Merge #3361 into n9_2.0 from refs/changes/3361/head 3362/target/1
author罗正 <1732036298@qq.com>
Thu, 23 Apr 2026 03:09:53 +0000 (03:09 +0000)
committer罗正 <1732036298@qq.com>
Thu, 23 Apr 2026 03:09:53 +0000 (03:09 +0000)
Code review from 罗正

* refs/changes/3361/head: (3 commits squashed)

  - evb 文件夹 1201patch重新合并提交

  - 解决编译不过问题

  - 1201patch合并(补交遗漏的)

Signed-off-by: 罗正 <1732036298@qq.com>
Merged-by: 罗正 <1732036298@qq.com>
link: https://codeup.aliyun.com/64191456b9581d62e8f81ac0/FD230/change/3361
681 files changed:
code/sdk/application/brandy/brandy_standard/CMakeLists.txt
code/sdk/application/brandy/brandy_standard/thread_pri_init.c
code/sdk/application/wearable/evb/auto_ota/auto_ota_service.c [new file with mode: 0644]
code/sdk/application/wearable/evb/ln/nativeapp/brandy-native-js-ln/libuikit_fwk.a [deleted file]
code/sdk/application/wearable/evb/ln/service/msg_center/brandy-native-js-ln/libmsg_center.a [deleted file]
code/sdk/application/wearable/evb/nativeabilityfwk/CMakeLists.txt
code/sdk/application/wearable/evb/nativeabilityfwk/include/Ability.h
code/sdk/application/wearable/evb/nativeabilityfwk/include/AbilitySlice.h
code/sdk/application/wearable/evb/nativeabilityfwk/include/BackDragListener.h
code/sdk/application/wearable/evb/nativeabilityfwk/include/PageTransitionMgr.h
code/sdk/application/wearable/evb/nativeabilityfwk/include/Presenter.h
code/sdk/application/wearable/evb/nativeabilityfwk/include/RecentManager.h
code/sdk/application/wearable/evb/nativeabilityfwk/include/Slice.h
code/sdk/application/wearable/evb/nativeabilityfwk/include/SlicePageFactory.h
code/sdk/application/wearable/evb/nativeabilityfwk/include/SlicePageManager.h
code/sdk/application/wearable/evb/nativeabilityfwk/include/TransitionType.h
code/sdk/application/wearable/evb/nativeabilityfwk/include/View.h
code/sdk/application/wearable/evb/nativeabilityfwk/src/Ability.cpp
code/sdk/application/wearable/evb/nativeabilityfwk/src/AbilitySlice.cpp
code/sdk/application/wearable/evb/nativeabilityfwk/src/transition/BackToCrossShapedTransition.cpp [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeabilityfwk/src/transition/BackToCrossShapedTransition.h [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeabilityfwk/src/transition/BackToHexagonsTransition.cpp
code/sdk/application/wearable/evb/nativeabilityfwk/src/transition/BackToWaterfallTransition.cpp
code/sdk/application/wearable/evb/nativeabilityfwk/src/transition/CrossShapedTransition.cpp [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeabilityfwk/src/transition/CrossShapedTransition.h [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeabilityfwk/src/transition/EnterWaterfallTransition.cpp
code/sdk/application/wearable/evb/nativeabilityfwk/src/transition/FadeInOutTransition.cpp [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeabilityfwk/src/transition/FadeInOutTransition.h [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeabilityfwk/src/transition/GaussianBlurTransition.cpp [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeabilityfwk/src/transition/GaussianBlurTransition.h [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeabilityfwk/src/transition/HexagonsTransition.cpp
code/sdk/application/wearable/evb/nativeabilityfwk/src/transition/ThreeDFoldTransition.cpp [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeabilityfwk/src/transition/ThreeDFoldTransition.h [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeabilityfwk/src/transition/TransitionUtils.h [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeabilityfwk/src/transition/TransparentGradientTransition.cpp [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeabilityfwk/src/transition/TransparentGradientTransition.h [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeabilityfwk/src/transition/WaterfallTransition.cpp
code/sdk/application/wearable/evb/nativeabilityfwk/src/transition/ZoomOutTransition.cpp [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeabilityfwk/src/transition/ZoomOutTransition.h [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeabilityfwk/src/transition/ZoomTransition.cpp
code/sdk/application/wearable/evb/nativeabilityfwk/src/transition/ZoomTransition.h
code/sdk/application/wearable/evb/nativeapp/CMakeLists.txt
code/sdk/application/wearable/evb/nativeapp/brandy-auto-ota-cli/libuikit_fwk.a
code/sdk/application/wearable/evb/nativeapp/brandy-auto-ota-ser/libuikit_fwk.a
code/sdk/application/wearable/evb/nativeapp/brandy-native-js/libuikit_fwk.a
code/sdk/application/wearable/evb/nativeapp/brandy-xts/libuikit_fwk.a
code/sdk/application/wearable/evb/nativeapp/nativelauncher/include/AppViewIDs.h
code/sdk/application/wearable/evb/nativeapp/nativelauncher/include/UICardPageFactory.h
code/sdk/application/wearable/evb/nativeapp/nativelauncher/include/UIWatchDialFactory.h [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativelauncher/include/UiConfig.h
code/sdk/application/wearable/evb/nativeapp/nativelauncher/include/ui_resource_blood.h [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativelauncher/include/ui_resource_breath.h
code/sdk/application/wearable/evb/nativeapp/nativelauncher/include/ui_resource_camera.h
code/sdk/application/wearable/evb/nativeapp/nativelauncher/include/ui_resource_date.h
code/sdk/application/wearable/evb/nativeapp/nativelauncher/include/ui_resource_empty.h [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativelauncher/include/ui_resource_findPhone.h
code/sdk/application/wearable/evb/nativeapp/nativelauncher/include/ui_resource_flashlight.h [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativelauncher/include/ui_resource_heartRate.h [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativelauncher/include/ui_resource_message.h [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativelauncher/include/ui_resource_phonemenu.h [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativelauncher/include/ui_resource_settings.h [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativelauncher/include/ui_resource_sleep.h
code/sdk/application/wearable/evb/nativeapp/nativelauncher/include/ui_resource_sport.h [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativelauncher/include/ui_resource_stopwatch.h [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativelauncher/include/ui_resource_timer.h
code/sdk/application/wearable/evb/nativeapp/nativelauncher/include/ui_resource_weather.h
code/sdk/application/wearable/evb/nativeapp/nativelauncher/src/NativeLauncher.cpp
code/sdk/application/wearable/evb/nativeapp/nativelauncher/src/UICardPageFactory.cpp
code/sdk/application/wearable/evb/nativeapp/nativelauncher/src/UIWatchDialFactory.cpp [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/activity/src/ActivityModel.cpp
code/sdk/application/wearable/evb/nativeapp/nativeui/activity/src/ActivityPresenter.cpp
code/sdk/application/wearable/evb/nativeapp/nativeui/alarm/src/AlarmClockModel.cpp
code/sdk/application/wearable/evb/nativeapp/nativeui/alarm/src/AlarmNewTimeView.cpp
code/sdk/application/wearable/evb/nativeapp/nativeui/alarm/src/AlarmPopUpPresenter.cpp
code/sdk/application/wearable/evb/nativeapp/nativeui/alarm/src/AlarmPopUpView.cpp
code/sdk/application/wearable/evb/nativeapp/nativeui/alipay/src/AlipayMainView.cpp
code/sdk/application/wearable/evb/nativeapp/nativeui/alipay/src/AlipayPresenter.cpp
code/sdk/application/wearable/evb/nativeapp/nativeui/aod_view/src/AodPresenter.cpp
code/sdk/application/wearable/evb/nativeapp/nativeui/aod_view/src/AodView.cpp
code/sdk/application/wearable/evb/nativeapp/nativeui/applist/src/AppItemView.cpp
code/sdk/application/wearable/evb/nativeapp/nativeui/applist/src/ApplistModel.cpp
code/sdk/application/wearable/evb/nativeapp/nativeui/applist/src/ApplistPresenter.cpp
code/sdk/application/wearable/evb/nativeapp/nativeui/applist/src/ApplistView.cpp
code/sdk/application/wearable/evb/nativeapp/nativeui/applist/src/DesktopFactory.cpp [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/applist/src/FootballDesktopFragment.cpp [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/applist/src/HexagonsDesktopFragment.cpp [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/applist/src/ListDesktopFragment.cpp [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/applist/src/PlanetDesktopFragment.cpp [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/applist/src/SphereDesktopFragment.cpp [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/applist/src/UIDesktopFragment.cpp [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/applist/src/WaterfallDesktopFragment.cpp [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/blood/src/BloodChartPage.cpp [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/blood/src/BloodExplainPage.cpp [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/blood/src/BloodMainPage.cpp [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/blood/src/BloodMeasurementPage.cpp [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/blood/src/BloodModel.cpp
code/sdk/application/wearable/evb/nativeapp/nativeui/blood/src/BloodPresenter.cpp
code/sdk/application/wearable/evb/nativeapp/nativeui/blood/src/BloodReadyPage.cpp [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/blood/src/BloodResultPage.cpp [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/bluetooth/src/BluetoothWrapper.cpp
code/sdk/application/wearable/evb/nativeapp/nativeui/breathexercise/src/BreathExerPage.cpp [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/breathexercise/src/BreathMainPage.cpp [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/breathexercise/src/BreathModel.cpp [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/breathexercise/src/BreathPresenter.cpp [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/breathexercise/src/BreathResultPage.cpp [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/breathexercise/src/BreathRhythmSetPage.cpp [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/breathexercise/src/BreathStartPage.cpp [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/breathexercise/src/BreathTimeSetPage.cpp [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/breathexercise/src/BreathTrainingRecordsPage.cpp [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/camera/src/CameraMainPage.cpp
code/sdk/application/wearable/evb/nativeapp/nativeui/camera/src/CameraModel.cpp
code/sdk/application/wearable/evb/nativeapp/nativeui/camera/src/CameraPresenter.cpp
code/sdk/application/wearable/evb/nativeapp/nativeui/clock/src/AmbientClockView.cpp
code/sdk/application/wearable/evb/nativeapp/nativeui/clock/src/GradientAodView.cpp [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/clock/src/GradientClockView.cpp [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/clock/src/GradientDateView.cpp [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/clock/src/MainClockView.cpp
code/sdk/application/wearable/evb/nativeapp/nativeui/compass/src/CompassControlView.cpp
code/sdk/application/wearable/evb/nativeapp/nativeui/compass/src/CompassFragment.cpp
code/sdk/application/wearable/evb/nativeapp/nativeui/compass/src/MainCompassPresenter.cpp
code/sdk/application/wearable/evb/nativeapp/nativeui/date/src/DateButtonItemView.cpp
code/sdk/application/wearable/evb/nativeapp/nativeui/date/src/DateContentItemView.cpp [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/date/src/DateMainPage.cpp
code/sdk/application/wearable/evb/nativeapp/nativeui/date/src/DateMessagePage.cpp
code/sdk/application/wearable/evb/nativeapp/nativeui/date/src/DateModel.cpp
code/sdk/application/wearable/evb/nativeapp/nativeui/date/src/DatePresenter.cpp
code/sdk/application/wearable/evb/nativeapp/nativeui/emptypage/src/EmptyPage.cpp
code/sdk/application/wearable/evb/nativeapp/nativeui/emptypage/src/EmptyPresenter.cpp
code/sdk/application/wearable/evb/nativeapp/nativeui/findphone/src/FindPhoneMainPage.cpp
code/sdk/application/wearable/evb/nativeapp/nativeui/findphone/src/FindPhoneModel.cpp
code/sdk/application/wearable/evb/nativeapp/nativeui/findphone/src/FindPhonePresenter.cpp
code/sdk/application/wearable/evb/nativeapp/nativeui/flashlight/src/FlashLightBlinkPage.cpp
code/sdk/application/wearable/evb/nativeapp/nativeui/flashlight/src/FlashLightColorPage.cpp
code/sdk/application/wearable/evb/nativeapp/nativeui/flashlight/src/FlashLightModel.cpp
code/sdk/application/wearable/evb/nativeapp/nativeui/flashlight/src/FlashLightPage.cpp
code/sdk/application/wearable/evb/nativeapp/nativeui/flashlight/src/FlashLightPlayPage.cpp
code/sdk/application/wearable/evb/nativeapp/nativeui/flashlight/src/FlashLightPresenter.cpp
code/sdk/application/wearable/evb/nativeapp/nativeui/flashlight/src/FlashLightRecoverPage.cpp [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/flashlight/src/FlashLightSetItemView.cpp
code/sdk/application/wearable/evb/nativeapp/nativeui/flashlight/src/FlashLightSetPage.cpp
code/sdk/application/wearable/evb/nativeapp/nativeui/heartrate/src/HeartRateMainPage.cpp [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/heartrate/src/HeartRateMeasurePage.cpp [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/heartrate/src/HeartRateModel.cpp [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/heartrate/src/HeartRatePresenter.cpp [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/heartrate/src/HeartRateReadyPage.cpp [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/heartrate/src/HeartRateResultGroup.cpp [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/include/activity/MainActivityView.h
code/sdk/application/wearable/evb/nativeapp/nativeui/include/alarm/AlarmPopUpPresenter.h
code/sdk/application/wearable/evb/nativeapp/nativeui/include/aod_view/AodPresenter.h
code/sdk/application/wearable/evb/nativeapp/nativeui/include/aod_view/AodView.h
code/sdk/application/wearable/evb/nativeapp/nativeui/include/applist/AppItemView.h
code/sdk/application/wearable/evb/nativeapp/nativeui/include/applist/ApplistModel.h
code/sdk/application/wearable/evb/nativeapp/nativeui/include/applist/ApplistPresenter.h
code/sdk/application/wearable/evb/nativeapp/nativeui/include/applist/ApplistView.h
code/sdk/application/wearable/evb/nativeapp/nativeui/include/applist/DesktopFactory.h [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/include/applist/FootballDesktopFragment.h [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/include/applist/HexagonsDesktopFragment.h [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/include/applist/ListDesktopFragment.h [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/include/applist/PlanetDesktopFragment.h [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/include/applist/SphereDesktopFragment.h [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/include/applist/UIDesktopFragment.h [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/include/applist/WaterfallDesktopFragment.h [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/include/blood/BloodChartPage.h [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/include/blood/BloodExplainPage.h [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/include/blood/BloodMainPage.h [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/include/blood/BloodMeasurementPage.h [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/include/blood/BloodModel.h
code/sdk/application/wearable/evb/nativeapp/nativeui/include/blood/BloodPresenter.h
code/sdk/application/wearable/evb/nativeapp/nativeui/include/blood/BloodReadyPage.h [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/include/blood/BloodResultPage.h [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/include/blood/BloodView.h
code/sdk/application/wearable/evb/nativeapp/nativeui/include/bluetooth/BluetoothWrapper.h
code/sdk/application/wearable/evb/nativeapp/nativeui/include/breathexercise/BreathExerPage.h [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/include/breathexercise/BreathMainPage.h [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/include/breathexercise/BreathModel.h [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/include/breathexercise/BreathPresenter.h [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/include/breathexercise/BreathResultPage.h [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/include/breathexercise/BreathRhythmSetPage.h [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/include/breathexercise/BreathStartPage.h [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/include/breathexercise/BreathTimeSetPage.h [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/include/breathexercise/BreathTrainingRecordsPage.h [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/include/breathexercise/BreathView.h [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/include/camera/CameraMainPage.h
code/sdk/application/wearable/evb/nativeapp/nativeui/include/camera/CameraModel.h
code/sdk/application/wearable/evb/nativeapp/nativeui/include/camera/CameraPresenter.h
code/sdk/application/wearable/evb/nativeapp/nativeui/include/clock/AmbientClockView.h
code/sdk/application/wearable/evb/nativeapp/nativeui/include/clock/ClockResourceImage.h [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/include/clock/GradientAodView.h [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/include/clock/GradientClockView.h [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/include/clock/GradientDateView.h [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/include/clock/MainClockView.h
code/sdk/application/wearable/evb/nativeapp/nativeui/include/compass/CompassCalibrationView.h [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/include/compass/CompassControlView.h
code/sdk/application/wearable/evb/nativeapp/nativeui/include/compass/CompassFragment.h
code/sdk/application/wearable/evb/nativeapp/nativeui/include/compass/CompassPresenter.h [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/include/compass/CompassView.h [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/include/compass/MainCompassPresenter.h
code/sdk/application/wearable/evb/nativeapp/nativeui/include/date/DateButtonItemView.h
code/sdk/application/wearable/evb/nativeapp/nativeui/include/date/DateContentItemView.h [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/include/date/DateMainPage.h
code/sdk/application/wearable/evb/nativeapp/nativeui/include/date/DateMessagePage.h
code/sdk/application/wearable/evb/nativeapp/nativeui/include/date/DateModel.h
code/sdk/application/wearable/evb/nativeapp/nativeui/include/date/DatePresenter.h
code/sdk/application/wearable/evb/nativeapp/nativeui/include/date/DateView.h
code/sdk/application/wearable/evb/nativeapp/nativeui/include/emptypage/EmptyPage.h
code/sdk/application/wearable/evb/nativeapp/nativeui/include/emptypage/EmptyPresenter.h
code/sdk/application/wearable/evb/nativeapp/nativeui/include/emptypage/EmptyView.h
code/sdk/application/wearable/evb/nativeapp/nativeui/include/findphone/FindPhoneMainPage.h
code/sdk/application/wearable/evb/nativeapp/nativeui/include/findphone/FindPhoneModel.h
code/sdk/application/wearable/evb/nativeapp/nativeui/include/findphone/FindPhonePresenter.h
code/sdk/application/wearable/evb/nativeapp/nativeui/include/findphone/FindPhoneView.h
code/sdk/application/wearable/evb/nativeapp/nativeui/include/flashlight/FlashLightBlinkPage.h
code/sdk/application/wearable/evb/nativeapp/nativeui/include/flashlight/FlashLightColorPage.h
code/sdk/application/wearable/evb/nativeapp/nativeui/include/flashlight/FlashLightModel.h
code/sdk/application/wearable/evb/nativeapp/nativeui/include/flashlight/FlashLightPage.h
code/sdk/application/wearable/evb/nativeapp/nativeui/include/flashlight/FlashLightPlayPage.h
code/sdk/application/wearable/evb/nativeapp/nativeui/include/flashlight/FlashLightRecoverPage.h [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/include/flashlight/FlashLightSetItemView.h
code/sdk/application/wearable/evb/nativeapp/nativeui/include/flashlight/FlashLightSetPage.h
code/sdk/application/wearable/evb/nativeapp/nativeui/include/flashlight/FlashLightView.h
code/sdk/application/wearable/evb/nativeapp/nativeui/include/heartrate/HeartRateMainPage.h [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/include/heartrate/HeartRateMeasurePage.h [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/include/heartrate/HeartRateModel.h [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/include/heartrate/HeartRatePresenter.h [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/include/heartrate/HeartRateReadyPage.h [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/include/heartrate/HeartRateResultGroup.h [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/include/heartrate/HeartRateView.h
code/sdk/application/wearable/evb/nativeapp/nativeui/include/main/AppGroupView.h
code/sdk/application/wearable/evb/nativeapp/nativeui/include/main/DialBinTypesV2.h
code/sdk/application/wearable/evb/nativeapp/nativeui/include/main/HealthModel.h
code/sdk/application/wearable/evb/nativeapp/nativeui/include/main/LoadImg.h
code/sdk/application/wearable/evb/nativeapp/nativeui/include/main/MainPresenterSample.h
code/sdk/application/wearable/evb/nativeapp/nativeui/include/main/MainViewSample.h
code/sdk/application/wearable/evb/nativeapp/nativeui/include/main/MessageDetailsGroup.h [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/include/main/MessageItemView.h
code/sdk/application/wearable/evb/nativeapp/nativeui/include/main/MessageMainPage.h [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/include/main/MessageModel.h
code/sdk/application/wearable/evb/nativeapp/nativeui/include/main/ModelListenerSample.h
code/sdk/application/wearable/evb/nativeapp/nativeui/include/main/VolumeSettingPresenter.h
code/sdk/application/wearable/evb/nativeapp/nativeui/include/main/dial/DialDataType.h
code/sdk/application/wearable/evb/nativeapp/nativeui/include/main/dial/DialModelArcProgress.h [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/include/monkey/MonkeyModel.h [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/include/monkey/MonkeyPage.h [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/include/monkey/MonkeyPresenter.h [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/include/monkey/MonkeyView.h [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/include/phonemenu/PhoneMenuCallerLogItemView.h [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/include/phonemenu/PhoneMenuCallerLogModel.h [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/include/phonemenu/PhoneMenuCallerLogPage.h [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/include/phonemenu/PhoneMenuCallingPage.h [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/include/phonemenu/PhoneMenuContactsItemView.h [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/include/phonemenu/PhoneMenuContactsPage.h [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/include/phonemenu/PhoneMenuDialPage.h [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/include/phonemenu/PhoneMenuDisconnectPage.h [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/include/phonemenu/PhoneMenuMainItemView.h [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/include/phonemenu/PhoneMenuMainPage.h [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/include/phonemenu/PhoneMenuPresenter.h [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/include/phonemenu/PhoneMenuSync.h [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/include/phonemenu/PhoneMenuView.h [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/include/player/PlayersModel.h
code/sdk/application/wearable/evb/nativeapp/nativeui/include/player/PlayersMusicItemView.h [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/include/player/PlayersMusicListGroup.h [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/include/player/PlayersOptionGroup.h [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/include/player/PlayersPresenter.h
code/sdk/application/wearable/evb/nativeapp/nativeui/include/player/PlayersView.h
code/sdk/application/wearable/evb/nativeapp/nativeui/include/quickaccess/FloatAccessView.h [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/include/recent_app/LoadingFragment.h [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/include/recent_app/RecentAppPresenter.h
code/sdk/application/wearable/evb/nativeapp/nativeui/include/recent_app/RecentAppView.h
code/sdk/application/wearable/evb/nativeapp/nativeui/include/recent_app/RollerRecentAppFragment.h [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/include/recent_app/SlipFlowRecentAppFragment.h [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/include/settings/SettingPresenter.h
code/sdk/application/wearable/evb/nativeapp/nativeui/include/settings/SettingView.h
code/sdk/application/wearable/evb/nativeapp/nativeui/include/settings/common/SettingBluetoothItemGroup.h [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/include/settings/common/SettingCardAddItemGroup.h [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/include/settings/common/SettingCardEffectItemGroup.h [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/include/settings/common/SettingCardEffectResourceImage.h [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/include/settings/common/SettingCardEffectSample.h [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/include/settings/common/SettingCardMgrItemGroup.h [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/include/settings/common/SettingCommon.h [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/include/settings/common/SettingDesktopHomeItemGroup.h [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/include/settings/common/SettingRefSingleton.h [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/include/settings/common/SettingToggleButton.h [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/include/settings/common/SettingUnionItemGroup.h [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/include/settings/model/SettingAboutModel.h [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/include/settings/model/SettingBluetoothHeadsetEvent.h [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/include/settings/model/SettingBluetoothModel.h [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/include/settings/model/SettingCardModel.h [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/include/settings/model/SettingDesktopModel.h [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/include/settings/model/SettingDisplayModel.h [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/include/settings/model/SettingMainModel.h [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/include/settings/model/SettingPowerModel.h [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/include/settings/model/SettingQrcodeConnModel.h [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/include/settings/model/SettingSystemModel.h [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/include/settings/page/SettingAboutPage.h [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/include/settings/page/SettingBluetoothPage.h [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/include/settings/page/SettingCardAddPage.h [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/include/settings/page/SettingCardEffectPage.h [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/include/settings/page/SettingCardMgrPage.h [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/include/settings/page/SettingCardPage.h [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/include/settings/page/SettingConnectBlueFail.h [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/include/settings/page/SettingConnectBlueSuccess.h [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/include/settings/page/SettingConnectNewPhone.h [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/include/settings/page/SettingConnectionOpen.h [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/include/settings/page/SettingDesktopDialPage.h [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/include/settings/page/SettingDesktopDialStylePage.h [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/include/settings/page/SettingDesktopHomePage.h [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/include/settings/page/SettingDesktopPage.h [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/include/settings/page/SettingDisplayBrightnessPage.h [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/include/settings/page/SettingDisplayPage.h [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/include/settings/page/SettingDisplayScreenOffPage.h [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/include/settings/page/SettingDisplaySteadyOnPage.h [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/include/settings/page/SettingMainPage.h [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/include/settings/page/SettingPowerPage.h [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/include/settings/page/SettingQrcodeConnPage.h [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/include/settings/page/SettingReconnectSecondConfirm.h [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/include/settings/page/SettingReconnection.h [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/include/settings/page/SettingSystemOperationPage.h [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/include/settings/page/SettingSystemOtaPage.h [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/include/settings/page/SettingSystemPage.h [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/include/settings/page/UnPairSecondConfirm.h [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/include/sleep/SleepDetailsPage.h [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/include/sleep/SleepMainPage.h [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/include/sleep/SleepModel.h [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/include/sleep/SleepPresenter.h [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/include/sleep/SleepSleepingPage.h [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/include/sleep/SleepTargetTime.h [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/include/sleep/SleepView.h [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/include/sport/SportCountdownPage.h [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/include/sport/SportDataPage.h [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/include/sport/SportHeartRateRangeItemView.h [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/include/sport/SportHeartRateRangePage.h [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/include/sport/SportMenuItemView.h [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/include/sport/SportMenuPage.h [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/include/sport/SportMistouchPage.h [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/include/sport/SportModel.h [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/include/sport/SportPausePage.h [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/include/sport/SportPreparePage.h [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/include/sport/SportPresenter.h [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/include/sport/SportPromptPage.h [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/include/sport/SportRemindHeartRateItemView.h [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/include/sport/SportRemindHeartRatePage.h [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/include/sport/SportRemindIntervalItemView.h [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/include/sport/SportRemindIntervalPage.h [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/include/sport/SportRemindItemView.h [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/include/sport/SportRemindPage.h [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/include/sport/SportSettingsItemView.h [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/include/sport/SportSettingsPage.h [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/include/sport/SportTargetItemView.h [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/include/sport/SportTargetPage.h [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/include/sport/SportTargetPromptPage.h [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/include/sport/SportTargetSettingPage.h [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/include/sport/SportView.h [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/include/stopwatch/StopwatchItemView.h
code/sdk/application/wearable/evb/nativeapp/nativeui/include/stopwatch/StopwatchModel.h
code/sdk/application/wearable/evb/nativeapp/nativeui/include/stopwatch/StopwatchPage.h
code/sdk/application/wearable/evb/nativeapp/nativeui/include/stopwatch/StopwatchRecordPage.h [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/include/stopwatch/StopwatchView.h
code/sdk/application/wearable/evb/nativeapp/nativeui/include/timers/TimerCountDown.h [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/include/timers/TimerMainPage.h
code/sdk/application/wearable/evb/nativeapp/nativeui/include/timers/TimerModel.h
code/sdk/application/wearable/evb/nativeapp/nativeui/include/timers/TimerPresenter.h
code/sdk/application/wearable/evb/nativeapp/nativeui/include/timers/TimerSettingPage.h
code/sdk/application/wearable/evb/nativeapp/nativeui/include/timers/TimerView.h
code/sdk/application/wearable/evb/nativeapp/nativeui/include/uisample/UISampleMainPage.h [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/include/uisample/UISampleModel.h
code/sdk/application/wearable/evb/nativeapp/nativeui/include/uisample/UISampleNativeTestCasePage.h [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/include/uisample/UISamplePresenter.h
code/sdk/application/wearable/evb/nativeapp/nativeui/include/uisample/UISampleProprietaryTestCasePage.h [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/include/uisample/UISampleView.h
code/sdk/application/wearable/evb/nativeapp/nativeui/include/weather/WeatherItemView.h
code/sdk/application/wearable/evb/nativeapp/nativeui/include/weather/WeatherMainPage.h
code/sdk/application/wearable/evb/nativeapp/nativeui/include/weather/WeatherModel.h
code/sdk/application/wearable/evb/nativeapp/nativeui/include/weather/WeatherPageDays.h [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/include/weather/WeatherPageHours.h [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/include/weather/WeatherPageHoursGroup.h [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/include/weather/WeatherPageLunarPhase.h [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/include/weather/WeatherPageMonthRise.h [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/include/weather/WeatherPageSunRise.h [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/include/weather/WeatherPresenter.h
code/sdk/application/wearable/evb/nativeapp/nativeui/include/weather/WeatherView.h
code/sdk/application/wearable/evb/nativeapp/nativeui/key/src/KeyInputListener.cpp
code/sdk/application/wearable/evb/nativeapp/nativeui/main/src/HealthModel.cpp
code/sdk/application/wearable/evb/nativeapp/nativeui/main/src/LoadImg.cpp
code/sdk/application/wearable/evb/nativeapp/nativeui/main/src/MainModel.cpp
code/sdk/application/wearable/evb/nativeapp/nativeui/main/src/MainPresenterSample.cpp
code/sdk/application/wearable/evb/nativeapp/nativeui/main/src/MainViewSample.cpp
code/sdk/application/wearable/evb/nativeapp/nativeui/main/src/MessageDetailsGroup.cpp [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/main/src/MessageItemView.cpp
code/sdk/application/wearable/evb/nativeapp/nativeui/main/src/MessageMainPage.cpp [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/main/src/MessageModel.cpp
code/sdk/application/wearable/evb/nativeapp/nativeui/main/src/ModelListenerSample.cpp
code/sdk/application/wearable/evb/nativeapp/nativeui/main/src/PullUpDownView.cpp
code/sdk/application/wearable/evb/nativeapp/nativeui/main/src/VolumeSettingPresenter.cpp
code/sdk/application/wearable/evb/nativeapp/nativeui/main/src/dial/DialModelArcProgress.cpp [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/main/src/dial/DialViewGroup.cpp
code/sdk/application/wearable/evb/nativeapp/nativeui/main/src/dial/WatchInterface.cpp
code/sdk/application/wearable/evb/nativeapp/nativeui/monkey/src/MonkeyModel.cpp [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/monkey/src/MonkeyPage.cpp [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/monkey/src/MonkeyPresenter.cpp [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/offlinevoice/src/VocassistPresenter.cpp
code/sdk/application/wearable/evb/nativeapp/nativeui/offlinevoice/src/VocassistView.cpp
code/sdk/application/wearable/evb/nativeapp/nativeui/phonemenu/src/PhoneMenuCallerLogItemView.cpp [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/phonemenu/src/PhoneMenuCallerLogModel.cpp [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/phonemenu/src/PhoneMenuCallerLogPage.cpp [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/phonemenu/src/PhoneMenuCallingPage.cpp [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/phonemenu/src/PhoneMenuContactsItemView.cpp [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/phonemenu/src/PhoneMenuContactsPage.cpp [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/phonemenu/src/PhoneMenuDialPage.cpp [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/phonemenu/src/PhoneMenuDisconnectPage.cpp [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/phonemenu/src/PhoneMenuMainItemView.cpp [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/phonemenu/src/PhoneMenuMainPage.cpp [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/phonemenu/src/PhoneMenuPresenter.cpp [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/phonemenu/src/PhoneMenuSync.cpp [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/phoneservice/src/PhoneService.cpp
code/sdk/application/wearable/evb/nativeapp/nativeui/player/src/PlayersModel.cpp
code/sdk/application/wearable/evb/nativeapp/nativeui/player/src/PlayersMusicItemView.cpp [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/player/src/PlayersMusicListGroup.cpp [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/player/src/PlayersOptionGroup.cpp [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/player/src/PlayersPresenter.cpp
code/sdk/application/wearable/evb/nativeapp/nativeui/player/src/PlayersView.cpp
code/sdk/application/wearable/evb/nativeapp/nativeui/quickaccess/FloatAccessView.cpp [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/recent_app/src/LoadingFragment.cpp [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/recent_app/src/RecentAppPresenter.cpp
code/sdk/application/wearable/evb/nativeapp/nativeui/recent_app/src/RecentAppView.cpp
code/sdk/application/wearable/evb/nativeapp/nativeui/recent_app/src/RollerRecentAppFragment.cpp [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/recent_app/src/SlipFlowRecentAppFragment.cpp [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/restoredefaults/src/RestorePresenter.cpp
code/sdk/application/wearable/evb/nativeapp/nativeui/screennotify/src/ui_screennotify.cpp
code/sdk/application/wearable/evb/nativeapp/nativeui/screensetting/src/ScreenModels.cpp
code/sdk/application/wearable/evb/nativeapp/nativeui/settings/src/SettingPresenter.cpp
code/sdk/application/wearable/evb/nativeapp/nativeui/settings/src/common/SettingBluetoothItemGroup.cpp [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/settings/src/common/SettingCardAddItemGroup.cpp [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/settings/src/common/SettingCardEffectItemGroup.cpp [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/settings/src/common/SettingCardMgrItemGroup.cpp [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/settings/src/common/SettingDesktopHomeItemGroup.cpp [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/settings/src/common/SettingToggleButton.cpp [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/settings/src/common/SettingUnionItemGroup.cpp [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/settings/src/model/SettingAboutModel.cpp [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/settings/src/model/SettingBluetoothHeadsetEvent.cpp [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/settings/src/model/SettingBluetoothModel.cpp [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/settings/src/model/SettingCardModel.cpp [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/settings/src/model/SettingDesktopModel.cpp [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/settings/src/model/SettingDisplayModel.cpp [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/settings/src/model/SettingMainModel.cpp [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/settings/src/model/SettingPowerModel.cpp [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/settings/src/model/SettingQrcodeConnModel.cpp [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/settings/src/model/SettingSystemModel.cpp [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/settings/src/page/SettingAboutPage.cpp [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/settings/src/page/SettingBluetoothPage.cpp [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/settings/src/page/SettingCardAddPage.cpp [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/settings/src/page/SettingCardEffectPage.cpp [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/settings/src/page/SettingCardMgrPage.cpp [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/settings/src/page/SettingCardPage.cpp [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/settings/src/page/SettingConnectBlueFail.cpp [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/settings/src/page/SettingConnectBlueSuccess.cpp [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/settings/src/page/SettingConnectNewPhone.cpp [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/settings/src/page/SettingConnectionOpen.cpp [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/settings/src/page/SettingDesktopDialPage.cpp [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/settings/src/page/SettingDesktopDialStylePage.cpp [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/settings/src/page/SettingDesktopHomePage.cpp [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/settings/src/page/SettingDesktopPage.cpp [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/settings/src/page/SettingDisplayBrightnessPage.cpp [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/settings/src/page/SettingDisplayPage.cpp [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/settings/src/page/SettingDisplayScreenOffPage.cpp [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/settings/src/page/SettingDisplaySteadyOnPage.cpp [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/settings/src/page/SettingMainPage.cpp [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/settings/src/page/SettingPowerPage.cpp [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/settings/src/page/SettingQrcodeConnPage.cpp [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/settings/src/page/SettingReconnectSecondConfirm.cpp [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/settings/src/page/SettingReconnection.cpp [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/settings/src/page/SettingSystemOperationPage.cpp [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/settings/src/page/SettingSystemOtaPage.cpp [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/settings/src/page/SettingSystemPage.cpp [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/settings/src/page/UnPairSecondConfirm.cpp [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/sleep/src/SleepDetailsPage.cpp [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/sleep/src/SleepMainPage.cpp [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/sleep/src/SleepModel.cpp [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/sleep/src/SleepPresenter.cpp [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/sleep/src/SleepSleepingPage.cpp [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/sleep/src/SleepTargetTime.cpp [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/sport/src/SportCountdownPage.cpp [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/sport/src/SportDataPage.cpp [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/sport/src/SportHeartRateRangeItemView.cpp [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/sport/src/SportHeartRateRangePage.cpp [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/sport/src/SportMenuItemView.cpp [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/sport/src/SportMenuPage.cpp [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/sport/src/SportMistouchPage.cpp [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/sport/src/SportModel.cpp [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/sport/src/SportPausePage.cpp [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/sport/src/SportPreparePage.cpp [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/sport/src/SportPresenter.cpp [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/sport/src/SportPromptPage.cpp [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/sport/src/SportRemindHeartRateItemView.cpp [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/sport/src/SportRemindHeartRatePage.cpp [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/sport/src/SportRemindIntervalItemView.cpp [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/sport/src/SportRemindIntervalPage.cpp [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/sport/src/SportRemindItemView.cpp [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/sport/src/SportRemindPage.cpp [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/sport/src/SportSettingsItemView.cpp [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/sport/src/SportSettingsPage.cpp [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/sport/src/SportTargetItemView.cpp [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/sport/src/SportTargetPage.cpp [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/sport/src/SportTargetPromptPage.cpp [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/sport/src/SportTargetSettingPage.cpp [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/stopwatch/src/StopwatchItemView.cpp
code/sdk/application/wearable/evb/nativeapp/nativeui/stopwatch/src/StopwatchModel.cpp
code/sdk/application/wearable/evb/nativeapp/nativeui/stopwatch/src/StopwatchPage.cpp
code/sdk/application/wearable/evb/nativeapp/nativeui/stopwatch/src/StopwatchPresenter.cpp
code/sdk/application/wearable/evb/nativeapp/nativeui/stopwatch/src/StopwatchRecordPage.cpp [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/timers/src/TimerCountDown.cpp [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/timers/src/TimerMainPage.cpp
code/sdk/application/wearable/evb/nativeapp/nativeui/timers/src/TimerModel.cpp
code/sdk/application/wearable/evb/nativeapp/nativeui/timers/src/TimerPresenter.cpp
code/sdk/application/wearable/evb/nativeapp/nativeui/timers/src/TimerSettingPage.cpp
code/sdk/application/wearable/evb/nativeapp/nativeui/uisample/src/UISampleMainPage.cpp [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/uisample/src/UISampleModel.cpp
code/sdk/application/wearable/evb/nativeapp/nativeui/uisample/src/UISampleNativeTestCasePage.cpp [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/uisample/src/UISamplePresenter.cpp
code/sdk/application/wearable/evb/nativeapp/nativeui/uisample/src/UISampleProprietaryTestCasePage.cpp [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/uisample/uitest/framework/include/test_case_list_adapter.h
code/sdk/application/wearable/evb/nativeapp/nativeui/uisample/uitest/framework/include/ui_test_group.h
code/sdk/application/wearable/evb/nativeapp/nativeui/uisample/uitest/framework/src/ui_test_group.cpp
code/sdk/application/wearable/evb/nativeapp/nativeui/uiservice/src/ui_service.cpp
code/sdk/application/wearable/evb/nativeapp/nativeui/weather/src/WeatherItemView.cpp
code/sdk/application/wearable/evb/nativeapp/nativeui/weather/src/WeatherMainPage.cpp
code/sdk/application/wearable/evb/nativeapp/nativeui/weather/src/WeatherModel.cpp
code/sdk/application/wearable/evb/nativeapp/nativeui/weather/src/WeatherPageDays.cpp [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/weather/src/WeatherPageHours.cpp [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/weather/src/WeatherPageHoursGroup.cpp [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/weather/src/WeatherPageLunarPhase.cpp [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/weather/src/WeatherPageMonthRise.cpp [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/weather/src/WeatherPageSunRise.cpp [new file with mode: 0644]
code/sdk/application/wearable/evb/nativeapp/nativeui/weather/src/WeatherPresenter.cpp
code/sdk/application/wearable/evb/ohos_deps/wearable_log.h [new file with mode: 0644]
code/sdk/application/wearable/evb/service/broadcast/include/broadcast_feature.h
code/sdk/application/wearable/evb/service/broadcast/src/broadcast_implement.c
code/sdk/application/wearable/evb/service/device_msg/CMakeLists.txt
code/sdk/application/wearable/evb/service/device_msg/device_msg.cpp
code/sdk/application/wearable/evb/service/device_msg/msg_center_device.cpp
code/sdk/application/wearable/evb/service/device_msg/msg_center_device.h
code/sdk/application/wearable/evb/service/msg_center/CMakeLists.txt
code/sdk/application/wearable/evb/service/msg_center/brandy-auto-ota-cli/libmsg_center.a
code/sdk/application/wearable/evb/service/msg_center/brandy-auto-ota-ser/libmsg_center.a
code/sdk/application/wearable/evb/service/msg_center/brandy-native-js/libmsg_center.a
code/sdk/application/wearable/evb/service/msg_center/brandy-xts/libmsg_center.a
code/sdk/application/wearable/evb/service/msg_center/include/msg_center_msg.h
code/sdk/application/wearable/evb/service/msg_center/include/notify/calendar_notification.h [new file with mode: 0644]
code/sdk/application/wearable/evb/service/msg_center/include/notify/notification_manager.h
code/sdk/application/wearable/evb/service/msg_center/include/notify/phone_msg_notification.h
code/sdk/application/wearable/evb/service/msg_center/src/common/msg_center_utils.cpp
code/sdk/application/wearable/evb/service/msg_center/src/msg_center_customer.cpp
code/sdk/application/wearable/evb/service/msg_center/src/notify/calendar_notification.cpp [new file with mode: 0644]
code/sdk/application/wearable/evb/service/msg_center/src/notify/ketinput/src/NotifyOnKeyListener.cpp
code/sdk/application/wearable/evb/service/msg_center/src/notify/phone_msg_notification.cpp
code/sdk/application/wearable/evb/service/remote_msg/CMakeLists.txt
code/sdk/application/wearable/evb/service/remote_msg/phone_contacts.cpp [new file with mode: 0644]
code/sdk/application/wearable/evb/service/remote_msg/phone_contacts.h [new file with mode: 0644]
code/sdk/application/wearable/evb/service/remote_msg/remote_msg.cpp
code/sdk/application/wearable/evb/service/remote_msg/remote_msg.h
code/sdk/application/wearable/n9/nativeabilityfwk/include/Ability.h
code/sdk/application/wearable/n9/nativeabilityfwk/include/Presenter.h
code/sdk/application/wearable/n9/nativeabilityfwk/src/Ability.cpp
code/sdk/application/wearable/n9/nativeabilityfwk/src/transition/BackToCrossShapedTransition.cpp
code/sdk/application/wearable/n9/nativeabilityfwk/src/transition/BackToHexagonsTransition.cpp
code/sdk/application/wearable/n9/nativeabilityfwk/src/transition/BackToWaterfallTransition.cpp
code/sdk/application/wearable/n9/nativeabilityfwk/src/transition/CrossShapedTransition.cpp
code/sdk/application/wearable/n9/nativeabilityfwk/src/transition/ZoomOutTransition.cpp [new file with mode: 0644]
code/sdk/application/wearable/n9/nativeabilityfwk/src/transition/ZoomOutTransition.h [new file with mode: 0644]
code/sdk/application/wearable/n9/nativeapp/CMakeLists.txt
code/sdk/application/wearable/n9/nativeapp/nativelauncher/include/UiConfig.h
code/sdk/application/wearable/n9/nativeapp/nativelauncher/include/ui_stopwatch_resource.h [deleted file]
code/sdk/application/wearable/n9/nativeapp/nativelauncher/src/UIWatchDialFactory.cpp
code/sdk/application/wearable/n9/nativeapp/nativeui/applist/include/DesktopFactory.h [new file with mode: 0644]
code/sdk/application/wearable/n9/nativeapp/nativeui/applist/include/FootballDesktopFragment.h [new file with mode: 0644]
code/sdk/application/wearable/n9/nativeapp/nativeui/applist/include/HexagonsDesktopFragment.h [new file with mode: 0644]
code/sdk/application/wearable/n9/nativeapp/nativeui/applist/include/ListDesktopFragment.h [new file with mode: 0644]
code/sdk/application/wearable/n9/nativeapp/nativeui/applist/include/PlanetDesktopFragment.h [new file with mode: 0644]
code/sdk/application/wearable/n9/nativeapp/nativeui/applist/include/SphereDesktopFragment.h [new file with mode: 0644]
code/sdk/application/wearable/n9/nativeapp/nativeui/applist/include/UIDesktopFragment.h [new file with mode: 0644]
code/sdk/application/wearable/n9/nativeapp/nativeui/applist/include/WaterfallDesktopFragment.h [new file with mode: 0644]
code/sdk/application/wearable/n9/nativeapp/nativeui/applist/src/DesktopFactory.cpp [new file with mode: 0644]
code/sdk/application/wearable/n9/nativeapp/nativeui/applist/src/FootballDesktopFragment.cpp [new file with mode: 0644]
code/sdk/application/wearable/n9/nativeapp/nativeui/applist/src/HexagonsDesktopFragment.cpp [new file with mode: 0644]
code/sdk/application/wearable/n9/nativeapp/nativeui/applist/src/ListDesktopFragment.cpp [new file with mode: 0644]
code/sdk/application/wearable/n9/nativeapp/nativeui/applist/src/PlanetDesktopFragment.cpp [new file with mode: 0644]
code/sdk/application/wearable/n9/nativeapp/nativeui/applist/src/SphereDesktopFragment.cpp [new file with mode: 0644]
code/sdk/application/wearable/n9/nativeapp/nativeui/applist/src/UIDesktopFragment.cpp [new file with mode: 0644]
code/sdk/application/wearable/n9/nativeapp/nativeui/applist/src/WaterfallDesktopFragment.cpp [new file with mode: 0644]
code/sdk/application/wearable/n9/nativeapp/nativeui/bluetooth/include/BluetoothWrapper.h
code/sdk/application/wearable/n9/nativeapp/nativeui/bluetooth/src/BluetoothModel.cpp
code/sdk/application/wearable/n9/nativeapp/nativeui/bluetooth/src/BluetoothWrapper.cpp
code/sdk/application/wearable/n9/nativeapp/nativeui/heartrate/src/HeartModel.cpp [new file with mode: 0644]
code/sdk/application/wearable/n9/nativeapp/nativeui/languagecode/src/LanguageSwitchView.cpp
code/sdk/application/wearable/n9/nativeapp/nativeui/saveele/src/SaveBatPresenter.cpp
code/sdk/application/wearable/n9/nativeapp/nativeui/uisample/src/UISampleView.cpp [deleted file]
code/sdk/application/wearable/n9/nativeapp/nativeui/uisample/uitest/framework/src/test_case_list_adapter.cpp [deleted file]
code/sdk/application/wearable/n9/service/device_msg/device_location.cpp [deleted file]
code/sdk/application/wearable/n9/service/device_msg/device_location.h [deleted file]
code/sdk/application/wearable/n9/service/device_msg/msg_center_device.cpp
code/sdk/application/wearable/n9/service/msg_center/CMakeLists.txt
code/sdk/application/wearable/n9/service/msg_center/brandy-native-js-fd230/libmsg_center.a [deleted file]
code/sdk/application/wearable/n9/service/msg_center/brandy-native-js-ln/libmsg_center.a [deleted file]
code/sdk/application/wearable/n9/service/msg_center/brandy-native-js-n9/libmsg_center.a
code/sdk/application/wearable/n9/service/msg_center/include/notify/makephone_notification.h [deleted file]
code/sdk/application/wearable/n9/service/msg_center/include/notify/notification_manager.h
code/sdk/application/wearable/n9/service/msg_center/src/msg_center_customer.cpp
code/sdk/application/wearable/n9/service/msg_center/src/notify/charge_notification.cpp
code/sdk/application/wearable/n9/service/msg_center/src/notify/goal_notification.cpp
code/sdk/application/wearable/n9/service/msg_center/src/notify/ketinput/src/NotifyOnKeyListener.cpp
code/sdk/application/wearable/n9/service/msg_center/src/notify/makephone_notification.cpp [deleted file]
code/sdk/application/wearable/n9/service/msg_center/src/notify/phone_crt.cpp
code/sdk/application/wearable/n9/service/msg_center/src/notify/transmitting.cpp
code/sdk/application/wearable/n9/service/remote_msg/remote_msg.cpp
code/sdk/application/wstp/at_service/ohosfwk/ohosfwk_at_process.cpp
code/sdk/interim_binary/brandy/libs/media/evb_standard/libjs_audio_recorder.a [new file with mode: 0644]
code/sdk/middleware/services/gpu/api/rm/brandy-native-js-fd230-r/libgfx_rm.a [deleted file]
code/sdk/middleware/services/gpu/api/rm/brandy-native-js-fd230/libgfx_rm.a [deleted file]
code/sdk/middleware/services/gpu/api/rm/brandy-native-js-fd230_user-r/libgfx_rm.a [deleted file]
code/sdk/middleware/services/gpu/api/rm/brandy-native-js-fd230_user/libgfx_rm.a [deleted file]
code/sdk/middleware/services/gpu/api/rm/brandy-native-js-fd272-r/libgfx_rm.a [deleted file]
code/sdk/middleware/services/gpu/api/rm/brandy-native-js-fd272/libgfx_rm.a [deleted file]
code/sdk/middleware/services/gpu/api/rm/brandy-native-js-ln-r/libgfx_rm.a [deleted file]
code/sdk/middleware/services/gpu/api/rm/brandy-native-js-ln/libgfx_rm.a [deleted file]
code/sdk/middleware/services/gpu/api/rm/brandy-native-js-lnppp-r/libgfx_rm.a [deleted file]
code/sdk/middleware/services/gpu/api/rm/brandy-native-js-lnppp/libgfx_rm.a [deleted file]
code/sdk/middleware/services/gpu/api/rm/brandy-native-js-n9-r/libgfx_rm.a
code/sdk/middleware/services/gpu/api/rm/brandy-native-js-n9/libgfx_rm.a
code/sdk/middleware/services/gpu/api/rm/brandy-native-js-n9ln-r/libgfx_rm.a [deleted file]
code/sdk/middleware/services/gpu/api/rm/brandy-native-js-n9ln/libgfx_rm.a [deleted file]
code/sdk/middleware/services/gui/uikit/brandy-native-js-n9/libuikit_ext.a
code/sdk/middleware/services/gui/uikit/proprietary/src/ui/frameworks/dfx/dfx_cmd.cpp
code/sdk/middleware/services/gui/uikit/sample/uitest/components/ui_test_cross/ui_test_cross.cpp
code/sdk/middleware/services/gui/uikit/sample/uitest/components/ui_test_transition/ui_test_transition_model.cpp
code/sdk/open_source/openharmony/foundation/aafwk/aafwk_lite/brandy-native-js-n9/libams.a
code/sdk/open_source/openharmony/foundation/ace/ace_engine_lite/brandy-native-js-fd230/libace.a [deleted file]
code/sdk/open_source/openharmony/foundation/ace/ace_engine_lite/brandy-native-js-fd230/libace_http.a [deleted file]
code/sdk/open_source/openharmony/foundation/ace/ace_engine_lite/brandy-native-js-fd230/libnetstack_http.a [deleted file]
code/sdk/open_source/openharmony/foundation/ace/ace_engine_lite/brandy-native-js-fd230/libwebsocket.a [deleted file]
code/sdk/open_source/openharmony/foundation/ace/ace_engine_lite/brandy-native-js-fd230_user/libace.a [deleted file]
code/sdk/open_source/openharmony/foundation/ace/ace_engine_lite/brandy-native-js-fd230_user/libace_http.a [deleted file]
code/sdk/open_source/openharmony/foundation/ace/ace_engine_lite/brandy-native-js-fd230_user/libnetstack_http.a [deleted file]
code/sdk/open_source/openharmony/foundation/ace/ace_engine_lite/brandy-native-js-fd230_user/libwebsocket.a [deleted file]
code/sdk/open_source/openharmony/foundation/ace/ace_engine_lite/brandy-native-js-fd272/libace.a [deleted file]
code/sdk/open_source/openharmony/foundation/ace/ace_engine_lite/brandy-native-js-fd272/libace_http.a [deleted file]
code/sdk/open_source/openharmony/foundation/ace/ace_engine_lite/brandy-native-js-fd272/libnetstack_http.a [deleted file]
code/sdk/open_source/openharmony/foundation/ace/ace_engine_lite/brandy-native-js-fd272/libwebsocket.a [deleted file]
code/sdk/open_source/openharmony/foundation/ace/ace_engine_lite/brandy-native-js-ln/libace.a [deleted file]
code/sdk/open_source/openharmony/foundation/ace/ace_engine_lite/brandy-native-js-ln/libace_http.a [deleted file]
code/sdk/open_source/openharmony/foundation/ace/ace_engine_lite/brandy-native-js-ln/libnetstack_http.a [deleted file]
code/sdk/open_source/openharmony/foundation/ace/ace_engine_lite/brandy-native-js-ln/libwebsocket.a [deleted file]
code/sdk/open_source/openharmony/foundation/ace/ace_engine_lite/brandy-native-js-lnppp/libace.a [deleted file]
code/sdk/open_source/openharmony/foundation/ace/ace_engine_lite/brandy-native-js-lnppp/libace_http.a [deleted file]
code/sdk/open_source/openharmony/foundation/ace/ace_engine_lite/brandy-native-js-lnppp/libnetstack_http.a [deleted file]
code/sdk/open_source/openharmony/foundation/ace/ace_engine_lite/brandy-native-js-lnppp/libwebsocket.a [deleted file]
code/sdk/open_source/openharmony/foundation/ace/ace_engine_lite/brandy-native-js-n9/libace.a
code/sdk/open_source/openharmony/foundation/ace/ace_engine_lite/brandy-native-js-n9/libace_ble.a [new file with mode: 0644]
code/sdk/open_source/openharmony/foundation/ace/ace_engine_lite/brandy-native-js-n9/libace_ext.a [new file with mode: 0644]
code/sdk/open_source/openharmony/foundation/ace/ace_engine_lite/brandy-native-js-n9/libace_http.a
code/sdk/open_source/openharmony/foundation/ace/ace_engine_lite/brandy-native-js-n9/libace_websocket.a [new file with mode: 0644]
code/sdk/open_source/openharmony/foundation/ace/ace_engine_lite/brandy-native-js-n9/libnetstack_http.a
code/sdk/open_source/openharmony/foundation/ace/ace_engine_lite/brandy-native-js-n9/libwebsocket.a
code/sdk/open_source/openharmony/foundation/ace/ace_engine_lite/brandy-native-js-n9ln/libace.a [deleted file]
code/sdk/open_source/openharmony/foundation/ace/ace_engine_lite/brandy-native-js-n9ln/libace_http.a [deleted file]
code/sdk/open_source/openharmony/foundation/ace/ace_engine_lite/brandy-native-js-n9ln/libnetstack_http.a [deleted file]
code/sdk/open_source/openharmony/foundation/ace/ace_engine_lite/brandy-native-js-n9ln/libwebsocket.a [deleted file]
code/sdk/open_source/openharmony/foundation/ace/ace_engine_lite/modules/calendarManager/event_id_manager.cpp
code/sdk/open_source/openharmony/foundation/ace/ace_engine_lite/modules/netstack/http/internal/http_opts.h
code/sdk/open_source/openharmony/foundation/ace/ace_engine_lite/modules/network/connection_manage/connection_manage.cpp
code/sdk/open_source/openharmony/foundation/ace/ace_engine_lite/modules/router_module.cpp
code/sdk/open_source/openharmony/foundation/ace/ace_engine_lite/modules/watchface/watchface_module.h
code/sdk/open_source/openharmony/foundation/appexecfwk/appexecfwk_lite/brandy-native-js-n9/libbms.a
code/sdk/open_source/openharmony/third_party/jerryscript/brandy-native-js-fd230/libjerryscript.a [deleted file]
code/sdk/open_source/openharmony/third_party/jerryscript/brandy-native-js-fd230_user/libjerryscript.a [deleted file]
code/sdk/open_source/openharmony/third_party/jerryscript/brandy-native-js-fd272/libjerryscript.a [deleted file]
code/sdk/open_source/openharmony/third_party/jerryscript/brandy-native-js-ln/libjerryscript.a [deleted file]
code/sdk/open_source/openharmony/third_party/jerryscript/brandy-native-js-lnppp/libjerryscript.a [deleted file]
code/sdk/open_source/openharmony/third_party/jerryscript/brandy-native-js-n9/libjerryscript.a
code/sdk/open_source/openharmony/third_party/lwip/lwip_v2.1.3/src/core/init.c
code/sdk/zhihui/4g/cat1Service/Service/cat1_utils.c
code/sdk/zhihui/utils/custom_utils_at_cmd.c
code/sdk/zhihui/websocket/src/zhihui_websocket.c

index 1680093..92a47bd 100644 (file)
@@ -44,7 +44,6 @@ set(PRIVATE_HEADER
     ${ROOT_DIR}/zhihui/4g/cat1Service/include
     ${ROOT_DIR}/zhihui/4g/cat1Service/Service
     ${ROOT_DIR}/zhihui/4gTest
-    ${ROOT_DIR}/zhihui/leiniao/imsl_ln/
 )
 
 set(PUBLIC_HEADER
index ad4b871..b4d4bbe 100644 (file)
@@ -172,6 +172,7 @@ static void sample_gfx_init(void)
     cst92xx_host_init_sample();\r
 #else\r
     ztw523_host_init_sample();\r
+#endif\r
 #endif\r
     ext_errno ret = uapi_lcd_init();\r
     if (ret != EXT_ERR_SUCCESS) {\r
diff --git a/code/sdk/application/wearable/evb/auto_ota/auto_ota_service.c b/code/sdk/application/wearable/evb/auto_ota/auto_ota_service.c
new file mode 100644 (file)
index 0000000..692202e
--- /dev/null
@@ -0,0 +1,603 @@
+/**
+ * Copyright (c) CompanyNameMagicTag 2021-2022. All rights reserved.
+ * Description: Power display service.
+ * Author:
+ * Create:
+ */
+
+#include <soc_osal.h>
+#include <osal_list.h>
+#include <securec.h>
+#include "cmsis_os2.h"
+#include "systick.h"
+#include "soc_errno.h"
+#include "common_def.h"
+#include "bts_def.h"
+#include "bts_br_gap.h"
+#include "oal_interface.h"
+#include "wearable_log.h"
+#include "local_device_manager.h"
+#include "remote_device_manager.h"
+#include "spp_service.h"
+#include "bts_spp.h"
+#include "btsrv_log.h"
+#include "bts_feature.h"
+#include "auto_ota_service.h"
+#include "msg_center_ota.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define AUTO_OTA_RETRY_TIMES 5
+#define AUTO_OTA_SEM_TIMEOUT (60*60*1000) /* 等待信号量超时时间,考虑资源大包传输时间长场景 */
+#define AUTO_OTA_DELAY_MS 100
+#define AUTO_OTA_SPP_TASK_STACK_SIZE 2048
+#define AUTO_OTA_SPP_TASK_PRI 20
+#define ADDR_MAC_LEN 6
+#define AUTO_OTA_RECORD_DEV_MAX_NUM 200 /* 设计成客户可定制 */
+#define AUTO_OTA_SCAN_WAIT_TIME  (25*1000) /* 客户可定制 */
+#define AUTO_OTA_UPDATE_RSSI_WAIT_TIME  (20*1000) /* 客户可定制 */
+#define AUTO_OTA_INQUERY_DEV_NUM   20 /* 客户可定制 */
+#define AUTO_OTA_OPRATE_DELAY_MS (2*1000) /* 客户可定制 */
+#define AUTO_OTA_ACL_CONN_DELAY (6*1000) /* 客户可定制 */
+#define AUTO_OTA_SPP_RECONN_TIMEOUT 10000 /* 客户可定制 */
+#define AUTO_OTA_WAIT_PREPARE_TIMEOUT (2 * 1000) /* 客户可定制, 用于更换升级包场景 */
+#define AUTO_OTA_DEV_NAME_PREFIX "Watch" /* 客户基于自己产品定义修改bt name前缀,用于黑名单管理 */
+#define AUTO_OTA_DEV_NAME_PREFIX_LEN 5
+#define AUTO_OTA_DST_UPG_VER_PATH "/user/dst_ver.txt"
+
+bool g_auto_ota_found_list_init = false;
+struct osal_list_head g_auto_ota_found_dev_list_head;
+osSemaphoreId_t g_auto_ota_transmit_done_sem = NULL;
+uint8_t g_auto_ota_upload_mode = 0; /* 默认是0,不阻塞auto_ota */
+uint8_t g_auto_ota_mac_tmp[ADDR_MAC_LEN] = {0};
+static bool g_anti_back_link_flag = false;
+
+typedef struct auto_ota_record_dev {
+    uint8_t addr[ADDR_MAC_LEN];   /* mac地址 */
+    uint8_t has_been_updated; /* 标记是否已经升级 */
+    uint8_t reserved;         /* 对齐 */
+} auto_ota_record_dev_t;
+
+static auto_ota_record_dev_t g_auto_ota_record_dev[AUTO_OTA_RECORD_DEV_MAX_NUM];
+
+typedef struct {
+    struct osal_list_head node;
+    bd_addr_t bd_addr;
+    uint8_t name[BD_NAME_LEN];
+    int32_t cod;
+    int32_t rssi;
+} auto_ota_found_dev_list_node;
+
+typedef struct {
+    uint32_t sample_mode;
+    spp_create_socket_para_t socket_params;
+    bd_addr_t addr;
+} auto_ota_spp_connect_task_params;
+
+/* 数据管理 */
+void auto_ota_dev_init(void)
+{
+    for (uint8_t i = 0; i < AUTO_OTA_RECORD_DEV_MAX_NUM; i++) {
+        (void)memset_s(&g_auto_ota_record_dev[i], sizeof(auto_ota_record_dev_t), 0, sizeof(auto_ota_record_dev_t));
+    }
+    return;
+}
+
+void auto_ota_dev_add(uint8_t *addr)
+{
+    for (uint16_t i = 0; i < AUTO_OTA_RECORD_DEV_MAX_NUM; i++) {
+        if (g_auto_ota_record_dev[i].has_been_updated == 0) {
+            (void)memcpy_s(g_auto_ota_record_dev[i].addr, ADDR_MAC_LEN, addr, ADDR_MAC_LEN);
+            g_auto_ota_record_dev[i].has_been_updated = 1;
+            WEARABLE_LOGI(WEARABLE_LOG_MODULE_MSG_CENTER, "to add record dev_mac : ****%02x%02x%02x%02x\r\n",
+                g_auto_ota_record_dev[i].addr[3], g_auto_ota_record_dev[i].addr[2], g_auto_ota_record_dev[i].addr[1],
+                g_auto_ota_record_dev[i].addr[0]);
+            WEARABLE_LOGI(WEARABLE_LOG_MODULE_MSG_CENTER, "alloc index = %d\r\n", i);
+            return;
+        }
+    }
+}
+
+bool auto_ota_dev_del(uint8_t *addr)
+{
+    for (uint16_t i = 0; i < AUTO_OTA_RECORD_DEV_MAX_NUM; i++) {
+        if (g_auto_ota_record_dev[i].has_been_updated == 1 &&
+            memcmp(g_auto_ota_record_dev[i].addr, addr, ADDR_MAC_LEN) == 0) {
+            WEARABLE_LOGI(WEARABLE_LOG_MODULE_MSG_CENTER, "found! to del record dev_mac : ****%02x%02x%02x%02x\r\n",
+                g_auto_ota_record_dev[i].addr[3], g_auto_ota_record_dev[i].addr[2], g_auto_ota_record_dev[i].addr[1],
+                g_auto_ota_record_dev[i].addr[0]);
+            WEARABLE_LOGI(WEARABLE_LOG_MODULE_MSG_CENTER, "free index = %d\r\n", i);
+            (void)memset_s(g_auto_ota_record_dev[i].addr, ADDR_MAC_LEN, 0, ADDR_MAC_LEN);
+            g_auto_ota_record_dev[i].has_been_updated = 0;
+            return true;
+        }
+    }
+
+    WEARABLE_LOGI(WEARABLE_LOG_MODULE_MSG_CENTER, "dev_del: no found dev_mac.\r\n");
+    return false;
+}
+
+bool auto_ota_dev_found(uint8_t *addr)
+{
+    for (uint16_t i = 0; i < AUTO_OTA_RECORD_DEV_MAX_NUM; i++) {
+        if (g_auto_ota_record_dev[i].has_been_updated == 1 &&
+            memcmp(g_auto_ota_record_dev[i].addr, addr, ADDR_MAC_LEN) == 0) {
+            WEARABLE_LOGI(WEARABLE_LOG_MODULE_MSG_CENTER, "no need to record dev_mac: ****%02x%02x%02x%02x\r\n",
+                g_auto_ota_record_dev[i].addr[3], g_auto_ota_record_dev[i].addr[2], g_auto_ota_record_dev[i].addr[1],
+                g_auto_ota_record_dev[i].addr[0]);
+            WEARABLE_LOGI(WEARABLE_LOG_MODULE_MSG_CENTER, "taken index = %d\r\n", i);
+            return true;
+        }
+    }
+    return false;
+}
+
+void auto_ota_dev_show(void)
+{
+    WEARABLE_LOGI(WEARABLE_LOG_MODULE_MSG_CENTER, "auto_ota total dev info :");
+    for (uint16_t i = 0; i < AUTO_OTA_RECORD_DEV_MAX_NUM; i++) {
+        if (g_auto_ota_record_dev[i].has_been_updated == 1) {
+            WEARABLE_LOGI(WEARABLE_LOG_MODULE_MSG_CENTER, "already record dev_mac : ****%02x%02x%02x%02x\r\n",
+                g_auto_ota_record_dev[i].addr[3], g_auto_ota_record_dev[i].addr[2], g_auto_ota_record_dev[i].addr[1],
+                g_auto_ota_record_dev[i].addr[0]);
+            WEARABLE_LOGI(WEARABLE_LOG_MODULE_MSG_CENTER, "taken index = %d\r\n", i);
+        }
+    }
+}
+
+/* 黑名单处理 */
+static bool auto_ota_dev_check_dev_name(unsigned char *dev_name)
+{
+    if (strncmp((const char *)dev_name, AUTO_OTA_DEV_NAME_PREFIX, AUTO_OTA_DEV_NAME_PREFIX_LEN) == 0) {
+        return true;
+    } else {
+        return false;
+    }
+}
+
+/* 重置发现设备链表 */
+void auto_ota_reset_found_dev_list(void)
+{
+    if (!g_auto_ota_found_list_init) {
+        g_auto_ota_found_list_init = true;
+        OSAL_INIT_LIST_HEAD(&g_auto_ota_found_dev_list_head);
+        return;
+    }
+
+    while (osal_list_empty(&g_auto_ota_found_dev_list_head) == false) {
+        struct osal_list_head *node = g_auto_ota_found_dev_list_head.next;
+        osal_list_del(node);
+        oal_mem_free(node);
+    }
+}
+
+bool auto_ota_bt_start_discovery(void)
+{
+    auto_ota_reset_found_dev_list();
+    (void)gap_br_set_inquiry_paramters(0, AUTO_OTA_INQUERY_DEV_NUM);
+    for (uint8_t i = 0; i < AUTO_OTA_RETRY_TIMES; i++) {
+        bool res = gap_br_start_discovery();
+        if (res != true) {
+            osDelay(AUTO_OTA_DELAY_MS);
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_MSG_CENTER, "gap_br_start_discovery fail.\r\n");
+            continue;
+        } else {
+            WEARABLE_LOGI(WEARABLE_LOG_MODULE_MSG_CENTER, "gap_br_start_discovery succ.\r\n");
+            return true;
+        }
+    }
+    return false;
+}
+
+/* 新增节点 */
+static void auto_ota_add_node_to_found_dev_list(const bd_addr_t *bd_addr, const uint8_t *name, int32_t cod, int32_t rssi)
+{
+    WEARABLE_LOGI(WEARABLE_LOG_MODULE_MSG_CENTER, "auto_ota_add_node, addr: ****%02x%02x%02x%02x, name: %s",
+        bd_addr->addr[3], bd_addr->addr[2], bd_addr->addr[1], bd_addr->addr[0], name); /* addr下标 0 1 2 3 */
+
+    auto_ota_found_dev_list_node *node =
+        (auto_ota_found_dev_list_node *)(void *)oal_mem_alloc(sizeof(auto_ota_found_dev_list_node));
+    if (node == NULL) {
+        return;
+    }
+    (void)memset_s(node, sizeof(auto_ota_found_dev_list_node), 0, sizeof(auto_ota_found_dev_list_node));
+
+    if (memcpy_s(&node->bd_addr, sizeof(node->bd_addr), bd_addr, sizeof(bd_addr_t)) != EOK) {
+        oal_mem_free(node);
+        return;
+    }
+
+    if (memcpy_s(node->name, sizeof(node->name), name, BD_NAME_LEN) != EOK) {
+        oal_mem_free(node);
+        return;
+    }
+
+    node->cod = cod;
+    node->rssi = rssi;
+    osal_list_add_tail((struct osal_list_head *)node, &g_auto_ota_found_dev_list_head);
+}
+
+static void auto_ota_sort_found_dev_list(void)
+{
+    struct osal_list_head *list_head = &g_auto_ota_found_dev_list_head;
+
+    for (struct osal_list_head *node1 = list_head->next; node1 != NULL && node1 != list_head; node1 = node1->next) {
+        auto_ota_found_dev_list_node *dev_info1 = (auto_ota_found_dev_list_node *)node1;
+        for (struct osal_list_head *node2 = node1->next; node2 != NULL && node2 != list_head; node2 = node2->next) {
+            auto_ota_found_dev_list_node *dev_info2 = (auto_ota_found_dev_list_node *)node2;
+
+            /* rssi大的在前 */
+            if (dev_info1->rssi >= dev_info2->rssi) {
+                continue;
+            }
+
+            /* 交换两个节点的信息 */
+            auto_ota_found_dev_list_node tmp_node;
+            uint32_t ret =
+                (uint32_t)memcpy_s(&tmp_node, sizeof(tmp_node), dev_info1, sizeof(auto_ota_found_dev_list_node));
+            ret |= (uint32_t)memcpy_s(&dev_info1->bd_addr,
+                sizeof(auto_ota_found_dev_list_node) - sizeof(struct osal_list_head),
+                &dev_info2->bd_addr,
+                sizeof(auto_ota_found_dev_list_node) - sizeof(struct osal_list_head));
+            ret |= (uint32_t)memcpy_s(&dev_info2->bd_addr,
+                sizeof(auto_ota_found_dev_list_node) - sizeof(struct osal_list_head),
+                &tmp_node.bd_addr,
+                sizeof(auto_ota_found_dev_list_node) - sizeof(struct osal_list_head));
+            if (ret != EOK) {
+                WEARABLE_LOGE(WEARABLE_LOG_MODULE_MSG_CENTER, "swap fail %x\n", ret);
+            }
+        }
+    }
+}
+
+/* 异步返回,更新RSSI */
+static void auto_ota_update_found_dev_node_rssi(const bd_addr_t *bd_addr, int32_t rssi)
+{
+    struct osal_list_head *list_head = &g_auto_ota_found_dev_list_head;
+    struct osal_list_head *node = list_head->next;
+
+    WEARABLE_LOGI(WEARABLE_LOG_MODULE_MSG_CENTER,"will update rssi, addr: ****%02x%02x%02x%02x, rssi = %d\n",
+        bd_addr->addr[3], bd_addr->addr[2], bd_addr->addr[1], bd_addr->addr[0], rssi); /* addr下标 0 1 2 3 */
+
+    while (node != NULL && node != list_head) {
+        auto_ota_found_dev_list_node *dev_info = (auto_ota_found_dev_list_node *)node;
+        if (memcmp(dev_info->bd_addr.addr, bd_addr->addr, BD_ADDR_LEN) == 0) {
+            dev_info->rssi = rssi;
+            return;
+        }
+
+        node = node->next;
+    }
+}
+
+static void auto_ota_gap_read_remote_rssi_event_callback(const bd_addr_t *bd_addr, int rssi, int status)
+{
+    WEARABLE_LOGI(WEARABLE_LOG_MODULE_MSG_CENTER,
+        " addr: ****%02x%02x%02x%02x rssi: %d status: %d\n",
+        bd_addr->addr[3], bd_addr->addr[2], /* addr下标 2 3 */
+        bd_addr->addr[1], bd_addr->addr[0], rssi, status); /* addr下标 0 1 */
+
+    if (status == ERRCODE_BT_SUCCESS) {
+        auto_ota_update_found_dev_node_rssi(bd_addr, rssi);
+    }
+}
+
+static bool auto_ota_get_top_dev_to_connect(void)
+{
+    struct osal_list_head *list_head = &g_auto_ota_found_dev_list_head;
+    uint8_t blank_addr[ADDR_MAC_LEN] = {0};
+
+    for (struct osal_list_head *node = list_head->next; node != NULL && node != list_head; node = node->next) {
+        auto_ota_found_dev_list_node *dev_info = (auto_ota_found_dev_list_node *)node;
+        if (memcmp(dev_info->bd_addr.addr, blank_addr, ADDR_MAC_LEN) == 0) {
+            WEARABLE_LOGI(WEARABLE_LOG_MODULE_MSG_CENTER, "ignore zero addr, name: %s\n", dev_info->name);
+            continue;
+        }
+        WEARABLE_LOGI(WEARABLE_LOG_MODULE_MSG_CENTER,
+                "plan to connect addr: ****%02x%02x%02x%02x name: \"%s\" cod: %x rssi: %d\n",
+                dev_info->bd_addr.addr[3], dev_info->bd_addr.addr[2], /* addr下标 3 2 */
+                dev_info->bd_addr.addr[1], dev_info->bd_addr.addr[0], /* addr下标 1 0 */
+                dev_info->name,
+                dev_info->cod,
+                dev_info->rssi);
+
+        for (uint8_t i = 0; i < AUTO_OTA_RETRY_TIMES; i++) {
+            if (gap_connect_remote_device(&(dev_info->bd_addr)) != true) {
+                WEARABLE_LOGI(WEARABLE_LOG_MODULE_MSG_CENTER, "to connect acl fail\r\n");
+                osDelay(100);
+            } else {
+                osDelay(AUTO_OTA_ACL_CONN_DELAY);
+                WEARABLE_LOGI(WEARABLE_LOG_MODULE_MSG_CENTER, "to connect acl succ\r\n");
+                return true;
+            }
+        }
+    }
+    WEARABLE_LOGI(WEARABLE_LOG_MODULE_MSG_CENTER, "no found_device\n");
+    return false;
+}
+
+static void auto_ota_discovery_result_callback(const bd_addr_t *bd_addr)
+{
+    unsigned char length = BD_NAME_LEN;
+    unsigned char *device_name = (unsigned char *)(void *)oal_mem_alloc(length);
+    if (device_name == NULL) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_MSG_CENTER, "gap_discovery_result_callback malloc error!\n");
+        return;
+    }
+    (void)memset_s(device_name, length, 0, length);
+
+    bool ret1 = gap_get_device_name(bd_addr, device_name, &length);
+    int cod = gap_get_device_class(bd_addr);
+    bool ret2 = gap_read_remote_rssi_value(bd_addr);
+
+    if (auto_ota_dev_found(bd_addr->addr) != true && auto_ota_dev_check_dev_name(device_name) == true) {
+        auto_ota_add_node_to_found_dev_list(bd_addr, device_name, cod, 0);
+    }
+
+    return;
+}
+
+static bool auto_ota_upg_check(void)
+{
+    errcode_t ret = ERRCODE_SUCC;
+
+    /* 目标版本从文件读取,方便客户每次推送不同版本 */
+    FILE *fp = NULL;
+
+    fp = fopen(AUTO_OTA_DST_UPG_VER_PATH, "rb");
+    if (fp == NULL) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_MSG_CENTER, "open %s fail.\r\n", AUTO_OTA_DST_UPG_VER_PATH);
+        return false;
+    }
+
+    fseek(fp, 0L, SEEK_END);
+    long file_len = ftell(fp);
+    char *dst_ver = (char *)malloc(sizeof(char) * (file_len + 1));
+    if (dst_ver == NULL) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_MSG_CENTER, "malloc fail, file_len = %d.\r\n", file_len);
+        fclose(fp);
+        return false;
+    }
+
+    fseek(fp, 0L, SEEK_SET);
+    if (fread(dst_ver, file_len, 1, fp) != 1) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_MSG_CENTER, "fread fail, file_len = %d.\r\n", file_len);
+        fclose(fp);
+        free(dst_ver);
+        dst_ver = NULL;
+        return false;
+    }
+    fclose(fp);
+    dst_ver[file_len] = '\0';
+
+    WEARABLE_LOGI(WEARABLE_LOG_MODULE_MSG_CENTER, "dst_ver = %s, file_len = %d.\r\n", dst_ver, file_len);
+
+    ret = msg_center_send_data(MSGCENTER_CMD_OTA, MSGCENTER_TYPE_ID_OTA_UPG_CHECK, dst_ver, strlen(dst_ver));
+    if (ret != ERRCODE_SUCC) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_MSG_CENTER, "send upgrade version check fail, ret = %d\r\n", ret);
+        free(dst_ver);
+        dst_ver = NULL;
+        return false;
+    }
+
+    free(dst_ver);
+    dst_ver = NULL;
+    return true;
+}
+
+static int auto_ota_spp_client_connect_task_body(void *data)
+{
+    auto_ota_spp_connect_task_params *task_params = (auto_ota_spp_connect_task_params *)data;
+    spp_create_socket_para_t *socket_param = &task_params->socket_params;
+
+    int ret = spp_connect(socket_param, &task_params->addr);
+    WEARABLE_LOGI(WEARABLE_LOG_MODULE_MSG_CENTER, "spp_connect ret: %x\n", ret);
+
+    oal_mem_free(data);
+    return OSAL_SUCCESS;
+}
+
+/* client连接server */
+bool auto_ota_spp_connect(const char *spp_uuid, const bd_addr_t *addr)
+{
+    uint8_t uuid_len = (uint8_t)strlen(spp_uuid);
+    auto_ota_spp_connect_task_params *task_params =
+        (auto_ota_spp_connect_task_params *)oal_mem_alloc(sizeof(auto_ota_spp_connect_task_params));
+
+    if (generate_uuid_from_string(spp_uuid, uuid_len + 1, &task_params->socket_params.uuid) != EXT_ERR_SUCCESS) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_MSG_CENTER, "generate uuid fail\n");
+        return false;
+    }
+
+    task_params->sample_mode = 0;
+    task_params->socket_params.socket_type = SPP_SOCKET_RFCOMM;
+    task_params->socket_params.is_encrypt = true;
+    (void)memcpy_s(&(task_params->addr.addr), BD_ADDR_LEN, addr->addr, BD_ADDR_LEN);
+
+    osal_task *task = osal_kthread_create(auto_ota_spp_client_connect_task_body, task_params,
+        "auto_ota_spp_client_connect_task", AUTO_OTA_SPP_TASK_STACK_SIZE);
+    if (task == NULL) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_MSG_CENTER, "create task fail\n");
+        return false;
+    }
+    int ret = osal_kthread_set_priority(task, AUTO_OTA_SPP_TASK_PRI);
+    if (ret != OSAL_SUCCESS) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_MSG_CENTER, "set pri error: %08x\n", ret);
+    }
+
+    WEARABLE_LOGI(WEARABLE_LOG_MODULE_MSG_CENTER, "create task success.\n");
+
+    bool is_connected = false;
+    uint64_t start_time = uapi_tcxo_get_ms();
+    uint64_t current_time;
+    while (is_connected == false) {
+        is_connected = is_spp_connected(0);
+        osDelay(AUTO_OTA_OPRATE_DELAY_MS);
+        WEARABLE_LOGI(WEARABLE_LOG_MODULE_MSG_CENTER, "spp reconnecting.\r\n");
+        current_time = uapi_tcxo_get_ms();
+        if (current_time - start_time > AUTO_OTA_SPP_RECONN_TIMEOUT || is_connected == true) {
+            WEARABLE_LOGI(WEARABLE_LOG_MODULE_MSG_CENTER, "spp connect %s.\r\n", is_connected == true ? "Succ" : "Fail");
+            break;
+        }
+    }
+
+    /* 升级版本号校验 */
+    bool res = auto_ota_upg_check();
+    if (res != true) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_MSG_CENTER, "auto_ota_upg_check fail.\n");
+        return false;
+    }
+
+    return true;
+}
+
+static void auto_ota_acl_state_changed_callback(const bd_addr_t *bd_addr, gap_acl_state_t state, unsigned int reason)
+{
+    WEARABLE_LOGI(WEARABLE_LOG_MODULE_MSG_CENTER, "acl cb, state %d, reason %x", state, reason);
+    WEARABLE_LOGI(WEARABLE_LOG_MODULE_MSG_CENTER, "addr: ****%02x%02x%02x%02x",
+        bd_addr->addr[3], bd_addr->addr[2], bd_addr->addr[1], bd_addr->addr[0]); /* mac下标 0 1 2 3 */
+    char uuid[] = {"1101"};
+    if (state == GAP_ACL_STATE_CONNECTED) {
+        if (g_anti_back_link_flag == true) {
+            WEARABLE_LOGI(WEARABLE_LOG_MODULE_MSG_CENTER, "anti back link addr: ****%02x%02x%02x%02x",
+                bd_addr->addr[3], bd_addr->addr[2], bd_addr->addr[1], bd_addr->addr[0]); /* mac下标 0 1 2 3 */
+            return;
+        }
+        bool res = auto_ota_spp_connect(uuid, bd_addr);
+        if (res != true) {
+            (void)osSemaphoreRelease(g_auto_ota_transmit_done_sem);
+            return;
+        }
+        /* spp trans回调中释放信号量最准确,故此处临时记录mac地址 */
+        (void)memcpy_s(g_auto_ota_mac_tmp, ADDR_MAC_LEN, (const char *)bd_addr->addr, ADDR_MAC_LEN);
+        g_anti_back_link_flag = true;
+    }
+}
+
+void auto_ota_gap_register_callbacks(void)
+{
+    gap_call_backs_t cb = {
+        NULL,
+        auto_ota_acl_state_changed_callback,
+        NULL,
+        NULL,
+        NULL,
+        NULL,
+        NULL,
+        NULL,
+        NULL,
+        auto_ota_discovery_result_callback,
+        NULL,
+        NULL,
+        NULL,
+        NULL,
+        NULL,
+        auto_ota_gap_read_remote_rssi_event_callback,
+        NULL
+    };
+    (void)gap_register_callbacks(&cb);
+}
+
+errcode_t auto_ota_enable_bt(void)
+{
+#if defined(SW_UART_DEBUG) || defined(SW_RTT_DEBUG)
+    g_bth_log_type_level = 0xFF2; /* BTSRV_LOG_UART_INFO */
+#endif
+    bts_feature_t feature = {0};
+    feature.bt_auto_reconnect_closed = 1;
+
+    auto_ota_gap_register_callbacks();
+    bts_set_features(&feature); /* 关闭client回链 */
+    errcode_t res = enable_bt_stack();
+    if (res != 0) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_MSG_CENTER, "bt enable fail, ret = %d\r\n", res);
+        return ERRCODE_FAIL;
+    } else {
+        WEARABLE_LOGI(WEARABLE_LOG_MODULE_MSG_CENTER, "bt enable ok\r\n");
+        return ERRCODE_SUCC;
+    }
+}
+
+void auto_ota_task_init(void)
+{
+    g_auto_ota_transmit_done_sem = osSemaphoreNew(1, 0, NULL);
+    if (!g_auto_ota_transmit_done_sem) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_MSG_CENTER, "sem creat fail!\r\n");
+        return;
+    }
+}
+
+void auto_ota_task_main(void)
+{
+    errcode_t ret;
+
+    auto_ota_dev_init();
+    auto_ota_task_init();
+
+    if (auto_ota_enable_bt() != ERRCODE_SUCC) {
+        return;
+    }
+
+    while (1) {
+        if (g_auto_ota_upload_mode == 1) {
+            WEARABLE_LOGI(WEARABLE_LOG_MODULE_MSG_CENTER, "enter upload fwpkg mode, auto_ota not run!\r\n");
+            osDelay(AUTO_OTA_WAIT_PREPARE_TIMEOUT);
+            continue;
+        }
+
+        /* 保证最开始不会有配对信息回连,可能导致B核wait等回连 */
+        if (gap_remove_all_pairs() != true) {
+            osDelay(AUTO_OTA_DELAY_MS);
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_MSG_CENTER, "remove all pairs fail, auto retry...\r\n");
+            continue;
+        }
+        osDelay(AUTO_OTA_OPRATE_DELAY_MS);
+        WEARABLE_LOGI(WEARABLE_LOG_MODULE_MSG_CENTER, "gap_remove_all_pairs ok\r\n");
+
+        /* scan */
+        if (auto_ota_bt_start_discovery() != true) {
+            osDelay(AUTO_OTA_DELAY_MS);
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_MSG_CENTER, "start discovery fail, auto retry...\r\n");
+            continue;
+        }
+
+        osDelay(AUTO_OTA_SCAN_WAIT_TIME); /* 保证能扫到设备 */
+
+        (void)gap_br_cancel_discovery();
+        osDelay(AUTO_OTA_UPDATE_RSSI_WAIT_TIME);
+        auto_ota_sort_found_dev_list(); /* 根据rssi降序排序 */
+        /* connect */
+        if (auto_ota_get_top_dev_to_connect() != true) {
+            osDelay(AUTO_OTA_DELAY_MS);
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_MSG_CENTER, "connect fail, auto retry...\r\n");
+            continue;
+        }
+
+        osSemaphoreAcquire(g_auto_ota_transmit_done_sem, AUTO_OTA_SEM_TIMEOUT);
+
+        /* clean, spp资源内部释放 */
+        spp_disconnect(0);
+        /* 删除配对时会disconnect ACL */
+        if (gap_remove_all_pairs() != true) {
+            osDelay(AUTO_OTA_DELAY_MS);
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_MSG_CENTER, "remove all pairs fail, auto retry...\r\n");
+            continue;
+        }
+        osDelay(AUTO_OTA_OPRATE_DELAY_MS);
+        WEARABLE_LOGI(WEARABLE_LOG_MODULE_MSG_CENTER, "gap_remove_all_pairs ok\r\n");
+
+        osDelay(AUTO_OTA_DELAY_MS);
+        auto_ota_dev_show();
+        memset_s(g_auto_ota_mac_tmp, sizeof(g_auto_ota_mac_tmp), 0, sizeof(g_auto_ota_mac_tmp));
+        g_anti_back_link_flag = false;
+        osDelay(AUTO_OTA_DELAY_MS);
+    }
+
+    return;
+}
+
+#ifdef __cplusplus
+}
+#endif
\ No newline at end of file
diff --git a/code/sdk/application/wearable/evb/ln/nativeapp/brandy-native-js-ln/libuikit_fwk.a b/code/sdk/application/wearable/evb/ln/nativeapp/brandy-native-js-ln/libuikit_fwk.a
deleted file mode 100644 (file)
index e3ce469..0000000
Binary files a/code/sdk/application/wearable/evb/ln/nativeapp/brandy-native-js-ln/libuikit_fwk.a and /dev/null differ
diff --git a/code/sdk/application/wearable/evb/ln/service/msg_center/brandy-native-js-ln/libmsg_center.a b/code/sdk/application/wearable/evb/ln/service/msg_center/brandy-native-js-ln/libmsg_center.a
deleted file mode 100644 (file)
index b1e105a..0000000
Binary files a/code/sdk/application/wearable/evb/ln/service/msg_center/brandy-native-js-ln/libmsg_center.a and /dev/null differ
index 63e56e8..7a01409 100644 (file)
@@ -27,12 +27,19 @@ set(SOURCES
     ${CMAKE_CURRENT_SOURCE_DIR}/src/AbilitySlice.cpp
     ${CMAKE_CURRENT_SOURCE_DIR}/src/NativeAbility.cpp
     ${CMAKE_CURRENT_SOURCE_DIR}/src/StartNative.cpp
+    ${CMAKE_CURRENT_SOURCE_DIR}/src/transition/ZoomOutTransition.cpp
     ${CMAKE_CURRENT_SOURCE_DIR}/src/transition/ZoomTransition.cpp
+    ${CMAKE_CURRENT_SOURCE_DIR}/src/transition/ThreeDFoldTransition.cpp
+    ${CMAKE_CURRENT_SOURCE_DIR}/src/transition/FadeInOutTransition.cpp
     ${CMAKE_CURRENT_SOURCE_DIR}/src/transition/HexagonsTransition.cpp
     ${CMAKE_CURRENT_SOURCE_DIR}/src/transition/BackToHexagonsTransition.cpp
     ${CMAKE_CURRENT_SOURCE_DIR}/src/transition/BackToWaterfallTransition.cpp
     ${CMAKE_CURRENT_SOURCE_DIR}/src/transition/WaterfallTransition.cpp
     ${CMAKE_CURRENT_SOURCE_DIR}/src/transition/EnterWaterfallTransition.cpp
+    ${CMAKE_CURRENT_SOURCE_DIR}/src/transition/TransparentGradientTransition.cpp
+    ${CMAKE_CURRENT_SOURCE_DIR}/src/transition/GaussianBlurTransition.cpp
+    ${CMAKE_CURRENT_SOURCE_DIR}/src/transition/CrossShapedTransition.cpp
+    ${CMAKE_CURRENT_SOURCE_DIR}/src/transition/BackToCrossShapedTransition.cpp
 )
 
 set(COMPONENT_PUBLIC_CCFLAGS
index f6a6877..f835734 100644 (file)
@@ -30,26 +30,56 @@ const static uint16_t gSliceInvalid = 0;
 const static uint16_t gPageInvalid = 0;
 const static uint16_t gSliceDefaultPriority = 4;  // 页面默认是最低优先级
 
+struct ExtralConfig {
+    uint16_t pageId;
+    TransitionType type;
+    bool enableSlideBack;
+};
+
+// 定义默认配置
+constexpr ExtralConfig DEFAULT_CONF = {gPageInvalid, TransitionType::TRANSITION_INVALID, false};
+
 class Ability {
 public:
     void AddSliceProxy(uint16_t sliceId, SliceProxy* proxy);
 
     /**
-     * @brief Switch to specified page in the current slice, matched page will be created, and current slice will not be
-     *        recreated. if slices or pages is being switched, this operation will be canceled
+     * @brief Switch to specified page in the current slice, target page will be created, and current slice will
+     *         not be recreated. if slices or pages is being switched, this operation will be canceled
      * @param pageId Indicates the specified id of the page in the current slice, it should not be zero
-     * @param data Indicates the data which will be transfered to next page, default value is nullptr
      * @param type Indicates Transition animation type, which is declared in TransitionType.h. The matched
      *        Transitioncallback should have params: enableCurrentSnapshot_ = false enableTargetSnapshot_ = false
-     * @param canBack Indicates whether current page should be cached and can be back from target page
+     * @param canBack Indicates whether current page will be cached or destroyed. if cached, can back from target page
+     * @param data Indicates the data which will be transfered to next page, default value is nullptr,
+     *        data can only be native C structures or basic data types
+     * @param dataLength Indicates the length of data
      * @return Returns <b>true</b> if the pages is switched successfully, returns <b>false</b> otherwise.
+     * @note It is recommended to call this method in the UI thread, and the event will be post into graphic event queue
+     */
+    bool SwitchPageInSlice(uint16_t pageId, TransitionType type = TransitionType::TRANSITION_INVALID,
+                           bool canBack = false, void* data = nullptr, uint16_t dataLength = 0);
+
+    /**
+     * @brief Back to previous cached page in the current slice, current page will be destroyed, and previous
+     *        cached page will be resumed. if slices or pages is being switched, this operation will be canceled
+     * @return Returns <b>true</b> if back to cached page successfully, returns <b>false</b> if no cached page.
+     * @note It is recommended to call this method in the UI thread, and the event will be post into graphic event queue
      */
-    bool SwitchPageInSlice(uint16_t pageId, void* data = nullptr,
-        TransitionType type = TransitionType::TRANSITION_INVALID, bool canBack = false);
+    bool BackToPrevSlicePage();
+
+    /**
+     * @brief Back to target cached page in the current slice, current page and the cached pages on the top of target
+     *        cached page will be destroyed, target cached page will be resumed. if slices or pages is being
+     *        switched, this operation will be canceled
+     * @param pageId Indicates the target page id in cached pages, it should not be zero
+     * @return Returns <b>true</b> if back to target cached page successfully, returns <b>false</b> otherwise.
+     * @note It is recommended to call this method in the UI thread, and the event will be post into graphic event queue
+     */
+    bool BackToCachedSlicePage(uint16_t pageId);
 
     /**
      * @brief Switch to specified slice. matched slice will be created.
-     *         1. If pageId is valid or default page is exist, matched page will also be created
+     *         1. If pageId is valid or default page exists, matched page will also be created
      *         2. If slices is being switched, this operation will be cached and run later.
      * @param sliceId Indicates the specified id of the slice
      * @param pageId Indicates the specified id of the slice, if pageId is invalid, default page will be used.
@@ -59,6 +89,15 @@ public:
     void SwitchSlice(uint16_t sliceId, uint16_t pageId = gPageInvalid,
         TransitionType type = TransitionType::TRANSITION_INVALID, bool enableSlideBack = false);
 
+    /**
+     * @brief Switch to specified slice. matched slice will be created.
+     *         1. If pageId is valid or default page exists, matched page will also be created
+     *         2. If slices is being switched, this operation will be cached and run later.
+     * @param config Indicates the extern config of the slice.
+     */
+    void SwitchSliceWithData(uint16_t sliceId, void* data, uint16_t dataLength,
+        const ExtralConfig& config = DEFAULT_CONF);
+
     /**
      * @brief Switch to specified slice. matched slice will be created.
      *         1. If default page is exist, default page will also be created
@@ -73,6 +112,8 @@ public:
     void ChangeSlice(uint16_t sliceId, TransitionType type = TransitionType::TRANSITION_INVALID,
         uint16_t priority = gSliceDefaultPriority, bool enableSlideBack = false);
 
+    void ChangeSliceToApplist();
+
     /**
      * @brief Get SlicePageManager of currrent slice. you can Use SlicePageManager to get page info in the slice.
      * @return Returns <b>nullptr</b> if slices is being switched, or js ability is running
@@ -141,10 +182,12 @@ public:
     void PauseSlice();
     void StopSliceTransition();
     void BackToPreSlice();
+    void EnterAod();
+    void ExitAod(uint32_t targetId);
 
 protected:
     // targetId consists of slice id and page id
-    void StartSlice(uint32_t targetId);
+    void StartSlice(uint32_t targetId, void* data = nullptr);
     void ResumeSliceWithoutJS();
     void StopSlice();
     Ability() = default;
@@ -172,10 +215,11 @@ protected:
 
     SliceStruct curSlice_;
     SliceStruct nextSlice_;
+    SliceStruct prevAodSlice_;
     uint32_t targetIdFromJS_ = 0;
     uint32_t defaultTargetId_ = gSliceInvalid;
     uint16_t curSlicePriority_ = gSliceDefaultPriority;
-    void PostChangeSlice(uint32_t targetId, TransitionType type);
+    void PostChangeSlice(uint32_t targetId, TransitionType type, void* data);
     Ability::ProxyStruct* Find(const uint16_t sliceId);
 };
 }
index 09a8c81..1e201d7 100644 (file)
@@ -35,7 +35,7 @@ public:
         : sliceId_(targetId & SLICE_MASK), view_(viewBase), presenter_(presenterBase),
           slicePageMgr_(targetId), state_(SliceState::UNINITIALIZED) {}
 
-    void OnStart() override;
+    void OnStart(void* data) override;
 
     void OnResume() override;
 
@@ -47,6 +47,10 @@ public:
 
     bool ChangeSlicePage(uint16_t pageId, void* data, TransitionType type, bool canBack);
 
+    bool BackToPrevSlicePage();
+
+    bool BackToCachedSlicePage(uint16_t pageId);
+
     SlicePageManager* GetSlicePageManger()
     {
         return &slicePageMgr_;
index 4cca1df..b7f3132 100644 (file)
@@ -14,6 +14,7 @@
 namespace OHOS {
 class BackDragListener : public UIView::OnDragListener {
 public:
+    static int16_t maxDragRegionX_;
     BackDragListener() = default;
     ~BackDragListener() override;
     bool OnDragStart(UIView& view, const DragEvent& event) override;
index 5b58fec..ab12b05 100644 (file)
@@ -154,7 +154,7 @@ private:
 #endif
     TransitionCaller transitionCaller_{TransitionCaller::INVALID};
     TransitionCaller slideBackCaller_{TransitionCaller::INVALID};
-    TransitionTarget slideBackTarget_{0};
+    TransitionTarget slideBackTarget_{{0, nullptr, 0}};
     bool isTransAnimNeeded_ = false;
     bool isCurrentSnapShotEnabled_ = false;
     bool isTargetSnapShotEnabled_ = false;
index b8cbc7a..b08e02f 100644 (file)
@@ -24,12 +24,17 @@ public:
     PresenterBase() : viewBase_(nullptr) {}
     virtual ~PresenterBase() = default;
 
+    /**
+     * @deprecated 推荐使用方法OnStart(void* data)
+     */
+    virtual void OnStart() {}
+
     /**
      * @brief Scheduled by slice when it is started and before transition animator starts if exsit
      *
      *        You can create non-ui resource and update ui based on Model data here
      */
-    virtual void OnStart() {}
+    virtual void OnStart(void* data) {}
 
     /**
      * @brief Scheduled by slice when it will be visiable and after transition animator ends if exsit
index 76e9598..588d535 100644 (file)
@@ -28,7 +28,7 @@ namespace OHOS {
 typedef struct {
     bool isNativeSlice; // true: native; false: js
     union {
-        uint32_t targetId;
+        uint32_t targetId; // sliceId + pageId
         char bundleName[RECENT_APP_BUNDLE_NAME_MAX_LEN];
     };
     ImageInfo* snapshot;
@@ -158,6 +158,11 @@ public:
      */
     uint32_t GetLoadingCnt();
 
+    /**
+     * @brief   Remove a native app with same sliceId. If pageId is same, file will be deleted as well.
+     */
+    bool RemoveNativeRecentApp(uint32_t targetId);
+
 private:
     RecentManager();
     virtual ~RecentManager();
index 047cc60..5d5640f 100644 (file)
@@ -30,7 +30,7 @@ public:
      *        Its system implemention is in the AbilitySlice, you can define your own processing logic by overriding
      *        Prenseter::OnStart And View::OnStart
      */
-    virtual void OnStart() = 0;
+    virtual void OnStart(void* data) = 0;
     /**
      * @brief Called when the slice will be visible and after transition animator ends if exits
      *
index 49dd1c7..f81896e 100644 (file)
@@ -27,6 +27,8 @@ public:
 
     void RegisterPage(uint16_t sliceId, uint16_t pageId, SlicePageProxyInterface* proxy, bool isMainPage);
 
+    void SetMainPage(uint16_t sliceId, uint16_t pageId);
+
 private:
     SlicePageFactory() {};
     ~SlicePageFactory() {};
@@ -64,6 +66,7 @@ public:
 };
 }
 
-#define REGIST_SLICE_PAGE(sliceId, pageId, V, isMainPage) \
-    const static OHOS::SlicePageRegister (STATIC_VAR)(sliceId, pageId, new OHOS::SlicePageProxy<V>(), isMainPage)
+#define REGIST_SLICE_PAGE(sliceId, pageId, V, isMainPage)      \
+    const static OHOS::SlicePageRegister(STATIC_VAR##sliceId)( \
+        sliceId, pageId, new OHOS::SlicePageProxy<V>(), isMainPage)
 #endif
\ No newline at end of file
index c69ef48..4308f30 100644 (file)
@@ -63,7 +63,9 @@ public:
         return ((animator_ != nullptr) && (animator_->GetState() != Animator::STOP));
     }
 
-    void BackToPrevSlicePage();
+    bool BackToPrevSlicePage();
+
+    bool BackToCachedSlicePage(uint16_t pageId);
 
     SlicePageManager(const SlicePageManager&) = delete;
     SlicePageManager& operator=(const SlicePageManager&) = delete;
index 0e894b4..70e14a9 100644 (file)
@@ -15,11 +15,18 @@ namespace OHOS {
 enum class TransitionType {
     TRANSITION_INVALID = 0,
     TRANSITION_ZOOM,
+    TRANSITION_ZOOM_OUT,
     TRANSITION_HEXAGONS,
     TRANSITION_BACK_TO_HEXAGONS,
     TRANSITION_WATERFALL,
     TRANSITION_BACK_TO_WATERFALL,
     TRANSITION_ENTER_WATERFALL,
+    TRANSITION_FADEINOUT,
+    TRANSITION_TRANSPARENT_GRADIENT,
+    TRANSITION_GAUSSIAN_BLUR,
+    TRANSITION_CROSS_SHAPED,
+    TRANSITION_BACK_TO_CROSS_SHAPED,
+    TRANSITION_3DFOLD,
     TRANSITION_MAX,
 };
 
@@ -35,8 +42,14 @@ enum class TransitionCaller {
     INVALID
 };
 
+typedef struct {
+    uint32_t sliceAndPageId;
+    void *data;
+    uint16_t dataLength;
+} SliceInfo;
+
 typedef union {
-    uint32_t sliceInfo; // The number of high 16 bits is priority, and the number of low 16 bits is slice id
+    SliceInfo sliceInfo; // The number of high 16 bits is priority, and the number of low 16 bits is slice id
 #ifdef JS_ENABLE
     Want* want;
     char* bundleName;
index 2079266..e91e6e4 100644 (file)
@@ -46,6 +46,11 @@ public:
         return backDragListener_;
     }
 
+    /**
+     * @deprecated 推荐使用方法OnStart(void* data)
+     */
+    virtual void OnStart() {}
+
     /**
      * @brief Scheduled by slice after funtion SetupView and before transition animator starts if exits.
      *
@@ -58,7 +63,7 @@ public:
      *            AddViewToRootContainer(label_); // add label_ into container
      *        }
      */
-    virtual void OnStart() {}
+    virtual void OnStart(void* data) {}
 
     /**
      * @brief Scheduled by slice after function TearDownView.
index 82e0d03..45c5ce8 100644 (file)
@@ -25,6 +25,9 @@
 #include "PageTransitionMgr.h"
 #include "gfx_utils/list.h"
 #include "AbilitySlice.h"
+#include "settings/model/SettingDesktopModel.h"
+#include "NativeAbility.h"
+#include "power_display_service.h"
 
 namespace OHOS {
 void Ability::AddSliceProxy(const uint16_t sliceId, SliceProxy* proxy)
@@ -42,7 +45,7 @@ void Ability::AddSliceProxy(const uint16_t sliceId, SliceProxy* proxy)
     allSlicesProxy_.PushBack(proxyPair);
 }
 
-void Ability::StartSlice(uint32_t targetId)
+void Ability::StartSlice(uint32_t targetId, void* data)
 {
     if (targetId <= gSliceInvalid) {
         return;
@@ -74,7 +77,7 @@ void Ability::StartSlice(uint32_t targetId)
         targetId >> PAGE_OFFSET, allSlices_.Size());
     nextSlice_.sliceId = sliceId;
     nextSlice_.slice = newSlice;
-    newSlice->OnStart();
+    newSlice->OnStart(data);
 }
 
 Ability::ProxyStruct* Ability::Find(const uint16_t sliceId)
@@ -119,7 +122,7 @@ void Ability::UpdateCurSlicePageId(uint16_t pageId)
     allSlices_[allSlices_.Size() - 1] = sliceId | (static_cast<uint32_t>(pageId) << PAGE_OFFSET);
 }
 
-bool Ability::SwitchPageInSlice(uint16_t pageId, void* data, TransitionType type, bool canBack)
+bool Ability::SwitchPageInSlice(uint16_t pageId, TransitionType type, bool canBack, void* data, uint16_t dataLength)
 {
     if (pageId == 0) {
         WEARABLE_LOGE(WEARABLE_LOG_MODULE_LAUNCHER_FWK, "page id should be valid but no zero");
@@ -129,39 +132,114 @@ bool Ability::SwitchPageInSlice(uint16_t pageId, void* data, TransitionType type
         WEARABLE_LOGW(WEARABLE_LOG_MODULE_LAUNCHER_FWK, "page can't be switched during transition");
         return false;
     }
+    if (!GraphicService::IsNativeUITask()) {
+        WEARABLE_LOGW(WEARABLE_LOG_MODULE_LAUNCHER_FWK, "SwitchPageInSlice is called not in ui task");
+        return false;
+    }
+    AbilitySlice* slice = dynamic_cast<AbilitySlice*>(curSlice_.slice);
+    if (slice == nullptr) {
+        WEARABLE_LOGW(WEARABLE_LOG_MODULE_LAUNCHER_FWK, "page can't be switched because current slice is nullptr");
+        return false;
+    }
+    void* sliceData = static_cast<void*>(UIMalloc(dataLength));
+    memcpy_s(sliceData, dataLength, data, dataLength);
+    GraphicService::GetInstance()->PostGraphicEvent([slice, pageId, sliceData, type, canBack]() {
+        slice->ChangeSlicePage(pageId, sliceData, type, canBack);
+        UIFree(sliceData);
+    });
+    return true;
+}
+
+bool Ability::BackToPrevSlicePage()
+{
+    if (PageTransitionMgr::GetInstance().IsTransitionRunning()) {
+        WEARABLE_LOGW(WEARABLE_LOG_MODULE_LAUNCHER_FWK, "page can't be switched during transition");
+        return false;
+    }
+    if (!GraphicService::IsNativeUITask()) {
+        WEARABLE_LOGW(WEARABLE_LOG_MODULE_LAUNCHER_FWK, "BackToPrevSlicePage is not called  in ui task");
+        return false;
+    }
     AbilitySlice* slice = dynamic_cast<AbilitySlice*>(curSlice_.slice);
     if (slice == nullptr) {
         WEARABLE_LOGW(WEARABLE_LOG_MODULE_LAUNCHER_FWK, "page can't be switched because current slice is nullptr");
         return false;
     }
-    return slice->ChangeSlicePage(pageId, data, type, canBack);
+    GraphicService::GetInstance()->PostGraphicEvent([slice]() {
+        slice->BackToPrevSlicePage();
+    });
+    return true;
+}
+
+bool Ability::BackToCachedSlicePage(uint16_t pageId)
+{
+    if (PageTransitionMgr::GetInstance().IsTransitionRunning()) {
+        WEARABLE_LOGW(WEARABLE_LOG_MODULE_LAUNCHER_FWK, "page can't be switched during transition");
+        return false;
+    }
+    if (!GraphicService::IsNativeUITask()) {
+        WEARABLE_LOGW(WEARABLE_LOG_MODULE_LAUNCHER_FWK, "BackToCachedSlicePage is not called in ui task");
+        return false;
+    }
+    AbilitySlice* slice = dynamic_cast<AbilitySlice*>(curSlice_.slice);
+    if (slice == nullptr) {
+        WEARABLE_LOGW(WEARABLE_LOG_MODULE_LAUNCHER_FWK, "page can't be switched because current slice is nullptr");
+        return false;
+    }
+    GraphicService::GetInstance()->PostGraphicEvent([slice, pageId]() {
+        slice->BackToCachedSlicePage(pageId);
+    });
+    return true;
 }
 
 void Ability::SwitchSlice(uint16_t sliceId, uint16_t pageId, TransitionType type, bool enableSlideBack)
 {
+    ExtralConfig config = {pageId, type, enableSlideBack};
+    SwitchSliceWithData(sliceId, nullptr, 0, config);
+}
+
+void Ability::SwitchSliceWithData(uint16_t sliceId, void* data, uint16_t dataLength, const ExtralConfig& config)
+{
+    if (sliceId == VIEW_AOD) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_LAUNCHER_FWK, "cannot enter aod by switch slice!");
+        return;
+    }
     if (Find(sliceId) == nullptr) {
         WEARABLE_LOGE(WEARABLE_LOG_MODULE_LAUNCHER_FWK, "slice %d is not registered", sliceId);
         return;
     }
+    const power_display_svr_api_t *display_api = power_display_svr_get_api();
+    screen_context_t *sc = power_display_get_screen_context();
+    if (sc != nullptr && display_api != nullptr && sc->current_state == SCREEN_ON) {
+        display_api->turn_on_screen();
+    }
 #ifdef JS_ENABLE
     ElementName *elementName = OHOS::AbilityMsClient::GetInstance().GetTopAbility();
     if (elementName != nullptr && strcmp(elementName->bundleName, "com.huawei.launcher") != 0) {
-        OHOS::AbilityMsClient::GetInstance().ForceStop(elementName->bundleName, type);
-        targetIdFromJS_ = sliceId | (static_cast<uint32_t>(pageId) << PAGE_OFFSET);
+        OHOS::AbilityMsClient::GetInstance().ForceStop(elementName->bundleName, config.type);
+        targetIdFromJS_ = sliceId | (static_cast<uint32_t>(config.pageId) << PAGE_OFFSET);
         FreeElement(elementName);
         return;
     }
     FreeElement(elementName);
 #endif
     TransitionTarget target;
-    target.sliceInfo = sliceId | (static_cast<uint32_t>(pageId) << PAGE_OFFSET);
+    target.sliceInfo.sliceAndPageId = sliceId | (static_cast<uint32_t>(config.pageId) << PAGE_OFFSET);
+    void* sliceData = nullptr;
+    if (dataLength != 0 && data != nullptr) {
+        sliceData = static_cast<void*>(UIMalloc(dataLength));
+        memcpy_s(sliceData, dataLength, data, dataLength);
+    }
+    target.sliceInfo.data = sliceData;
+    target.sliceInfo.dataLength = dataLength;
     bool runImmed = PageTransitionMgr::GetInstance().BeginTransition(TransitionCaller::CHANGE_SLICE, target,
-        type, enableSlideBack);
+        config.type, config.enableSlideBack);
     if (!runImmed) {
-        printf("pending change slice id:%d type:%d enableSlideBack:%d\n", target.sliceInfo, type, enableSlideBack);
+        printf("pending change slice id:%d type:%d enableSlideBack:%d\n", target.sliceInfo.sliceAndPageId, config.type, config.enableSlideBack);
         return;
     }
-    GraphicService::GetInstance()->PostGraphicEvent(std::bind(&Ability::PostChangeSlice, this, target.sliceInfo, type));
+    GraphicService::GetInstance()->PostGraphicEvent(std::bind(&Ability::PostChangeSlice, this,
+        target.sliceInfo.sliceAndPageId, config.type, target.sliceInfo.data));
 }
 
 void Ability::ChangeSlice(uint16_t sliceId, TransitionType type,
@@ -171,21 +249,103 @@ void Ability::ChangeSlice(uint16_t sliceId, TransitionType type,
     SwitchSlice(sliceId, gPageInvalid, type, enableSlideBack);
 }
 
-void Ability::PostChangeSlice(uint32_t targetId, TransitionType type)
+void Ability::ChangeSliceToApplist()
 {
+    if (SettingDesktopModel::GetInstance().GetDesktopStyle() == HEXAGONS_STYLE) {
+        NativeAbility::GetInstance().ChangeSlice(VIEW_APPLIST, TransitionType::TRANSITION_BACK_TO_HEXAGONS);
+    } else if (SettingDesktopModel::GetInstance().GetDesktopStyle() == WATERFALL_STYLE) {
+        NativeAbility::GetInstance().ChangeSlice(VIEW_APPLIST, TransitionType::TRANSITION_BACK_TO_WATERFALL);
+    } else {
+        NativeAbility::GetInstance().ChangeSlice(VIEW_APPLIST);
+    }
+}
+
+void Ability::EnterAod()
+{
+#ifdef JS_ENABLE
+    ElementName *elementName = OHOS::AbilityMsClient::GetInstance().GetTopAbility();
+    if (elementName != nullptr && strcmp(elementName->bundleName, "com.huawei.launcher") != 0) {
+        OHOS::AbilityMsClient::GetInstance().ForceStop(elementName->bundleName);
+        targetIdFromJS_ = VIEW_AOD | (static_cast<uint32_t>(gPageInvalid) << PAGE_OFFSET);
+        FreeElement(elementName);
+        return;
+    }
+    FreeElement(elementName);
+#endif
+    TransitionTarget target;
+    target.sliceInfo.sliceAndPageId = VIEW_AOD | (static_cast<uint32_t>(gPageInvalid) << PAGE_OFFSET);
+    target.sliceInfo.data = nullptr;
+    target.sliceInfo.dataLength = 0;
+    bool runImmed = PageTransitionMgr::GetInstance().BeginTransition(
+        TransitionCaller::CHANGE_SLICE, target, TransitionType::TRANSITION_INVALID, false);
+    if (!runImmed) {
+        printf("pending change slice id:%d type:%d enableSlideBack:%d\n",
+            target.sliceInfo.sliceAndPageId, TransitionType::TRANSITION_INVALID, false);
+        return;
+    }
     PauseSlice();
-    if (allSlices_.Size() > 0 && allSlices_[allSlices_.Size() - 1] == VIEW_AOD) {
-        allSlices_.PopBack();
-        if (allSlices_.Size() > 0 && (allSlices_[allSlices_.Size() - 1] & SLICE_MASK) == (targetId & SLICE_MASK)) {
-            allSlices_.PopBack();
+    prevAodSlice_ = curSlice_;
+    curSlice_.slice = nullptr;
+    curSlice_.sliceId = gSliceInvalid;
+    ImageCacheManager::GetInstance().EnterAod();
+    StartSlice(VIEW_AOD);
+    ResumeSlice();
+    PageTransitionMgr::GetInstance().EndTransition(true);
+}
+
+void Ability::ExitAod(uint32_t targetId)
+{
+    TransitionTarget target;
+    target.sliceInfo.sliceAndPageId = targetId;
+    target.sliceInfo.data = nullptr;
+    target.sliceInfo.dataLength = 0;
+    bool runImmed = PageTransitionMgr::GetInstance().BeginTransition(
+        TransitionCaller::CHANGE_SLICE, target, TransitionType::TRANSITION_INVALID, false);
+    if (!runImmed) {
+        printf("pending change slice id:%d type:%d enableSlideBack:%d\n",
+            target.sliceInfo.sliceAndPageId, TransitionType::TRANSITION_INVALID, false);
+        return;
+    }
+    allSlices_.PopBack();
+    PauseSlice();
+    StopSlice();
+    ImageCacheManager::GetInstance().ExitAod();
+    if ((targetId & SLICE_MASK) == prevAodSlice_.sliceId) {  // back to prev slice
+        if (prevAodSlice_.slice != nullptr) {
+            nextSlice_ = prevAodSlice_;
+            prevAodSlice_.slice = nullptr;
+            prevAodSlice_.sliceId = gSliceInvalid;
+        }
+        InputDeviceManager::GetInstance()->ClearInputDeviceState();
+    } else {
+        if (prevAodSlice_.slice != nullptr) {
+            WEARABLE_LOGI(
+                WEARABLE_LOG_MODULE_LAUNCHER_FWK, "Ability StopSlice when exits aod %d", prevAodSlice_.sliceId);
+            prevAodSlice_.slice->OnStop();
+            prevAodSlice_.sliceId = gSliceInvalid;
+            delete prevAodSlice_.slice;
+            prevAodSlice_.slice = nullptr;
         }
+        StartSlice(targetId);
     }
+    ResumeSlice();
+    PageTransitionMgr::GetInstance().EndTransition(true);
+}
+
+void Ability::PostChangeSlice(uint32_t targetId, TransitionType type, void* data)
+{
+    if (curSlice_.sliceId == VIEW_AOD) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_LAUNCHER_FWK, "cannot exit aod by switch slice!");
+        PageTransitionMgr::GetInstance().EndTransition(true);
+        return;
+    }
+    PauseSlice();
     PageTransitionMgr::GetInstance().SaveCurrentSourceIfNecessary(curSlice_.slice->GetSliceContainer());
     if (!PageTransitionMgr::GetInstance().IsTransAnimNeeded() ||
         PageTransitionMgr::GetInstance().IsCurrentSnapshotEnabled()) {
         StopSlice();
     }
-    StartSlice(targetId);
+    StartSlice(targetId, data);
 
     if (!PageTransitionMgr::GetInstance().IsTransAnimNeeded()) {
         ResumeSliceWithoutJS();
@@ -193,6 +353,9 @@ void Ability::PostChangeSlice(uint32_t targetId, TransitionType type)
         PageTransitionMgr::GetInstance().SaveTargetSource(nextSlice_.slice->GetSliceContainer());
         PageTransitionMgr::GetInstance().StartTransAnim(std::bind(&Ability::ResumeSliceWithoutJS, this));
     }
+    if (data != nullptr) {
+        UIFree(data);
+    }
 }
 
 void Ability::ResumeSliceWithoutJS()
@@ -265,7 +428,9 @@ void Ability::BackToPreSlice()
         return;
     }
     TransitionTarget target;
-    target.sliceInfo = targetId;
+    target.sliceInfo.sliceAndPageId = targetId;
+    target.sliceInfo.data = nullptr;
+    target.sliceInfo.dataLength = 0;
     uint16_t sliceId = static_cast<uint16_t>(targetId & SLICE_MASK);
     uint16_t pageId = static_cast<uint16_t>(targetId >> PAGE_OFFSET);
     PageTransitionMgr::GetInstance().BeginBackTransition(TransitionCaller::CHANGE_SLICE, target);
index 37810c7..3fec56b 100644 (file)
 #include "View.h"
 #include "Presenter.h"
 #include "key/KeyInputListener.h"
+#include "common/image_cache_manager.h"
 
 namespace OHOS {
 const uint16_t SLICE_MASK = 0xFFFF;
 const uint32_t PAGE_OFFSET = 16;
 
-void AbilitySlice::OnStart()
+void AbilitySlice::OnStart(void* data)
 {
     if ((presenter_ == nullptr) || (view_ == nullptr)) {
         WEARABLE_LOGE(WEARABLE_LOG_MODULE_LAUNCHER_FWK, "Presenter or View  was nullptr for slice %s", sliceId_);
@@ -36,8 +37,10 @@ void AbilitySlice::OnStart()
 
     view_->SetupView();
     view_->OnStart();
-    slicePageMgr_.StartSlicePage();
+    view_->OnStart(data);
+    slicePageMgr_.StartSlicePage(data);
     presenter_->OnStart();
+    presenter_->OnStart(data);
     state_ = SliceState::START;
 }
 
@@ -54,7 +57,9 @@ void AbilitySlice::OnResume()
         RootView::GetInstance()->Add(view_->GetRootContainer());
     }
     // Reset the default key listener
-    RootView::GetInstance()->SetOnKeyActListener(KeyInputListener::GetInstance());
+    if (!ImageCacheManager::GetInstance().IsInAod()) {
+        RootView::GetInstance()->SetOnKeyActListener(KeyInputListener::GetInstance());
+    }
     NativeAbility::GetInstance().SetCurSlicePriority(gSliceDefaultPriority);
 
     UIView* backView = PageTransitionMgr::GetInstance().GetTopSlideBackImage();
@@ -131,4 +136,14 @@ bool AbilitySlice::ChangeSlicePage(uint16_t pageId, void* data, TransitionType t
 {
     return slicePageMgr_.ChangeSlicePage(pageId, data, type, canBack);
 }
+
+bool AbilitySlice::BackToPrevSlicePage()
+{
+    return slicePageMgr_.BackToPrevSlicePage();
+}
+
+bool AbilitySlice::BackToCachedSlicePage(uint16_t pageId)
+{
+    return slicePageMgr_.BackToCachedSlicePage(pageId);
+}
 }
\ No newline at end of file
diff --git a/code/sdk/application/wearable/evb/nativeabilityfwk/src/transition/BackToCrossShapedTransition.cpp b/code/sdk/application/wearable/evb/nativeabilityfwk/src/transition/BackToCrossShapedTransition.cpp
new file mode 100644 (file)
index 0000000..6eb9e3b
--- /dev/null
@@ -0,0 +1,124 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: BackToCrossShapedTransition\r
+ * Create: 2025-04\r
+ */\r
+\r
+#include "applist/AppItemView.h"\r
+#include "animator/easing_equation.h"\r
+#include "common/screen.h"\r
+#include "components/root_view.h"\r
+#include "components/ui_view.h"\r
+#include "TransitionManager.h"\r
+#include "wearable_log.h"\r
+#include "BackToCrossShapedTransition.h"\r
+\r
+namespace OHOS {\r
+    static constexpr uint16_t DURATION = 200;\r
+    static constexpr int16_t CAMERA_DISTANCE = 600;\r
+    static constexpr uint16_t NUM2 = 2;\r
+    static constexpr uint16_t HALF_DURATION = DURATION / NUM2;\r
+    static constexpr int16_t MIN_OFFSET = 10;\r
+    static constexpr int16_t EASE_RANGE = 100;\r
+\r
+    REGIST_TRANSITION(TransitionType::TRANSITION_BACK_TO_CROSS_SHAPED,\r
+        BackToCrossShapedTransition, DURATION, true, true);\r
+\r
+    void BackToCrossShapedTransition::OnTransitionStart(UIImageView *current, UIImageView *target)\r
+    {\r
+        if (current == nullptr || target == nullptr) {\r
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_LAUNCHER_FWK, "BackToCrossShapedTransition ImageView is empty!");\r
+            return;\r
+        }\r
+\r
+        currentView_ = current;\r
+        targetView_ = target;\r
+\r
+        if (cameraView_ == nullptr) {\r
+            cameraView_ = new UIImageView();\r
+        }\r
+\r
+        screenWidth_ = Screen::GetInstance().GetWidth();\r
+        screenHeight_ = Screen::GetInstance().GetHeight();\r
+        middleHeight_ = screenHeight_ / NUM2;\r
+        middleWidth_ = screenWidth_ / NUM2;\r
+\r
+        cameraView_->SetPosition(0, 0, screenWidth_, screenHeight_);\r
+        cameraView_->SetCameraPosition(Vector2<float>(middleWidth_, middleHeight_));\r
+        cameraView_->SetCameraDistance(CAMERA_DISTANCE);\r
+        currentView_->SetVisible(false);\r
+        targetView_->SetVisible(false);\r
+        RootView::GetInstance()->Add(cameraView_);\r
+    }\r
+\r
+    void BackToCrossShapedTransition::TransitionAlg(uint32_t time)\r
+    {\r
+        int16_t offSet = 0;\r
+        if (time < HALF_DURATION) {\r
+            offSet = EasingEquation::QuadEaseIn(-MIN_OFFSET, -middleWidth_, time, HALF_DURATION);\r
+        } else {\r
+            offSet = EasingEquation::QuadEaseIn(middleWidth_, MIN_OFFSET,\r
+                                                time - HALF_DURATION, DURATION - HALF_DURATION);\r
+        }\r
+\r
+        UIView* tmpCard = GetVisibleView(offSet);\r
+        CommonAlg(tmpCard, offSet);\r
+    }\r
+\r
+    UIView* BackToCrossShapedTransition::GetVisibleView(int16_t offSet)\r
+    {\r
+        UIView* view = nullptr;\r
+        if (offSet > 0) {\r
+            if (offSet < middleWidth_) {\r
+                return targetView_;\r
+            }\r
+            return currentView_;\r
+        } else {\r
+            if (abs(offSet) < middleWidth_) {\r
+                return currentView_;\r
+            }\r
+            return targetView_;\r
+        }\r
+        return view;\r
+    }\r
+\r
+    void BackToCrossShapedTransition::OnTransitionEnd()\r
+    {\r
+        if (cameraView_ != nullptr) {\r
+            RootView::GetInstance()->Remove(cameraView_);\r
+        }\r
+\r
+        if (targetView_ != nullptr) {\r
+            targetView_->SetVisible(true);\r
+        }\r
+    }\r
+\r
+    void BackToCrossShapedTransition::CommonAlg(UIView* visualView, int16_t offSet)\r
+    {\r
+        if (visualView == nullptr) {\r
+            return;\r
+        }\r
+\r
+        float factor;\r
+        if (abs(offSet) < middleWidth_) {\r
+            factor = EasingEquation::LinearEaseNone(0, EASE_RANGE, abs(offSet), middleWidth_);\r
+        } else {\r
+            factor = EasingEquation::LinearEaseNone(0, EASE_RANGE, screenWidth_ - abs(offSet), middleWidth_);\r
+        }\r
+\r
+        float scale = 1.0 - 0.2 * factor / EASE_RANGE; // 0.2: scale range\r
+        float angle = 90 * factor / EASE_RANGE;        // 90: quarter cycle degrees\r
+        if (visualView != currentView_) {\r
+            angle = -angle;\r
+        }\r
+\r
+        Vector3<float> scaleCenter = {middleWidth_, middleHeight_, 0};\r
+        Vector3<float> rotateStart = {middleWidth_, 0, 0};\r
+        Vector3<float> rotateEnd = {middleWidth_, 2, 0};\r
+        UIView* tmpCard = nullptr;\r
+\r
+        cameraView_->SetSrc(static_cast<UIImageView *>(visualView)->GetImageInfo());\r
+        cameraView_->Scale(Vector3<float>(scale, scale, 0), scaleCenter);\r
+        cameraView_->Rotate(angle, rotateStart, rotateEnd);\r
+    }\r
+} // namespace OHOS
\ No newline at end of file
diff --git a/code/sdk/application/wearable/evb/nativeabilityfwk/src/transition/BackToCrossShapedTransition.h b/code/sdk/application/wearable/evb/nativeabilityfwk/src/transition/BackToCrossShapedTransition.h
new file mode 100644 (file)
index 0000000..8ad17d4
--- /dev/null
@@ -0,0 +1,39 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: BackToCrossShapedTransition\r
+ * Create: 2025-04\r
+ */\r
+\r
+#ifndef BACK_TO_CROSS_SHAPED_TRANSITION_H\r
+#define BACK_TO_CROSS_SHAPED_TRANSITION_H\r
+\r
+#include "TransitionCallback.h"\r
+\r
+namespace OHOS {\r
+    class BackToCrossShapedTransition : public TransitionCallback {\r
+    public:\r
+        BackToCrossShapedTransition(uint32_t time, bool enableCurrentSnapshot, bool enableTargetSnapshot) :\r
+            TransitionCallback(time, enableCurrentSnapshot, enableTargetSnapshot) {}\r
+        ~BackToCrossShapedTransition() override {}\r
+\r
+        void OnTransitionStart(UIImageView* current, UIImageView* target) override;\r
+        void TransitionAlg(uint32_t time) override;\r
+        void OnTransitionEnd() override;\r
+    private:\r
+\r
+        void CommonAlg(UIView* visualView, int16_t offSet);\r
+        UIView* GetVisibleView(int16_t offSet);\r
+\r
+        UIImageView* currentView_ = nullptr;\r
+        UIImageView* targetView_ = nullptr;\r
+        UIImageView* cameraView_ = nullptr;\r
+\r
+        int16_t middleWidth_;\r
+        int16_t middleHeight_;\r
+        int16_t screenWidth_;\r
+        int16_t screenHeight_;\r
+    };\r
+\r
+} // namespace OHOS\r
+\r
+#endif // BACK_TO_CROSS_SHAPED_TRANSITION_H
\ No newline at end of file
index da9c421..3ccd66e 100644 (file)
@@ -9,12 +9,13 @@
 #include "TransitionManager.h"
 #include "NativeAbility.h"
 #include "components/root_view.h"
-#include "applist/AppItemView.h"
+#include "applist/HexagonsDesktopFragment.h"
 #include "hal_tick.h"
 #include "wearable_log.h"
 #ifdef JS_ENABLE
 #include "abilityms_slite_client.h"
 #endif
+#include "TransitionUtils.h"
 
 namespace OHOS {
 REGIST_TRANSITION(TransitionType::TRANSITION_BACK_TO_HEXAGONS, BackToHexagonsTransition, 300, true, false);
@@ -24,7 +25,7 @@ static const float TARGET_SCALE_END = 1.0f;
 void BackToHexagonsTransition::OnTransitionStart(UIImageView* current, UIViewGroup* target)
 {
     current_ = current;
-    target_ = dynamic_cast<UICustomHexagonsList*>(target->GetChildrenHead());
+    target_ = dynamic_cast<UICustomHexagonsList*>(TransitionUtils::GetViewAndTransparentizePath(target, UI_HEXAGONS_LIST));
     if ((target_ == nullptr) || (current_ == nullptr)) {
         return;
     }
index a5bb730..f2167b1 100644 (file)
@@ -9,12 +9,13 @@
 #include "TransitionManager.h"
 #include "NativeAbility.h"
 #include "components/root_view.h"
-#include "applist/AppItemView.h"
+#include "applist/WaterfallDesktopFragment.h"
 #include "hal_tick.h"
 #include "wearable_log.h"
 #ifdef JS_ENABLE
 #include "abilityms_slite_client.h"
 #endif
+#include "TransitionUtils.h"
 
 namespace OHOS {
 REGIST_TRANSITION(TransitionType::TRANSITION_BACK_TO_WATERFALL, BackToWaterfallTransition, 300, true, false);
@@ -24,7 +25,7 @@ static const float TARGET_SCALE_END = 1.0f;
 void BackToWaterfallTransition::OnTransitionStart(UIImageView* current, UIViewGroup* target)
 {
     current_ = current;
-    target_ = dynamic_cast<UIWaterfallList *>(target->GetChildrenHead());
+    target_ = dynamic_cast<UIWaterfallList*>(TransitionUtils::GetViewAndTransparentizePath(target, UI_WATERFALL_LIST));
     if ((target_ == nullptr) || (current_ == nullptr)) {
         return;
     }
diff --git a/code/sdk/application/wearable/evb/nativeabilityfwk/src/transition/CrossShapedTransition.cpp b/code/sdk/application/wearable/evb/nativeabilityfwk/src/transition/CrossShapedTransition.cpp
new file mode 100644 (file)
index 0000000..64a7f76
--- /dev/null
@@ -0,0 +1,135 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: CrossShapedTransition\r
+ * Create: 2025-04\r
+ */\r
+\r
+#include "applist/AppItemView.h"\r
+#include "animator/easing_equation.h"\r
+#include "common/screen.h"\r
+#include "components/root_view.h"\r
+#include "components/ui_view.h"\r
+#include "TransitionManager.h"\r
+#include "wearable_log.h"\r
+#include "CrossShapedTransition.h"\r
+\r
+namespace OHOS {\r
+    static constexpr uint16_t DURATION = 200;\r
+    static constexpr uint16_t NUM2 = 2;\r
+    static constexpr uint16_t HALF_DURATION = DURATION / NUM2;\r
+    static constexpr int16_t CAMERA_DISTANCE = 600;\r
+    static constexpr int16_t EASE_RANGE = 100;\r
+    static constexpr int16_t MIN_OFFSET = 10;\r
+\r
+    REGIST_TRANSITION(TransitionType::TRANSITION_CROSS_SHAPED, CrossShapedTransition, DURATION, true, true);\r
+\r
+    void CrossShapedTransition::OnTransitionStart(UIImageView *current, UIImageView *target)\r
+    {\r
+        if (current == nullptr || target == nullptr) {\r
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_LAUNCHER_FWK, "CrossShapedTransition ImageView is empty!");\r
+            return;\r
+        }\r
+\r
+        currentView_ = current;\r
+        targetView_ = target;\r
+\r
+        currentView_->SetVisible(false);\r
+        targetView_->SetVisible(false);\r
+\r
+        if (cameraView_ == nullptr) {\r
+            cameraView_ = new UIImageView();\r
+        }\r
+\r
+        screenWidth_ = Screen::GetInstance().GetWidth();\r
+        screenHeight_ = Screen::GetInstance().GetHeight();\r
+\r
+        middleWidth_ = screenWidth_ / NUM2;\r
+        middleHeight_ = screenHeight_ / NUM2;\r
+\r
+        cameraView_->SetPosition(0, 0, screenWidth_, screenHeight_);\r
+        cameraView_->SetCameraPosition(Vector2<float>(middleWidth_, middleHeight_));\r
+        cameraView_->SetCameraDistance(CAMERA_DISTANCE);\r
+        RootView::GetInstance()->Add(cameraView_);\r
+    }\r
+\r
+    void CrossShapedTransition::TransitionAlg(uint32_t time)\r
+    {\r
+        int16_t xOffset = 0;\r
+        if (time < HALF_DURATION) {\r
+            xOffset = EasingEquation::QuadEaseIn(-MIN_OFFSET, -middleWidth_, time, HALF_DURATION);\r
+        } else {\r
+            xOffset = EasingEquation::QuadEaseIn(middleWidth_, MIN_OFFSET,\r
+                                                 time - HALF_DURATION, DURATION - HALF_DURATION);\r
+        }\r
+\r
+        bool visible = false; // true: current; false: target\r
+        UIView* tmpCard = GetVisibleView(xOffset, visible);\r
+        CommonAlg(tmpCard, xOffset, visible);\r
+    }\r
+\r
+    UIView* CrossShapedTransition::GetVisibleView(int16_t xOffset, bool &visible)\r
+    {\r
+        UIView* view = nullptr;\r
+        if (xOffset > 0) {\r
+            if (xOffset < middleWidth_) {\r
+                view = targetView_;\r
+                visible = false;\r
+                return view;\r
+            }\r
+\r
+            view = currentView_;\r
+            visible = true;\r
+        } else {\r
+            if (abs(xOffset) < middleWidth_) {\r
+                view = currentView_;\r
+                visible = true;\r
+                return view;\r
+            }\r
+\r
+            view = targetView_;\r
+            visible = false;\r
+        }\r
+\r
+        return view;\r
+    }\r
+\r
+    void CrossShapedTransition::OnTransitionEnd()\r
+    {\r
+        if (cameraView_ != nullptr) {\r
+            RootView::GetInstance()->Remove(cameraView_);\r
+        }\r
+\r
+        if (targetView_ != nullptr) {\r
+            targetView_->SetVisible(true);\r
+        }\r
+    }\r
+\r
+    void CrossShapedTransition::CommonAlg(UIView* visualView, int16_t xOffset, bool visible)\r
+    {\r
+        if (visualView == nullptr) {\r
+            return;\r
+        }\r
+\r
+        float factor;\r
+        if (abs(xOffset) < middleWidth_) {\r
+            factor = EasingEquation::LinearEaseNone(0, EASE_RANGE, abs(xOffset), middleWidth_);\r
+        } else {\r
+            factor = EasingEquation::LinearEaseNone(0, EASE_RANGE, screenWidth_ - abs(xOffset), middleWidth_);\r
+        }\r
+\r
+        float scale = 1.0 - 0.2 * factor / EASE_RANGE; // 0.2: scale range\r
+        float angle = 90 * factor / EASE_RANGE;        // 90: quarter cycle degrees\r
+        if (visible) {\r
+            angle = -angle;\r
+        }\r
+\r
+        Vector3<float> scaleCenter = {middleWidth_, middleHeight_, 0};\r
+        Vector3<float> rotateStart = {middleWidth_, 0, 0};\r
+        Vector3<float> rotateEnd = {middleWidth_, 2, 0};\r
+        UIView* tmpCard = nullptr;\r
+\r
+        cameraView_->SetSrc(static_cast<UIImageView *>(visualView)->GetImageInfo());\r
+        cameraView_->Scale(Vector3<float>(scale, scale, 0), scaleCenter);\r
+        cameraView_->Rotate(angle, rotateStart, rotateEnd);\r
+    }\r
+} // namespace OHOS
\ No newline at end of file
diff --git a/code/sdk/application/wearable/evb/nativeabilityfwk/src/transition/CrossShapedTransition.h b/code/sdk/application/wearable/evb/nativeabilityfwk/src/transition/CrossShapedTransition.h
new file mode 100644 (file)
index 0000000..1ff7f56
--- /dev/null
@@ -0,0 +1,39 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: CrossShapedTransition\r
+ * Create: 2025-04\r
+ */\r
+\r
+#ifndef CROSS_SHAPED_TRANSITION_H\r
+#define CROSS_SHAPED_TRANSITION_H\r
+\r
+#include "TransitionCallback.h"\r
+\r
+namespace OHOS {\r
+    class CrossShapedTransition : public TransitionCallback {\r
+    public:\r
+        CrossShapedTransition(uint32_t time, bool enableCurrentSnapshot, bool enableTargetSnapshot) :\r
+            TransitionCallback(time, enableCurrentSnapshot, enableTargetSnapshot) {}\r
+        ~CrossShapedTransition() override {}\r
+\r
+        void OnTransitionStart(UIImageView* current, UIImageView* target) override;\r
+        void TransitionAlg(uint32_t time) override;\r
+        void OnTransitionEnd() override;\r
+    private:\r
+\r
+        void CommonAlg(UIView* visualView, int16_t xOffset, bool visible);\r
+        UIView* GetVisibleView(int16_t xOffset, bool &visible);\r
+\r
+        UIImageView* currentView_ = nullptr;\r
+        UIImageView* targetView_ = nullptr;\r
+        UIImageView* cameraView_ = nullptr;\r
+\r
+        int16_t middleWidth_;\r
+        int16_t middleHeight_;\r
+        int16_t screenWidth_;\r
+        int16_t screenHeight_;\r
+    };\r
+\r
+} // namespace OHOS\r
+\r
+#endif // CROSS_SHAPED_TRANSITION_H
\ No newline at end of file
index cc20f4f..1d7dd6c 100644 (file)
@@ -11,6 +11,7 @@
 #include "components/root_view.h"\r
 #include "TransitionManager.h"\r
 #include "wearable_log.h"\r
+#include "TransitionUtils.h"\r
 \r
 namespace OHOS {\r
 REGIST_TRANSITION(TransitionType::TRANSITION_ENTER_WATERFALL, EnterWaterfallTransition, 300, true, false);\r
@@ -20,7 +21,7 @@ static const float SCALE_END = 1.0f;
 void EnterWaterfallTransition::OnTransitionStart(UIImageView* current, UIViewGroup* target)\r
 {\r
     current_ = current;\r
-    target_ = dynamic_cast<UIWaterfallList*>(target->GetChildrenHead());\r
+    target_ = dynamic_cast<UIWaterfallList*>(TransitionUtils::GetViewAndTransparentizePath(target, UI_WATERFALL_LIST));\r
     if ((target_ == nullptr) || (current_ == nullptr)) {\r
         return;\r
     }\r
diff --git a/code/sdk/application/wearable/evb/nativeabilityfwk/src/transition/FadeInOutTransition.cpp b/code/sdk/application/wearable/evb/nativeabilityfwk/src/transition/FadeInOutTransition.cpp
new file mode 100644 (file)
index 0000000..48634a7
--- /dev/null
@@ -0,0 +1,73 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: FadeInOutTransition\r
+ * Create: 2025-04\r
+ */\r
+\r
+#include "animator/easing_equation.h"\r
+#include "common/screen.h"\r
+#include "TransitionManager.h"\r
+#include "wearable_log.h"\r
+#include "FadeInOutTransition.h"\r
+\r
+namespace OHOS {\r
+static constexpr int16_t DURA_RANGE = 400;\r
+static constexpr int16_t FADE_IN_END = 300;\r
+static constexpr int16_t FADE_IN_OPASTART = OPA_OPAQUE - 30;\r
+static constexpr int16_t FADE_IN_OPAEND = 0;\r
+static constexpr int16_t FADE_OUT_START = 100;\r
+static constexpr int16_t FADE_OUT_OPASTART = 0;\r
+static constexpr int16_t FADE_OUT_OPAEND = OPA_OPAQUE - 30;\r
+static constexpr int16_t FADE_OPA_DELTA = 15;\r
+\r
+REGIST_TRANSITION(TransitionType::TRANSITION_FADEINOUT, FadeInOutTransition, DURA_RANGE, true, true);\r
+\r
+void FadeInOutTransition::OnTransitionStart(UIImageView* current, UIImageView* target)\r
+{\r
+    if ((current == nullptr) || (target == nullptr)) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_LAUNCHER_FWK, "FadeInOutTransition no current or target\n");\r
+        return;\r
+    }\r
+    current_ = current;\r
+    target_ = target;\r
+    target_->SetVisible(false);\r
+    current_->SetOpaScale(OPA_OPAQUE - FADE_OPA_DELTA);\r
+    current_->Invalidate();\r
+    target_->SetOpaScale(0);\r
+}\r
+\r
+void FadeInOutTransition::TransitionAlg(uint32_t time)\r
+{\r
+    if ((current_ == nullptr) || (target_ == nullptr)) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_LAUNCHER_FWK, "FadeInOutTransition no current or target\n");\r
+        return;\r
+    }\r
+    if (time < FADE_IN_END) {\r
+        float curFloatOpa = (FADE_IN_OPASTART - FADE_IN_OPAEND) * (FADE_IN_END - time) * 1.0f;\r
+        uint8_t curOpa = static_cast<uint8_t> (curFloatOpa / FADE_IN_END);\r
+        curOpa = curOpa + FADE_IN_OPAEND;\r
+        current_->SetOpaScale(curOpa);\r
+        current_->Invalidate();\r
+    }\r
+    if (time > FADE_OUT_START) {\r
+        target_->SetVisible(true);\r
+        float curFloatOpa = (FADE_OUT_OPAEND - FADE_OUT_OPASTART)  * (time - FADE_OUT_START) * 1.0f;\r
+        uint8_t tarOpa = static_cast<uint8_t> (curFloatOpa / (DURA_RANGE - FADE_OUT_START));\r
+        tarOpa = tarOpa + FADE_OUT_OPASTART;\r
+        target_->SetOpaScale(tarOpa);\r
+        target_->Invalidate();\r
+    }\r
+}\r
+\r
+void FadeInOutTransition::OnTransitionEnd()\r
+{\r
+    if ((current_ == nullptr) || (target_ == nullptr)) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_LAUNCHER_FWK, "FadeInOutTransition no current or target\n");\r
+        return;\r
+    }\r
+    current_->SetVisible(false);\r
+    target_->SetVisible(true);\r
+    target_->SetOpaScale(OPA_OPAQUE - FADE_OPA_DELTA);\r
+    target_->Invalidate();\r
+}\r
+} // namespace OHOS\r
diff --git a/code/sdk/application/wearable/evb/nativeabilityfwk/src/transition/FadeInOutTransition.h b/code/sdk/application/wearable/evb/nativeabilityfwk/src/transition/FadeInOutTransition.h
new file mode 100644 (file)
index 0000000..0b1d8a0
--- /dev/null
@@ -0,0 +1,25 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: FadeInOutTransition\r
+ * Create: 2025-04\r
+ */\r
+\r
+#ifndef FADE_IN_OUT_TRANSITION_H\r
+#define FADE_IN_OUT_TRANSITION_H\r
+#include "TransitionCallback.h"\r
+\r
+namespace OHOS {\r
+class FadeInOutTransition : public TransitionCallback {\r
+public:\r
+    FadeInOutTransition(uint32_t time, bool enableCurrentSnapshot, bool enableTargetSnapshot) :\r
+        TransitionCallback(time, enableCurrentSnapshot, enableTargetSnapshot) {}\r
+    ~FadeInOutTransition() override {}\r
+    void OnTransitionStart(UIImageView* current, UIImageView* target) override;\r
+    void TransitionAlg(uint32_t time) override;\r
+    void OnTransitionEnd() override;\r
+private:\r
+    UIImageView* current_ = nullptr;\r
+    UIImageView* target_ = nullptr;\r
+};\r
+} // namespace OHOS\r
+#endif // FADE_IN_OUT_TRANSITION_H
\ No newline at end of file
diff --git a/code/sdk/application/wearable/evb/nativeabilityfwk/src/transition/GaussianBlurTransition.cpp b/code/sdk/application/wearable/evb/nativeabilityfwk/src/transition/GaussianBlurTransition.cpp
new file mode 100644 (file)
index 0000000..0f1a21a
--- /dev/null
@@ -0,0 +1,136 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: GaussianBlurTransition\r
+ * Create: 2025-04\r
+ */\r
+\r
+#include "animator/easing_equation.h"\r
+#include "components/root_view.h"\r
+#include "components/ui_view.h"\r
+#include "TransitionManager.h"\r
+#include "wearable_log.h"\r
+#include "GaussianBlurTransition.h"\r
+\r
+namespace OHOS {\r
+    static constexpr int64_t VIEW_COLOR = 0xff505050;\r
+    static constexpr uint8_t VIEW_OPACITY = 10;\r
+    static constexpr uint64_t VIEW_BLUR_OPACITY = 150;\r
+    static constexpr uint8_t BLUR_MIN = 5;\r
+    static constexpr float BLUR_MAX = 31.0;\r
+    static constexpr int16_t BREAK_TIME = 125;\r
+    static constexpr int16_t DURITION = 200;\r
+    static constexpr char* BLURVIEW_NAME = "blur";\r
+\r
+    REGIST_TRANSITION(TransitionType::TRANSITION_GAUSSIAN_BLUR, GaussianBlurTransition, DURITION, false, false);\r
+\r
+    void GaussianBlurTransition::AddBlurView(UIViewGroup* groupView)\r
+    {\r
+        if (groupView == nullptr) {\r
+            return;\r
+        }\r
+\r
+        UIView* blurCurent = new UIView(BLURVIEW_NAME);\r
+        if (blurCurent == nullptr) {\r
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_AAFWK, "GaussianBlurTransition new view failed!");\r
+            return;\r
+        }\r
+\r
+        Rect currRect = groupView->GetVisibleRect();\r
+        blurCurent->SetPosition(currRect.GetX(), currRect.GetY(), currRect.GetWidth(), currRect.GetHeight());\r
+        blurCurent->SetStyle(STYLE_BACKGROUND_COLOR, VIEW_COLOR);\r
+        blurCurent->SetStyle(STYLE_BACKGROUND_OPA, VIEW_OPACITY);\r
+\r
+        UIView* tailView = groupView->GetChildrenTail();\r
+        if (tailView != nullptr) {\r
+            groupView->Insert(tailView, blurCurent);\r
+        }\r
+    }\r
+\r
+    void GaussianBlurTransition::SetViewBlur(UIViewGroup* groupView, float guassScale)\r
+    {\r
+        if (nullptr == groupView) {\r
+            return;\r
+        }\r
+\r
+        UIView* tailView = groupView->GetChildrenTail();\r
+        if (tailView == nullptr && tailView->GetViewId() != BLURVIEW_NAME) {\r
+            return;\r
+        }\r
+\r
+        UIView* testView = RootView::GetInstance()->GetBlurView();\r
+        RootView::GetInstance()->ClearBlurView(tailView);\r
+        tailView->SetBackgroundBlur(guassScale);\r
+        tailView->SetStyle(STYLE_BACKGROUND_OPA, VIEW_BLUR_OPACITY);\r
+    }\r
+\r
+    void GaussianBlurTransition::ClearBlurView(UIViewGroup* groupView)\r
+    {\r
+        if (groupView == nullptr) {\r
+            return;\r
+        }\r
+\r
+        UIView* tailView = groupView->GetChildrenTail();\r
+        if (tailView != nullptr && tailView->GetViewId() == BLURVIEW_NAME) {\r
+            RootView::GetInstance()->ClearBlurView(tailView);\r
+            groupView->Remove(tailView);\r
+        }\r
+    }\r
+\r
+    void GaussianBlurTransition::OnTransitionStart(UIViewGroup* current, UIViewGroup* target)\r
+    {\r
+        if ((current == nullptr) || (target == nullptr)) {\r
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_AAFWK, "GaussianBlurTransition ImageView is empty!");\r
+            return;\r
+        }\r
+\r
+        current_ = current;\r
+        target_ = target;\r
+        blurFlag_ = false;\r
+\r
+        AddBlurView(current_);\r
+        AddBlurView(target_);\r
+        target_->SetVisible(false);\r
+    }\r
+\r
+    void GaussianBlurTransition::TransitionAlg(uint32_t time)\r
+    {\r
+        if (time <= BREAK_TIME) {\r
+            float scale = EasingEquation::QuadEaseIn(BLUR_MIN, static_cast<int16_t>(BLUR_MAX), time,\\r
+                                                     BREAK_TIME)/ BLUR_MAX;\r
+            float guassScale = scale * BLUR_MAX;\r
+\r
+            SetViewBlur(current_, guassScale);\r
+        } else {\r
+            if (!blurFlag_) {\r
+                UIView* tailView = current_->GetChildrenTail();\r
+                if (tailView != nullptr) {\r
+                    tailView->ClearBackgroundBlur();\r
+                }\r
+\r
+                if (current_->IsVisible()) {\r
+                    current_->SetVisible(false);\r
+                }\r
+\r
+                target_->SetVisible(true);\r
+                SetViewBlur(target_, BLUR_MAX);\r
+                blurFlag_ = true;\r
+                return;\r
+            }\r
+\r
+            float scale = EasingEquation::QuadEaseIn(static_cast<int16_t>(BLUR_MAX), BLUR_MIN, time - BREAK_TIME,\\r
+                                                     DURITION) / BLUR_MAX;\r
+            float guassScale = scale * BLUR_MAX;\r
+            SetViewBlur(target_, guassScale);\r
+        }\r
+    }\r
+\r
+    void GaussianBlurTransition::OnTransitionEnd()\r
+    {\r
+        if (current_ == nullptr || target_ == nullptr) {\r
+            return;\r
+        }\r
+\r
+        ClearBlurView(current_);\r
+        ClearBlurView(target_);\r
+    }\r
+}
\ No newline at end of file
diff --git a/code/sdk/application/wearable/evb/nativeabilityfwk/src/transition/GaussianBlurTransition.h b/code/sdk/application/wearable/evb/nativeabilityfwk/src/transition/GaussianBlurTransition.h
new file mode 100644 (file)
index 0000000..ecbf529
--- /dev/null
@@ -0,0 +1,34 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: GaussianBlurTransition\r
+ * Create: 2025-04\r
+ */\r
+\r
+#ifndef GAUSSIAN_BLUR_TRANSITION_H\r
+#define GAUSSIAN_BLUR_TRANSITION_H\r
+\r
+#include "TransitionCallback.h"\r
+\r
+namespace OHOS {\r
+    class GaussianBlurTransition : public TransitionCallback {\r
+    public:\r
+        GaussianBlurTransition(uint32_t time, bool enableCurrentSnapshot, bool enableTargetSnapshot) :\r
+            TransitionCallback(time, enableCurrentSnapshot, enableTargetSnapshot) {}\r
+        ~GaussianBlurTransition() override {}\r
+\r
+        void OnTransitionStart(UIViewGroup* current, UIViewGroup* target) override;\r
+        void TransitionAlg(uint32_t time) override;\r
+        void OnTransitionEnd() override;\r
+    private:\r
+\r
+        void AddBlurView(UIViewGroup* groupView);\r
+        void SetViewBlur(UIViewGroup* groupView, float guassScale);\r
+        void ClearBlurView(UIViewGroup* groupView);\r
+\r
+        UIViewGroup* current_ = nullptr;\r
+        UIViewGroup* target_ = nullptr;\r
+        bool blurFlag_;\r
+    };\r
+} // namespace OHOS\r
+\r
+#endif // GAUSSIAN_BLUR_TRANSITION_H
\ No newline at end of file
index 45ebd76..a76848f 100644 (file)
@@ -10,6 +10,7 @@
 #include "components/root_view.h"
 #include "TransitionManager.h"
 #include "wearable_log.h"
+#include "TransitionUtils.h"
 
 namespace OHOS {
 REGIST_TRANSITION(TransitionType::TRANSITION_HEXAGONS, HexagonsTransition, 300, false, true);
@@ -20,8 +21,7 @@ static const float TARGET_SCALE_END = 1.0f;
 
 void HexagonsTransition::OnTransitionStart(UIViewGroup* current, UIImageView* target)
 {
-    current->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);
-    current_ = dynamic_cast<UICustomHexagonsList*>(current->GetChildrenHead());
+    current_ = dynamic_cast<UICustomHexagonsList*>(TransitionUtils::GetViewAndTransparentizePath(current, UI_HEXAGONS_LIST));
     if (current_ == nullptr) {
         return;
     }
@@ -37,7 +37,6 @@ void HexagonsTransition::OnTransitionStart(UIViewGroup* current, UIImageView* ta
         WEARABLE_LOGE(WEARABLE_LOG_MODULE_LAUNCHER_FWK, "HexagonsTransition no focus view\n");
         return;
     }
-    current_->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);
     Vector2<int16_t> delta = Vector2<int16_t>(current_->GetWidth() / 2, current_->GetHeight() / 2) -
         current_->GetCurrentPosition(focusIndex_);
     opaStart_ = focusView_->GetOpaScale();
diff --git a/code/sdk/application/wearable/evb/nativeabilityfwk/src/transition/ThreeDFoldTransition.cpp b/code/sdk/application/wearable/evb/nativeabilityfwk/src/transition/ThreeDFoldTransition.cpp
new file mode 100644 (file)
index 0000000..91e53e9
--- /dev/null
@@ -0,0 +1,69 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: ThreeDFoldTransition\r
+ * Create: 2025-04\r
+ */\r
+\r
+#include "ThreeDFoldTransition.h"\r
+#include "animator/easing_equation.h"\r
+#include "TransitionManager.h"\r
+#include "common/screen.h"\r
+#include "wearable_log.h"\r
+namespace OHOS {\r
+static constexpr int16_t DURA_RANGE = 200;\r
+static const float ROTATE_END = 90.0f;\r
+static constexpr int16_t ROTATE_RANGE_MAX = 90;\r
+static constexpr int16_t CAMERA_DISTANCE = 500;\r
+\r
+REGIST_TRANSITION(TransitionType::TRANSITION_3DFOLD, ThreeDFoldTransition, DURA_RANGE, true, true);\r
+void ThreeDFoldTransition::OnTransitionStart(UIImageView* current, UIImageView* target)\r
+{\r
+    if ((current == nullptr) || (target == nullptr)) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_LAUNCHER_FWK, "ThreeDFoldTransition no current or target\n");\r
+        return;\r
+    }\r
+    current_ = current;\r
+    target_ = target;\r
+    current_->SetVisible(true);\r
+    target_->SetVisible(true);\r
+\r
+    current_->SetCameraPosition(Vector2<float>(current_->GetWidth(), current_->GetHeight() / 2)); // 2: half\r
+    current_->SetCameraDistance(CAMERA_DISTANCE);\r
+ \r
+    target_->SetCameraPosition(Vector2<float>(0, target_->GetHeight() / 2)); // 2: half\r
+    target_->SetCameraDistance(CAMERA_DISTANCE);\r
+}\r
+\r
+void ThreeDFoldTransition::TransitionAlg(uint32_t time)\r
+{\r
+    if ((current_ == nullptr) || (target_ == nullptr)) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_LAUNCHER_FWK, "ThreeDFoldTransition no current or target\n");\r
+        return;\r
+    }\r
+\r
+    int16_t width = Screen::GetInstance().GetWidth();\r
+    float moveOffset = time * 1.0f / (float)DURA_RANGE;\r
+    float angle = ROTATE_RANGE_MAX * moveOffset;\r
+\r
+    Vector3<float> currRotateStart = {current_->GetWidth(), current_->GetHeight(), 0};\r
+    Vector3<float> currRotateEnd = {current_->GetWidth(), 0, 0};\r
+    Vector3<float> targRotateStart = {0, 0, 0};\r
+    Vector3<float> targRotateEnd = {0, target_->GetHeight(), 0};\r
+\r
+    current_->Rotate(angle, currRotateStart, currRotateEnd);\r
+    current_->SetPosition(-moveOffset * width, current_->GetY());\r
+\r
+    target_->Rotate(ROTATE_RANGE_MAX - angle, targRotateStart, targRotateEnd);\r
+    target_->SetPosition((width - moveOffset * width), target_->GetY());\r
+}\r
+\r
+void ThreeDFoldTransition::OnTransitionEnd()\r
+{\r
+    if ((current_ == nullptr) || (target_ == nullptr)) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_LAUNCHER_FWK, "ThreeDFoldTransition no current or target\n");\r
+        return;\r
+    }\r
+    current_->SetVisible(false);\r
+    target_->SetVisible(true);\r
+}\r
+} // namespace OHOS\r
diff --git a/code/sdk/application/wearable/evb/nativeabilityfwk/src/transition/ThreeDFoldTransition.h b/code/sdk/application/wearable/evb/nativeabilityfwk/src/transition/ThreeDFoldTransition.h
new file mode 100644 (file)
index 0000000..32f6f95
--- /dev/null
@@ -0,0 +1,25 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: ThreeDFoldTransition\r
+ * Create: 2025-04\r
+ */\r
+\r
+#ifndef THREE_D_FOLD_TRANSITION_H\r
+#define THREE_D_FOLD_TRANSITION_H\r
+#include "TransitionCallback.h"\r
+\r
+namespace OHOS {\r
+class ThreeDFoldTransition : public TransitionCallback {\r
+public:\r
+    ThreeDFoldTransition(uint32_t time, bool enableCurrentSnapshot, bool enableTargetSnapshot) :\r
+        TransitionCallback(time, enableCurrentSnapshot, enableTargetSnapshot) {}\r
+    ~ThreeDFoldTransition() override {}\r
+    void OnTransitionStart(UIImageView* current, UIImageView* target) override;\r
+    void TransitionAlg(uint32_t time) override;\r
+    void OnTransitionEnd() override;\r
+private:\r
+    UIImageView* current_ = nullptr;\r
+    UIImageView* target_ = nullptr;\r
+};\r
+} // namespace OHOS\r
+#endif // THREE_D_FOLD_TRANSITION_H
\ No newline at end of file
diff --git a/code/sdk/application/wearable/evb/nativeabilityfwk/src/transition/TransitionUtils.h b/code/sdk/application/wearable/evb/nativeabilityfwk/src/transition/TransitionUtils.h
new file mode 100644 (file)
index 0000000..b5b493e
--- /dev/null
@@ -0,0 +1,42 @@
+/*
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025. All rights reserved.
+ * Description: TransitionUtils
+ * Author: Hisi Graphic Team
+ * Created: 2025-10
+ */
+
+#ifndef TRANSITION_UTILS_H
+#define TRANSITION_UTILS_H
+
+#include "components/ui_view.h"
+#include "components/ui_view_group.h"
+
+namespace OHOS {
+class TransitionUtils {
+public:
+    static UIView* GetViewAndTransparentizePath(UIView* current, UIViewType viewType)
+    {
+        if (current->GetViewType() == viewType) {
+            current->SetStyle(STYLE_BACKGROUND_OPA, 0);
+            return current;
+        }
+
+        if (!current->IsViewGroup()) {
+            return nullptr;
+        }
+
+        UIView* target = nullptr;
+        UIView* child = dynamic_cast<UIViewGroup*>(current)->GetChildrenHead();
+        while (child != nullptr) {
+            target = GetViewAndTransparentizePath(child, viewType);
+            if (target != nullptr) {
+                current->SetStyle(STYLE_BACKGROUND_OPA, 0);
+                break;
+            }
+            child = child->GetNextSibling();
+        }
+        return target;
+    }
+};
+}
+#endif
\ No newline at end of file
diff --git a/code/sdk/application/wearable/evb/nativeabilityfwk/src/transition/TransparentGradientTransition.cpp b/code/sdk/application/wearable/evb/nativeabilityfwk/src/transition/TransparentGradientTransition.cpp
new file mode 100644 (file)
index 0000000..d14f3c9
--- /dev/null
@@ -0,0 +1,78 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: TransparentGradientTransition\r
+ * Create: 2025-04\r
+ */\r
+\r
+#include "animator/easing_equation.h"\r
+#include "components/root_view.h"\r
+#include "TransitionManager.h"\r
+#include "wearable_log.h"\r
+#include "TransparentGradientTransition.h"\r
+\r
+\r
+namespace OHOS {\r
+    static const uint8_t FADE_OUT_OPACITY = 250;\r
+    static const uint8_t FADE_IN_OPACITY = 30;\r
+    static const uint8_t FADE_DELTA = 200;\r
+    static const int16_t FADE_IN_TRANS = 5;\r
+    static const int16_t FADE_OUT_TRANS = -5;\r
+    static constexpr int16_t OPA_MAX = 255;\r
+\r
+    REGIST_TRANSITION(TransitionType::TRANSITION_TRANSPARENT_GRADIENT, TransparentGradientTransition, 400, true, true);\r
+    void TransparentGradientTransition::OnTransitionStart(UIImageView* current, UIImageView* target)\r
+    {\r
+        if ((current == nullptr) || (target == nullptr)) {\r
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_LAUNCHER_FWK, "TransparentGradientTransition ImageView is empty!");\r
+            return;\r
+        }\r
+\r
+        current_ = current;\r
+        target_ = target;\r
+\r
+        // currentView fade out\r
+        currentOpa_ = FADE_OUT_OPACITY;\r
+        transOut_ = 0;\r
+        Vector2<int16_t> transTarget(transIn_, 0);\r
+        current_->SetOpaScale(currentOpa_);\r
+\r
+        // targeview fade in\r
+        transIn_ = FADE_IN_TRANS;\r
+        targetOpa_ = FADE_IN_OPACITY;\r
+        target_->Translate(transTarget);\r
+        target_->SetOpaScale(targetOpa_);\r
+    }\r
+\r
+    void TransparentGradientTransition::TransitionAlg(uint32_t time)\r
+    {\r
+        if ((current_ == nullptr) || (target_ == nullptr)) {\r
+            return;\r
+        }\r
+\r
+        float scale = EasingEquation::QuadEaseIn(0, OPA_MAX, time, duration_) / static_cast<float>(OPA_MAX);\r
+        uint8_t opa = uint8_t(scale * FADE_DELTA);\r
+        currentOpa_ = FADE_OUT_OPACITY - opa;\r
+        targetOpa_ = FADE_IN_OPACITY + opa;\r
+        transIn_ = FADE_IN_TRANS - int16_t(scale*FADE_IN_TRANS);\r
+        transOut_ = int16_t(scale*FADE_OUT_TRANS);\r
+\r
+        Vector2<int16_t> transCurrent(transOut_, 0);\r
+        Vector2<int16_t> transTarget(transIn_, 0);\r
+\r
+        current_->Translate(transCurrent);\r
+        current_->SetOpaScale(currentOpa_);\r
+\r
+        target_->Translate(transTarget);\r
+        target_->SetOpaScale(targetOpa_);\r
+    }\r
+\r
+    void TransparentGradientTransition::OnTransitionEnd()\r
+    {\r
+        if (current_ == nullptr || target_ == nullptr) {\r
+            return;\r
+        }\r
+\r
+        target_->SetOpaScale(OPA_OPAQUE);\r
+        current_->SetOpaScale(OPA_TRANSPARENT);\r
+    }\r
+}
\ No newline at end of file
diff --git a/code/sdk/application/wearable/evb/nativeabilityfwk/src/transition/TransparentGradientTransition.h b/code/sdk/application/wearable/evb/nativeabilityfwk/src/transition/TransparentGradientTransition.h
new file mode 100644 (file)
index 0000000..2f03e68
--- /dev/null
@@ -0,0 +1,33 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: TransparentGradientTransition\r
+ * Create: 2025-04\r
+ */\r
+\r
+#ifndef TRANSPARENT_GRADIENT_TRANSITION_H\r
+#define TRANSPARENT_GRADIENT_TRANSITION_H\r
+\r
+#include "TransitionCallback.h"\r
+\r
+namespace OHOS {\r
+    class TransparentGradientTransition : public TransitionCallback {\r
+    public:\r
+        TransparentGradientTransition(uint32_t time, bool enableCurrentSnapshot, bool enableTargetSnapshot) :\r
+            TransitionCallback(time, enableCurrentSnapshot, enableTargetSnapshot) {}\r
+        ~TransparentGradientTransition() override {}\r
+\r
+        void OnTransitionStart(UIImageView* current, UIImageView* target) override;\r
+        void TransitionAlg(uint32_t time) override;\r
+        void OnTransitionEnd() override;\r
+    private:\r
+\r
+        UIImageView* current_ = nullptr;\r
+        UIImageView* target_ = nullptr;\r
+        uint8_t currentOpa_;\r
+        uint8_t targetOpa_;\r
+        int16_t transIn_;\r
+        int16_t transOut_;\r
+    };\r
+} // namespace OHOS\r
+\r
+#endif
\ No newline at end of file
index 5663f70..11656bc 100644 (file)
@@ -10,6 +10,7 @@
 #include "components/root_view.h"
 #include "TransitionManager.h"
 #include "wearable_log.h"
+#include "TransitionUtils.h"
 
 namespace OHOS {
 REGIST_TRANSITION(TransitionType::TRANSITION_WATERFALL, WaterfallTransition, 300, false, true);
@@ -20,8 +21,7 @@ static const float TARGET_SCALE_END = 1.0f;
 
 void WaterfallTransition::OnTransitionStart(UIViewGroup* current, UIImageView* target)
 {
-    current->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);
-    current_ = dynamic_cast<UIWaterfallList*>(current->GetChildrenHead());
+    current_ = dynamic_cast<UIWaterfallList*>(TransitionUtils::GetViewAndTransparentizePath(current, UI_WATERFALL_LIST));
     if (current_ == nullptr) {
         return;
     }
@@ -37,7 +37,6 @@ void WaterfallTransition::OnTransitionStart(UIViewGroup* current, UIImageView* t
         WEARABLE_LOGE(WEARABLE_LOG_MODULE_LAUNCHER_FWK, "WaterfallTransition no focus view\n");
         return;
     }
-    current_->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);
     opaStart_ = focusView_->GetOpaScale();
     scaleStart_ = current_->GetGlobalScale();
     Rect rect = focusView_->GetRect();
diff --git a/code/sdk/application/wearable/evb/nativeabilityfwk/src/transition/ZoomOutTransition.cpp b/code/sdk/application/wearable/evb/nativeabilityfwk/src/transition/ZoomOutTransition.cpp
new file mode 100644 (file)
index 0000000..d4c4c52
--- /dev/null
@@ -0,0 +1,43 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: ZoomOutTransition\r
+ * Create: 2025-04\r
+ */\r
+\r
+#include "animator/easing_equation.h"\r
+#include "common/screen.h"\r
+#include "components/root_view.h"\r
+#include "TransitionManager.h"\r
+#include "wearable_log.h"\r
+#include "ZoomOutTransition.h"\r
+\r
+namespace OHOS {\r
+static constexpr int16_t DURATION = 200;\r
+static constexpr float HALF = 0.5f;\r
+static constexpr float NUM2 = 2.0f;\r
+static constexpr int16_t SCALE_BASE = 1;\r
+REGIST_TRANSITION(TransitionType::TRANSITION_ZOOM_OUT, ZoomOutTransition, DURATION, true, true);\r
+\r
+void ZoomOutTransition::OnTransitionStart(UIImageView* current, UIImageView* target)\r
+{\r
+    if (current == nullptr || target == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_LAUNCHER_FWK, "ZoomOutTransition ImageView is empty!");\r
+        return;\r
+    }\r
+    target_ = target;\r
+    current_ = current;\r
+    RootView::GetInstance()->Remove(target);\r
+    RootView::GetInstance()->Insert(nullptr, target);\r
+    middleWidth_ = Screen::GetInstance().GetWidth() / NUM2;\r
+    middleHeight_ = Screen::GetInstance().GetHeight() / NUM2;\r
+}\r
+\r
+void ZoomOutTransition::TransitionAlg(uint32_t time)\r
+{\r
+    float zoom_scale = EasingEquation::LinearEaseNone(DURATION, 0, time, duration_) / static_cast<float>(DURATION);\r
+    float zoom_in_scale = zoom_scale;\r
+    current_->Scale(Vector2<float>{zoom_in_scale, zoom_in_scale}, Vector2<float>{middleWidth_, middleHeight_});\r
+    float zoom_out_scale = SCALE_BASE + zoom_scale;\r
+    target_->Scale(Vector2<float>{zoom_out_scale, zoom_out_scale}, Vector2<float>{middleWidth_, middleHeight_});\r
+}\r
+} // namespace OHOS\r
diff --git a/code/sdk/application/wearable/evb/nativeabilityfwk/src/transition/ZoomOutTransition.h b/code/sdk/application/wearable/evb/nativeabilityfwk/src/transition/ZoomOutTransition.h
new file mode 100644 (file)
index 0000000..1bbd02a
--- /dev/null
@@ -0,0 +1,26 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: ZoomOutTransition\r
+ * Create: 2025-04\r
+ */\r
+\r
+#ifndef ZOOM_OUT_TRANSITION_H\r
+#define ZOOM_OUT_TRANSITION_H\r
+#include "TransitionCallback.h"\r
+\r
+namespace OHOS {\r
+class ZoomOutTransition : public TransitionCallback {\r
+public:\r
+    ZoomOutTransition(uint32_t time, bool enableCurrentSnapshot, bool enableTargetSnapshot) :\r
+        TransitionCallback(time, enableCurrentSnapshot, enableTargetSnapshot) {}\r
+    ~ZoomOutTransition() override {}\r
+    void OnTransitionStart(UIImageView* current, UIImageView* target) override;\r
+    void TransitionAlg(uint32_t time) override;\r
+private:\r
+    UIImageView* current_ = nullptr;\r
+    UIImageView* target_ = nullptr;\r
+    float middleWidth_;\r
+    float middleHeight_;\r
+};\r
+} // namespace OHOS\r
+#endif // ZOOM_OUT_TRANSITION_H
\ No newline at end of file
index 233f276..9191033 100644 (file)
@@ -1,52 +1,44 @@
-/*
- * Copyright (c) CompanyNameMagicTag 2023. All rights reserved.
- * Description: ZoomTransition
- * Author:
- * Create: 2023-11
- */
-
-#include "ZoomTransition.h"
-#include "animator/easing_equation.h"
-#include "TransitionManager.h"
-
-namespace OHOS {
-static constexpr int16_t RANGE = 1000;
-REGIST_TRANSITION(TransitionType::TRANSITION_ZOOM, ZoomTransition, 800, true, true);
-
-void ZoomTransition::OnTransitionStart(UIImageView* current, UIImageView* target)
-{
-    current_ = current;
-    target_ = target;
-}
-
-void ZoomTransition::TransitionAlg(uint32_t time)
-{
-    if ((current_ == nullptr) || (target_ == nullptr)) {
-        return;
-    }
-
-    float scale;
-    uint32_t half = duration_ / 2; // 2: half of duration
-    if (time < half) {
-        scale = 1 - EasingEquation::QuadEaseOut(0, RANGE, time, half) / static_cast<float>(RANGE);
-    } else {
-        scale = EasingEquation::QuadEaseIn(0, RANGE, time - half, half) / static_cast<float>(RANGE);
-    }
-    uint8_t opa = scale * OPA_OPAQUE;
-    if (time < half) {
-        float centerX = current_->GetX() + current_->GetWidth() / 2.0f; // 2.0: half of width
-        float centerY = current_->GetY() + current_->GetHeight() / 2.0f; // 2.0: half of height
-        current_->SetVisible(true);
-        target_->SetVisible(false);
-        current_->Scale(Vector2<float>{scale, scale}, Vector2<float>{centerX, centerY});
-        current_->SetOpaScale(opa);
-    } else {
-        float centerX = target_->GetX() + target_->GetWidth() / 2.0f; // 2.0: half of width
-        float centerY = target_->GetY() + target_->GetHeight() / 2.0f; // 2.0: half of height
-        target_->SetVisible(true);
-        current_->SetVisible(false);
-        target_->Scale(Vector2<float>{scale, scale}, Vector2<float>{centerX, centerY});
-        target_->SetOpaScale(opa);
-    }
-}
-} // namespace OHOS
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: ZoomTransition\r
+ * Create: 2025-04\r
+ */\r
+\r
+#include "animator/easing_equation.h"\r
+#include "common/screen.h"\r
+#include "TransitionManager.h"\r
+#include "wearable_log.h"\r
+#include "ZoomTransition.h"\r
+\r
+namespace OHOS {\r
+static constexpr uint16_t DURATION = 160;\r
+static constexpr uint16_t OPA_DURATION = 100;\r
+static constexpr float NUM2 = 2.0f;\r
+static constexpr float SCALE_BASE = 1;\r
+\r
+REGIST_TRANSITION(TransitionType::TRANSITION_ZOOM, ZoomTransition, DURATION, true, true);\r
+\r
+void ZoomTransition::OnTransitionStart(UIImageView* current, UIImageView* target)\r
+{\r
+    if (current == nullptr || target == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_LAUNCHER_FWK, "ZoomTransition ImageView is empty!");\r
+        return;\r
+    }\r
+    current_ = current;\r
+    target_ = target;\r
+    middleWidth_ = Screen::GetInstance().GetWidth() / NUM2;\r
+    middleHeight_ = Screen::GetInstance().GetHeight() / NUM2;\r
+}\r
+\r
+void ZoomTransition::TransitionAlg(uint32_t time)\r
+{\r
+    float zoom_scale = EasingEquation::LinearEaseNone(0, DURATION, time, duration_) \\r
+                                        / static_cast<float>(DURATION);\r
+    float zoom_out_scale = SCALE_BASE + zoom_scale;\r
+    float zoom_in_scale = zoom_scale;\r
+    uint8_t opaScale = EasingEquation::CubicEaseOut(OPA_OPAQUE / NUM2, OPA_OPAQUE, time, OPA_DURATION);\r
+    current_->Scale(Vector2<float>{zoom_out_scale, zoom_out_scale}, Vector2<float>{middleWidth_, middleHeight_});\r
+    target_->SetOpaScale(opaScale);\r
+    target_->Scale(Vector2<float>{zoom_in_scale, zoom_in_scale}, Vector2<float>{middleWidth_, middleHeight_});\r
+}\r
+} // namespace OHOS\r
index 419f2c0..ad604e5 100644 (file)
@@ -1,25 +1,26 @@
-/*
- * Copyright (c) CompanyNameMagicTag 2023. All rights reserved.
- * Description: ZoomTransition
- * Author:
- * Create: 2023-11
- */
-
-#ifndef ZOOM_TRANSITION_H
-#define ZOOM_TRANSITION_H
-#include "TransitionCallback.h"
-
-namespace OHOS {
-class ZoomTransition : public TransitionCallback {
-public:
-    ZoomTransition(uint32_t time, bool enableCurrentSnapshot, bool enableTargetSnapshot) :
-        TransitionCallback(time, enableCurrentSnapshot, enableTargetSnapshot) {}
-    ~ZoomTransition() override {}
-    void OnTransitionStart(UIImageView* current, UIImageView* target) override;
-    void TransitionAlg(uint32_t time) override;
-private:
-    UIImageView* current_ = nullptr;
-    UIImageView* target_ = nullptr;
-};
-} // namespace OHOS
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: ZoomTransition\r
+ * Create: 2025-04\r
+ */\r
+\r
+#ifndef ZOOM_TRANSITION_H\r
+#define ZOOM_TRANSITION_H\r
+#include "TransitionCallback.h"\r
+\r
+namespace OHOS {\r
+class ZoomTransition : public TransitionCallback {\r
+public:\r
+    ZoomTransition(uint32_t time, bool enableCurrentSnapshot, bool enableTargetSnapshot) :\r
+        TransitionCallback(time, enableCurrentSnapshot, enableTargetSnapshot) {}\r
+    ~ZoomTransition() override {}\r
+    void OnTransitionStart(UIImageView* current, UIImageView* target) override;\r
+    void TransitionAlg(uint32_t time) override;\r
+private:\r
+    UIImageView* current_ = nullptr;\r
+    UIImageView* target_ = nullptr;\r
+    float middleWidth_;\r
+    float middleHeight_;\r
+};\r
+} // namespace OHOS\r
 #endif // ZOOM_TRANSITION_H
\ No newline at end of file
index 779b0cc..b0fdeb9 100644 (file)
@@ -13,7 +13,7 @@ set(PUBLIC_HEADER
 set(PRIVATE_HEADER
     ${NativeApp}/nativeui/
     ${NativeApp}/nativeui/uisample/uitest/framework/include
-    ${UI_SAMPLE_ROOT}/components
+    ${NativeApp}/nativeui/inlcude/screennotify
     ${NativeApp}/../service/smart_voice/smart_voice_service/interfaces/innerkits/native_c/include
     ${NativeApp}/../service/smart_voice/voice_engine_hal/interfaces/innerkits/native_c/include
     ${NativeApp}/../ohos_deps
@@ -23,6 +23,7 @@ set(PRIVATE_HEADER
     ${ROOT_DIR}/middleware/services/gui/uikit/proprietary/src/ui/frameworks
     ${ROOT_DIR}/middleware/services/gui/uikit/proprietary/src/ui/innerkits
 
+    ${UI_SAMPLE_ROOT}/components
     ${ROOT_DIR}/middleware/services/gui/uikit/ui/interfaces/kits/events
     ${ROOT_DIR}/middleware/services/gui/uikit/ui/interfaces/kits
     ${ROOT_DIR}/middleware/services/gui/uikit/utils/interfaces/kits
@@ -63,39 +64,40 @@ set(PRIVATE_HEADER
     ${ROOT_DIR}/middleware/services/gui/uikit/ui/interfaces/kits/animator
     ${ROOTDIR}/open_source/flatbuffers/include
     ${ROOT_DIR}/open_source/openharmony/third_party/lwip/lwip_adapter/lwip_driver_adapter
+    ${ROOT_DIR}/open_source/openharmony/foundation/ace/ace_engine_lite/modules/calendarManager
+    ${ROOTDIR}/open_source/openharmony/third_party/lwip/lwip_adapter/liteos/src/include/public
 )
 
 file(GLOB_RECURSE SOURCES "${NativeApp}/nativeui/*.cpp")
+file(GLOB_RECURSE UI_SAMPLE_SRC "${UI_SAMPLE_ROOT}/components/*.cpp")
+list(REMOVE_ITEM UI_SAMPLE_SRC
+    ${UI_SAMPLE_ROOT}/components/ui_test_bitmap_font/ui_test_bitmap_font.cpp
+    ${UI_SAMPLE_ROOT}/components/ui_test_clock_dial/ui_test_clock_dial.cpp
+    ${UI_SAMPLE_ROOT}/components/ui_test_clock_dial/ScreenModel.cpp
+    ${UI_SAMPLE_ROOT}/components/ui_test_clock_dial/PullUpDownView.cpp
+    ${UI_SAMPLE_ROOT}/components/ui_test_clock_dial/MainClockView.cpp
+    ${UI_SAMPLE_ROOT}/components/ui_test_clock_dial/HeartRateView.cpp
+    ${UI_SAMPLE_ROOT}/components/ui_test_clock_dial/CompassView.cpp
+    ${UI_SAMPLE_ROOT}/components/ui_test_clock_dial/CompassControlView.cpp
+    ${UI_SAMPLE_ROOT}/components/ui_test_clock_dial/ActivityWeekView.cpp
+    ${UI_SAMPLE_ROOT}/components/ui_test_compass/ui_test_compass.cpp
+    ${UI_SAMPLE_ROOT}/components/ui_test_dump_dom_tree/ui_test_dump_dom.cpp
+)
+
+if(NOT "CONFIG_NATIVEAPP_TEST" IN_LIST DEFINES)
+    file(GLOB FILES_TO_REMOVE_MONKEY "${CMAKE_CURRENT_SOURCE_DIR}/nativeui/monkey/src/*.cpp")
+    file(GLOB FILES_TO_REMOVE_EMPTY "${CMAKE_CURRENT_SOURCE_DIR}/nativeui/emptypage/src/*.cpp")
+    list(APPEND FILES_TO_REMOVE ${FILES_TO_REMOVE_MONKEY} ${FILES_TO_REMOVE_EMPTY})
+    list(REMOVE_ITEM SOURCES ${FILES_TO_REMOVE})
+endif()
+
 set(SOURCES
     ${SOURCES}
     ${NativeApp}/nativelauncher/src/NativeLauncher.cpp
     ${NativeApp}/nativelauncher/src/NativeRegisterManager.cpp
     ${NativeApp}/nativelauncher/src/UICardPageFactory.cpp
-    ${UI_SAMPLE_ROOT}/components/ui_test_lottie/ui_test_lottie.cpp
-    ${UI_SAMPLE_ROOT}/components/ui_test_tiger/tiger_view.cpp
-    ${UI_SAMPLE_ROOT}/components/ui_test_tiger/ui_test_tiger.cpp
-    ${UI_SAMPLE_ROOT}/components/ui_test_running_ball/ui_test_running_ball.cpp
-    ${UI_SAMPLE_ROOT}/components/ui_test_breath/ui_test_breath.cpp
-    ${UI_SAMPLE_ROOT}/components/ui_test_card_switch/ui_test_card_switch.cpp
-    ${UI_SAMPLE_ROOT}/components/ui_test_countdown/ui_test_countdown.cpp
-    ${UI_SAMPLE_ROOT}/components/ui_test_list_fps/image_text_adapter.cpp
-    ${UI_SAMPLE_ROOT}/components/ui_test_list_fps/ui_test_list_fps.cpp
-    ${UI_SAMPLE_ROOT}/components/ui_test_particle/ui_test_particle.cpp
-    ${UI_SAMPLE_ROOT}/components/ui_test_message/ui_test_message.cpp
-    ${UI_SAMPLE_ROOT}/components/ui_test_icosahedron/ui_test_icosahedron.cpp
-    ${UI_SAMPLE_ROOT}/components/ui_test_cube_rotate/cube_rotate_view.cpp
-    ${UI_SAMPLE_ROOT}/components/ui_test_cube_rotate/ui_test_cube_rotate.cpp
-    ${UI_SAMPLE_ROOT}/components/ui_test_video_play/ui_test_video_play.cpp
-    ${UI_SAMPLE_ROOT}/components/ui_test_keyboard/ui_test_keyboard.cpp
-    ${UI_SAMPLE_ROOT}/components/ui_test_hexagons_list/ui_test_hexagons_list.cpp
-    ${UI_SAMPLE_ROOT}/components/ui_test_waterfall_list/ui_test_waterfall_list.cpp
-    ${UI_SAMPLE_ROOT}/components/ui_test_coverflow/ui_test_coverflow.cpp
-    ${UI_SAMPLE_ROOT}/components/ui_test_slipflow/ui_test_slipflow.cpp
-    ${UI_SAMPLE_ROOT}/components/ui_test_kaleidoscope/ui_test_kaleidoscope.cpp
-    ${UI_SAMPLE_ROOT}/components/ui_test_roller_view/ui_test_roller_view.cpp
-    ${UI_SAMPLE_ROOT}/components/ui_test_emoji/ui_test_emoji.cpp
-    ${UI_SAMPLE_ROOT}/components/ui_test_sphere_view/ui_test_sphere_view.cpp
-    ${UI_SAMPLE_ROOT}/components/ui_test_nested/ui_test_nested.cpp
+    ${NativeApp}/nativelauncher/src/UIWatchDialFactory.cpp
+    ${UI_SAMPLE_SRC}
 )
 
 list(REMOVE_ITEM SOURCES
@@ -209,7 +211,7 @@ set(PRIVATE_HEADER
     ${ROOT_DIR}/open_source/openharmony/foundation/ace/ace_engine_lite/interfaces/base
     ${ROOT_DIR}/middleware/services/gui/uikit/proprietary/include
     ${ROOT_DIR}/middleware/services/gui/uikit/proprietary/src/utils/innerkits
-    ${ROOT_DIR}/middleware/services/gui/uikit/proprietary/src/ui/frameworks/
+    ${ROOT_DIR}/middleware/services/gui/uikit/proprietary/src/ui/frameworks
     ${ROOT_DIR}/middleware/services/gui/uikit/utils/interfaces/innerkits
     ${ROOT_DIR}/middleware/services/gui/uikit/utils/interfaces/kits
     ${ROOT_DIR}/middleware/services/gui/uikit/utils/interfaces/kits/gfx_utils
index eede3b3..1bf80f9 100644 (file)
Binary files a/code/sdk/application/wearable/evb/nativeapp/brandy-auto-ota-cli/libuikit_fwk.a and b/code/sdk/application/wearable/evb/nativeapp/brandy-auto-ota-cli/libuikit_fwk.a differ
index 40a9458..a29f4e7 100644 (file)
Binary files a/code/sdk/application/wearable/evb/nativeapp/brandy-auto-ota-ser/libuikit_fwk.a and b/code/sdk/application/wearable/evb/nativeapp/brandy-auto-ota-ser/libuikit_fwk.a differ
index e3ce469..dd5873d 100644 (file)
Binary files a/code/sdk/application/wearable/evb/nativeapp/brandy-native-js/libuikit_fwk.a and b/code/sdk/application/wearable/evb/nativeapp/brandy-native-js/libuikit_fwk.a differ
index 337b034..ae7f995 100644 (file)
Binary files a/code/sdk/application/wearable/evb/nativeapp/brandy-xts/libuikit_fwk.a and b/code/sdk/application/wearable/evb/nativeapp/brandy-xts/libuikit_fwk.a differ
index 6c6b38f..40cacd2 100644 (file)
@@ -33,7 +33,6 @@ typedef enum : uint16_t {
     VIEW_MAIN_ACTIVITY = 7,
     VIEW_ALARM_POP_UP,
     VIEW_CALLER_SAMPLE,
-    VIEW_MAEKPHONE_SAMPLE,
     VIEW_BLOODOXY_SAMPLE,
     VIEW_BLUETOOTH_EARPHONE,
     VIEW_OFFLINEVOICE,
@@ -42,10 +41,9 @@ typedef enum : uint16_t {
     VIEW_COMPASS,
     VIEW_CONNECT_PHONE,
     VIEW_MAIN_TEMP,
-    VIEW_INDOORWALK,
     VIEW_REBOOT,
     VIEW_UISAMPLE,
-    VIEW_MAIN_BREATHEASE,
+    VIEW_BREATH,
     VIEW_FLASHLIGHT,  // 手电筒;
     VIEW_STOPWATCH,  // 秒表;
     VIEW_WEATHER, // 天气
@@ -54,20 +52,15 @@ typedef enum : uint16_t {
     VIEW_CAMERA, // 相机
     VIEW_FIND_PHONE, // 寻找手机
     VIEW_DATE, // 日期
-    VIEW_QRCODE_CONN,  // 二维码连接;
-    VIEW_SPORTS,
+    VIEW_SPORT,
+    VIEW_PHONE_MENU,
     VIEW_SLEEPING,
-    VIEW_TRAINING,
     VIEW_EMPTY,
+    VIEW_HEARTRATE,
+    VIEW_MONKEY,
 #ifdef SUPPORT_ALIPAY_SEC
     VIEW_MAIN_ALIPAY,
 #endif
-    VIEW_SET_DESKTOP,
-    VIEW_SET_OTA,
-    VIEW_SET_CARD,
-    VIEW_ADD_CARD,
-    VIEW_SET_DIAL,
-    VIEW_SET_DIAL_STYLE,
     VIEW_AOD,
     VIEW_RESTORE_DEFAULTS,
     VIEW_RECENT_APP,
index 761e137..33f0fc3 100644 (file)
@@ -21,22 +21,22 @@ public:
         static UICardPageFactory instance;
         return instance;
     }
-    void RegisterWatchDial(const uint16_t mode, const uint16_t id, UICardPageProxyInterface* uiCardPage);
-    UICardPage* CreateWatchDial(uint16_t mode, uint16_t id);
+    void RegisterCardPage(const uint16_t id, UICardPageProxyInterface* uiCardPage);
+    UICardPage* CreateCardPage(uint16_t id);
 
 private:
     UICardPageFactory() {};
     ~UICardPageFactory() {};
     UICardPageFactory(const UICardPageFactory&) = delete;
     UICardPageFactory &operator=(const UICardPageFactory&) = delete;
-    std::unordered_map<uint16_t, UICardPageProxyInterface*> watchDials_[static_cast<uint16_t>(DIAL_DISPLAY_MODE_MAX)];
+    std::unordered_map<uint16_t, UICardPageProxyInterface*> cardPage_;
 };
 
-class WatchDialRegister {
+class CardPageRegister {
 public:
-    WatchDialRegister(const uint16_t mode, const uint16_t id, UICardPageProxyInterface* uiCardPage)
+    CardPageRegister(const uint16_t id, UICardPageProxyInterface* uiCardPage)
     {
-        UICardPageFactory::GetInstance().RegisterWatchDial(mode, id, uiCardPage);
+        UICardPageFactory::GetInstance().RegisterCardPage(id, uiCardPage);
     }
 };
 
@@ -52,7 +52,7 @@ public:
 };
 
 template <class U>
-class WatchDialProxy : public UICardPageProxyInterface {
+class CardPageProxy : public UICardPageProxyInterface {
 public:
     UICardPage* CreateUICardPage() override
     {
@@ -66,8 +66,8 @@ public:
 };
 } // namespace OHOS
 
-#define REGIST_WATCH_DIAL(mode, id, U) \
-    const static OHOS::WatchDialRegister (STATIC_VAR)(static_cast<uint16_t>(mode), static_cast<uint16_t>(id), \
-                                                      new WatchDialProxy<U>())
+#define REGIST_CARD_PAGE(id, U) \
+    const static OHOS::CardPageRegister (STATIC_VAR)(static_cast<uint16_t>(id), \
+                                                      new CardPageProxy<U>())
 
 #endif // UI_CARD_PAGE_FACTORY_H
\ No newline at end of file
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativelauncher/include/UIWatchDialFactory.h b/code/sdk/application/wearable/evb/nativeapp/nativelauncher/include/UIWatchDialFactory.h
new file mode 100644 (file)
index 0000000..086b2a2
--- /dev/null
@@ -0,0 +1,94 @@
+/*
+ * Copyright (c) CompanyNameMagicTag 2025. All rights reserved.
+ * Description: UIWatchDialFactory
+ * Author:
+ * Create: 2025-06
+ */
+
+#ifndef UI_WATCH_DIAL_FACTORY_H
+#define UI_WATCH_DIAL_FACTORY_H
+
+#include <unordered_map>
+#include "components/ui_card_page.h"
+#include "UiConfig.h"
+#include "wearable_log.h"
+#include "main/MainModel.h"
+#include "components/ui_fragment.h"
+
+namespace OHOS {
+class UIWatchDialProxyInterface;
+class UIWatchDialFactory {
+public:
+    static UIWatchDialFactory& GetInstance()
+    {
+        static UIWatchDialFactory instance;
+        return instance;
+    }
+    void RegisterWatchDial(const uint16_t ability, const uint16_t id, UIWatchDialProxyInterface* uiWatchDial,
+        const DialInfo* dialInfo);
+    UICardPage* CreateNormalDial(uint16_t id);
+    UIFragment* CreateAodDial(uint16_t id);
+    const DialInfo* GetNormalDialInfo(uint16_t id);
+    uint8_t GetNormalDialInfoNum();
+
+private:
+    UIWatchDialFactory() {};
+    ~UIWatchDialFactory() {};
+    UIWatchDialFactory(const UIWatchDialFactory&) = delete;
+    UIWatchDialFactory &operator=(const UIWatchDialFactory&) = delete;
+    std::unordered_map<uint16_t, UIWatchDialProxyInterface*> watchDials_[static_cast<uint16_t>(DIAL_DISPLAY_MODE_MAX)];
+    std::unordered_map<uint16_t, const DialInfo*> normalDialInfo_;
+};
+
+class WatchDialRegister {
+public:
+    WatchDialRegister(const uint16_t ability, const uint16_t id, UIWatchDialProxyInterface* uiWatchDial,
+        const DialInfo* dialInfo)
+    {
+        UIWatchDialFactory::GetInstance().RegisterWatchDial(ability, id, uiWatchDial, dialInfo);
+    }
+};
+
+class UIWatchDialProxyInterface {
+public:
+    virtual UICardPage* CreateWatchDialCardPage(const uint16_t id) = 0;
+    virtual UIFragment* CreateWatchDialFragment(const uint16_t id) = 0;
+    UIWatchDialProxyInterface() = default;
+    virtual ~UIWatchDialProxyInterface() = default;
+    UIWatchDialProxyInterface(const UIWatchDialProxyInterface&) = delete;
+    UIWatchDialProxyInterface& operator=(const UIWatchDialProxyInterface&) = delete;
+    UIWatchDialProxyInterface(UIWatchDialProxyInterface&&) = delete;
+    UIWatchDialProxyInterface& operator=(UIWatchDialProxyInterface&&) = delete;
+};
+
+template <class U>
+class WatchDialProxy : public UIWatchDialProxyInterface {
+public:
+    UICardPage* CreateWatchDialCardPage(const uint16_t id) override
+    {
+        U* u = new U();
+        UICardPage* page = dynamic_cast<UICardPage*>(u);
+        if (page == nullptr) {
+            delete u;
+        }
+        return page;
+    }
+
+    UIFragment* CreateWatchDialFragment(const uint16_t id) override
+    {
+        U* u = new U();
+        UIFragment* fragment = dynamic_cast<UIFragment*>(u);
+        if (fragment == nullptr) {
+            delete u;
+        }
+        fragment->CreateView();
+        return fragment;
+    }
+};
+} // namespace OHOS
+
+#define REGIST_WATCH_DIAL(ability, id, U, info) \
+    const static OHOS::WatchDialRegister (STATIC_VAR)(static_cast<uint16_t>(ability), static_cast<uint16_t>(id), \
+                                                      new WatchDialProxy<U>(), static_cast<const DialInfo*>(info))
+
+#endif // UI_WATCH_DIAL_FACTORY_H
\ No newline at end of file
index b04a143..5af46ad 100644 (file)
@@ -15,7 +15,6 @@
 namespace OHOS {
     typedef enum {
         WATCH_FACE = 0, /* 主表盘枚举值不能修改 */
-        HEART_RATE,
         COMPASS,
         ACTIVITY,
         MUSIC_PLAYER,
@@ -28,14 +27,22 @@ namespace OHOS {
 
     typedef enum {
         DIAL_CLOCK = 0,
+        GRADIENT_CLOCK,
         DIAL_MAX,
     } DialId;
 
     typedef enum {
-        DIAL_DISPLAY_MODE_MAIN = 0,
+        DIAL_DISPLAY_MODE_NORMAL = 0,
         DIAL_DISPLAY_MODE_AOD,
         DIAL_DISPLAY_MODE_MAX,
-    } DialDispayMode;
+    } DialDisplayMode;
+
+    typedef enum {
+        DIAL_DISPLAY_SUPPORT_NORMAL = 0,
+        DIAL_DISPLAY_SUPPORT_AOD,
+        DIAL_DISPLAY_SUPPORT_NORMAL_AOD,
+        DIAL_DISPLAY_SUPPORT_MAX,
+    } DialDisplayAbility;
 
     #ifndef UNUSED
     #define UNUSED(x) ((void)(x))
@@ -64,17 +71,20 @@ namespace OHOS {
     #define APP_MUSIC_PATH "/user/music"
     #define APP_VIDEO_PATH "/user/video"
     #define APP_DIAL_PATH "/user/dial"
+    #define APP_RECENT_PATH "/system/recent/"
 #else
 #ifdef RELEASE_VERSION
     #define APP_RES_PATH "res/res"
     #define APP_MUSIC_PATH "res/music"
     #define APP_VIDEO_PATH "res/video"
     #define APP_DIAL_PATH "res/dial"
+    #define APP_RECENT_PATH "/res/recent/"
 #else
     #define APP_RES_PATH "../../../wearable/res/res"
     #define APP_MUSIC_PATH "../../../wearable/res/music"
     #define APP_VIDEO_PATH "../../../wearable/res/video"
     #define APP_DIAL_PATH "../../../wearable/res/dial"
+    #define APP_RECENT_PATH "../../../wearable/res/recent/"
 #endif
 #endif
 
@@ -86,87 +96,12 @@ namespace OHOS {
     static constexpr const char *DROPDOWN_IAMGES = APP_RES_PATH"/dropdown/dropdown.bin";
     static constexpr const char *HEART_IAMGES = APP_RES_PATH"/heart/heart.bin";
     static constexpr const char *PNG_BLUETOOTH_HINTS_PATH = APP_RES_PATH"/BLUETOOTH_HINTS.bin";
-    static constexpr const char *PNG_BLOODOXYGEN_IMAGE_PATH = APP_RES_PATH"/BLOODOXYGEN_VIEW.bin";
-
-    static constexpr const char *PNG_BLOOD_ICON_ENTER = APP_RES_PATH"/BLOOD_ICON_ENTER.bin";
-
-    static constexpr const char *PNG_AGREEING_IMAGE_PATH = APP_RES_PATH"/AGREEING.bin";
-    static constexpr const char *PNG_DISSGREE_IMAGE_PATH = APP_RES_PATH"/DISSGREE.bin";
-    static constexpr const char *PNG_MICROPHONE_OPEN_IMAGE_PATH = APP_RES_PATH"/MICRO_PHONE_OPEN.bin";
-    static constexpr const char *PNG_MICROPHONE_CLOSE_IMAGE_PATH = APP_RES_PATH"/MICRO_PHONE_CLOSE.bin";
-    static constexpr const char *PNG_HANDUP_IMAGE_PATH = APP_RES_PATH"/HANDUP.bin";
-    static constexpr const char *PNG_ANSWER_TMAGE_PATH = APP_RES_PATH"/ANSWER_PHONE.bin";
-    static constexpr const char *PNG_CALLING_TMAGE_PATH = APP_RES_PATH"/CALLING_PHONE.bin";
-    static constexpr const char *PNG_CALLER_TMAGE_PATH = APP_RES_PATH"/CALLER_LOG_IMAGE.bin";
-    static constexpr const char *PNG_NO_CALLER_LOG_IMAGE = APP_RES_PATH"/NO_CALLER_LOG_IMAGE.bin";
-    static constexpr const char *PNG_APPLIST_CALLER_IMAGE = APP_RES_PATH"/APPLIST_CALLER_IMAGE.bin";
     static constexpr const char *PNG_APPLIST_COMPASS_IMAGE = APP_RES_PATH"/APPLIST_COMPASS_IMAGE.bin";
 
-    static constexpr const char *PNG_COUNTDOWN_TIME_IMAGE_0 = APP_RES_PATH"/COUNTDOWN_IMAGE_01.bin";
-    static constexpr const char *PNG_COUNTDOWN_TIME_IMAGE_1 = APP_RES_PATH"/COUNTDOWN_IMAGE_02.bin";
-    static constexpr const char *PNG_COUNTDOWN_TIME_IMAGE_2 = APP_RES_PATH"/COUNTDOWN_IMAGE_03.bin";
-    static constexpr const char *PNG_COUNTDOWN_TIME_IMAGE_3 = APP_RES_PATH"/COUNTDOWN_IMAGE_04.bin";
-    static constexpr const char *PNG_COUNTDOWN_TIME_IMAGE_4 = APP_RES_PATH"/COUNTDOWN_IMAGE_05.bin";
-    static constexpr const char *PNG_COUNTDOWN_TIME_IMAGE_5 = APP_RES_PATH"/COUNTDOWN_IMAGE_06.bin";
-    static constexpr const char *PNG_COUNTDOWN_TIME_IMAGE_6 = APP_RES_PATH"/COUNTDOWN_IMAGE_07.bin";
-    static constexpr const char *PNG_COUNTDOWN_TIME_IMAGE_7 = APP_RES_PATH"/COUNTDOWN_IMAGE_08.bin";
-    static constexpr const char *PNG_COUNTDOWN_TIME_IMAGE_8 = APP_RES_PATH"/COUNTDOWN_IMAGE_09.bin";
-    static constexpr const char *PNG_COUNTDOWN_TIME_IMAGE_9 = APP_RES_PATH"/COUNTDOWN_IMAGE_10.bin";
-    static constexpr const char *PNG_COUNTDOWN_TIME_IMAGE_10 = APP_RES_PATH"/COUNTDOWN_IMAGE_11.bin";
-    static constexpr const char *PNG_COUNTDOWN_TIME_IMAGE_11 = APP_RES_PATH"/COUNTDOWN_IMAGE_12.bin";
-    static constexpr const char *PNG_COUNTDOWN_TIME_IMAGE_12 = APP_RES_PATH"/COUNTDOWN_IMAGE_13.bin";
-    static constexpr const char *PNG_COUNTDOWN_TIME_IMAGE_13 = APP_RES_PATH"/COUNTDOWN_IMAGE_14.bin";
-    static constexpr const char *PNG_COUNTDOWN_TIME_IMAGE_14 = APP_RES_PATH"/COUNTDOWN_IMAGE_15.bin";
-    static constexpr const char *PNG_COUNTDOWN_TIME_IMAGE_15 = APP_RES_PATH"/COUNTDOWN_IMAGE_16.bin";
-    static constexpr const char *PNG_COUNTDOWN_TIME_IMAGE_16 = APP_RES_PATH"/COUNTDOWN_IMAGE_17.bin";
-    static constexpr const char *PNG_COUNTDOWN_TIME_IMAGE_17 = APP_RES_PATH"/COUNTDOWN_IMAGE_18.bin";
-    static constexpr const char *PNG_COUNTDOWN_TIME_IMAGE_18 = APP_RES_PATH"/COUNTDOWN_IMAGE_19.bin";
-    static constexpr const char *PNG_COUNTDOWN_TIME_IMAGE_19 = APP_RES_PATH"/COUNTDOWN_IMAGE_20.bin";
-    static constexpr const char *PNG_COUNTDOWN_TIME_IMAGE_20 = APP_RES_PATH"/COUNTDOWN_IMAGE_21.bin";
-    static constexpr const char *PNG_COUNTDOWN_TIME_IMAGE_21 = APP_RES_PATH"/COUNTDOWN_IMAGE_22.bin";
-    static constexpr const char *PNG_COUNTDOWN_TIME_IMAGE_22 = APP_RES_PATH"/COUNTDOWN_IMAGE_23.bin";
-    static constexpr const char *PNG_COUNTDOWN_TIME_IMAGE_23 = APP_RES_PATH"/COUNTDOWN_IMAGE_24.bin";
-
     static constexpr const char *PNG_PROGRESS_BAR_TMAGE = APP_RES_PATH"/PROGRESS_BAR_TMAGE.bin";
-    static constexpr const char *TEMP_WAITING = APP_RES_PATH"/TEMP_WAITING.bin";
-    static constexpr const char *TEMP_REPORT = APP_RES_PATH"/TEMP_REPORT.bin";
-    static constexpr const char *TEMP_POINT = APP_RES_PATH"/TEMP_POINT.bin";
-    static constexpr const char *TEMP_REV_POINTER = APP_RES_PATH"/TEMP_REV_POINTER.bin";
-
-    static constexpr const char *PNG_BLOOD_FLOW_IMAGE_0 = APP_RES_PATH"/BLOOD_FLOW_IMAGE_02.bin";
-    static constexpr const char *PNG_BLOOD_FLOW_IMAGE_1 = APP_RES_PATH"/BLOOD_FLOW_IMAGE_03.bin";
-    static constexpr const char *PNG_BLOOD_FLOW_IMAGE_2 = APP_RES_PATH"/BLOOD_FLOW_IMAGE_04.bin";
-    static constexpr const char *PNG_BLOOD_FLOW_IMAGE_3 = APP_RES_PATH"/BLOOD_FLOW_IMAGE_05.bin";
-    static constexpr const char *PNG_BLOOD_FLOW_IMAGE_4 = APP_RES_PATH"/BLOOD_FLOW_IMAGE_06.bin";
-    static constexpr const char *PNG_BLOOD_FLOW_IMAGE_5 = APP_RES_PATH"/BLOOD_FLOW_IMAGE_07.bin";
-    static constexpr const char *PNG_BLOOD_FLOW_IMAGE_6 = APP_RES_PATH"/BLOOD_FLOW_IMAGE_08.bin";
-    static constexpr const char *PNG_BLOOD_FLOW_IMAGE_7 = APP_RES_PATH"/BLOOD_FLOW_IMAGE_09.bin";
-    static constexpr const char *PNG_BLOOD_FLOW_IMAGE_8 = APP_RES_PATH"/BLOOD_FLOW_IMAGE_10.bin";
-    static constexpr const char *PNG_BLOOD_FLOW_IMAGE_9 = APP_RES_PATH"/BLOOD_FLOW_IMAGE_11.bin";
-    static constexpr const char *PNG_BLOOD_FLOW_IMAGE_10 = APP_RES_PATH"/BLOOD_FLOW_IMAGE_12.bin";
-    static constexpr const char *PNG_BLOOD_FLOW_IMAGE_11 = APP_RES_PATH"/BLOOD_FLOW_IMAGE_13.bin";
-    static constexpr const char *PNG_BLOOD_FLOW_IMAGE_12 = APP_RES_PATH"/BLOOD_FLOW_IMAGE_14.bin";
-    static constexpr const char *PNG_BLOOD_FLOW_IMAGE_13 = APP_RES_PATH"/BLOOD_FLOW_IMAGE_15.bin";
-    static constexpr const char *PNG_BLOOD_FLOW_IMAGE_14 = APP_RES_PATH"/BLOOD_FLOW_IMAGE_16.bin";
-    static constexpr const char *PNG_BLOOD_FLOW_IMAGE_15 = APP_RES_PATH"/BLOOD_FLOW_IMAGE_17.bin";
-    static constexpr const char *PNG_BLOOD_FLOW_IMAGE_16 = APP_RES_PATH"/BLOOD_FLOW_IMAGE_18.bin";
-    static constexpr const char *PNG_BLOOD_FLOW_IMAGE_17 = APP_RES_PATH"/BLOOD_FLOW_IMAGE_19.bin";
-    static constexpr const char *PNG_BLOOD_FLOW_IMAGE_18 = APP_RES_PATH"/BLOOD_FLOW_IMAGE_20.bin";
-    static constexpr const char *PNG_BLOOD_FLOW_IMAGE_19 = APP_RES_PATH"/BLOOD_FLOW_IMAGE_21.bin";
-    static constexpr const char *PNG_BLOOD_FLOW_IMAGE_20 = APP_RES_PATH"/BLOOD_FLOW_IMAGE_22.bin";
-    static constexpr const char *PNG_BLOOD_FLOW_IMAGE_21 = APP_RES_PATH"/BLOOD_FLOW_IMAGE_23.bin";
-    static constexpr const char *PNG_BLOOD_FLOW_IMAGE_22 = APP_RES_PATH"/BLOOD_FLOW_IMAGE_24.bin";
-    static constexpr const char *PNG_BLOOD_FLOW_IMAGE_23 = APP_RES_PATH"/BLOOD_FLOW_IMAGE_25.bin";
-    static constexpr const char *PNG_BLOOD_FLOW_IMAGE_24 = APP_RES_PATH"/BLOOD_FLOW_IMAGE_26.bin";
-    static constexpr const char *PNG_BLOOD_FLOW_IMAGE_25 = APP_RES_PATH"/BLOOD_FLOW_IMAGE_27.bin";
-    static constexpr const char *PNG_BLOOD_FLOW_IMAGE_26 = APP_RES_PATH"/BLOOD_FLOW_IMAGE_28.bin";
-    static constexpr const char *PNG_BLOOD_FLOW_IMAGE_27 = APP_RES_PATH"/BLOOD_FLOW_IMAGE_29.bin";
-    static constexpr const char *PNG_BLOOD_FLOW_IMAGE_28 = APP_RES_PATH"/BLOOD_FLOW_IMAGE_30.bin";
-    static constexpr const char *PNG_BLOOD_FLOW_IMAGE_29 = APP_RES_PATH"/BLOOD_FLOW_IMAGE_31.bin";
-    static constexpr const char *PNG_BLOOD_FLOW_IMAGE_30 = APP_RES_PATH"/BLOOD_FLOW_IMAGE_32.bin";
 
     static constexpr const char *PNG_SOUNDBUTTON2 = APP_RES_PATH"/SOUND_IMAGE.bin";
-    static constexpr const char *PNG_PULLBUTTON_FACE_IMAGE = APP_RES_PATH"/BLOOD_FLOW_IMAGE_01.bin";
+    static constexpr const char *PNG_PULLUP_BUTTON = APP_RES_PATH"/PNG_PULLUP_BUTTON.bin";
     static constexpr const char *MUSIC_2 = APP_RES_PATH"/mp3_48k_caiqing.mp3";
     static constexpr const char *MUSIC_1 = APP_RES_PATH"/one.mp3";
 
@@ -174,17 +109,6 @@ namespace OHOS {
     static constexpr const char *PNG_BLUETOOTH_IMAGE = APP_RES_PATH"/BLUETOOTH_IMAGE.bin";
     static constexpr const char *PNG_WATCH_IMAGE = APP_RES_PATH"/WATCH_IMAGE.bin";
     static constexpr const char *PNG_PHONE_IMAGE = APP_RES_PATH"/PHONE_IMAGE.bin";
-    static constexpr const char *PNG_REBOOT_BUTTON_IMAGE = APP_RES_PATH"/REBOOT_BUTTON.bin";
-    static constexpr const char *PNG_SHUTDOWN_BUTTON_IMAGE = APP_RES_PATH"/SHUTDOWN_BUTTON.bin";
-    static constexpr const char *PNG_SETTTING_REBOOT_IMAGE = APP_RES_PATH"/SETTTING_REBOOT.bin";
-    static constexpr const char *PNG_SETTTING_SHUTDOWN_IMAGE = APP_RES_PATH"/SETTTING_SHUTDOWN.bin";
-    static constexpr const char *PNG_SETTTING_DESKTOP_IMAGE = APP_RES_PATH"/SETTTING_DESKTOP.bin";
-    static constexpr const char *PNG_SET_DESKTOP_LIST_IMAGE = APP_RES_PATH"/SET_DESKTOP_LIST.bin";
-    static constexpr const char *PNG_SET_DESKTOP_HEXAGONS_IMAGE = APP_RES_PATH"/SET_DESKTOP_HEXAGONS.bin";
-    static constexpr const char *PNG_SET_DESKTOP_BG_IMAGE = APP_RES_PATH"/SET_DESKTOP_BG.bin";
-
-    static constexpr const char *PNG_CONNECT_PHONE_IMAGE = APP_RES_PATH"/CONNECT_PHONE.bin";
-    static constexpr const char *PNG_BLUETOOTH_STITLE = APP_RES_PATH"/BLUETOOTH_TITLE.bin";
 
     static constexpr const char *PNG_NEW_DEVICE = APP_RES_PATH"/NEW_DEVICE.bin";
     static constexpr const char *PNG_BT_LIST = APP_RES_PATH"/BT_LIST.bin";
@@ -205,20 +129,6 @@ namespace OHOS {
     static constexpr const char *ALARM_CLOCK_POP_ADD_PATH = APP_RES_PATH"/RING_CLOCK.bin";
     static constexpr const char *ALARM_DELETE_ADD_PATH = APP_RES_PATH"/DELETE.bin";
     static constexpr const char *ALARM_TRUE_ADD_PATH = APP_RES_PATH"/TRUE_ADD.bin";
-    static constexpr const char *TEMP_MEASURE = APP_RES_PATH"/TEMP_MEASURE.bin";
-    static constexpr const char *TEMP_UP_DROP = APP_RES_PATH"/TEMP_UP_DROP.bin";
-    static constexpr const char *TEMP_EXIT = APP_RES_PATH"/TEMP_EXIT.bin";
-    static constexpr const char *TEMP_ROTATE = APP_RES_PATH"/TEMP_ROTATE.bin";
-    static constexpr const char *TEMP_ICON_ENTER = APP_RES_PATH"/TEMP_ICON_ENTER.bin";
-    static constexpr const char *TEMP_BACKGROUND = APP_RES_PATH"/TEMP_BACKGROUND.bin";
-    static constexpr const char *TEMP_WARN = APP_RES_PATH"/TEMP_WARN.bin";
-    static constexpr const char *TEMP_LITTLE_MEASURE = APP_RES_PATH"/TEMP_LITTLE_MEASURE.bin";
-    static constexpr const char *TEMP_HOT = APP_RES_PATH"/TEMP_HOT.bin";
-    static constexpr const char *TEMP_COLD = APP_RES_PATH"/TEMP_COLD.bin";
-    static constexpr const char *TEMP_LIT_TIP = APP_RES_PATH"/TEMP_LIT_TIP.bin";
-    static constexpr const char *TEMP_ABOUT_STUDY = APP_RES_PATH"/TEMP_ABOUT_STUDY.bin";
-    static constexpr const char *TEMP_TRUE = APP_RES_PATH"/TEMP_TRUE.bin";
-    static constexpr const char *TEMP_DELETE = APP_RES_PATH"/TEMP_DELETE.bin";
 
     static constexpr const char *COMPASS_CALIBRATE_IMAGE = APP_RES_PATH"/COMPASS_CALIBRATE_IMAGE.bin";
     static constexpr const char *PNG_SETTING_NEXT_IMAGE = APP_RES_PATH"/SETTING_NEXT.bin";
@@ -298,26 +208,6 @@ namespace OHOS {
 
     static constexpr const char *PNG_STEP_SHOE_IMAGE_PATH = APP_RES_PATH"/SHOE_IMAGE.bin";
 
-    static constexpr const char *PNG_A004_070_IMAGE_PATH = APP_RES_PATH"/HEARTBEAT_IMAGE_01.bin";
-    static constexpr const char *PNG_A004_071_IMAGE_PATH = APP_RES_PATH"/HEARTBEAT_IMAGE_02.bin";
-    static constexpr const char *PNG_A004_072_IMAGE_PATH = APP_RES_PATH"/HEARTBEAT_IMAGE_03.bin";
-    static constexpr const char *PNG_A004_073_IMAGE_PATH = APP_RES_PATH"/HEARTBEAT_IMAGE_04.bin";
-    static constexpr const char *PNG_A004_074_IMAGE_PATH = APP_RES_PATH"/HEARTBEAT_IMAGE_05.bin";
-    static constexpr const char *PNG_A004_075_IMAGE_PATH = APP_RES_PATH"/HEARTBEAT_IMAGE_06.bin";
-    static constexpr const char *PNG_A004_076_IMAGE_PATH = APP_RES_PATH"/HEARTBEAT_IMAGE_07.bin";
-    static constexpr const char *PNG_A004_077_IMAGE_PATH = APP_RES_PATH"/HEARTBEAT_IMAGE_08.bin";
-    static constexpr const char *PNG_A004_078_IMAGE_PATH = APP_RES_PATH"/HEARTBEAT_IMAGE_09.bin";
-    static constexpr const char *PNG_A004_079_IMAGE_PATH = APP_RES_PATH"/HEARTBEAT_IMAGE_10.bin";
-    static constexpr const char *PNG_A004_080_IMAGE_PATH = APP_RES_PATH"/HEARTBEAT_IMAGE_11.bin";
-    static constexpr const char *PNG_A004_081_IMAGE_PATH = APP_RES_PATH"/HEARTBEAT_IMAGE_12.bin";
-    static constexpr const char *PNG_A004_082_IMAGE_PATH = APP_RES_PATH"/HEARTBEAT_IMAGE_13.bin";
-    static constexpr const char *PNG_A004_083_IMAGE_PATH = APP_RES_PATH"/HEARTBEAT_IMAGE_14.bin";
-    static constexpr const char *PNG_A004_084_IMAGE_PATH = APP_RES_PATH"/HEARTBEAT_IMAGE_15.bin";
-    static constexpr const char *PNG_A004_085_IMAGE_PATH = APP_RES_PATH"/HEARTBEAT_IMAGE_16.bin";
-    static constexpr const char *PNG_A004_086_IMAGE_PATH = APP_RES_PATH"/HEARTBEAT_IMAGE_17.bin";
-    static constexpr const char *PNG_A004_087_IMAGE_PATH = APP_RES_PATH"/HEARTBEAT_IMAGE_18.bin";
-    static constexpr const char *PNG_A004_088_IMAGE_PATH = APP_RES_PATH"/HEARTBEAT_IMAGE_19.bin";
-
     static constexpr const char *PNG_A019_080_IMAGE_PATH = APP_RES_PATH"/BLUETOOTH_IMAGE_01.bin";
     static constexpr const char *PNG_A019_081_IMAGE_PATH = APP_RES_PATH"/BLUETOOTH_IMAGE_02.bin";
     static constexpr const char *PNG_A019_082_IMAGE_PATH = APP_RES_PATH"/BLUETOOTH_IMAGE_03.bin";
@@ -339,9 +229,7 @@ namespace OHOS {
     // AppList
 
     static constexpr const char *PNG_APPLIST_ALARM_IMAGE = APP_RES_PATH"/APPLIST_ALARM.bin"; // 闹钟
-    static constexpr const char *PNG_APPLIST_SPO2_IMAGE = APP_RES_PATH"/APPLIST_SPO2.bin";  // 血氧
     static constexpr const char *PNG_APPLIST_SETTING_IMAGE = APP_RES_PATH"/APPLIST_SETTING.bin";  // 设置
-    static constexpr const char *PNG_APPLIST_TEMP_IMAGE = APP_RES_PATH"/TEMP_IMAGE.bin"; // 体温
 
     static constexpr const char *PNG_APPLIST_ALIPAY_IMAGE = APP_RES_PATH"/alipay_logo.bin"; // 支付宝
     static constexpr const char *PNG_ALIPAY_BIND_FAILURE = APP_RES_PATH"/ALIPAY_BIND_FAILURE.bin";
@@ -357,27 +245,8 @@ namespace OHOS {
     static constexpr const char *PNG_APPLIST_DEFAULT_IMG = APP_RES_PATH"/regular_hexagon.bin";
     static constexpr const char *PNG_APPLIST_NOTSETUSE_IMG = APP_RES_PATH"/regular_hexagon_inverse.bin";
 
-    // 室内步行
-    static constexpr const char *PNG_APPLIST_WALK_IMAGE = APP_RES_PATH"/APPLIST_WALK.bin"; // Applist图标
-    static constexpr const char *PNG_WALK_BACK_GROUND = APP_RES_PATH"/WALK_BACK_GROUND.bin";
-    static constexpr const char *PNG_WALK_IMAGE = APP_RES_PATH"/INDOORWALK.bin";
-    static constexpr const char *PNG_AEROBIC_IMAGE = APP_RES_PATH"/AEROBIC.bin";
-    static constexpr const char *PNG_ANAEROBIC_IMAGE = APP_RES_PATH"/ANAEROBIC.bin";
-    static constexpr const char *PNG_OPTIONS_BOX1_IMAGE = APP_RES_PATH"/OPTIONS_BOX1.bin";
-    static constexpr const char *PNG_OPTIONS_BOX2_IMAGE = APP_RES_PATH"/OPTIONS_BOX2.bin";
-    static constexpr const char *PNG_OPTIONS_BOX3_IMAGE = APP_RES_PATH"/OPTIONS_BOX3.bin";
-    static constexpr const char *PNG_OPTIONS_BOX4_IMAGE = APP_RES_PATH"/OPTIONS_BOX4.bin";
-    static constexpr const char *PNG_WALK_TIME_IMAGE = APP_RES_PATH"/TIME_IMAGE.bin";
-    static constexpr const char *PNG_WALK_DISTANCES_IMAGE = APP_RES_PATH"/DISTANCES_IMAGE.bin";
-    static constexpr const char *PNG_WALK_HEART_IMAGE = APP_RES_PATH"/HEART_IMAGE.bin";
-    static constexpr const char *PNG_WALK_SPEED_IMAGE = APP_RES_PATH"/SPEED_IMAGE.bin";
-    static constexpr const char *PNG_WALK_STEPS_IMAGE = APP_RES_PATH"/STEPS_IMAGE.bin";
-
     static constexpr const char *PNG_APPLIST_UI_SAMPLE_IMAGE = APP_RES_PATH"/APPLIST_UI_SAMPLE.bin"; // Applist图标
 
-    static constexpr const char *PNG_SET_CARD_ADD = APP_RES_PATH"/CARD_ADD.bin";
-    static constexpr const char *PNG_SET_CARD_DEL = APP_RES_PATH"/CARD_DEL.bin";
-    static constexpr const char *PNG_SET_CARD_HEART = APP_RES_PATH"/CARD_HEART.bin";
     static constexpr const char *PNG_SET_CARD_COMPASS = APP_RES_PATH"/CARD_COMPASS.bin";
     static constexpr const char *PNG_SET_CARD_ACTIVITY = APP_RES_PATH"/CARD_ACTIVITY.bin";
     static constexpr const char *PNG_SET_CARD_PLAYER = APP_RES_PATH"/CARD_PLAYER.bin";
@@ -386,24 +255,41 @@ namespace OHOS {
 
     static constexpr const char *PNG_SET_DIAL_CLOCK = APP_RES_PATH"/DIAL_CLOCK.bin";
 
-    static constexpr const char *PNG_APPLIST_STOPWATCH_LOGO = APP_RES_PATH"/STOPWATCH_LOGO.bin";
-    static constexpr const char *PNG_APPLIST_STOPWATCH_IMAGE = APP_RES_PATH"/STOPWATCH.bin";
+    static constexpr const char *SPORT_ICON = APP_RES_PATH"/SPORT_ICON.bin";
+    static constexpr const char *SPORT_IMAGE = APP_RES_PATH"/SPORT.bin";
+    static constexpr const char *STOPWATCH_ICON = APP_RES_PATH"/STOPWATCH_ICON.bin";
+    static constexpr const char *STOPWATCH_IMAGE = APP_RES_PATH"/STOPWATCH.bin";
     static constexpr const char *WEATHER_IMAGE = APP_RES_PATH"/WEATHER.bin";
-    static constexpr const char *WEATHER_MAIN_ICON = APP_RES_PATH"/WEATHER_LOGO.bin";
+    static constexpr const char *WEATHER_ICON = APP_RES_PATH"/WEATHER_ICON.bin";
     static constexpr const char *TIMER_IMAGE = APP_RES_PATH"/TIMER.bin";
-    static constexpr const char *TIMER_MAIN_ICON = APP_RES_PATH"/TIMER_ICON.bin";
+    static constexpr const char *TIMER_ICON = APP_RES_PATH"/TIMER_ICON.bin";
     static constexpr const char *DATE_IMAGE = APP_RES_PATH"/DATE.bin";
-    static constexpr const char *DATE_MAIN_ICON = APP_RES_PATH"/DATE_LOGO.bin";
+    static constexpr const char *DATE_ICON = APP_RES_PATH"/DATE_ICON.bin";
     static constexpr const char *FLASHLIGHT_IMAGE = APP_RES_PATH"/FLASHLIGHT.bin";
-    static constexpr const char *FLASHLIGHT_MAIN_ICON = APP_RES_PATH"/FLASHLIGHT_LOGO.bin";
+    static constexpr const char *FLASHLIGHT_ICON = APP_RES_PATH"/FLASHLIGHT_ICON.bin";
     static constexpr const char *SLEEP_IMAGE = APP_RES_PATH"/SLEEP.bin";
     static constexpr const char *SLEEP_ICON = APP_RES_PATH"/SLEEP_ICON.bin";
     static constexpr const char *BREATH_IMAGE = APP_RES_PATH"/BREATH.bin";
-    static constexpr const char *BREATH_MAIN_ICON = APP_RES_PATH"/BREATH_ICON.bin";
+    static constexpr const char *BREATH_ICON = APP_RES_PATH"/BREATH_ICON.bin";
     static constexpr const char *FINDPHONE_IMAGE = APP_RES_PATH"/FINDPHONE.bin";
-    static constexpr const char *FINDPHONE_MAIN_ICON = APP_RES_PATH"/FINDPHONE_LOGO.bin";
+    static constexpr const char *FINDPHONE_ICON = APP_RES_PATH"/FINDPHONE_ICON.bin";
     static constexpr const char *CAMERA_IMAGE = APP_RES_PATH"/CAMERA.bin";
-    static constexpr const char *CAMERA_MAIN_ICON = APP_RES_PATH"/CAMERA_ICON.bin";
+    static constexpr const char *CAMERA_ICON = APP_RES_PATH"/CAMERA_ICON.bin";
+    static constexpr const char *PHONEMENU_IMAGE = APP_RES_PATH"/PHONEMENU.bin";
+    static constexpr const char *PHONEMENU_ICON = APP_RES_PATH"/PHONEMENU_ICON.bin";
+    static constexpr const char *HEART_RATE_IMAGE = APP_RES_PATH"/HEART_RATE.bin";
+    static constexpr const char *HEART_RATE_ICON = APP_RES_PATH"/HEART_RATE_ICON.bin";
+    static constexpr const char *MESSAGE_IMAGE = APP_RES_PATH"/MESSAGE.bin";
+    static constexpr const char *BLOOD_IMAGE = APP_RES_PATH"/BLOOD.bin";
+    static constexpr const char *BLOOD_ICON = APP_RES_PATH"/BLOOD_ICON.bin";
+    static constexpr const char *SETTING_IMAGE = APP_RES_PATH"/SETTING.bin";
+    static constexpr const char *SETTING_ICON = APP_RES_PATH"/SETTING_ICON.bin";
+    static constexpr const char *EMPTY_IMAGE = APP_RES_PATH"/EMPTY.bin";
+    static constexpr const char *EMPTY_ICON = APP_RES_PATH"/EMPTY_ICON.bin";
+    static constexpr const char *MONKEY_ICON = APP_RES_PATH"/MONKEY_ICON.bin";
+
+    static constexpr const char *PNG_SET_GRADIENT_CLOCK = APP_RES_PATH"/GRADIENT_CLOCK.bin";
+    static constexpr const char *PNG_TRANSITION_SLICE_SAMPLE = APP_RES_PATH"/TRANSITION_SLICE_SAMPLE.bin";
 }
 
 #endif // UI_CONFIG_H
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativelauncher/include/ui_resource_blood.h b/code/sdk/application/wearable/evb/nativeapp/nativelauncher/include/ui_resource_blood.h
new file mode 100644 (file)
index 0000000..0901ff4
--- /dev/null
@@ -0,0 +1,51 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: UIResourceBlood\r
+ * Create: 2025-06\r
+ */\r
+\r
+#ifndef UI_RESOURCE_BLOOD_H\r
+#define UI_RESOURCE_BLOOD_H\r
+\r
+namespace OHOS {\r
+static const int IMAGE_BLOOD_ABNORMAL = 0x100001;\r
+static const int IMAGE_BLOOD_AGAIN = 0x100002;\r
+static const int IMAGE_BLOOD_BG = 0x100003;\r
+static const int IMAGE_BLOOD_COMMON = 0x100004;\r
+static const int IMAGE_BLOOD_FRAME00 = 0x100005;\r
+static const int IMAGE_BLOOD_FRAME01 = 0x100006;\r
+static const int IMAGE_BLOOD_FRAME02 = 0x100007;\r
+static const int IMAGE_BLOOD_FRAME03 = 0x100008;\r
+static const int IMAGE_BLOOD_FRAME04 = 0x100009;\r
+static const int IMAGE_BLOOD_FRAME05 = 0x10000a;\r
+static const int IMAGE_BLOOD_FRAME06 = 0x10000b;\r
+static const int IMAGE_BLOOD_FRAME07 = 0x10000c;\r
+static const int IMAGE_BLOOD_FRAME08 = 0x10000d;\r
+static const int IMAGE_BLOOD_FRAME09 = 0x10000e;\r
+static const int IMAGE_BLOOD_FRAME10 = 0x10000f;\r
+static const int IMAGE_BLOOD_FRAME11 = 0x100010;\r
+static const int IMAGE_BLOOD_FRAME12 = 0x100011;\r
+static const int IMAGE_BLOOD_FRAME13 = 0x100012;\r
+static const int IMAGE_BLOOD_FRAME14 = 0x100013;\r
+static const int IMAGE_BLOOD_FRAME15 = 0x100014;\r
+static const int IMAGE_BLOOD_FRAME16 = 0x100015;\r
+static const int IMAGE_BLOOD_FRAME17 = 0x100016;\r
+static const int IMAGE_BLOOD_FRAME18 = 0x100017;\r
+static const int IMAGE_BLOOD_FRAME19 = 0x100018;\r
+static const int IMAGE_BLOOD_FRAME20 = 0x100019;\r
+static const int IMAGE_BLOOD_FRAME21 = 0x10001a;\r
+static const int IMAGE_BLOOD_FRAME22 = 0x10001b;\r
+static const int IMAGE_BLOOD_FRAME23 = 0x10001c;\r
+static const int IMAGE_BLOOD_FRAME24 = 0x10001d;\r
+static const int IMAGE_BLOOD_FRAME25 = 0x10001e;\r
+static const int IMAGE_BLOOD_FRAME26 = 0x10001f;\r
+static const int IMAGE_BLOOD_FRAME27 = 0x100020;\r
+static const int IMAGE_BLOOD_FRAME28 = 0x100021;\r
+static const int IMAGE_BLOOD_FRAME29 = 0x100022;\r
+static const int IMAGE_BLOOD_NORMAL = 0x100023;\r
+static const int IMAGE_BLOOD_PREVIEW1 = 0x100024;\r
+static const int IMAGE_BLOOD_PREVIEW2 = 0x100025;\r
+static const int IMAGE_BLOOD_RESET = 0x100026;\r
+static const int IMAGE_BLOOD_SCALE = 0x100027;\r
+}  // OHOS\r
+#endif  // UI_RESOURCE_BLOOD_H\r
index ca66834..9c42b09 100644 (file)
 /*\r
  * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
- * Description: UIBreathResource\r
+ * Description: UIResourceBreath\r
  * Create: 2025-06-05\r
  */\r
-#ifndef UI_RESOURCE_BREATH_IMAGE_H\r
-#define UI_RESOURCE_BREATH_IMAGE_H\r
-#include <cstdint>\r
+\r
+#ifndef UI_RESOURCE_BREATH_H\r
+#define UI_RESOURCE_BREATH_H\r
+\r
 namespace OHOS {\r
-    static const int IMAGE_CONVERTER_TOOL_BREATH001 = 0x100001;\r
-    static const int IMAGE_CONVERTER_TOOL_BREATH002 = 0x100002;\r
-    static const int IMAGE_CONVERTER_TOOL_BREATH003 = 0x100003;\r
-    static const int IMAGE_CONVERTER_TOOL_BREATH004 = 0x100004;\r
-    static const int IMAGE_CONVERTER_TOOL_BREATH005 = 0x100005;\r
-    static const int IMAGE_CONVERTER_TOOL_BREATH006 = 0x100006;\r
-    static const int IMAGE_CONVERTER_TOOL_BREATH007 = 0x100007;\r
-    static const int IMAGE_CONVERTER_TOOL_BREATH008 = 0x100008;\r
-    static const int IMAGE_CONVERTER_TOOL_BREATH009 = 0x100009;\r
-    static const int IMAGE_CONVERTER_TOOL_BREATH010 = 0x10000a;\r
-    static const int IMAGE_CONVERTER_TOOL_BREATH011 = 0x10000b;\r
-    static const int IMAGE_CONVERTER_TOOL_BREATH012 = 0x10000c;\r
-    static const int IMAGE_CONVERTER_TOOL_BREATH013 = 0x10000d;\r
-    static const int IMAGE_CONVERTER_TOOL_INOREX_HALE001 = 0x10000e;\r
-    static const int IMAGE_CONVERTER_TOOL_INOREX_HALE002 = 0x10000f;\r
-    static const int IMAGE_CONVERTER_TOOL_INOREX_HALE003 = 0x100010;\r
-    static const int IMAGE_CONVERTER_TOOL_INOREX_HALE004 = 0x100011;\r
-    static const int IMAGE_CONVERTER_TOOL_INOREX_HALE005 = 0x100012;\r
-    static const int IMAGE_CONVERTER_TOOL_INOREX_HALE006 = 0x100013;\r
-    static const int IMAGE_CONVERTER_TOOL_INOREX_HALE007 = 0x100014;\r
-    static const int IMAGE_CONVERTER_TOOL_INOREX_HALE008 = 0x100015;\r
-    static const int IMAGE_CONVERTER_TOOL_INOREX_HALE009 = 0x100016;\r
-    static const int IMAGE_CONVERTER_TOOL_INOREX_HALE010 = 0x100017;\r
-    static const int IMAGE_CONVERTER_TOOL_INOREX_HALE011 = 0x100018;\r
-    static const int IMAGE_CONVERTER_TOOL_INOREX_HALE012 = 0x100019;\r
-    static const int IMAGE_CONVERTER_TOOL_INOREX_HALE013 = 0x10001a;\r
-    static const int IMAGE_CONVERTER_TOOL_INOREX_HALE014 = 0x10001b;\r
-    static const int IMAGE_CONVERTER_TOOL_INOREX_HALE015 = 0x10001c;\r
-    static const int IMAGE_CONVERTER_TOOL_INOREX_HALE016 = 0x10001d;\r
-    static const int IMAGE_CONVERTER_TOOL_INOREX_HALE017 = 0x10001e;\r
-    static const int IMAGE_CONVERTER_TOOL_INOREX_HALE018 = 0x10001f;\r
-    static const int IMAGE_CONVERTER_TOOL_INOREX_HALE019 = 0x100020;\r
-    static const int IMAGE_CONVERTER_TOOL_INOREX_HALE020 = 0x100021;\r
-    static const int IMAGE_CONVERTER_TOOL_INOREX_HALE021 = 0x100022;\r
-    static const int IMAGE_CONVERTER_TOOL_INOREX_HALE022 = 0x100023;\r
-    static const int IMAGE_CONVERTER_TOOL_INOREX_HALE023 = 0x100024;\r
-    static const int IMAGE_CONVERTER_TOOL_INOREX_HALE024 = 0x100025;\r
-    static const int IMAGE_CONVERTER_TOOL_INOREX_HALE025 = 0x100026;\r
-    static const int IMAGE_CONVERTER_TOOL_INOREX_HALE026 = 0x100027;\r
-    static const int IMAGE_CONVERTER_TOOL_INOREX_HALE027 = 0x100028;\r
-    static const int IMAGE_CONVERTER_TOOL_INOREX_HALE028 = 0x100029;\r
-    static const int IMAGE_CONVERTER_TOOL_INOREX_HALE029 = 0x10002a;\r
-    static const int IMAGE_CONVERTER_TOOL_INOREX_HALE030 = 0x10002b;\r
-    static const int IMAGE_CONVERTER_TOOL_INOREX_HALE031 = 0x10002c;\r
-    static const int IMAGE_CONVERTER_TOOL_INOREX_HALE032 = 0x10002d;\r
-    static const int IMAGE_CONVERTER_TOOL_INOREX_HALE033 = 0x10002e;\r
-    static const int IMAGE_CONVERTER_TOOL_INOREX_HALE034 = 0x10002f;\r
-    static const int IMAGE_CONVERTER_TOOL_INOREX_HALE035 = 0x100030;\r
-    static const int IMAGE_CONVERTER_TOOL_INOREX_HALE036 = 0x100031;\r
-    static const int IMAGE_CONVERTER_TOOL_INOREX_HALE037 = 0x100032;\r
-    static const int IMAGE_CONVERTER_TOOL_INOREX_HALE038 = 0x100033;\r
-    static const int IMAGE_CONVERTER_TOOL_INOREX_HALE039 = 0x100034;\r
-    static const int IMAGE_CONVERTER_TOOL_INOREX_HALE040 = 0x100035;\r
-    static const int IMAGE_CONVERTER_TOOL_INOREX_HALE041 = 0x100036;\r
-    static const int IMAGE_CONVERTER_TOOL_INOREX_HALE042 = 0x100037;\r
-    static const int IMAGE_CONVERTER_TOOL_INOREX_HALE043 = 0x100038;\r
-    static const int IMAGE_CONVERTER_TOOL_INOREX_HALE044 = 0x100039;\r
-    static const int IMAGE_CONVERTER_TOOL_INOREX_HALE045 = 0x10003a;\r
-    static const int IMAGE_CONVERTER_TOOL_INOREX_HALE046 = 0x10003b;\r
-    static const int IMAGE_CONVERTER_TOOL_INOREX_HALE047 = 0x10003c;\r
-    static const int IMAGE_CONVERTER_TOOL_INOREX_HALE048 = 0x10003d;\r
-    static const int IMAGE_CONVERTER_TOOL_INOREX_HALE049 = 0x10003e;\r
-    static const int IMAGE_CONVERTER_TOOL_INOREX_HALE050 = 0x10003f;\r
-    static const int IMAGE_CONVERTER_TOOL_INOREX_HALE051 = 0x100040;\r
-    static const int IMAGE_CONVERTER_TOOL_INOREX_HALE052 = 0x100041;\r
-    static const int IMAGE_CONVERTER_TOOL_INOREX_HALE053 = 0x100042;\r
-    static const int IMAGE_CONVERTER_TOOL_INOREX_HALE054 = 0x100043;\r
-    static const int IMAGE_CONVERTER_TOOL_INOREX_HALE055 = 0x100044;\r
-    static const int IMAGE_CONVERTER_TOOL_INOREX_HALE056 = 0x100045;\r
-    static const int IMAGE_CONVERTER_TOOL_INOREX_HALE057 = 0x100046;\r
-    static const int IMAGE_CONVERTER_TOOL_INOREX_HALE058 = 0x100047;\r
-    static const int IMAGE_CONVERTER_TOOL_INOREX_HALE059 = 0x100048;\r
-    static const int IMAGE_CONVERTER_TOOL_INOREX_HALE060 = 0x100049;\r
-    static const int IMAGE_CONVERTER_TOOL_INOREX_HALE061 = 0x10004a;\r
-    static const int IMAGE_CONVERTER_TOOL_INOREX_HALE062 = 0x10004b;\r
-    static const int IMAGE_CONVERTER_TOOL_INOREX_HALE063 = 0x10004c;\r
-    static const int IMAGE_CONVERTER_TOOL_INOREX_HALE064 = 0x10004d;\r
-    static const int IMAGE_CONVERTER_TOOL_INOREX_HALE065 = 0x10004e;\r
-    static const int IMAGE_CONVERTER_TOOL_INOREX_HALE066 = 0x10004f;\r
-    static const int IMAGE_CONVERTER_TOOL_INOREX_HALE067 = 0x100050;\r
-    static const int IMAGE_CONVERTER_TOOL_INOREX_HALE068 = 0x100051;\r
-    static const int IMAGE_CONVERTER_TOOL_INOREX_HALE069 = 0x100052;\r
-    static const int IMAGE_CONVERTER_TOOL_INOREX_HALE070 = 0x100053;\r
-    static const int IMAGE_CONVERTER_TOOL_INOREX_HALE071 = 0x100054;\r
-    static const int IMAGE_CONVERTER_TOOL_INOREX_HALE072 = 0x100055;\r
-    static const int IMAGE_CONVERTER_TOOL_INOREX_HALE073 = 0x100056;\r
-    static const int IMAGE_CONVERTER_TOOL_INOREX_HALE074 = 0x100057;\r
-    static const int IMAGE_CONVERTER_TOOL_INOREX_HALE075 = 0x100058;\r
-    static const int IMAGE_CONVERTER_TOOL_INOREX_HALE076 = 0x100059;\r
-    static const int IMAGE_CONVERTER_TOOL_INOREX_HALE077 = 0x10005a;\r
-    static const int IMAGE_CONVERTER_TOOL_INOREX_HALE078 = 0x10005b;\r
-} // OHOS\r
-#endif // UI_RESOURCE_BREATH_IMAGE_H
\ No newline at end of file
+static const int IMAGE_BREATH_BAD = 0x100001;\r
+static const int IMAGE_BREATH_BG1 = 0x100002;\r
+static const int IMAGE_BREATH_BG2 = 0x100003;\r
+static const int IMAGE_BREATH_BG3 = 0x100004;\r
+static const int IMAGE_BREATH_BG4 = 0x100005;\r
+static const int IMAGE_BREATH_CENTER = 0x100006;\r
+static const int IMAGE_BREATH_CENTER1 = 0x100007;\r
+static const int IMAGE_BREATH_CENTER2 = 0x100008;\r
+static const int IMAGE_BREATH_COMPLETE = 0x100009;\r
+static const int IMAGE_BREATH_EXCELLENT = 0x10000a;\r
+static const int IMAGE_BREATH_GOOD = 0x10000b;\r
+static const int IMAGE_BREATH_NORMAL = 0x10000c;\r
+static const int IMAGE_BREATH_OK = 0x10000d;\r
+static const int IMAGE_BREATH_PASS = 0x10000e;\r
+static const int IMAGE_BREATH_RESULT = 0x10000f;\r
+static const int IMAGE_BREATH_RETEST = 0x100010;\r
+static const int IMAGE_BREATH_ROMATA1 = 0x100011;\r
+static const int IMAGE_BREATH_ROMATA2 = 0x100012;\r
+static const int IMAGE_BREATH_SETTING = 0x100013;\r
+static const int IMAGE_BREATH_START = 0x100014;\r
+static const int IMAGE_BREATH_TIME = 0x100015;\r
+}  // OHOS\r
+#endif  // UI_RESOURCE_BREATH_H
\ No newline at end of file
index 022ddfc..ba0bb98 100644 (file)
@@ -1,17 +1,14 @@
 /*\r
  * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
- * Description: UICameraResource\r
+ * Description: UIResourceCamera\r
  * Create: 2025-06-05\r
  */\r
+\r
 #ifndef UI_RESOURCE_CAMERA_H\r
 #define UI_RESOURCE_CAMERA_H\r
-#include <cstdint>\r
-namespace OHOS {\r
-    static const int IMAGE_CONVERTER_TOOL_CAMERA_1 = 0x100001;\r
-    static const int IMAGE_CONVERTER_TOOL_CAMERA_2 = 0x100002;\r
-    static const int IMAGE_CONVERTER_TOOL_CAMERA_3 = 0x100003;\r
-    static const int IMAGE_CONVERTER_TOOL_CAMERA_4 = 0x100004;\r
-    static const int IMAGE_CONVERTER_TOOL_CAMERA_5 = 0x100005;\r
 \r
-} // OHOS\r
-#endif // UI_RESOURCE_CAMERA_H\r
+namespace OHOS {\r
+static const int IMAGE_CAMERA_TAKEPHOTO = 0x100001;\r
+static const int IMAGE_CAMERA_DISCONNECT = 0x100002;\r
+}  // OHOS\r
+#endif  // UI_RESOURCE_CAMERA_H\r
index 0bccb8b..78e6777 100644 (file)
@@ -1,21 +1,19 @@
 /*\r
  * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
- * Description: UIWeatherResource\r
+ * Description: UIResourceDate\r
  * Create: 2025-06-10\r
  */\r
+\r
 #ifndef UI_RESOURCE_DATE_H\r
 #define UI_RESOURCE_DATE_H\r
-#include <cstdint>\r
+\r
 namespace OHOS {\r
-    static const int DIR_MASK = 0xfff00000;\r
-    static const int PNG_MASK = 0x000fffff;\r
-    static const int IMAGE_CONVERTER_TOOL_DATE1 = 0x100001;\r
-    static const int IMAGE_CONVERTER_TOOL_DATE2 = 0x100002;\r
-    static const int IMAGE_CONVERTER_TOOL_DATE3 = 0x100003;\r
-    static const int IMAGE_CONVERTER_TOOL_DATE4 = 0x100004;\r
-    static const int IMAGE_CONVERTER_TOOL_DATE5 = 0x100005;\r
-    static const int IMAGE_CONVERTER_TOOL_DATE6 = 0x100006;\r
-    static const int IMAGE_CONVERTER_TOOL_DATE7 = 0x100007;\r
-    static const int IMAGE_CONVERTER_TOOL_DATE8 = 0x100008;\r
-} // OHOS\r
-#endif // UI_RESOURCE_DATE_H\r
+static const int IMAGE_DATE_BG1 = 0x100001;\r
+static const int IMAGE_DATE_BG2 = 0x100002;\r
+static const int IMAGE_DATE_GRAY = 0x100003;\r
+static const int IMAGE_DATE_RED = 0x100004;\r
+static const int IMAGE_DATE_SELECT = 0x100005;\r
+static const int IMAGE_DATE_SIGNS = 0x100006;\r
+static const int IMAGE_DATE_WHITE = 0x100007;\r
+}  // OHOS\r
+#endif  // UI_RESOURCE_DATE_H\r
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativelauncher/include/ui_resource_empty.h b/code/sdk/application/wearable/evb/nativeapp/nativelauncher/include/ui_resource_empty.h
new file mode 100644 (file)
index 0000000..b7b2e64
--- /dev/null
@@ -0,0 +1,13 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: UIResourceEmpty\r
+ * Create: 2025-06-05\r
+ */\r
+\r
+#ifndef UI_RESOURCE_EMPTY_H\r
+#define UI_RESOURCE_EMPTY_H\r
+\r
+namespace OHOS {\r
+static const int IMAGE_EMPTY_BG = 0x100001;\r
+}  // OHOS\r
+#endif  // UI_RESOURCE_EMPTY_H\r
index 9a51cdf..45a097a 100644 (file)
@@ -1,46 +1,43 @@
 /*\r
  * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
- * Description: UIFindPhoneResource\r
+ * Description: UIResourceFindPhone\r
  * Create: 2025-2-13\r
  */\r
+\r
 #ifndef UI_RESOURCE_FINDPHONE_H\r
 #define UI_RESOURCE_FINDPHONE_H\r
-#include <cstdint>\r
+\r
 namespace OHOS {\r
-    static const int IMAGE_CONVERTER_TOOL_CONNECT_PHONE_1 = 0x100001;\r
-    static const int IMAGE_CONVERTER_TOOL_CONNECT_PHONE_2 = 0x100002;\r
-    static const int IMAGE_CONVERTER_TOOL_CONNECT_PHONE_3 = 0x100003;\r
-    static const int IMAGE_CONVERTER_TOOL_CONNECT_PHONE_4 = 0x100004;\r
-    static const int IMAGE_CONVERTER_TOOL_CONNECT_PHONE_5 = 0x100005;\r
-    static const int IMAGE_CONVERTER_TOOL_CONNECT_PHONE_6 = 0x100006;\r
-    static const int IMAGE_CONVERTER_TOOL_CONNECT_PHONE_7 = 0x100007;\r
-    static const int IMAGE_CONVERTER_TOOL_FINDPHONE001 = 0x100008;\r
-    static const int IMAGE_CONVERTER_TOOL_FINDPHONE002 = 0x100009;\r
-    static const int IMAGE_CONVERTER_TOOL_FINDPHONE003 = 0x10000a;\r
-    static const int IMAGE_CONVERTER_TOOL_FINDPHONE004 = 0x10000b;\r
-    static const int IMAGE_CONVERTER_TOOL_FINDPHONE005 = 0x10000c;\r
-    static const int IMAGE_CONVERTER_TOOL_FINDPHONE006 = 0x10000d;\r
-    static const int IMAGE_CONVERTER_TOOL_FINDPHONE007 = 0x10000e;\r
-    static const int IMAGE_CONVERTER_TOOL_FINDPHONE008 = 0x10000f;\r
-    static const int IMAGE_CONVERTER_TOOL_FINDPHONE009 = 0x100010;\r
-    static const int IMAGE_CONVERTER_TOOL_FINDPHONE010 = 0x100011;\r
-    static const int IMAGE_CONVERTER_TOOL_FINDPHONE011 = 0x100012;\r
-    static const int IMAGE_CONVERTER_TOOL_FINDPHONE012 = 0x100013;\r
-    static const int IMAGE_CONVERTER_TOOL_FINDPHONE013 = 0x100014;\r
-    static const int IMAGE_CONVERTER_TOOL_FINDPHONE014 = 0x100015;\r
-    static const int IMAGE_CONVERTER_TOOL_FINDPHONE015 = 0x100016;\r
-    static const int IMAGE_CONVERTER_TOOL_FINDPHONE016 = 0x100017;\r
-    static const int IMAGE_CONVERTER_TOOL_FINDPHONE017 = 0x100018;\r
-    static const int IMAGE_CONVERTER_TOOL_FINDPHONE018 = 0x100019;\r
-    static const int IMAGE_CONVERTER_TOOL_FINDPHONE019 = 0x10001a;\r
-    static const int IMAGE_CONVERTER_TOOL_FINDPHONE020 = 0x10001b;\r
-    static const int IMAGE_CONVERTER_TOOL_FINDPHONE021 = 0x10001c;\r
-    static const int IMAGE_CONVERTER_TOOL_FINDPHONE022 = 0x10001d;\r
-    static const int IMAGE_CONVERTER_TOOL_FINDPHONE023 = 0x10001e;\r
-    static const int IMAGE_CONVERTER_TOOL_FINDPHONE024 = 0x10001f;\r
-    static const int IMAGE_CONVERTER_TOOL_FINDPHONE025 = 0x100020;\r
-    static const int IMAGE_CONVERTER_TOOL_FINDPHONE026 = 0x100021;\r
-    static const int IMAGE_CONVERTER_TOOL_FINDPHONE027 = 0x100022;\r
-    static const int IMAGE_CONVERTER_TOOL_FINDPHONE028 = 0x100023;\r
-} // OHOS\r
-#endif // UI_RESOURCE_FINDPHONE_H\r
+static const int IMAGE_FINDPHONE_CONNECT = 0x100001;\r
+static const int IMAGE_FINDPHONE_DISCONNECT = 0x100002;\r
+static const int IMAGE_FINDPHONE_FRAME01 = 0x100003;\r
+static const int IMAGE_FINDPHONE_FRAME02 = 0x100004;\r
+static const int IMAGE_FINDPHONE_FRAME03 = 0x100005;\r
+static const int IMAGE_FINDPHONE_FRAME04 = 0x100006;\r
+static const int IMAGE_FINDPHONE_FRAME05 = 0x100007;\r
+static const int IMAGE_FINDPHONE_FRAME06 = 0x100008;\r
+static const int IMAGE_FINDPHONE_FRAME07 = 0x100009;\r
+static const int IMAGE_FINDPHONE_FRAME08 = 0x10000a;\r
+static const int IMAGE_FINDPHONE_FRAME09 = 0x10000b;\r
+static const int IMAGE_FINDPHONE_FRAME10 = 0x10000c;\r
+static const int IMAGE_FINDPHONE_FRAME11 = 0x10000d;\r
+static const int IMAGE_FINDPHONE_FRAME12 = 0x10000e;\r
+static const int IMAGE_FINDPHONE_FRAME13 = 0x10000f;\r
+static const int IMAGE_FINDPHONE_FRAME14 = 0x100010;\r
+static const int IMAGE_FINDPHONE_FRAME15 = 0x100011;\r
+static const int IMAGE_FINDPHONE_FRAME16 = 0x100012;\r
+static const int IMAGE_FINDPHONE_FRAME17 = 0x100013;\r
+static const int IMAGE_FINDPHONE_FRAME18 = 0x100014;\r
+static const int IMAGE_FINDPHONE_FRAME19 = 0x100015;\r
+static const int IMAGE_FINDPHONE_FRAME20 = 0x100016;\r
+static const int IMAGE_FINDPHONE_FRAME21 = 0x100017;\r
+static const int IMAGE_FINDPHONE_FRAME22 = 0x100018;\r
+static const int IMAGE_FINDPHONE_FRAME23 = 0x100019;\r
+static const int IMAGE_FINDPHONE_FRAME24 = 0x10001a;\r
+static const int IMAGE_FINDPHONE_FRAME25 = 0x10001b;\r
+static const int IMAGE_FINDPHONE_FRAME26 = 0x10001c;\r
+static const int IMAGE_FINDPHONE_FRAME27 = 0x10001d;\r
+static const int IMAGE_FINDPHONE_FRAME28 = 0x10001e;\r
+static const int IMAGE_FINDPHONE_RESET = 0x10001f;\r
+}  // OHOS\r
+#endif  // UI_RESOURCE_FINDPHONE_H\r
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativelauncher/include/ui_resource_flashlight.h b/code/sdk/application/wearable/evb/nativeapp/nativelauncher/include/ui_resource_flashlight.h
new file mode 100644 (file)
index 0000000..bd94ffb
--- /dev/null
@@ -0,0 +1,49 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: UIResouceFlashlight\r
+ * Create: 2025-04-24\r
+ */\r
+\r
+#ifndef UI_RESOURCE_FLASHLIGHT_H\r
+#define UI_RESOURCE_FLASHLIGHT_H\r
+\r
+namespace OHOS {\r
+static const int IMAGE_FLASHLIGHT_BLINKBUTTON = 0x100001;\r
+static const int IMAGE_FLASHLIGHT_BLINKITEM = 0x100002;\r
+static const int IMAGE_FLASHLIGHT_COLORITEM = 0x100003;\r
+static const int IMAGE_FLASHLIGHT_COLOR_DARK_BLUE_BUTTON = 0x100004;\r
+static const int IMAGE_FLASHLIGHT_COLOR_DARK_BLUE_PRESSBUTTON = 0x100005;\r
+static const int IMAGE_FLASHLIGHT_COLOR_GREEN_BUTTON = 0x100006;\r
+static const int IMAGE_FLASHLIGHT_COLOR_GREEN_PRESSBUTTON = 0x100007;\r
+static const int IMAGE_FLASHLIGHT_COLOR_LIGHT_BLUE_BUTTON = 0x100008;\r
+static const int IMAGE_FLASHLIGHT_COLOR_LIGHT_BLUE_PRESSBUTTON = 0x100009;\r
+static const int IMAGE_FLASHLIGHT_COLOR_MULTI_BUTTON = 0x10000a;\r
+static const int IMAGE_FLASHLIGHT_COLOR_MULTI_PRESSBUTTON = 0x10000b;\r
+static const int IMAGE_FLASHLIGHT_COLOR_ORANGE_BUTTON = 0x10000c;\r
+static const int IMAGE_FLASHLIGHT_COLOR_ORANGE_PRESSBUTTON = 0x10000d;\r
+static const int IMAGE_FLASHLIGHT_COLOR_PURPLE_BUTTON = 0x10000e;\r
+static const int IMAGE_FLASHLIGHT_COLOR_PURPLE_PRESSBUTTON = 0x10000f;\r
+static const int IMAGE_FLASHLIGHT_COLOR_RED_BUTTON = 0x100010;\r
+static const int IMAGE_FLASHLIGHT_COLOR_RED_PRESSBUTTON = 0x100011;\r
+static const int IMAGE_FLASHLIGHT_COLOR_WHITE_BUTTON = 0x100012;\r
+static const int IMAGE_FLASHLIGHT_COLOR_WHITE_PRESSBUTTON = 0x100013;\r
+static const int IMAGE_FLASHLIGHT_COLOR_YELLOW_BUTTON = 0x100014;\r
+static const int IMAGE_FLASHLIGHT_COLOR_YELLOW_PRESSBUTTON = 0x100015;\r
+static const int IMAGE_FLASHLIGHT_DOWNARROW = 0x100016;\r
+static const int IMAGE_FLASHLIGHT_FLASHLIGHTON = 0x100017;\r
+static const int IMAGE_FLASHLIGHT_PLAY_BLACK_PAGE = 0x100018;\r
+static const int IMAGE_FLASHLIGHT_PLAY_DARK_BLUE_PAGE = 0x100019;\r
+static const int IMAGE_FLASHLIGHT_PLAY_GREEN_PAGE = 0x10001a;\r
+static const int IMAGE_FLASHLIGHT_PLAY_LIGHT_BLUE_PAGE = 0x10001b;\r
+static const int IMAGE_FLASHLIGHT_PLAY_MULTI_PAGE = 0x10001c;\r
+static const int IMAGE_FLASHLIGHT_PLAY_ORANGE_PAGE = 0x10001d;\r
+static const int IMAGE_FLASHLIGHT_PLAY_PURPLE_PAGE = 0x10001e;\r
+static const int IMAGE_FLASHLIGHT_PLAY_RED_PAGE = 0x10001f;\r
+static const int IMAGE_FLASHLIGHT_PLAY_WHITE_PAGE = 0x100020;\r
+static const int IMAGE_FLASHLIGHT_PLAY_YELLOW_PAGE = 0x100021;\r
+static const int IMAGE_FLASHLIGHT_RECOVERBUTTON = 0x100022;\r
+static const int IMAGE_FLASHLIGHT_RECOVERCANCLE = 0x100023;\r
+static const int IMAGE_FLASHLIGHT_RECOVERCONFIRM = 0x100024;\r
+static const int IMAGE_FLASHLIGHT_RIGHTARROW = 0x100025;\r
+}  // OHOS\r
+#endif  // UI_RESOURCE_FLASHLIGHT_H\r
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativelauncher/include/ui_resource_heartRate.h b/code/sdk/application/wearable/evb/nativeapp/nativelauncher/include/ui_resource_heartRate.h
new file mode 100644 (file)
index 0000000..97ffed1
--- /dev/null
@@ -0,0 +1,49 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: UIResourceHeartRate\r
+ * Create: 2025-06\r
+ */\r
+\r
+#ifndef UI_RESOURCE_HEARTRATE_H\r
+#define UI_RESOURCE_HEARTRATE_H\r
+\r
+namespace OHOS {\r
+static const int IMAGE_HEART_RATE_BG1 = 0x100001;\r
+static const int IMAGE_HEART_RATE_BG2 = 0x100002;\r
+static const int IMAGE_HEART_RATE_DOWN = 0x100003;\r
+static const int IMAGE_HEART_RATE_FRAME00 = 0x100004;\r
+static const int IMAGE_HEART_RATE_FRAME01 = 0x100005;\r
+static const int IMAGE_HEART_RATE_FRAME02 = 0x100006;\r
+static const int IMAGE_HEART_RATE_FRAME03 = 0x100007;\r
+static const int IMAGE_HEART_RATE_FRAME04 = 0x100008;\r
+static const int IMAGE_HEART_RATE_FRAME05 = 0x100009;\r
+static const int IMAGE_HEART_RATE_FRAME06 = 0x10000a;\r
+static const int IMAGE_HEART_RATE_FRAME07 = 0x10000b;\r
+static const int IMAGE_HEART_RATE_FRAME08 = 0x10000c;\r
+static const int IMAGE_HEART_RATE_FRAME09 = 0x10000d;\r
+static const int IMAGE_HEART_RATE_FRAME10 = 0x10000e;\r
+static const int IMAGE_HEART_RATE_FRAME11 = 0x10000f;\r
+static const int IMAGE_HEART_RATE_FRAME12 = 0x100010;\r
+static const int IMAGE_HEART_RATE_FRAME13 = 0x100011;\r
+static const int IMAGE_HEART_RATE_FRAME14 = 0x100012;\r
+static const int IMAGE_HEART_RATE_FRAME15 = 0x100013;\r
+static const int IMAGE_HEART_RATE_FRAME16 = 0x100014;\r
+static const int IMAGE_HEART_RATE_FRAME17 = 0x100015;\r
+static const int IMAGE_HEART_RATE_FRAME18 = 0x100016;\r
+static const int IMAGE_HEART_RATE_FRAME19 = 0x100017;\r
+static const int IMAGE_HEART_RATE_FRAME20 = 0x100018;\r
+static const int IMAGE_HEART_RATE_FRAME21 = 0x100019;\r
+static const int IMAGE_HEART_RATE_FRAME22 = 0x10001a;\r
+static const int IMAGE_HEART_RATE_FRAME23 = 0x10001b;\r
+static const int IMAGE_HEART_RATE_FRAME24 = 0x10001c;\r
+static const int IMAGE_HEART_RATE_FRAME25 = 0x10001d;\r
+static const int IMAGE_HEART_RATE_FRAME26 = 0x10001e;\r
+static const int IMAGE_HEART_RATE_FRAME27 = 0x10001f;\r
+static const int IMAGE_HEART_RATE_FRAME28 = 0x100020;\r
+static const int IMAGE_HEART_RATE_FRAME29 = 0x100021;\r
+static const int IMAGE_HEART_RATE_PREVIEW1 = 0x100022;\r
+static const int IMAGE_HEART_RATE_PREVIEW2 = 0x100023;\r
+static const int IMAGE_HEART_RATE_RESET = 0x100024;\r
+static const int IMAGE_HEART_RATE_UP = 0x100025;\r
+}  // OHOS\r
+#endif  // UI_RESOURCE_HEARTRATE_H\r
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativelauncher/include/ui_resource_message.h b/code/sdk/application/wearable/evb/nativeapp/nativelauncher/include/ui_resource_message.h
new file mode 100644 (file)
index 0000000..1758c87
--- /dev/null
@@ -0,0 +1,26 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: UIResourceMessage\r
+ * Create: 2025-06-29\r
+ */\r
+\r
+#ifndef UI_RESOURCE_MESSAGE_H\r
+#define UI_RESOURCE_MESSAGE_H\r
+\r
+namespace OHOS {\r
+static const int IMAGE_MESSAGE_BG = 0x100001;\r
+static const int IMAGE_MESSAGE_CALENDAR = 0x100002;\r
+static const int IMAGE_MESSAGE_CANCEL = 0x100003;\r
+static const int IMAGE_MESSAGE_CONFIRM = 0x100004;\r
+static const int IMAGE_MESSAGE_DELETE = 0x100005;\r
+static const int IMAGE_MESSAGE_DUANXIN = 0x100006;\r
+static const int IMAGE_MESSAGE_DY = 0x100007;\r
+static const int IMAGE_MESSAGE_QQ = 0x100008;\r
+static const int IMAGE_MESSAGE_RING = 0x100009;\r
+static const int IMAGE_MESSAGE_SINGLE_DELETE = 0x10000a;\r
+static const int IMAGE_MESSAGE_TOUTIAO = 0x10000b;\r
+static const int IMAGE_MESSAGE_WB = 0x10000c;\r
+static const int IMAGE_MESSAGE_WX = 0x10000d;\r
+static const int IMAGE_MESSAGE_XHS = 0x10000e;\r
+}  // OHOS\r
+#endif  // UI_RESOURCE_MESSAGE_H\r
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativelauncher/include/ui_resource_phonemenu.h b/code/sdk/application/wearable/evb/nativeapp/nativelauncher/include/ui_resource_phonemenu.h
new file mode 100644 (file)
index 0000000..dcbe2ad
--- /dev/null
@@ -0,0 +1,30 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: UiResourcePhoneMenu\r
+ * Create: 2025-2-13\r
+ */\r
+\r
+#ifndef UI_RESOURCE_PHONEMENU_H\r
+#define UI_RESOURCE_PHONEMENU_H\r
+\r
+namespace OHOS {\r
+static const int IMAGE_PHONEMENU_ANSWER = 0x100001;\r
+static const int IMAGE_PHONEMENU_CALL = 0x100002;\r
+static const int IMAGE_PHONEMENU_CALLIN = 0x100003;\r
+static const int IMAGE_PHONEMENU_CALLIN_ICON = 0x100004;\r
+static const int IMAGE_PHONEMENU_CALLOUT = 0x100005;\r
+static const int IMAGE_PHONEMENU_CALLOUT_ICON = 0x100006;\r
+static const int IMAGE_PHONEMENU_CONTACTS = 0x100007;\r
+static const int IMAGE_PHONEMENU_CONTACTS_BOOKS = 0x100008;\r
+static const int IMAGE_PHONEMENU_DEL = 0x100009;\r
+static const int IMAGE_PHONEMENU_DIAL = 0x10000a;\r
+static const int IMAGE_PHONEMENU_DISCONNECT = 0x10000b;\r
+static const int IMAGE_PHONEMENU_HANGUP = 0x10000c;\r
+static const int IMAGE_PHONEMENU_MIC = 0x10000d;\r
+static const int IMAGE_PHONEMENU_MIC_MUTE = 0x10000e;\r
+static const int IMAGE_PHONEMENU_PHONE = 0x10000f;\r
+static const int IMAGE_PHONEMENU_POUND_KEY = 0x100010;\r
+static const int IMAGE_PHONEMENU_RECENT_CALL = 0x100011;\r
+static const int IMAGE_PHONEMENU_STAR_KEY = 0x100012;\r
+}  // OHOS\r
+#endif  // UI_RESOURCE_PHONEMENU_H\r
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativelauncher/include/ui_resource_settings.h b/code/sdk/application/wearable/evb/nativeapp/nativelauncher/include/ui_resource_settings.h
new file mode 100644 (file)
index 0000000..39ed3a4
--- /dev/null
@@ -0,0 +1,169 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: UIResourceSettings\r
+ * Create: 2025-06-05\r
+ */\r
+\r
+#ifndef UI_RESOURCE_SETTINGS_H\r
+#define UI_RESOURCE_SETTINGS_H\r
+\r
+namespace OHOS {\r
+static const int IMAGE_3D_FOLD_01 = 0x100001;\r
+static const int IMAGE_3D_FOLD_02 = 0x100002;\r
+static const int IMAGE_3D_FOLD_03 = 0x100003;\r
+static const int IMAGE_3D_FOLD_04 = 0x100004;\r
+static const int IMAGE_3D_FOLD_05 = 0x100005;\r
+static const int IMAGE_3D_FOLD_06 = 0x100006;\r
+static const int IMAGE_3D_FOLD_07 = 0x100007;\r
+static const int IMAGE_3D_FOLD_08 = 0x100008;\r
+static const int IMAGE_3D_FOLD_09 = 0x100009;\r
+static const int IMAGE_3D_FOLD_10 = 0x10000a;\r
+static const int IMAGE_ARROW = 0x10000b;\r
+static const int IMAGE_BG = 0x10000c;\r
+static const int IMAGE_BLUETOOTH = 0x10000d;\r
+static const int IMAGE_CANCEL = 0x10000e;\r
+static const int IMAGE_CARD_ADD_ADD = 0x10000f;\r
+static const int IMAGE_CARD_ADD_ADDED = 0x100010;\r
+static const int IMAGE_CARD_FLIP_01 = 0x100011;\r
+static const int IMAGE_CARD_FLIP_02 = 0x100012;\r
+static const int IMAGE_CARD_FLIP_03 = 0x100013;\r
+static const int IMAGE_CARD_FLIP_04 = 0x100014;\r
+static const int IMAGE_CARD_FLIP_05 = 0x100015;\r
+static const int IMAGE_CARD_FLIP_06 = 0x100016;\r
+static const int IMAGE_CARD_FLIP_07 = 0x100017;\r
+static const int IMAGE_CARD_FLIP_08 = 0x100018;\r
+static const int IMAGE_CARD_FLIP_09 = 0x100019;\r
+static const int IMAGE_CARD_FLIP_10 = 0x10001a;\r
+static const int IMAGE_CARD_LIST_CARDANIMATOR = 0x10001b;\r
+static const int IMAGE_CARD_LIST_CARDMANAGER = 0x10001c;\r
+static const int IMAGE_CARD_MGR_ADD = 0x10001d;\r
+static const int IMAGE_CARD_MGR_DEL = 0x10001e;\r
+static const int IMAGE_CONNECT = 0x10001f;\r
+static const int IMAGE_DESKTOP_BG = 0x100020;\r
+static const int IMAGE_DESKTOP_BRIGHTNESS_BG = 0x100021;\r
+static const int IMAGE_DESKTOP_BRIGHTNESS_FG = 0x100022;\r
+static const int IMAGE_DESKTOP_DIALSTYLE_AOD = 0x100023;\r
+static const int IMAGE_DESKTOP_DIALSTYLE_COVERFLOW = 0x100024;\r
+static const int IMAGE_DESKTOP_DIALSTYLE_ROLLER = 0x100025;\r
+static const int IMAGE_DESKTOP_HOME_SELECTED_APPLIST = 0x100026;\r
+static const int IMAGE_DESKTOP_HOME_SELECTED_FOOTBALL = 0x100027;\r
+static const int IMAGE_DESKTOP_HOME_SELECTED_HEXAGONS = 0x100028;\r
+static const int IMAGE_DESKTOP_HOME_SELECTED_PLANET = 0x100029;\r
+static const int IMAGE_DESKTOP_HOME_SELECTED_SPHERE = 0x10002a;\r
+static const int IMAGE_DESKTOP_HOME_SELECTED_WATERFALL = 0x10002b;\r
+static const int IMAGE_DESKTOP_HOME_UNSELECT_APPLIST = 0x10002c;\r
+static const int IMAGE_DESKTOP_HOME_UNSELECT_FOOTBALL = 0x10002d;\r
+static const int IMAGE_DESKTOP_HOME_UNSELECT_HEXAGONS = 0x10002e;\r
+static const int IMAGE_DESKTOP_HOME_UNSELECT_PLANET = 0x10002f;\r
+static const int IMAGE_DESKTOP_HOME_UNSELECT_SPHERE = 0x100030;\r
+static const int IMAGE_DESKTOP_HOME_UNSELECT_WATERFALL = 0x100031;\r
+static const int IMAGE_DESKTOP_LIST_DIAL = 0x100032;\r
+static const int IMAGE_DESKTOP_LIST_DIAL_STYLE = 0x100033;\r
+static const int IMAGE_DESKTOP_LIST_HOME = 0x100034;\r
+static const int IMAGE_DISPLAY_BRIGHTNESS_ADD = 0x100035;\r
+static const int IMAGE_DISPLAY_BRIGHTNESS_SUB = 0x100036;\r
+static const int IMAGE_DISPLAY_LIST_ADJUST_BRIGHTNESS = 0x100037;\r
+static const int IMAGE_DISPLAY_LIST_AUTO_ADJUST = 0x100038;\r
+static const int IMAGE_DISPLAY_LIST_SCREEN_OFF_TIME = 0x100039;\r
+static const int IMAGE_DISPLAY_LIST_SCREEN_ON_TIME = 0x10003a;\r
+static const int IMAGE_DISPLAY_OK = 0x10003b;\r
+static const int IMAGE_MAIN_LIST_ABOUT = 0x10003c;\r
+static const int IMAGE_MAIN_LIST_ARROW = 0x10003d;\r
+static const int IMAGE_MAIN_LIST_BLUETOOTH = 0x10003e;\r
+static const int IMAGE_MAIN_LIST_CARD = 0x10003f;\r
+static const int IMAGE_MAIN_LIST_DESKTOP = 0x100040;\r
+static const int IMAGE_MAIN_LIST_DISPLAY = 0x100041;\r
+static const int IMAGE_MAIN_LIST_POWER = 0x100042;\r
+static const int IMAGE_MAIN_LIST_SYSTEM = 0x100043;\r
+static const int IMAGE_OK = 0x100044;\r
+static const int IMAGE_OK_BLUE = 0x100045;\r
+static const int IMAGE_OK_DOWN = 0x100046;\r
+static const int IMAGE_PAGE_BACKGROUND = 0x100047;\r
+static const int IMAGE_PHONE = 0x100048;\r
+static const int IMAGE_PUSH_PRESS_01 = 0x100049;\r
+static const int IMAGE_PUSH_PRESS_02 = 0x10004a;\r
+static const int IMAGE_PUSH_PRESS_03 = 0x10004b;\r
+static const int IMAGE_PUSH_PRESS_04 = 0x10004c;\r
+static const int IMAGE_PUSH_PRESS_05 = 0x10004d;\r
+static const int IMAGE_PUSH_PRESS_06 = 0x10004e;\r
+static const int IMAGE_PUSH_PRESS_07 = 0x10004f;\r
+static const int IMAGE_PUSH_PRESS_08 = 0x100050;\r
+static const int IMAGE_PUSH_PRESS_09 = 0x100051;\r
+static const int IMAGE_PUSH_PRESS_10 = 0x100052;\r
+static const int IMAGE_QCODE = 0x100053;\r
+static const int IMAGE_SURPRISE = 0x100054;\r
+static const int IMAGE_SYSTEM_LIST_OTA = 0x100055;\r
+static const int IMAGE_SYSTEM_LIST_POWEROFF = 0x100056;\r
+static const int IMAGE_SYSTEM_LIST_RESTART = 0x100057;\r
+static const int IMAGE_SYSTEM_LIST_RESUME = 0x100058;\r
+static const int IMAGE_SYSTEM_OPERATION_CLOSE = 0x100059;\r
+static const int IMAGE_SYSTEM_OTA_UNBLUETOOTH = 0x10005a;\r
+static const int IMAGE_SYSTEM_OTA_UNUPDATE = 0x10005b;\r
+static const int IMAGE_SYSTEM_OTA_UPDATE = 0x10005c;\r
+static const int IMAGE_TRAINSTION_END = 0x10005d;\r
+static const int IMAGE_TRAINSTION_START = 0x10005e;\r
+static const int IMAGE_TURN_PAGE_01 = 0x10005f;\r
+static const int IMAGE_TURN_PAGE_02 = 0x100060;\r
+static const int IMAGE_TURN_PAGE_03 = 0x100061;\r
+static const int IMAGE_TURN_PAGE_04 = 0x100062;\r
+static const int IMAGE_TURN_PAGE_05 = 0x100063;\r
+static const int IMAGE_TURN_PAGE_06 = 0x100064;\r
+static const int IMAGE_TURN_PAGE_07 = 0x100065;\r
+static const int IMAGE_TURN_PAGE_08 = 0x100066;\r
+static const int IMAGE_TURN_PAGE_09 = 0x100067;\r
+static const int IMAGE_TURN_PAGE_10 = 0x100068;\r
+static const int IMAGE_UNPAIR = 0x100069;\r
+static const int IMAGE_WINDMILL_01 = 0x10006a;\r
+static const int IMAGE_WINDMILL_02 = 0x10006b;\r
+static const int IMAGE_WINDMILL_03 = 0x10006c;\r
+static const int IMAGE_WINDMILL_04 = 0x10006d;\r
+static const int IMAGE_WINDMILL_05 = 0x10006e;\r
+static const int IMAGE_WINDMILL_06 = 0x10006f;\r
+static const int IMAGE_WINDMILL_07 = 0x100070;\r
+static const int IMAGE_WINDMILL_08 = 0x100071;\r
+static const int IMAGE_WINDMILL_09 = 0x100072;\r
+static const int IMAGE_WINDMILL_10 = 0x100073;\r
+static const int IMAGE_Y3_1 = 0x100074;\r
+static const int IMAGE_Y3_10 = 0x100075;\r
+static const int IMAGE_Y3_11 = 0x100076;\r
+static const int IMAGE_Y3_12 = 0x100077;\r
+static const int IMAGE_Y3_13 = 0x100078;\r
+static const int IMAGE_Y3_14 = 0x100079;\r
+static const int IMAGE_Y3_15 = 0x10007a;\r
+static const int IMAGE_Y3_16 = 0x10007b;\r
+static const int IMAGE_Y3_17 = 0x10007c;\r
+static const int IMAGE_Y3_18 = 0x10007d;\r
+static const int IMAGE_Y3_19 = 0x10007e;\r
+static const int IMAGE_Y3_2 = 0x10007f;\r
+static const int IMAGE_Y3_20 = 0x100080;\r
+static const int IMAGE_Y3_21 = 0x100081;\r
+static const int IMAGE_Y3_22 = 0x100082;\r
+static const int IMAGE_Y3_23 = 0x100083;\r
+static const int IMAGE_Y3_24 = 0x100084;\r
+static const int IMAGE_Y3_25 = 0x100085;\r
+static const int IMAGE_Y3_26 = 0x100086;\r
+static const int IMAGE_Y3_27 = 0x100087;\r
+static const int IMAGE_Y3_28 = 0x100088;\r
+static const int IMAGE_Y3_29 = 0x100089;\r
+static const int IMAGE_Y3_3 = 0x10008a;\r
+static const int IMAGE_Y3_30 = 0x10008b;\r
+static const int IMAGE_Y3_31 = 0x10008c;\r
+static const int IMAGE_Y3_4 = 0x10008d;\r
+static const int IMAGE_Y3_5 = 0x10008e;\r
+static const int IMAGE_Y3_6 = 0x10008f;\r
+static const int IMAGE_Y3_7 = 0x100090;\r
+static const int IMAGE_Y3_8 = 0x100091;\r
+static const int IMAGE_Y3_9 = 0x100092;\r
+static const int IMAGE_ZOOM_01 = 0x100093;\r
+static const int IMAGE_ZOOM_02 = 0x100094;\r
+static const int IMAGE_ZOOM_03 = 0x100095;\r
+static const int IMAGE_ZOOM_04 = 0x100096;\r
+static const int IMAGE_ZOOM_05 = 0x100097;\r
+static const int IMAGE_ZOOM_06 = 0x100098;\r
+static const int IMAGE_ZOOM_07 = 0x100099;\r
+static const int IMAGE_ZOOM_08 = 0x10009a;\r
+static const int IMAGE_ZOOM_09 = 0x10009b;\r
+static const int IMAGE_ZOOM_10 = 0x10009c;\r
+static const int IMAGE_MAIN_LIST_LANGUAGE = 0x100043;\r
+}  // OHOS\r
+#endif  // UI_RESOURCE_SETTING_H\r
index c5d369d..4057088 100644 (file)
@@ -1,28 +1,27 @@
 /*\r
  * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
- * Description: UISleepResource\r
+ * Description: UIResourceSleep\r
  * Create: 2025-06-05\r
  */\r
+\r
 #ifndef UI_RESOURCE_SLEEP_H\r
 #define UI_RESOURCE_SLEEP_H\r
-#include <cstdint>\r
+\r
 namespace OHOS {\r
-    static const int IMAGE_CONVERTER_TOOL_BACKGROUND = 0x100001;\r
-    static const int IMAGE_CONVERTER_TOOL_BLACK_BG = 0x100002;\r
-    static const int IMAGE_CONVERTER_TOOL_BLUE_CIR = 0x100003;\r
-    static const int IMAGE_CONVERTER_TOOL_GREEN_CIR = 0x100004;\r
-    static const int IMAGE_CONVERTER_TOOL_NORECORD_SLEEP = 0x100005;\r
-    static const int IMAGE_CONVERTER_TOOL_ORANGE_CIR = 0x100006;\r
-    static const int IMAGE_CONVERTER_TOOL_RECORD_BG = 0x100007;\r
-    static const int IMAGE_CONVERTER_TOOL_RECORD_SLEEP = 0x100008;\r
-    static const int IMAGE_CONVERTER_TOOL_RED_CIR = 0x100009;\r
-    static const int IMAGE_CONVERTER_TOOL_SELECTEDTIME = 0x10000a;\r
-    static const int IMAGE_CONVERTER_TOOL_SELECTTIME = 0x10000b;\r
-    static const int IMAGE_CONVERTER_TOOL_SETTIMEBTN = 0x10000c;\r
-    static const int IMAGE_CONVERTER_TOOL_SETTING = 0x10000d;\r
-    static const int IMAGE_CONVERTER_TOOL_START_GRAY = 0x10000e;\r
-    static const int IMAGE_CONVERTER_TOOL_STAR_GRAY = 0x10000f;\r
-    static const int IMAGE_CONVERTER_TOOL_STAR_YELLOW = 0x100010;\r
-    static const int IMAGE_CONVERTER_TOOL_TIPS = 0x100011;\r
-} // OHOS\r
-#endif // UI_RESOURCE_SLEEP_H\r
+static const int IMAGE_SLEEP_BACKGROUND = 0x100001;\r
+static const int IMAGE_SLEEP_BLUE_CIR = 0x100002;\r
+static const int IMAGE_SLEEP_GREEN_CIR = 0x100003;\r
+static const int IMAGE_SLEEP_NORECORD_SLEEP = 0x100004;\r
+static const int IMAGE_SLEEP_ORANGE_CIR = 0x100005;\r
+static const int IMAGE_SLEEP_RECORD_BG = 0x100006;\r
+static const int IMAGE_SLEEP_RECORD_SLEEP = 0x100007;\r
+static const int IMAGE_SLEEP_RED_CIR = 0x100008;\r
+static const int IMAGE_SLEEP_SETTIMEBTN = 0x100009;\r
+static const int IMAGE_SLEEP_SETTING = 0x10000a;\r
+static const int IMAGE_SLEEP_SLEEPING_MOON = 0x10000b;\r
+static const int IMAGE_SLEEP_SLEEPING_TIME = 0x10000c;\r
+static const int IMAGE_SLEEP_START_GRAY = 0x10000d;\r
+static const int IMAGE_SLEEP_STAR_GRAY = 0x10000e;\r
+static const int IMAGE_SLEEP_STAR_YELLOW = 0x10000f;\r
+}  // OHOS\r
+#endif  // UI_RESOURCE_SLEEP_H\r
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativelauncher/include/ui_resource_sport.h b/code/sdk/application/wearable/evb/nativeapp/nativelauncher/include/ui_resource_sport.h
new file mode 100644 (file)
index 0000000..c81672b
--- /dev/null
@@ -0,0 +1,114 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: UIResourceSport\r
+ * Create: 2025-06-05\r
+ */\r
+\r
+#ifndef UI_RESOURCE_SPORT_H\r
+#define UI_RESOURCE_SPORT_H\r
+\r
+namespace OHOS {\r
+static const int IMAGE_SPORT_10KM = 0x100001;\r
+static const int IMAGE_SPORT_10MIN = 0x100002;\r
+static const int IMAGE_SPORT_120MIN = 0x100003;\r
+static const int IMAGE_SPORT_15KM = 0x100004;\r
+static const int IMAGE_SPORT_180MIN = 0x100005;\r
+static const int IMAGE_SPORT_1KM = 0x100006;\r
+static const int IMAGE_SPORT_200MIN = 0x100007;\r
+static const int IMAGE_SPORT_20KM = 0x100008;\r
+static const int IMAGE_SPORT_20MIN = 0x100009;\r
+static const int IMAGE_SPORT_25KM = 0x10000a;\r
+static const int IMAGE_SPORT_30KM = 0x10000b;\r
+static const int IMAGE_SPORT_30MIN = 0x10000c;\r
+static const int IMAGE_SPORT_3KM = 0x10000d;\r
+static const int IMAGE_SPORT_40KM = 0x10000e;\r
+static const int IMAGE_SPORT_5KM = 0x10000f;\r
+static const int IMAGE_SPORT_60MIN = 0x100010;\r
+static const int IMAGE_SPORT_7KM = 0x100011;\r
+static const int IMAGE_SPORT_BATTERY1 = 0x100012;\r
+static const int IMAGE_SPORT_BATTERY2 = 0x100013;\r
+static const int IMAGE_SPORT_BATTERY3 = 0x100014;\r
+static const int IMAGE_SPORT_BATTERY4 = 0x100015;\r
+static const int IMAGE_SPORT_BATTERY5 = 0x100016;\r
+static const int IMAGE_SPORT_BG = 0x100017;\r
+static const int IMAGE_SPORT_BG1 = 0x100018;\r
+static const int IMAGE_SPORT_BG2 = 0x100019;\r
+static const int IMAGE_SPORT_BG3 = 0x10001a;\r
+static const int IMAGE_SPORT_BG4 = 0x10001b;\r
+static const int IMAGE_SPORT_BG5 = 0x10001c;\r
+static const int IMAGE_SPORT_BG6 = 0x10001d;\r
+static const int IMAGE_SPORT_CALORIE = 0x10001e;\r
+static const int IMAGE_SPORT_CANCEL = 0x10001f;\r
+static const int IMAGE_SPORT_CLIMBING1 = 0x100020;\r
+static const int IMAGE_SPORT_CLIMBING2 = 0x100021;\r
+static const int IMAGE_SPORT_CONFIRM = 0x100022;\r
+static const int IMAGE_SPORT_CROWN = 0x100023;\r
+static const int IMAGE_SPORT_CYCLING1 = 0x100024;\r
+static const int IMAGE_SPORT_CYCLING2 = 0x100025;\r
+static const int IMAGE_SPORT_DISTANCE = 0x100026;\r
+static const int IMAGE_SPORT_FACE = 0x100027;\r
+static const int IMAGE_SPORT_FINISH = 0x100028;\r
+static const int IMAGE_SPORT_GO1 = 0x100029;\r
+static const int IMAGE_SPORT_GO2 = 0x10002a;\r
+static const int IMAGE_SPORT_GO3 = 0x10002b;\r
+static const int IMAGE_SPORT_GO4 = 0x10002c;\r
+static const int IMAGE_SPORT_GO5 = 0x10002d;\r
+static const int IMAGE_SPORT_GO6 = 0x10002e;\r
+static const int IMAGE_SPORT_GPS = 0x10002f;\r
+static const int IMAGE_SPORT_HALF = 0x100030;\r
+static const int IMAGE_SPORT_HEART1 = 0x100031;\r
+static const int IMAGE_SPORT_HEART2 = 0x100032;\r
+static const int IMAGE_SPORT_HEART3 = 0x100033;\r
+static const int IMAGE_SPORT_HEARTRATE = 0x100034;\r
+static const int IMAGE_SPORT_INDOOR_RUNNING1 = 0x100035;\r
+static const int IMAGE_SPORT_INDOOR_RUNNING2 = 0x100036;\r
+static const int IMAGE_SPORT_INDOOR_SWIMMING1 = 0x100037;\r
+static const int IMAGE_SPORT_INDOOR_SWIMMING2 = 0x100038;\r
+static const int IMAGE_SPORT_INTERVAL = 0x100039;\r
+static const int IMAGE_SPORT_ITEMBG = 0x10003a;\r
+static const int IMAGE_SPORT_ITEMBG1 = 0x10003b;\r
+static const int IMAGE_SPORT_ITEMBG2 = 0x10003c;\r
+static const int IMAGE_SPORT_ITEMBG3 = 0x10003d;\r
+static const int IMAGE_SPORT_ITEMBG4 = 0x10003e;\r
+static const int IMAGE_SPORT_ITEMBG5 = 0x10003f;\r
+static const int IMAGE_SPORT_ITEMBG6 = 0x100040;\r
+static const int IMAGE_SPORT_LAP = 0x100041;\r
+static const int IMAGE_SPORT_LAP1 = 0x100042;\r
+static const int IMAGE_SPORT_LAP10 = 0x100043;\r
+static const int IMAGE_SPORT_LAP12 = 0x100044;\r
+static const int IMAGE_SPORT_LAP16 = 0x100045;\r
+static const int IMAGE_SPORT_LAP2 = 0x100046;\r
+static const int IMAGE_SPORT_LAP20 = 0x100047;\r
+static const int IMAGE_SPORT_LAP30 = 0x100048;\r
+static const int IMAGE_SPORT_LAP4 = 0x100049;\r
+static const int IMAGE_SPORT_LAP6 = 0x10004a;\r
+static const int IMAGE_SPORT_LAP8 = 0x10004b;\r
+static const int IMAGE_SPORT_MISTOUCH = 0x10004c;\r
+static const int IMAGE_SPORT_NEXT = 0x10004d;\r
+static const int IMAGE_SPORT_NONE = 0x10004e;\r
+static const int IMAGE_SPORT_OK1 = 0x10004f;\r
+static const int IMAGE_SPORT_OK2 = 0x100050;\r
+static const int IMAGE_SPORT_OK3 = 0x100051;\r
+static const int IMAGE_SPORT_OUTDOOR_RUNNING1 = 0x100052;\r
+static const int IMAGE_SPORT_OUTDOOR_RUNNING2 = 0x100053;\r
+static const int IMAGE_SPORT_OUTDOOR_SWIMMING1 = 0x100054;\r
+static const int IMAGE_SPORT_OUTDOOR_SWIMMING2 = 0x100055;\r
+static const int IMAGE_SPORT_RADIO0 = 0x100056;\r
+static const int IMAGE_SPORT_RADIO1 = 0x100057;\r
+static const int IMAGE_SPORT_REMIND = 0x100058;\r
+static const int IMAGE_SPORT_SCALE = 0x100059;\r
+static const int IMAGE_SPORT_SCREEN = 0x10005a;\r
+static const int IMAGE_SPORT_SETTING = 0x10005b;\r
+static const int IMAGE_SPORT_SIGNAL0 = 0x10005c;\r
+static const int IMAGE_SPORT_SIGNAL1 = 0x10005d;\r
+static const int IMAGE_SPORT_SIGNAL2 = 0x10005e;\r
+static const int IMAGE_SPORT_SIGNAL3 = 0x10005f;\r
+static const int IMAGE_SPORT_START = 0x100060;\r
+static const int IMAGE_SPORT_STOP = 0x100061;\r
+static const int IMAGE_SPORT_TARGET = 0x100062;\r
+static const int IMAGE_SPORT_TIME = 0x100063;\r
+static const int IMAGE_SPORT_TOGGLE0 = 0x100064;\r
+static const int IMAGE_SPORT_TOGGLE1 = 0x100065;\r
+static const int IMAGE_SPORT_TRIANGLE = 0x100066;\r
+}  // OHOS\r
+#endif  // UI_RESOURCE_SPORT_H\r
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativelauncher/include/ui_resource_stopwatch.h b/code/sdk/application/wearable/evb/nativeapp/nativelauncher/include/ui_resource_stopwatch.h
new file mode 100644 (file)
index 0000000..de08fef
--- /dev/null
@@ -0,0 +1,21 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: UIResourceStopwatch\r
+ * Create: 2025-06-05\r
+ */\r
+\r
+#ifndef UI_RESOURCE_STOPWATCH_H\r
+#define UI_RESOURCE_STOPWATCH_H\r
+\r
+namespace OHOS {\r
+static const int IMAGE_STOPWATCH_BG = 0x100001;\r
+static const int IMAGE_STOPWATCH_HAND = 0x100002;\r
+static const int IMAGE_STOPWATCH_PAUSE = 0x100003;\r
+static const int IMAGE_STOPWATCH_RECORD = 0x100004;\r
+static const int IMAGE_STOPWATCH_RECORD_DISABLE = 0x100005;\r
+static const int IMAGE_STOPWATCH_RESET = 0x100006;\r
+static const int IMAGE_STOPWATCH_RESET_DISABLE = 0x100007;\r
+static const int IMAGE_STOPWATCH_SCALE = 0x100008;\r
+static const int IMAGE_STOPWATCH_START = 0x100009;\r
+}  // OHOS\r
+#endif  // UI_RESOURCE_STOPWATCH_H\r
index b9a4629..1d02c84 100644 (file)
@@ -1,27 +1,25 @@
 /*\r
- * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
- * Description: UITimerResource\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: UIResourceTimer\r
  * Create: 2025-06-05\r
  */\r
+\r
 #ifndef UI_RESOURCE_TIMER_H\r
 #define UI_RESOURCE_TIMER_H\r
-#include <cstdint>\r
+\r
 namespace OHOS {\r
-    static const int IMAGE_CONVERTER_TOOL_BG_CIR = 0x100001;\r
-    static const int IMAGE_CONVERTER_TOOL_TIMER_1 = 0x100002;\r
-    static const int IMAGE_CONVERTER_TOOL_TIMER_15 = 0x100003;\r
-    static const int IMAGE_CONVERTER_TOOL_TIMER_3 = 0x100004;\r
-    static const int IMAGE_CONVERTER_TOOL_TIMER_30 = 0x100005;\r
-    static const int IMAGE_CONVERTER_TOOL_TIMER_BEGIN_GRAY = 0x100006;\r
-    static const int IMAGE_CONVERTER_TOOL_TIMER_BEGIN_ORANGE = 0x100007;\r
-    static const int IMAGE_CONVERTER_TOOL_TIMER_BG = 0x100008;\r
-    static const int IMAGE_CONVERTER_TOOL_TIMER_EXIT = 0x100009;\r
-    static const int IMAGE_CONVERTER_TOOL_TIMER_PAUSE = 0x10000a;\r
-    static const int IMAGE_CONVERTER_TOOL_TIMER_PAUSE_ORANGE = 0x10000b;\r
-    static const int IMAGE_CONVERTER_TOOL_TIMER_PBG = 0x10000c;\r
-    static const int IMAGE_CONVERTER_TOOL_TIMER_PLAY = 0x10000d;\r
-    static const int IMAGE_CONVERTER_TOOL_TIMER_POINTER = 0x10000e;\r
-    static const int IMAGE_CONVERTER_TOOL_TIMER_RESTART = 0x10000f;\r
-    static const int IMAGE_CONVERTER_TOOL_TIMER_USER = 0x100010;\r
-} // OHOS\r
-#endif // UI_RESOURCE_TIMER_H\r
+static const int IMAGE_TIMER_1 = 0x100001;\r
+static const int IMAGE_TIMER_15 = 0x100002;\r
+static const int IMAGE_TIMER_3 = 0x100003;\r
+static const int IMAGE_TIMER_30 = 0x100004;\r
+static const int IMAGE_TIMER_BEGIN_GRAY = 0x100005;\r
+static const int IMAGE_TIMER_BEGIN_ORANGE = 0x100006;\r
+static const int IMAGE_TIMER_BG = 0x100007;\r
+static const int IMAGE_TIMER_EXIT = 0x100008;\r
+static const int IMAGE_TIMER_PAUSE = 0x100009;\r
+static const int IMAGE_TIMER_PAUSE_ORANGE = 0x10000a;\r
+static const int IMAGE_TIMER_PLAY = 0x10000b;\r
+static const int IMAGE_TIMER_RESTART = 0x10000c;\r
+static const int IMAGE_TIMER_USER = 0x10000d;\r
+}  // OHOS\r
+#endif  // UI_RESOURCE_TIMER_H\r
index 874ba3f..13eeebc 100644 (file)
 /*\r
- * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
- * Description: UIWeatherResource\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: UIResourceWeather\r
  * Create: 2025-06-05\r
  */\r
-#ifndef UI_RESOURCE_WEATHER_IMAGE_H\r
-#define UI_RESOURCE_WEATHER_IMAGE_H\r
-#include <cstdint>\r
+\r
+#ifndef UI_RESOURCE_WEATHER_H\r
+#define UI_RESOURCE_WEATHER_H\r
+\r
 namespace OHOS {\r
-static const int IMAGE_CONVERTER_TOOL_WEATHER00 = 0x100001;\r
-static const int IMAGE_CONVERTER_TOOL_WEATHER01 = 0x100002;\r
-static const int IMAGE_CONVERTER_TOOL_WEATHER02 = 0x100003;\r
-static const int IMAGE_CONVERTER_TOOL_WEATHER03 = 0x100004;\r
-static const int IMAGE_CONVERTER_TOOL_WEATHER04 = 0x100005;\r
-static const int IMAGE_CONVERTER_TOOL_WEATHER05 = 0x100006;\r
-static const int IMAGE_CONVERTER_TOOL_WEATHER06 = 0x100007;\r
-static const int IMAGE_CONVERTER_TOOL_WEATHER07 = 0x100008;\r
-static const int IMAGE_CONVERTER_TOOL_WEATHER08 = 0x100009;\r
-static const int IMAGE_CONVERTER_TOOL_WEATHER09 = 0x10000a;\r
-static const int IMAGE_CONVERTER_TOOL_WEATHER10 = 0x10000b;\r
-static const int IMAGE_CONVERTER_TOOL_WEATHER11 = 0x10000c;\r
-static const int IMAGE_CONVERTER_TOOL_WEATHER12 = 0x10000d;\r
-static const int IMAGE_CONVERTER_TOOL_WEATHER13 = 0x10000e;\r
-static const int IMAGE_CONVERTER_TOOL_WEATHER14 = 0x10000f;\r
-static const int IMAGE_CONVERTER_TOOL_WEATHER15 = 0x100010;\r
-static const int IMAGE_CONVERTER_TOOL_WEATHER16 = 0x100011;\r
-static const int IMAGE_CONVERTER_TOOL_WEATHER17 = 0x100012;\r
-static const int IMAGE_CONVERTER_TOOL_WEATHER18 = 0x100013;\r
-static const int IMAGE_CONVERTER_TOOL_WEATHER19 = 0x100014;\r
-static const int IMAGE_CONVERTER_TOOL_WEATHER20 = 0x100015;\r
-static const int IMAGE_CONVERTER_TOOL_WEATHER21 = 0x100016;\r
-static const int IMAGE_CONVERTER_TOOL_WEATHER22 = 0x100017;\r
-static const int IMAGE_CONVERTER_TOOL_WEATHER23 = 0x100018;\r
-static const int IMAGE_CONVERTER_TOOL_WEATHER24 = 0x100019;\r
-static const int IMAGE_CONVERTER_TOOL_WEATHER25 = 0x10001a;\r
-static const int IMAGE_CONVERTER_TOOL_WEATHER26 = 0x10001b;\r
-static const int IMAGE_CONVERTER_TOOL_WEATHER27 = 0x10001c;\r
-static const int IMAGE_CONVERTER_TOOL_WEATHER28 = 0x10001d;\r
-static const int IMAGE_CONVERTER_TOOL_WEATHER29 = 0x10001e;\r
-static const int IMAGE_CONVERTER_TOOL_WEATHER30 = 0x10001f;\r
-static const int IMAGE_CONVERTER_TOOL_WEATHER31 = 0x100020;\r
-static const int IMAGE_CONVERTER_TOOL_WEATHER32 = 0x100021;\r
-static const int IMAGE_CONVERTER_TOOL_WEATHER33 = 0x100022;\r
-static const int IMAGE_CONVERTER_TOOL_WEATHER34 = 0x100023;\r
-static const int IMAGE_CONVERTER_TOOL_WEATHER35 = 0x100024;\r
-static const int IMAGE_CONVERTER_TOOL_WEATHER36 = 0x100025;\r
-static const int IMAGE_CONVERTER_TOOL_WEATHER37 = 0x100026;\r
-static const int IMAGE_CONVERTER_TOOL_WEATHER38 = 0x100027;\r
-static const int IMAGE_CONVERTER_TOOL_WEATHER39 = 0x100028;\r
-static const int IMAGE_CONVERTER_TOOL_WEATHER40 = 0x100029;\r
-static const int IMAGE_CONVERTER_TOOL_WEATHER41 = 0x10002a;\r
-static const int IMAGE_CONVERTER_TOOL_WEATHER42 = 0x10002b;\r
-static const int IMAGE_CONVERTER_TOOL_WEATHER43 = 0x10002c;\r
-static const int IMAGE_CONVERTER_TOOL_WEATHER44 = 0x10002d;\r
-static const int IMAGE_CONVERTER_TOOL_WEATHER45 = 0x10002e;\r
-static const int IMAGE_CONVERTER_TOOL_WEATHER46 = 0x10002f;\r
-static const int IMAGE_CONVERTER_TOOL_WEATHER47 = 0x100030;\r
-static const int IMAGE_CONVERTER_TOOL_WEATHER48 = 0x100031;\r
-static const int IMAGE_CONVERTER_TOOL_WEATHER49 = 0x100032;\r
-static const int IMAGE_CONVERTER_TOOL_WEATHER50 = 0x100033;\r
-static const int IMAGE_CONVERTER_TOOL_WEATHER51 = 0x100034;\r
-static const int IMAGE_CONVERTER_TOOL_WEATHER52 = 0x100035;\r
-static const int IMAGE_CONVERTER_TOOL_WEATHER53 = 0x100036;\r
-static const int IMAGE_CONVERTER_TOOL_WEATHER54 = 0x100037;\r
-static const int IMAGE_CONVERTER_TOOL_WEATHER55 = 0x100038;\r
-static const int IMAGE_CONVERTER_TOOL_WEATHER56 = 0x100039;\r
-static const int IMAGE_CONVERTER_TOOL_WEATHER57 = 0x10003a;\r
-static const int IMAGE_CONVERTER_TOOL_WEATHER58 = 0x10003b;\r
-static const int IMAGE_CONVERTER_TOOL_WEATHER59 = 0x10003c;\r
-static const int IMAGE_CONVERTER_TOOL_WEATHER60 = 0x10003d;\r
-static const int IMAGE_CONVERTER_TOOL_WEATHER61 = 0x10003e;\r
-static const int IMAGE_CONVERTER_TOOL_WEATHER62 = 0x10003f;\r
-static const int IMAGE_CONVERTER_TOOL_WEATHER63 = 0x100040;\r
-static const int IMAGE_CONVERTER_TOOL_WEATHER64 = 0x100041;\r
-static const int IMAGE_CONVERTER_TOOL_WEATHER65 = 0x100042;\r
-static const int IMAGE_CONVERTER_TOOL_WEATHER66 = 0x100043;\r
-static const int IMAGE_CONVERTER_TOOL_WEATHER67 = 0x100044;\r
-static const int IMAGE_CONVERTER_TOOL_WEATHER68 = 0x100045;\r
-static const int IMAGE_CONVERTER_TOOL_WEATHER69 = 0x100046;\r
-static const int IMAGE_CONVERTER_TOOL_WEATHER70 = 0x100047;\r
-static const int IMAGE_CONVERTER_TOOL_WEATHER71 = 0x100048;\r
-static const int IMAGE_CONVERTER_TOOL_WEATHER72 = 0x100049;\r
-static const int IMAGE_CONVERTER_TOOL_WEATHER73 = 0x10004a;\r
-static const int IMAGE_CONVERTER_TOOL_WEATHER74 = 0x10004b;\r
-static const int IMAGE_CONVERTER_TOOL_WEATHER75 = 0x10004c;\r
-static const int IMAGE_CONVERTER_TOOL_WEATHER76 = 0x10004d;\r
-static const int IMAGE_CONVERTER_TOOL_WEATHER77 = 0x10004e;\r
+static const int IMAGE_WEATHER_AIR = 0x100001;\r
+static const int IMAGE_WEATHER_BG1 = 0x100002;\r
+static const int IMAGE_WEATHER_BG2 = 0x100003;\r
+static const int IMAGE_WEATHER_ITEM1 = 0x100004;\r
+static const int IMAGE_WEATHER_ITEM2 = 0x100005;\r
+static const int IMAGE_WEATHER_ITEM3 = 0x100006;\r
+static const int IMAGE_WEATHER_ITEM4 = 0x100007;\r
+static const int IMAGE_WEATHER_ITEM5 = 0x100008;\r
+static const int IMAGE_WEATHER_ITEM6 = 0x100009;\r
+static const int IMAGE_WEATHER_LOCATE = 0x10000a;\r
+static const int IMAGE_WEATHER_MOON = 0x10000b;\r
+static const int IMAGE_WEATHER_MOON1 = 0x10000c;\r
+static const int IMAGE_WEATHER_MOON2 = 0x10000d;\r
+static const int IMAGE_WEATHER_MOON3 = 0x10000e;\r
+static const int IMAGE_WEATHER_MOON4 = 0x10000f;\r
+static const int IMAGE_WEATHER_MOON5 = 0x100010;\r
+static const int IMAGE_WEATHER_MOON6 = 0x100011;\r
+static const int IMAGE_WEATHER_MOON7 = 0x100012;\r
+static const int IMAGE_WEATHER_MOON8 = 0x100013;\r
+static const int IMAGE_WEATHER_NEXT = 0x100014;\r
+static const int IMAGE_WEATHER_NEXT_GRAY = 0x100015;\r
+static const int IMAGE_WEATHER_PAGE1 = 0x100016;\r
+static const int IMAGE_WEATHER_PAGE2 = 0x100017;\r
+static const int IMAGE_WEATHER_PAGE3 = 0x100018;\r
+static const int IMAGE_WEATHER_PREV = 0x100019;\r
+static const int IMAGE_WEATHER_PREV_GRAY = 0x10001a;\r
+static const int IMAGE_WEATHER_SUN = 0x10001b;\r
+static const int IMAGE_WEATHER_SUNRISE = 0x10001c;\r
+static const int IMAGE_WEATHER_SUNSET = 0x10001d;\r
+static const int IMAGE_WEATHER_WEATHER00 = 0x10001e;\r
+static const int IMAGE_WEATHER_WEATHER01 = 0x10001f;\r
+static const int IMAGE_WEATHER_WEATHER02 = 0x100020;\r
+static const int IMAGE_WEATHER_WEATHER03 = 0x100021;\r
+static const int IMAGE_WEATHER_WEATHER04 = 0x100022;\r
+static const int IMAGE_WEATHER_WEATHER05 = 0x100023;\r
+static const int IMAGE_WEATHER_WEATHER06 = 0x100024;\r
+static const int IMAGE_WEATHER_WEATHER07 = 0x100025;\r
+static const int IMAGE_WEATHER_WEATHER08 = 0x100026;\r
+static const int IMAGE_WEATHER_WEATHER09 = 0x100027;\r
+static const int IMAGE_WEATHER_WEATHER10 = 0x100028;\r
+static const int IMAGE_WEATHER_WEATHER11 = 0x100029;\r
+static const int IMAGE_WEATHER_WEATHER12 = 0x10002a;\r
+static const int IMAGE_WEATHER_WEATHER13 = 0x10002b;\r
+static const int IMAGE_WEATHER_WEATHER14 = 0x10002c;\r
+static const int IMAGE_WEATHER_WEATHER15 = 0x10002d;\r
+static const int IMAGE_WEATHER_WEATHER16 = 0x10002e;\r
+static const int IMAGE_WEATHER_WEATHER17 = 0x10002f;\r
+static const int IMAGE_WEATHER_WEATHER18 = 0x100030;\r
+static const int IMAGE_WEATHER_WEATHER19 = 0x100031;\r
+static const int IMAGE_WEATHER_WEATHER20 = 0x100032;\r
+static const int IMAGE_WEATHER_WEATHER21 = 0x100033;\r
+static const int IMAGE_WEATHER_WEATHER22 = 0x100034;\r
+static const int IMAGE_WEATHER_WEATHER23 = 0x100035;\r
+static const int IMAGE_WEATHER_WEATHER24 = 0x100036;\r
+static const int IMAGE_WEATHER_WEATHER25 = 0x100037;\r
+static const int IMAGE_WEATHER_WEATHER26 = 0x100038;\r
+static const int IMAGE_WEATHER_WEATHER27 = 0x100039;\r
+static const int IMAGE_WEATHER_WEATHER28 = 0x10003a;\r
+static const int IMAGE_WEATHER_WEATHER29 = 0x10003b;\r
+static const int IMAGE_WEATHER_WEATHER30 = 0x10003c;\r
+static const int IMAGE_WEATHER_WEATHER31 = 0x10003d;\r
+static const int IMAGE_WEATHER_WEATHER32 = 0x10003e;\r
+static const int IMAGE_WEATHER_WEATHER33 = 0x10003f;\r
+static const int IMAGE_WEATHER_WEATHER34 = 0x100040;\r
+static const int IMAGE_WEATHER_WEATHER35 = 0x100041;\r
+static const int IMAGE_WEATHER_WEATHER36 = 0x100042;\r
+static const int IMAGE_WEATHER_WEATHER37 = 0x100043;\r
+static const int IMAGE_WEATHER_WEATHER38 = 0x100044;\r
+static const int IMAGE_WEATHER_WEATHER39 = 0x100045;\r
+static const int IMAGE_WEATHER_WEATHER40 = 0x100046;\r
+static const int IMAGE_WEATHER_WEATHER41 = 0x100047;\r
+static const int IMAGE_WEATHER_WEATHER42 = 0x100048;\r
+static const int IMAGE_WEATHER_WEATHER43 = 0x100049;\r
+static const int IMAGE_WEATHER_WEATHER44 = 0x10004a;\r
+static const int IMAGE_WEATHER_WEATHER45 = 0x10004b;\r
+static const int IMAGE_WEATHER_WEATHER46 = 0x10004c;\r
+static const int IMAGE_WEATHER_WEATHER47 = 0x10004d;\r
+static const int IMAGE_WEATHER_WEATHER48 = 0x10004e;\r
+static const int IMAGE_WEATHER_WEATHER49 = 0x10004f;\r
+static const int IMAGE_WEATHER_WEATHER50 = 0x100050;\r
+static const int IMAGE_WEATHER_WEATHER51 = 0x100051;\r
+static const int IMAGE_WEATHER_WEATHER52 = 0x100052;\r
+static const int IMAGE_WEATHER_WEATHER53 = 0x100053;\r
+static const int IMAGE_WEATHER_WEATHER54 = 0x100054;\r
+static const int IMAGE_WEATHER_WEATHER55 = 0x100055;\r
+static const int IMAGE_WEATHER_WEATHER56 = 0x100056;\r
+static const int IMAGE_WEATHER_WEATHER57 = 0x100057;\r
+static const int IMAGE_WEATHER_WEATHER58 = 0x100058;\r
+static const int IMAGE_WEATHER_WEATHER59 = 0x100059;\r
+static const int IMAGE_WEATHER_WEATHER60 = 0x10005a;\r
+static const int IMAGE_WEATHER_WEATHER61 = 0x10005b;\r
+static const int IMAGE_WEATHER_WEATHER62 = 0x10005c;\r
+static const int IMAGE_WEATHER_WEATHER63 = 0x10005d;\r
+static const int IMAGE_WEATHER_WET = 0x10005e;\r
 }  // OHOS\r
-#endif  // UI_RESOURCE_IMAGE_H\r
+#endif  // UI_RESOURCE_WEATHER_H\r
index be0ab58..be7df9d 100644 (file)
 #include "SliceProxy.h"
 #include "AbilitySliceProxy.h"
 #include "wearable_log.h"
-#include "callerlog/CallerLogModel.h"
+#include "phonemenu/PhoneMenuCallerLogModel.h"
 #include "activity/ActivityModel.h"
-#include "heartrate/HeartModel.h"
 #include "player/PlayersModel.h"
 #include "main/HealthModel.h"
-#include "sports/SportsModel.h"
 #include "offlinevoice/VocassistModel.h"
 #include "screensetting/ScreenModels.h"
-#include "bluetooth/BluetoothHeadsetEvent.h"
 #include "graphic_hardware_config.h"
 #include "graphic_service.h"
 #include "common/graphic_startup.h"
 #ifdef JS_ENABLE
 #include "product_adapter.h"
 #endif
+#ifdef ENABLE_MODULE_CALENDAR
+#include "event_id_manager.h"
+#endif
 #include "RecentManager.h"
 #include "PageTransitionMgr.h"
-
+#include "date/DateModel.h"
+#include "settings/model/SettingDisplayModel.h"
+#include "settings/model/SettingBluetoothModel.h"
+#include "settings/model/SettingBluetoothHeadsetEvent.h"
+#include "NativeLauncher.h"
 namespace OHOS {
-
+int16_t BackDragListener::maxDragRegionX_ = MAX_X_IN_DRAG_REGION;
 NativeLauncher::NativeLauncher() {}
 NativeLauncher::~NativeLauncher() {}
 
@@ -56,29 +60,34 @@ void NativeLauncher::InitNativeLauncher()
 #endif
     GraphicStartUp::InitFontEngine(MEM_POOL_UI_FONT, MEM_POOL_UI_FONT_SIZE,
         OHOS::VECTOR_FONT_DIR, DEFAULT_VECTOR_FONT_FILENAME);
+    GraphicStartUp::InitFontEngine(MEM_POOL_UI_FONT, MEM_POOL_UI_FONT_SIZE,
+        OHOS::VECTOR_FONT_DIR, BOLD_VECTOR_FONT_FILENAME);
     WEARABLE_LOGI(WEARABLE_LOG_MODULE_LAUNCHER_FWK, "NativeLauncher::InitNativeLauncher");
     // 初始化所有预加载slice
-    InitBtHeadsetEvent(); // 蓝牙ct和tg适配初始化
+    SettingInitBtHeadsetEvent(); // 蓝牙ct和tg适配初始化
     NativeRegisterManager::GetInstance().InitAllNativesSlices();
-    CallerLogModel::GetInstance()->InitPhoneService();
+    PhoneMenuCallerLogModel::GetInstance()->InitPhoneService();
     PlayersModel::GetInstance()->AudioInit();
     ActivityModel::GetInstance()->Init();
     ScreenModels::GetInstance()->InitKvStorage();
+#ifdef ENABLE_MODULE_CALENDAR
+    ACELite::InitEventMaps();
+#endif
     VocassistModel::GetInstance()->Init();
-    HeartModel::GetInstance()->Init();
-    BluetoothModel::GetInstance()->Init();
-    SportsModel::GetInstance()->Init();
+    SettingBluetoothModel::GetInstance()->Init();
     // 初始化默认首页
     ScreenModels::GetInstance()->PreLoadAppimages();
     NativeAbility::GetInstance().SetDefaultSliceId(VIEW_MAIN_SAMPLE);
 
-    RecentManager::GetInstance()->SetDirPath("system/recent/");
+    RecentManager::GetInstance()->SetDirPath(APP_RECENT_PATH);
     RecentManager::GetInstance()->AddToBlackList(VIEW_AOD);
     RecentManager::GetInstance()->AddToBlackList(VIEW_RECENT_APP);
     RecentManager::GetInstance()->AddToBlackList(VIEW_APPLIST);
     RecentManager::GetInstance()->AddToBlackList(VIEW_MAIN_SAMPLE);
     RecentManager::GetInstance()->SetMaxSize(5); // 5: max number of recent apps.
     PageTransitionMgr::GetInstance().SetRecentMinPeriod(1000); // 1000: min period
-}
+    DateModel::GetInstance().Init();
 
+    SettingDisplayModel::GetInstance().InitDisplayModel();
+}
 }
index 649aa2f..3bed490 100644 (file)
 
 namespace OHOS {
 
-void UICardPageFactory::RegisterWatchDial(const uint16_t mode, const uint16_t id, UICardPageProxyInterface* uiCardPage)
+void UICardPageFactory::RegisterCardPage(const uint16_t id, UICardPageProxyInterface* uiCardPage)
 {
-    if (mode >= DIAL_DISPLAY_MODE_MAX || uiCardPage == nullptr) {
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Can't register watch dial using invalid mode or proxy %d-%p",
-            mode, uiCardPage);
+    if (uiCardPage == nullptr) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Can't register watch dial using invalid proxy %p",
+            uiCardPage);
         return;
     }
-    if (watchDials_[mode].find(id) != watchDials_[mode].end()) {
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Watch dial mode %d id:%d has already been registered", mode, id);
+    if (cardPage_.find(id) != cardPage_.end()) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Watch dial id:%d has already been registered", id);
         return;
     } else {
-        watchDials_[mode].insert({id, uiCardPage});
+        cardPage_.insert({id, uiCardPage});
     }
 }
 
-UICardPage* UICardPageFactory::CreateWatchDial(uint16_t mode, uint16_t id)
+UICardPage* UICardPageFactory::CreateCardPage(uint16_t id)
 {
-    if (mode >= DIAL_DISPLAY_MODE_MAX ) {
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Can't create watch dial using invalid mode %d", mode);
-        return nullptr;
-    }
-
-    auto it = watchDials_[mode].find(id);
-    if (it != watchDials_[mode].end()) {
+    auto it = cardPage_.find(id);
+    if (it != cardPage_.end()) {
         return it->second->CreateUICardPage();
     } else {
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Watch dial mode %d id:%d was not registered", mode, id);
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Watch dial id:%d was not registered", id);
         return nullptr;
     }
 }
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativelauncher/src/UIWatchDialFactory.cpp b/code/sdk/application/wearable/evb/nativeapp/nativelauncher/src/UIWatchDialFactory.cpp
new file mode 100644 (file)
index 0000000..7f7aeae
--- /dev/null
@@ -0,0 +1,80 @@
+/*
+ * Copyright (c) CompanyNameMagicTag 2025. All rights reserved.
+ * Description: UICardPageFactory
+ * Author:
+ * Create: 2025-06
+ */
+
+#include "UIWatchDialFactory.h"
+#include "wearable_log.h"
+
+namespace OHOS {
+
+void UIWatchDialFactory::RegisterWatchDial(const uint16_t ability, const uint16_t id,
+    UIWatchDialProxyInterface* uiWatchDial, const DialInfo* dialInfo)
+{
+    if (ability >= DIAL_DISPLAY_SUPPORT_MAX || uiWatchDial == nullptr) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Can't register watch dial using invalid ability or proxy %d-%p",
+        ability, uiWatchDial);
+        return;
+    }
+
+    if ((ability == DIAL_DISPLAY_SUPPORT_NORMAL || ability == DIAL_DISPLAY_SUPPORT_NORMAL_AOD) && dialInfo != nullptr) {
+        if (watchDials_[DIAL_DISPLAY_MODE_NORMAL].find(id) != watchDials_[DIAL_DISPLAY_MODE_NORMAL].end() ||
+            normalDialInfo_.find(id) != normalDialInfo_.end()) {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "normal dial(info) id:%d has already been registered", id);
+            return;
+        } else {
+            watchDials_[DIAL_DISPLAY_MODE_NORMAL].insert({id, uiWatchDial});
+            normalDialInfo_.insert({id, dialInfo});
+        }
+    }
+
+    if ((ability == DIAL_DISPLAY_SUPPORT_AOD || ability == DIAL_DISPLAY_SUPPORT_NORMAL_AOD)) {
+        if (watchDials_[DIAL_DISPLAY_MODE_AOD].find(id) != watchDials_[DIAL_DISPLAY_MODE_AOD].end()) {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "aod dial id:%d has already been registered", id);
+            return;
+        } else {
+            watchDials_[DIAL_DISPLAY_MODE_AOD].insert({id, uiWatchDial});
+        }
+    }
+}
+
+const DialInfo* UIWatchDialFactory::GetNormalDialInfo(uint16_t id)
+{
+    auto it = normalDialInfo_.find(id);
+    if (it != normalDialInfo_.end()) {
+        return it->second;
+    } else {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "normal dial info id:%d was not created", id);
+        return nullptr;
+    }
+}
+
+uint8_t UIWatchDialFactory::GetNormalDialInfoNum()
+{
+    return normalDialInfo_.size();
+}
+
+UICardPage* UIWatchDialFactory::CreateNormalDial(uint16_t id)
+{
+    auto it = watchDials_[DIAL_DISPLAY_MODE_NORMAL].find(id);
+    if (it != watchDials_[DIAL_DISPLAY_MODE_NORMAL].end()) {
+        return it->second->CreateWatchDialCardPage(id);
+    } else {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "normal dial id:%d was not registered", id);
+        return nullptr;
+    }
+}
+
+UIFragment* UIWatchDialFactory::CreateAodDial(uint16_t id)
+{
+    auto it = watchDials_[DIAL_DISPLAY_MODE_AOD].find(id);
+    if (it != watchDials_[DIAL_DISPLAY_MODE_AOD].end()) {
+        return it->second->CreateWatchDialFragment(id);
+    } else {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "aod dial id:%d was not registered", id);
+        return nullptr;
+    }
+}
+} // namespace OHOS
index a68a6c7..a9a2c85 100644 (file)
@@ -18,7 +18,6 @@
 #include "securec.h"
 #include "broadcast_service.h"
 #include "clock/MainClockView.h"
-#include "indoorwalk/IndoorWalkPresenter.h"
 #include "activity/ActivityWeekView.h"
 #include "graphic_service.h"
 
@@ -83,15 +82,6 @@ static void RefreshStepControls(const uint32_t &value, const uint16 &msgId)
         });
     }
 
-    IndoorWalkPresenter *indoorWalkPresenter = OHOS::IndoorWalkPresenter::GetInstance();
-    if (indoorWalkPresenter != nullptr) {
-        GraphicService::GetInstance()->PostGraphicEvent([value]() {
-            if (OHOS::IndoorWalkPresenter::GetInstance() != nullptr) {
-                OHOS::IndoorWalkPresenter::GetInstance()->ModifiesSteps(value);
-            }
-        });
-    }
-
     ActivityWeekView *activityWeekView = OHOS::ActivityWeekView::GetInstance();
     if (activityWeekView == nullptr) {
         return;
index 4603a46..5689d86 100644 (file)
@@ -15,7 +15,7 @@
 namespace OHOS {\r
 \r
 REGIST_SLICE(VIEW_MAIN_ACTIVITY, MainActivityView, ActivityPresenter);\r
-\r
+    \r
 static ActivityPresenter *g_pActivityPresenter = nullptr;\r
 ActivityPresenter::ActivityPresenter()\r
 {\r
index e2863a5..87bd621 100644 (file)
@@ -17,6 +17,7 @@
 #include "graphic_service.h"
 #include "player/PlayersModel.h"
 #include "phoneservice/PhoneService.h"
+#include "phonemenu/PhoneMenuView.h"
 #include "uiservice/ui_service.h"
 
 #ifdef __cplusplus
@@ -810,10 +811,12 @@ void AlarmPlayerCallbackImpl::OnPlaybackComplete()
 
 uint16_t AlarmClockModel::JudgePreSlice(void)
 {
-    uint16_t preSlice = NativeAbility::GetInstance().GetPreSliceId();
+    uint32_t targetId = NativeAbility::GetInstance().GetPreTargetId();
+    uint16_t preSlice = static_cast<uint16_t>(targetId & SLICE_MASK);
+    uint16_t prePage = static_cast<uint16_t>(targetId >> PAGE_OFFSET);
     if (preSlice == VIEW_ALARM_POP_UP || preSlice < VIEW_SETTING) {
         preSlice = VIEW_MAIN_SAMPLE;
-    } else if ((preSlice == VIEW_MAEKPHONE_SAMPLE) &&
+    } else if ((preSlice == VIEW_PHONE_MENU && prePage == PhoneMenuPages::PHONE_MENU_CALLING_PAGE) &&
         (GetCurrCallNum() == 0 || GetScoConnectState() != HFP_SCO_STATE_CONNECTED)) {
         int num;
         PhoneCallInfo callList[MULTI_CALL_MAX_NUME]{};
index d13509d..97f0c23 100644 (file)
@@ -9,6 +9,9 @@
 #include "common/screen.h"\r
 #include "components/ui_label.h"\r
 #include "components/ui_label_button.h"\r
+#ifdef BUILD_IN_LINUX\r
+#include "localtime.h"\r
+#endif\r
 #include <string>\r
 #include <iostream>\r
 #include <sstream>\r
index 972cc0e..e09321d 100644 (file)
@@ -119,7 +119,7 @@ bool AlarmPopUpPresenter::OnDragEnd(UIView& view, const DragEvent& event)
     return true;\r
 }\r
 \r
-void AlarmPopUpPresenter::Notify()\r
+void AlarmPopUpPresenter::Callback()\r
 {\r
     if (isStartCalcu) {\r
         if (calcuNotifyNums == RENDER_FINISH) {\r
@@ -131,4 +131,14 @@ void AlarmPopUpPresenter::Notify()
         ++calcuNotifyNums;\r
     }\r
 }\r
+\r
+void AlarmPopUpPresenter::OnResume()\r
+{\r
+    Init();\r
+}\r
+\r
+void AlarmPopUpPresenter::OnPause()\r
+{\r
+    Deinit();\r
+}\r
 }
\ No newline at end of file
index 3d54a5c..9cc5786 100644 (file)
@@ -10,6 +10,9 @@
 #include "common/screen.h"\r
 #include "components/ui_label.h"\r
 #include "components/ui_label_button.h"\r
+#ifdef BUILD_IN_LINUX\r
+#include "localtime.h"\r
+#endif\r
 #include <string>\r
 \r
 namespace OHOS {\r
index d45093f..4a7e1b3 100644 (file)
@@ -200,7 +200,7 @@ void AlipayMainView::DropView(UIView &view)
             AlipayModel::GetInstance()->AlipayFinishBind();\r
         }\r
         AlipayModel::GetInstance()->AlipayStopSwitchTimer();\r
-        NativeAbility::GetInstance().ChangeSlice(VIEW_APPLIST);\r
+        NativeAbility::GetInstance().ChangeSliceToApplist();\r
 \r
     } else if (&view == container[ALIPAY_TRANS_LIST_VIEW]) {\r
         WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "AlipayMainView::DropView::container[ALIPAY_TRANS_LIST_VIEW]");\r
index 4909bd0..a725769 100644 (file)
@@ -54,7 +54,7 @@ void AlipayPresenter::OnStart()
     alipayMode_->AlipayExitLpm();\r
     if (!alipayMode_->AlipayInitModel()) {\r
         WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "AlipayPresenter::OnStart AlipayInitModel fail.");\r
-        NativeAbility::GetInstance().ChangeSlice(VIEW_APPLIST);\r
+        NativeAbility::GetInstance().ChangeSliceToApplist();\r
         return;\r
     }\r
 }\r
@@ -179,7 +179,7 @@ void AlipayPresenter::ClickTransToTransCode(UIView &view)
         view_->ChangeView(ALIPAY_TRANS_LIST_VIEW, ALIPAY_TRANS_ANI_VIEW);\r
         return;\r
     }\r
-    \r
+\r
     ret = alipayMode_->AlipayGetTransCode(index);\r
     if (ret == 0) {\r
         view_->ChangeView(ALIPAY_TRANS_LIST_VIEW, ALIPAY_TRANS_VIEW);\r
index 9d47082..615716e 100644 (file)
@@ -7,13 +7,26 @@
 
 #include "aod_view/AodPresenter.h"
 #include "NativeRegisterManager.h"
+#include "main/dial/DialViewGroup.h"
 
 namespace OHOS {
 
 REGIST_SLICE(VIEW_AOD, AodView, AodPresenter);
 
-void AodPresenter::Notify()
+void AodPresenter::Callback()
 {
-    view_->PeriodicUpdate();
+    if (view_ != nullptr) {
+        view_->Update();
+    }
+}
+
+void AodPresenter::OnResume()
+{
+    Init();
+}
+
+void AodPresenter::OnPause()
+{
+    Deinit();
 }
 } // OHOS
index 6bb9f8c..6e1ff18 100644 (file)
@@ -9,15 +9,24 @@
 #include "aod_view/AodPresenter.h"
 #include "aod_view/AodModel.h"
 #include "common/graphic_utils.h"
-#include "UICardPageFactory.h"
+#include "UIWatchDialFactory.h"
 #include "main/DialBinParser.h"
 #include "main/dial/DialViewGroup.h"
 #include "clock/AmbientClockView.h"
 #include "main/dial/DialModelTime.h"
+#include "clock/GradientAodView.h"
+#include "common/task.h"
+#include "common/periodicupdate_interface.h"
 
 namespace OHOS {
 AodView::~AodView()
 {
+    if (clockDialFragment_ != nullptr) {
+        delete clockDialFragment_;
+        clockDialFragment_ = nullptr;
+        clockDial_ = nullptr;
+    }
+
     if (clockDial_ != nullptr) {
         delete clockDial_;
         clockDial_ = nullptr;
@@ -42,13 +51,14 @@ void AodView::OnStart()
     DialViewGroup *dial = dynamic_cast<DialViewGroup*>(clockDial_);
     if (dial != nullptr) {
         dial->PreLoad();
-        dial->OnActive();
         presenter_->SetPeriod(dial->GetPeriod());
-    } else {
-        AmbientClockView *clock = dynamic_cast<AmbientClockView*>(clockDial_);
-        if (clock != nullptr) {
-            presenter_->SetPeriod(clock->GetPeriod());
+    } else if (clockDialFragment_ != nullptr) {
+#ifndef __WIN32
+        PeriodicUpdateInterface *interface = dynamic_cast<PeriodicUpdateInterface*>(clockDialFragment_);
+        if (interface != nullptr) {
+            presenter_->SetPeriod(interface->GetPeriod());
         }
+#endif
     }
     isLoaded_ = true;
     AddViewToRootContainer(clockDial_);
@@ -57,7 +67,7 @@ void AodView::OnStart()
 void AodView::OnStop()
 {
     if (clockDial_ != nullptr) {
-        DialViewGroup *dial = dynamic_cast<DialViewGroup *>(clockDial_);
+        DialViewGroup *dial = dynamic_cast<DialViewGroup*>(clockDial_);
         if (dial != nullptr) {
             dial->OnInactive();
             dial->UnLoad();
@@ -68,7 +78,11 @@ void AodView::OnStop()
 
 UIViewGroup *AodView::InitAodDial(DialSetting &setting)
 {
-    return UICardPageFactory::GetInstance().CreateWatchDial(DIAL_DISPLAY_MODE_AOD, setting.dialId);
+    clockDialFragment_ = UIWatchDialFactory::GetInstance().CreateAodDial(setting.dialId);
+    if (clockDialFragment_ != nullptr) {
+        return dynamic_cast<UIViewGroup*>(clockDialFragment_->GetFragmentView());
+    }
+    return nullptr;
 }
 
 UIViewGroup *AodView::InitAodOffDial(DialSetting &setting)
@@ -79,7 +93,7 @@ UIViewGroup *AodView::InitAodOffDial(DialSetting &setting)
     if (fp == nullptr) {
         return nullptr;
     }
-    bool ret = DialBinParserManager::GetInstance()->GetDialPreviewInfo(setting.dialFullName, fp, &preview);
+    bool ret = DialBinParserManager::GetInstance()->GetDialPreviewInfo(setting.dialFullName, fp, &preview, false);
     fclose(fp);
     if (!ret) {
         return nullptr;
@@ -103,7 +117,7 @@ UIViewGroup *AodView::InitDefaultAod()
     return InitAodOffDial(setting);
 }
 
-void AodView::PeriodicUpdate()
+void AodView::Update()
 {
     if (clockDial_ == nullptr || !isLoaded_) {
         return;
@@ -116,9 +130,11 @@ void AodView::PeriodicUpdate()
         return;
     }
 
-    AmbientClockView *clock = dynamic_cast<AmbientClockView*>(clockDial_);
-    if (clockDial_ != nullptr) {
-        clock->UpdateTime();
+#ifndef __WIN32
+    PeriodicUpdateInterface *interface = dynamic_cast<PeriodicUpdateInterface*>(clockDialFragment_);
+    if (interface != nullptr) {
+        interface->Update();
     }
+#endif
 }
 } // OHOS
index f5dca80..d4727a9 100644 (file)
@@ -102,74 +102,4 @@ namespace OHOS {
         label_.SetTextColor(Color::Gray());
         icon_.ResetTransParameter();
     }
-
-    HexagonsItemView::HexagonsItemView()
-    {
-    }
-
-    HexagonsItemView::~HexagonsItemView()
-    {
-        if (itemInfo_.iconSmall == nullptr && itemInfo_.resPath != nullptr) {
-            ImageCacheManager::GetInstance().UnloadOneInMultiRes(itemInfo_.resId, itemInfo_.resPath);
-        }
-    }
-
-    void HexagonsItemView::SetItemInfo(const AppItem &itemInfo)
-    {
-        itemInfo_ = itemInfo;
-    }
-
-    AppViewId HexagonsItemView::GetViewId()
-    {
-        return static_cast<AppViewId>(itemInfo_.id);
-    }
-
-    const char *HexagonsItemView::GetAppUid()
-    {
-        return itemInfo_.uid;
-    }
-
-    FootballItemView::~FootballItemView()
-    {
-        if (itemInfo_.iconHexagon == nullptr && itemInfo_.hexagonPath != nullptr) {
-            ImageCacheManager::GetInstance().UnloadOneInMultiRes(itemInfo_.hexagonId, itemInfo_.hexagonPath);
-        }
-    }
-
-    void FootballItemView::SetItemInfo(const AppItem &itemInfo)
-    {
-        itemInfo_ = itemInfo;
-    }
-
-    AppViewId FootballItemView::GetViewId()
-    {
-        return static_cast<AppViewId>(itemInfo_.id);
-    }
-
-    const char *FootballItemView::GetAppUid()
-    {
-        return itemInfo_.uid;
-    }
-
-    WaterfallItemView::~WaterfallItemView()
-    {
-        if (itemInfo_.iconSmall == nullptr && itemInfo_.resPath != nullptr) {
-            ImageCacheManager::GetInstance().UnloadOneInMultiRes(itemInfo_.resId, itemInfo_.resPath);
-        }
-    }
-    
-    void WaterfallItemView::SetItemInfo(const AppItem &itemInfo)
-    {
-        itemInfo_ = itemInfo;
-    }
-
-    AppViewId WaterfallItemView::GetViewId()
-    {
-        return static_cast<AppViewId>(itemInfo_.id);
-    }
-
-    const char *WaterfallItemView::GetAppUid()
-    {
-        return itemInfo_.uid;
-    }
 }
index b3eabbb..865d599 100644 (file)
@@ -16,7 +16,6 @@
 #include "applist/ApplistModel.h"
 #include "applist/ApplistPresenter.h"
 #include "font/font_global_manager.h"
-#include "settings/SetDesktopModel.h"
 #include "NativeRegisterManager.h"
 
 namespace OHOS {
@@ -55,22 +54,22 @@ namespace OHOS {
         initFlag = flag;
     }
 
-    void ApplistModel::ResolvingJSAppItems(void)
+    void ApplistModel::CleanupApplistStrings(uint8_t nativeAppNumTotal)
     {
-#ifdef JS_ENABLE
-        if (bundleInfos != nullptr) {
-            for (uint8_t i = 0; i < bundleLen; i++) {
-                ClearBundleInfo(bundleInfos + i);
-            }
-
-            if (bundleInfos != nullptr) {
-                AdapterFree(bundleInfos);
-                bundleInfos = nullptr;
-            }
+        for (uint8_t i = nativeAppNumTotal; i < appLen; i++) {
+                free((void*)applist[i].iconSmall);
+                free((void*)applist[i].iconHexagon);
+                free((void*)applist[i].label);
+                free((void*)applist[i].uid);
+                applist[i].iconSmall = nullptr;
+                applist[i].iconHexagon = nullptr;
+                applist[i].label = nullptr;
+                applist[i].uid = nullptr;
         }
-#endif
-        bundleLen = 0;
-        appLen = 0;
+    }
+
+    void ApplistModel::ResolvingJSAppItems(void)
+    {
         List<AppItem>& nativeAppLists = NativeRegisterManager::GetInstance().GetNativeAppLists();
         uint8_t registerNativeAppNum = nativeAppLists.Size();
         if (registerNativeAppNum > APP_MAX_NUM) {
@@ -83,6 +82,9 @@ namespace OHOS {
             applist[index] = appNode->data_;
             appNode = appNode->next_;
         }
+        CleanupApplistStrings(nativeAppNumTotal);
+        bundleLen = 0;
+        appLen = 0;
         appLen = nativeAppNumTotal;
 #ifdef JS_ENABLE
         int32_t len = 0;
@@ -93,23 +95,36 @@ namespace OHOS {
                 len = APP_MAX_NUM - nativeAppNumTotal;
             }
             while (len--) {
-                applist[appLen] = {
-                    VIEW_EXTERN_APP,
-                    bundleInfos[len].smallIconPath,
-                    bundleInfos[len].bigIconPath,
-                    bundleInfos[len].label,
-                    bundleInfos[len].bundleName
-                };
-                WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ResolvingJSAppItems bundleName is %s \r", bundleInfos[len].bundleName);
-                WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ResolvingJSAppItems label is %s \r", bundleInfos[len].label);
-                WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ResolvingJSAppItems smallIconPath is %s \r", bundleInfos[len].smallIconPath);
-                WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ResolvingJSAppItems bigIconPath is %s \r", bundleInfos[len].bigIconPath);
+                char* smallIconPath = strdup(bundleInfos[len].smallIconPath);
+                char* bigIconPath = strdup(bundleInfos[len].bigIconPath);
+                char* label = strdup(bundleInfos[len].label);
+                char* bundleName = strdup(bundleInfos[len].bundleName);
+                applist[appLen] = AppItem(
+                    VIEW_EXTERN_APP,       // id
+                    smallIconPath,         // iconSmall
+                    bigIconPath,           // iconHexagon
+                    label,                 // label
+                    bundleName             // uid
+                );
+                WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ResolvingJSAppItems bundleName is %s \r", bundleName);
+                WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ResolvingJSAppItems label is %s \r", label);
+                WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ResolvingJSAppItems smallIconPath is %s \r", smallIconPath);
+                WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ResolvingJSAppItems bigIconPath is %s \r", bigIconPath);
                 appLen++;
                 bundleInfos[len].abilityInfo = nullptr;
             }
         } else {
             WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "ResolvingJSAppItems GetBundleInfos ret = %d \r", ret);
         }
+        if (bundleInfos != nullptr) {
+            for (uint8_t i = 0; i < bundleLen; i++) {
+                ClearBundleInfo(bundleInfos + i);
+            }
+            if (bundleInfos != nullptr) {
+                AdapterFree(bundleInfos);
+                bundleInfos = nullptr;
+            }
+        }
 #endif
     }
 
@@ -132,6 +147,18 @@ namespace OHOS {
         return startIndex;
     }
 
+    void ApplistModel::SetLastOffset(int16_t x, int16_t y)
+    {
+        lastOffsetX = x;
+        lastOffsetY = y;
+    }
+
+    void ApplistModel::GetLastOffset(int16_t& x, int16_t& y)
+    {
+        x = lastOffsetX;
+        y = lastOffsetY;
+    }
+
     void ApplistModel::SetHeadItemY(int y)
     {
         headItemY = y;
@@ -159,9 +186,4 @@ namespace OHOS {
     {
         presenter = p;
     }
-
-    AppListStyle ApplistModel::GetCurrentStyle(void)
-    {
-        return static_cast<AppListStyle>(SetDesktopModel::GetInstance().GetDesktopStyle());
-    }
 }
index 382786a..5963625 100644 (file)
  */
 
 #include "applist/ApplistPresenter.h"
-#include "ability_manager.h"
-#include "securec.h"
-#include "components/ui_hexagons_list.h"
-#include "components/ui_waterfall_list.h"
-#include "TransitionType.h"
 #include "NativeRegisterManager.h"
+#include "wearable_log.h"
 
 namespace OHOS {
-
 REGIST_SLICE(VIEW_APPLIST, ApplistView, ApplistPresenter);
 
-    ApplistPresenter::ApplistPresenter()
-    {
-        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ApplistPresenter::ApplistPresenter()");
-        model = &ApplistModel::GetInstance();
-        model->Init();
-        model->SetPresenter(this);
-    }
-
-    ApplistPresenter::~ApplistPresenter()
-    {
-        model->SetPresenter(nullptr);
-    }
-
-    void ApplistPresenter::OnStart()
-    {
-        if (view_ == nullptr) {
-            return;
-        }
-        const AppItem *itemInfo = model->GetApplistItems();
-        for (uint8 i = 0; i < model->GetAppListNum(); i++) {
-            view_->AddAppItemToList(itemInfo[i]);
-        }
-        view_->RefreshAppList();
-    }
-
-    void ApplistPresenter::OnResume()
-    {
-        if (GetCurrentStyle() == AppListStyle::FOOTBALL_STYLE) {
-            view_->StartFootBallAnimator();
-        } else if  (GetCurrentStyle() == AppListStyle::WATERFALL_STYLE) {
-            view_->ResumeWaterFallDraggable();
-        }
-    }
-
-    bool ApplistPresenter::OnRotate(UIView& view, const RotateEvent& event)
-    {
-        UICustomHexagonsList* hexagonsView = dynamic_cast<UICustomHexagonsList *>(&view);
-        if (hexagonsView == nullptr) {
-            return false;
-        }
-        int8_t index = hexagonsView->GetFocusedImgIndex();
-        uint8_t focusIndex_ = 0;
-        if (index >= 0) {
-            focusIndex_ = static_cast<uint8_t>(index);
-        }
-        HexagonsItemView *itemView = dynamic_cast<HexagonsItemView *>(hexagonsView->GetViewByIndex(focusIndex_));
-        AppViewId viewId = itemView->GetViewId();
-        if (FloatMore(hexagonsView->GetGlobalScale(), 2.0f)) { // 2.0 threshold for beginning transition
-            hexagonsView->StopRotateAnimator();
-            NativeAbility::GetInstance().ChangeSlice(viewId, TransitionType::TRANSITION_HEXAGONS);
-            hexagonsView->ClearFocus();
-        }
-        return true;
-    }
-
-    bool ApplistPresenter::OnClick(UIView &view, const ClickEvent &event)
-    {
-        UNUSED(event);
-        AppViewId viewId = VIEW_INVALID;
-        char *uid = nullptr;
-        TransitionType type = TransitionType::TRANSITION_INVALID;
-        AppListStyle style = GetCurrentStyle();
-        if (style == AppListStyle::FOOTBALL_STYLE) {
-            FootballItemView *itemView = dynamic_cast<FootballItemView *>(&view);
-            viewId = itemView->GetViewId();
-            uid = (char *)itemView->GetAppUid();
-        } else if (style == AppListStyle::HEXAGONS_STYLE) {
-            HexagonsItemView *itemView = dynamic_cast<HexagonsItemView *>(&view);
-            UIHexagonsList *hexagonsView = dynamic_cast<UIHexagonsList *>(itemView->GetParent());
-            if (hexagonsView == nullptr || itemView == nullptr) {
-                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "hexagonsView or itemView is nullptr");
-                return false;
-            }
-            viewId = itemView->GetViewId();
-            uid = (char *)itemView->GetAppUid();
-            hexagonsView->SetDraggable(false);
-            hexagonsView->Scale(1.0f, itemView->GetViewIndex()); // switch focus to click view
-            type = TransitionType::TRANSITION_HEXAGONS;
-        } else if (style == AppListStyle::WATERFALL_STYLE) {
-            WaterfallItemView *itemView = dynamic_cast<WaterfallItemView *>(&view);
-            UIWaterfallList *waterfallView = dynamic_cast<UIWaterfallList *>(itemView->GetParent());
-            if (waterfallView == nullptr || itemView == nullptr) {
-                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "waterfallView or itemView is nullptr");
-                return false;
-            }
-            viewId = itemView->GetViewId();
-            uid = (char *)itemView->GetAppUid();
-            waterfallView->SetDraggable(false);
-            waterfallView->Scale(1.0f, itemView->GetViewIndex());
-            type = TransitionType::TRANSITION_WATERFALL;
-        } else {
-            AppItemView *itemView = dynamic_cast<AppItemView *>(&view);
-            if (itemView == nullptr) {
-                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "itemView is nullptr", viewId);
-                return false;
-            }
-            viewId = itemView->GetViewId();
-            uid = (char *)itemView->GetAppUid();
-        }
-        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ApplistPresenter::OnClick viewid = %d", viewId);
-        if (viewId < VIEW_MAX_INTER_APP) {
-            if (viewId == VIEW_SETTING && style == AppListStyle::APPLIST_STYLE) {
-                NativeAbility::GetInstance().ChangeSlice(viewId, type, gSliceDefaultPriority, true);
-            } else {
-                NativeAbility::GetInstance().ChangeSlice(viewId, type);
-            }
-            return true;
-        } else if (viewId == VIEW_EXTERN_APP) {
-#ifdef JS_ENABLE
-            WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ApplistPresenter::OnClick bundleName = %s", uid);
-            Want *want = new Want();
-            memset_s(want, sizeof(Want), 0, sizeof(Want));
-            ElementName startElement = {};
-            startElement.abilityName = (char *)"default";
-            startElement.bundleName = uid;
-            startElement.deviceId = nullptr;
-            SetWantElement(want, startElement);
-            if (viewId == VIEW_SETTING && style == AppListStyle::APPLIST_STYLE) {
-                StartAbilityWithAnimation(want, static_cast<uint8_t>(type), true);
-            } else {
-                StartAbilityWithAnimation(want, static_cast<uint8_t>(type), false);
-            }
-            ClearWant(want);
-            delete want;
-            return true;
-#endif
-        }
-        return false;
-    }
-
-    void ApplistPresenter::OnItemSelected(int16 index, UIView *view)
-    {
-        UNUSED(index);
-        if (view != nullptr) {
-            itemViewSele = static_cast<AppItemView *>(view);
-            itemViewSele->SelectedChange();
+ApplistPresenter::ApplistPresenter()
+{
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ApplistPresenter::ApplistPresenter()");
+    model = &ApplistModel::GetInstance();
+    model->Init();
+    model->SetPresenter(this);
+}
 
-            if (preItemViewSele != nullptr && preItemViewSele != itemViewSele) {
-                preItemViewSele->Reset();
-            }
-            preItemViewSele = itemViewSele;
-        }
-    }
-    void ApplistPresenter::SetStartIndex(uint16_t index)
-    {
-        model->SetStartIndex(index);
+ApplistPresenter::~ApplistPresenter()
+{
+    model->SetPresenter(nullptr);
+}
 
+void ApplistPresenter::OnStart()
+{
+    if (view_ == nullptr) {
         return;
     }
-
-    uint16_t ApplistPresenter::GetStartIndex(void)
-    {
-        return model->GetStartIndex();
-    }
-
-    void ApplistPresenter::SetHeadItemY(int y)
-    {
-        model->SetHeadItemY(y);
-    }
-
-    int ApplistPresenter::GetHeadItemY(void)
-    {
-        return model->GetHeadItemY();
-    }
-
-    uint8_t ApplistPresenter::GetListItemNum(void)
-    {
-        return model->GetAppListNum();
-    }
-
-    AppListStyle ApplistPresenter::GetCurrentStyle(void)
-    {
-        return model->GetCurrentStyle();
+    const AppItem *itemInfo = model->GetApplistItems();
+    for (uint8 i = 0; i < model->GetAppListNum(); i++) {
+        view_->AddAppItemToList(itemInfo[i]);
     }
+    view_->RefreshAppList();
+}
 
-    ApplistView* ApplistPresenter::GetAppListView()
-    {
-        return view_;
-    }
+void ApplistPresenter::OnResume()
+{
+    view_->OnResume();
+}
 
+ApplistView* ApplistPresenter::GetAppListView()
+{
+    return view_;
+}
 }
index fbb1880..7c15fc3 100644 (file)
  * Create: 2021-09-18
  */
 
-#include "components/ui_view_group.h"
 #include "applist/ApplistView.h"
 #include "applist/ApplistPresenter.h"
-#include "applist/AppItemView.h"
+#include "applist/DesktopFactory.h"
 #include "common/image_cache_manager.h"
-#include "common/screen.h"
-#include "hal_tick.h"
 
 namespace OHOS {
-static constexpr int16 NUM_2 = 2;
-static constexpr int16 MAX_SCROLL_DIS = 1000;
-
-ApplistView::ApplistView()
-{
-    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ApplistView::ApplistView ");
-}
-
-ApplistView::~ApplistView()
-{
-    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ApplistView::~ApplistView ");
-    if (listAdapter_ != nullptr) {
-        delete listAdapter_;
-        listAdapter_ = nullptr;
-    }
-    if (contentList_ != nullptr) {
-        delete contentList_;
-        contentList_ = nullptr;
-    }
-    if (dragListener_ != nullptr) {
-        delete dragListener_;
-        dragListener_ = nullptr;
-    }
-    if (hexagonsList_ != nullptr) {
-        delete hexagonsList_;
-        hexagonsList_ = nullptr;
-    }
-    if (footballList_ != nullptr) {
-        delete footballList_;
-        footballList_ = nullptr;
-    }
-    if (waterfallList_ != nullptr) {
-        delete waterfallList_;
-        waterfallList_ = nullptr;
-    }
-    if (callback_ != nullptr) {
-        delete callback_;
-        callback_ = nullptr;
-    }
-    enterAnimator_ = nullptr;
-}
-
 void ApplistView::OnStart()
 {
-    AppListStyle style = presenter_->GetCurrentStyle();
-    if (style == AppListStyle::FOOTBALL_STYLE) {
-        FootballStyleOnStart();
-    } else if (style == AppListStyle::HEXAGONS_STYLE) {
-        HexagonsStyleOnStart();
-    } else if (style == AppListStyle::WATERFALL_STYLE) {
-        WaterfallStyleOnStart();
-    } else {
-        ListStyleOnStart();
-    }
-}
-
-void ApplistView::FootballStyleOnStart()
-{
-    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ApplistView::FootballStyleOnStart ");
-    if (footballList_ == nullptr) {
-        footballList_ = new UIIcosahedronView();
-    }
-    footballList_->SetThrowDrag(true);
-    if (footballDefaultImg_ == nullptr) {
-        footballDefaultImg_ = ImageCacheManager::GetInstance().LoadSingleRes(PNG_APPLIST_NOTSETUSE_IMG);
-        if (footballDefaultImg_ == nullptr) {
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "load res faild");
-            return;
-        }
-    }
-    if (callback_ == nullptr) {
-        callback_ = new FootballAnimatorCallback(footballList_, 30, 200); // 30: Initial Size 200: Final display size
-    }
-    footballList_->SetDefaultImage(footballDefaultImg_);
-    footballList_->SetPosition(0, 0, GetRootContainer()->GetWidth(), GetRootContainer()->GetHeight());
-    enterAnimator_ = callback_->GetAnimator();
-    AddViewToRootContainer(footballList_);
-    if (callback_ != nullptr) {
-        callback_->SetStartTime(HALTick::GetInstance().GetTime());
-    }
-}
-
-void ApplistView::HexagonsStyleOnStart()
-{
-    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ApplistView::HexagonsStyleOnStart ");
-    if (hexagonsList_ == nullptr) {
-        hexagonsList_ = new UICustomHexagonsList();
-    }
-    hexagonsList_->SetPosition(0, 0, GetRootContainer()->GetWidth(), GetRootContainer()->GetHeight()); // 2, two
-    imgDistance_ = hexagonsList_->GetWidth() * 0.25991; // 0.25991, empirical coefficient
-    imgSize_ = hexagonsList_->GetWidth() * 0.23348; // 0.23348, empirical coefficient
-    hexagonsList_->SetImageDistance(imgDistance_);
-    hexagonsList_->SetImageSizeInCenter(imgSize_);
-    int16_t blankSize = hexagonsList_->GetRelativeRect().GetWidth() > hexagonsList_->GetRelativeRect().GetHeight() ?
-        hexagonsList_->GetRelativeRect().GetWidth() / 2 : hexagonsList_->GetRelativeRect().GetHeight() / 2; // 2, half
-    hexagonsList_->SetScrollBlankSize(blankSize);
-    hexagonsList_->SetReboundSize(blankSize);
-    hexagonsList_->SetThrowDrag(true);
-    hexagonsList_->SetOnRotateListener(presenter_);
-    hexagonsList_->RequestFocus();
-    AddViewToRootContainer(hexagonsList_);
-}
-
-void ApplistView::WaterfallStyleOnStart()
-{
-    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ApplistView::WaterfallStyleOnStart ");
-    if (waterfallList_ == nullptr) {
-        waterfallList_ = new UIWaterfallList();
-    }
-    waterfallList_->SetPosition(0, 0, GetRootContainer()->GetWidth(), GetRootContainer()->GetHeight());
-    imgDistance_ = waterfallList_->GetWidth() * 0.25991; // 0.25991, empirical coefficient
-    imgSize_ = waterfallList_->GetWidth() * 0.23348; // 0.23348, empirical coefficient
-    waterfallList_->SetImageDistance(imgDistance_);
-    waterfallList_->SetImageSizeInCenter(imgSize_);
-    int16_t blankSize = waterfallList_->GetRelativeRect().GetWidth() > waterfallList_->GetRelativeRect().GetHeight() ?
-        waterfallList_->GetRelativeRect().GetWidth() / 2 : waterfallList_->GetRelativeRect().GetHeight() / 2; // 2, half
-    waterfallList_->SetThrowDrag(true);
-    uint16_t layoutHeight = static_cast<uint16_t>(imgDistance_ * Sin(60));
-    waterfallList_->SetReboundSize(layoutHeight); // 60: degree, row's layout height
-    waterfallList_->SetScrollBlankSize(layoutHeight, UIAbstractScroll::Direction::TOP);
-    waterfallList_->SetScrollBlankSize(Screen::GetInstance().GetHeight() / 2 - layoutHeight, // 2: half
-        UIAbstractScroll::Direction::BOTTOM);
-    waterfallList_->RequestFocus();
-    waterfallList_->SetRotateFactor(10); // 10, empirical coefficient
-    waterfallList_->SetOnRotateListener(presenter_);
-    waterfallList_->SetTouchable(false);
-    waterfallList_->SetDraggable(false); // ensure that it can't be dragged during animation to avoid error display
-    AddViewToRootContainer(waterfallList_);
-}
-
-void ApplistView::ListStyleOnStart()
-{
-    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ApplistView::ListStyleOnStart");
-    listAdapter_ = new ApplistAdapter();
-    if (listAdapter_ == nullptr) {
-        return;
-    }
-    listAdapter_->SetItemClickListener(presenter_);
-
-    contentList_ = new UIList(UIList::VERTICAL);
-    if (contentList_ == nullptr) {
-        return;
-    }
-    contentList_->SetPosition(0, 0);
-    contentList_->Resize(HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);
-    contentList_->SetScrollBlankSize(VERTICAL_RESOLUTION / NUM_2);
-    contentList_->SetSelectPosition(VERTICAL_RESOLUTION / NUM_2); // middle position
-    contentList_->SetDraggable(true);
-    contentList_->SetThrowDrag(true);
-    contentList_->EnableAutoAlign(true);
-    contentList_->SetScrollStateListener(presenter_);
-    contentList_->SetMaxScrollDistance(MAX_SCROLL_DIS);
-    contentList_->SetYScrollBarVisible(true);
-
-    dragListener_ = new AppListOnDragListener();
-    if (dragListener_ == nullptr) {
-        return;
-    }
-    contentList_->SetOnDragListener(dragListener_);
-    AddViewToRootContainer(contentList_);
-}
-
-void ApplistView::ResumeWaterFallDraggable()
-{
-    if (waterfallList_ != nullptr) {
-        waterfallList_->SetTouchable(true);
-        waterfallList_->SetDraggable(true); // resume touchable after transition animation
-    }
-}
-
-void ApplistView::StartFootBallAnimator()
-{
-    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ApplistView::StartFootBallAnimator");
-    if (enterAnimator_ != nullptr) {
-        enterAnimator_->Start();
+    if (desktopFragment_ != nullptr) {
+        OnStop();
     }
+    DesktopStyle style = SettingDesktopModel::GetInstance().GetDesktopStyle();
+    desktopFragment_ = DesktopFactory::GetInstance().CreateDesktopStyle(style);
+    desktopFragment_->SetPosition(0, 0, GetRootContainer()->GetWidth(), GetRootContainer()->GetHeight());
+    desktopFragment_->CreateView();
+    AddViewToRootContainer(desktopFragment_->GetFragmentView());
 }
 
 void ApplistView::OnStop()
 {
-    AppListStyle style = presenter_->GetCurrentStyle();
-    if (style == AppListStyle::FOOTBALL_STYLE) {
-        FootballStyleOnStop();
-    } else if (style == AppListStyle::HEXAGONS_STYLE) {
-        HexagonsStyleOnStop();
-    } else if (style == AppListStyle::WATERFALL_STYLE) {
-        WaterfallStyleOnStop();
-    } else {
-        ListStyleOnStop();
-    }
-    return;
-}
-
-void ApplistView::FootballStyleOnStop()
-{
-    if (enterAnimator_ != nullptr) {
-        enterAnimator_->Stop();
-    }
-    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ApplistView::FootballStyleOnStop");
-    if (footballDefaultImg_ != nullptr) {
-        ImageCacheManager::GetInstance().UnloadSingleRes(PNG_APPLIST_NOTSETUSE_IMG);
-        footballDefaultImg_ = nullptr;
-    }
-    if (footballList_ != nullptr) {
-        footballList_->RemoveAll();
-    }
-    ListNode<FootballItemView*>* viewNode = footballItemList_.Head();
-    while (viewNode != footballItemList_.End()) {
-        delete(viewNode->data_);
-        viewNode = viewNode->next_;
-    }
-    footballItemList_.Clear();
-}
-
-void ApplistView::HexagonsStyleOnStop()
-{
-    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ApplistView::HexagonsStyleOnStop");
-    if (hexagonsList_ != nullptr) {
-        hexagonsList_->RemoveAll();
-    }
-    ListNode<HexagonsItemView*>* viewNode = listHexagonsView_.Head();
-    while (viewNode != listHexagonsView_.End()) {
-        delete(viewNode->data_);
-        viewNode = viewNode->next_;
-    }
-    listHexagonsView_.Clear();
-}
-
-void ApplistView::WaterfallStyleOnStop()
-{
-    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ApplistView::WaterfallStyleOnStop");
-    if (waterfallList_ != nullptr) {
-        waterfallList_->RemoveAll();
-    }
-    ListNode<WaterfallItemView*>* viewNode = waterfallItemList_.Head();
-    while (viewNode != waterfallItemList_.End()) {
-        delete(viewNode->data_);
-        viewNode = viewNode->next_;
+    if (desktopFragment_ == nullptr) {
+        return;
     }
-    waterfallItemList_.Clear();
+    desktopFragment_->DestroyView();
+    delete desktopFragment_;
+    desktopFragment_ = nullptr;
 }
 
-void ApplistView::ListStyleOnStop()
+void ApplistView::OnResume()
 {
-    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ApplistView::ListStyleOnStop");
-    int16_t listHeadY = contentList_->GetChildrenHead()->GetY();
-    int16_t listHeadIndex = contentList_->GetChildrenHead()->GetViewIndex();
-    presenter_->SetHeadItemY(listHeadY);
-    presenter_->SetStartIndex(listHeadIndex);
-}
-
-void ApplistView::LoadAppIconImage(UIImageView *view, const uint32_t id, const char *path)
-{
-    ImageInfo* image = ImageCacheManager::GetInstance().LoadOneInMultiRes(id, path);
-    if (image == nullptr) {
-        GRAPHIC_LOGE("Load App Icon path %s Image %x fail\n", path, id);
+    if (desktopFragment_ == nullptr) {
         return;
     }
-    view->SetSrc(image);
+    desktopFragment_->ResumeView();
 }
 
 void ApplistView::AddAppItemToList(const AppItem &item)
 {
-    AppListStyle style = presenter_->GetCurrentStyle();
-    if (style == AppListStyle::FOOTBALL_STYLE) {
-        FootballItemView *itemView = new FootballItemView();
-        itemView->SetItemInfo(item);
-        if (item.iconHexagon == nullptr && item.hexagonPath != nullptr) {
-            LoadAppIconImage(itemView, item.hexagonId, item.hexagonPath);
-        } else {
-            itemView->SetSrc(item.iconHexagon);
-        }
-        itemView->SetTouchable(true);
-        itemView->SetOnClickListener(presenter_);
-        footballList_->Add(itemView);
-        footballItemList_.PushBack(itemView);
-    } else if (style == AppListStyle::HEXAGONS_STYLE) {
-        HexagonsItemView *itemView = new HexagonsItemView();
-        itemView->SetItemInfo(item);
-        if (item.iconSmall == nullptr && item.resPath != nullptr) {
-            LoadAppIconImage(itemView, item.resId, item.resPath);
-        } else {
-            itemView->SetSrc(item.iconSmall);
-        }
-        itemView->SetTouchable(true);
-        itemView->SetOnClickListener(presenter_);
-        hexagonsList_->Add(itemView);
-        listHexagonsView_.PushBack(itemView);
-    } else if (style == AppListStyle::WATERFALL_STYLE) {
-        WaterfallItemView *itemView = new WaterfallItemView();
-        itemView->SetItemInfo(item);
-        if (item.iconSmall == nullptr && item.resPath != nullptr) {
-            LoadAppIconImage(itemView, item.resId, item.resPath);
-        } else {
-            itemView->SetSrc(item.iconSmall);
-        }
-        itemView->SetTouchable(true);
-        itemView->SetOnClickListener(presenter_);
-        waterfallList_->Add(itemView);
-        waterfallItemList_.PushBack(itemView);
-    } else {
-        listAdapter_->AddListItem(item);
+    if (desktopFragment_ == nullptr) {
+        return;
     }
+    desktopFragment_->AddAppItemToList(item);
 }
 
 void ApplistView::ClearAppItemToList()
 {
-    AppListStyle style = presenter_->GetCurrentStyle();
-    if (style == FOOTBALL_STYLE) {
-        FootballStyleOnStop();
-    } else if (style == AppListStyle::HEXAGONS_STYLE) {
-        HexagonsStyleOnStop();
-    } else if (style == AppListStyle::WATERFALL_STYLE) {
-        WaterfallStyleOnStop();
-    } else {
-        listAdapter_->ClearItem();
-    }
-}
-
-void ApplistView::RefreshAppList(void)
-{
-    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ApplistView::RefreshAppList");
-    AppListStyle style = presenter_->GetCurrentStyle();
-    if (style == AppListStyle::FOOTBALL_STYLE) {
-        footballList_->RefreshIcosahedron();
-    } else if (style == AppListStyle::HEXAGONS_STYLE) {
-        hexagonsList_->LayoutChildren(true);
-    } else if (style == AppListStyle::WATERFALL_STYLE) {
-        waterfallList_->LayoutChildren(true);
-    } else {
-        uint16_t startIndex = 0;
-        int16_t headY = 0;
-        if (presenter_->GetStartIndex() >= presenter_->GetListItemNum()) {
-            startIndex = presenter_->GetListItemNum() - 1;
-            headY = VERTICAL_RESOLUTION / NUM_2;
-        } else {
-            startIndex = presenter_->GetStartIndex();
-            headY = presenter_->GetHeadItemY();
-            if (headY == 0) {
-                headY = VERTICAL_RESOLUTION / NUM_2;
-            }
-        }
-        contentList_->SetAdapter(listAdapter_);
-        contentList_->ScrollTo(startIndex);
-        contentList_->ScrollBy(headY);
-        contentList_->RefreshList();
+    if (desktopFragment_ == nullptr) {
+        return;
     }
+    desktopFragment_->ClearAppItemToList();
 }
 
-void FootballAnimatorCallback::Callback(UIView *view)
+void ApplistView::RefreshAppList()
 {
-    if (HALTick::GetInstance().GetElapseTime(startTime_) < 300) { // 300, empirical coefficient
+    if (desktopFragment_ == nullptr) {
         return;
     }
-    if (!isStartAnim_) {
-        animator_->Stop();
-        animator_->Start();
-        isStartAnim_ = true;
-    }
-    UIIcosahedronView* footView = dynamic_cast<UIIcosahedronView*>(view);
-    int16_t el = EasingEquation::LinearEaseNone(startPos_, endPos_, animator_->GetRunTime(), animator_->GetTime());
-    footView->SetSideLength(el);
-    footView->RefreshIcosahedron();
-    const Vector3<float> rotateStart(Screen::GetInstance().GetWidth() / 2.0, // 2.0: divisor
-        Screen::GetInstance().GetHeight() / 2.0, 0); // 2.0: divisor
-    const Vector3<float> rotateEnd(0, 0, 0);
-    // 270 : stop angle
-    int16_t angle = EasingEquation::LinearEaseNone(0, 270, animator_->GetRunTime(), animator_->GetTime());
-    footView->RotatePlanes(angle, rotateStart, rotateEnd);
+    desktopFragment_->RefreshAppList();
 }
 }
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/applist/src/DesktopFactory.cpp b/code/sdk/application/wearable/evb/nativeapp/nativeui/applist/src/DesktopFactory.cpp
new file mode 100644 (file)
index 0000000..621ebcc
--- /dev/null
@@ -0,0 +1,37 @@
+/*
+ * Copyright (c) CompanyNameMagicTag 2025. All rights reserved.
+ * Description: DesktopFactory
+ * Author:
+ * Create: 2025-07
+ */
+
+#include "applist/DesktopFactory.h"
+#include "wearable_log.h"
+
+namespace OHOS {
+
+void DesktopFactory::RegisterDesktopStyle(const uint16_t style, DesktopInterface* desktop)
+{
+    if (desktop == nullptr) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Can't register desktop using null proxy");
+        return;
+    }
+    if (desktops_.find(style) != desktops_.end()) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "desktop style %d has already been registered", style);
+        return;
+    } else {
+        desktops_.insert({style, desktop});
+    }
+}
+
+UIDesktopFragment* DesktopFactory::CreateDesktopStyle(uint16_t style)
+{
+    auto it = desktops_.find(style);
+    if (it != desktops_.end()) {
+        return it->second->CreateDesktop();
+    } else {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Desktop style:%d was not registered", style);
+        return nullptr;
+    }
+}
+} // namespace OHOS
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/applist/src/FootballDesktopFragment.cpp b/code/sdk/application/wearable/evb/nativeapp/nativeui/applist/src/FootballDesktopFragment.cpp
new file mode 100644 (file)
index 0000000..53dd8e9
--- /dev/null
@@ -0,0 +1,174 @@
+/*
+ * Copyright (c) CompanyNameMagicTag 2025-2025. All rights reserved.
+ * Description: FootballDesktopFragment.cpp
+ * Author:
+ * Create: 2025-07-04
+ */
+
+#include "applist/FootballDesktopFragment.h"
+#include "applist/DesktopFactory.h"
+#include "common/image_cache_manager.h"
+#include "common/screen.h"
+#include "hal_tick.h"
+
+namespace OHOS {
+REGIST_DESKTOP_STYLE(FOOTBALL_STYLE, FootballDesktopFragment);
+
+void FootballDesktopFragment::OnCreateView(void* data)
+{
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "FootballDesktopFragment::OnCreateView ");
+    if (footballList_ == nullptr) {
+        footballList_ = new UIIcosahedronView();
+    }
+    footballList_->SetThrowDrag(true);
+    if (footballDefaultImg_ == nullptr) {
+        footballDefaultImg_ = ImageCacheManager::GetInstance().LoadSingleRes(PNG_APPLIST_NOTSETUSE_IMG);
+        if (footballDefaultImg_ == nullptr) {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "load res faild");
+            return;
+        }
+    }
+    if (callback_ == nullptr) {
+        callback_ = new FootballAnimatorCallback(footballList_, 30, 200); // 30: Initial Size 200: Final display size
+    }
+    footballList_->SetDefaultImage(footballDefaultImg_);
+    footballList_->SetPosition(0, 0, fragmentView_.GetWidth(), fragmentView_.GetHeight());
+    enterAnimator_ = callback_->GetAnimator();
+    fragmentView_.Add(footballList_);
+    if (callback_ != nullptr) {
+        callback_->SetStartTime(HALTick::GetInstance().GetTime());
+    }
+}
+
+void FootballDesktopFragment::OnDestroyView()
+{
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "FootballDesktopFragment::OnDestroyView");
+    ClearAppItemToList();
+    if (footballList_ != nullptr) {
+        delete footballList_;
+        footballList_ = nullptr;
+    }
+    if (footballDefaultImg_ != nullptr) {
+        ImageCacheManager::GetInstance().UnloadSingleRes(PNG_APPLIST_NOTSETUSE_IMG);
+        footballDefaultImg_ = nullptr;
+    }
+    if (callback_ != nullptr) {
+        delete callback_;
+        callback_ = nullptr;
+    }
+    enterAnimator_ = nullptr;
+}
+
+void FootballDesktopFragment::OnResumeView()
+{
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "FootballDesktopFragment::OnResumeView");
+    if (enterAnimator_ != nullptr) {
+        enterAnimator_->Start();
+    }
+}
+
+bool FootballDesktopFragment::OnClick(UIView &view, const ClickEvent &event)
+{
+    UNUSED(event);
+    FootballItemView *itemView = dynamic_cast<FootballItemView *>(&view);
+    AppViewId viewId = itemView->GetViewId();
+    char *uid = (char *)itemView->GetAppUid();
+
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "FootballDesktopFragment::OnClick viewid = %d", viewId);
+    return SwitchView(viewId, uid, TransitionType::TRANSITION_INVALID, FOOTBALL_STYLE);
+}
+
+void FootballDesktopFragment::AddAppItemToList(const AppItem &item)
+{
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "FootballDesktopFragment::AddAppItemToList");
+    FootballItemView *itemView = new FootballItemView();
+    if (!itemView->SetItemInfo(item)) {
+        delete itemView;
+        return;
+    }
+    itemView->SetTouchable(true);
+    itemView->SetOnClickListener(this);
+    footballList_->Add(itemView);
+    footballItemList_.PushBack(itemView);
+}
+
+void FootballDesktopFragment::ClearAppItemToList()
+{
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "FootballDesktopFragment::ClearAppItemToList");
+    if (enterAnimator_ != nullptr) {
+        enterAnimator_->Stop();
+    }
+    if (footballList_ != nullptr) {
+        footballList_->RemoveAll();
+    }
+    ListNode<FootballItemView*>* viewNode = footballItemList_.Head();
+    while (viewNode != footballItemList_.End()) {
+        delete(viewNode->data_);
+        viewNode = viewNode->next_;
+    }
+    footballItemList_.Clear();
+}
+
+void FootballDesktopFragment::RefreshAppList(void)
+{
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "FootballDesktopFragment::RefreshAppList");
+    footballList_->RefreshIcosahedron();
+}
+
+void FootballAnimatorCallback::Callback(UIView *view)
+{
+    if (HALTick::GetInstance().GetElapseTime(startTime_) < 300) { // 300, empirical coefficient
+        return;
+    }
+    if (!isStartAnim_) {
+        animator_->Stop();
+        animator_->Start();
+        isStartAnim_ = true;
+    }
+    UIIcosahedronView* footView = dynamic_cast<UIIcosahedronView*>(view);
+    int16_t el = EasingEquation::LinearEaseNone(startPos_, endPos_, animator_->GetRunTime(), animator_->GetTime());
+    footView->SetSideLength(el);
+    footView->RefreshIcosahedron();
+    const Vector3<float> rotateStart(Screen::GetInstance().GetWidth() / 2.0, // 2.0: divisor
+        Screen::GetInstance().GetHeight() / 2.0, 0); // 2.0: divisor
+    const Vector3<float> rotateEnd(0, 0, 0);
+    // 270 : stop angle
+    int16_t angle = EasingEquation::LinearEaseNone(0, 270, animator_->GetRunTime(), animator_->GetTime());
+    footView->RotatePlanes(angle, rotateStart, rotateEnd);
+}
+
+FootballItemView::~FootballItemView()
+{
+    if (itemInfo_.iconHexagon == nullptr && itemInfo_.hexagonPath != nullptr) {
+        ImageCacheManager::GetInstance().UnloadOneInMultiRes(itemInfo_.hexagonId, itemInfo_.hexagonPath);
+    }
+}
+
+bool FootballItemView::SetItemInfo(const AppItem &itemInfo)
+{
+    itemInfo_ = itemInfo;
+    if (itemInfo.iconHexagon == nullptr && itemInfo.hexagonPath != nullptr) {
+        ImageInfo* image =
+            ImageCacheManager::GetInstance().LoadOneInMultiRes(itemInfo.hexagonId, itemInfo.hexagonPath);
+        if (image == nullptr) {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Load App Icon path %s Image %x fail",
+                itemInfo.hexagonId, itemInfo.hexagonPath);
+            return false;
+        }
+        SetSrc(image);
+    } else {
+        SetSrc(itemInfo.iconHexagon);
+    }
+    return true;
+}
+
+AppViewId FootballItemView::GetViewId()
+{
+    return static_cast<AppViewId>(itemInfo_.id);
+}
+
+const char *FootballItemView::GetAppUid()
+{
+    return itemInfo_.uid;
+}
+}
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/applist/src/HexagonsDesktopFragment.cpp b/code/sdk/application/wearable/evb/nativeapp/nativeui/applist/src/HexagonsDesktopFragment.cpp
new file mode 100644 (file)
index 0000000..23e1013
--- /dev/null
@@ -0,0 +1,153 @@
+/*
+ * Copyright (c) CompanyNameMagicTag 2025-2025. All rights reserved.
+ * Description: HexagonsDesktopFragment.cpp
+ * Author:
+ * Create: 2025-07-04
+ */
+
+#include "applist/HexagonsDesktopFragment.h"
+#include "applist/DesktopFactory.h"
+#include "common/image_cache_manager.h"
+#include "NativeAbility.h"
+
+namespace OHOS {
+REGIST_DESKTOP_STYLE(HEXAGONS_STYLE, HexagonsDesktopFragment);
+
+void HexagonsDesktopFragment::OnCreateView(void* data)
+{
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HexagonsDesktopFragment::OnCreateView ");
+    if (hexagonsList_ == nullptr) {
+        hexagonsList_ = new UICustomHexagonsList();
+    }
+    hexagonsList_->SetPosition(0, 0, fragmentView_.GetWidth(), fragmentView_.GetHeight()); // 2, two
+    imgDistance_ = hexagonsList_->GetWidth() * 0.25991; // 0.25991, empirical coefficient
+    imgSize_ = hexagonsList_->GetWidth() * 0.23348; // 0.23348, empirical coefficient
+    hexagonsList_->SetImageDistance(imgDistance_);
+    hexagonsList_->SetImageSizeInCenter(imgSize_);
+    int16_t blankSize = hexagonsList_->GetRelativeRect().GetWidth() > hexagonsList_->GetRelativeRect().GetHeight() ?
+        hexagonsList_->GetRelativeRect().GetWidth() / 2 : hexagonsList_->GetRelativeRect().GetHeight() / 2; // 2, half
+    hexagonsList_->SetScrollBlankSize(blankSize);
+    hexagonsList_->SetReboundSize(blankSize);
+    hexagonsList_->SetThrowDrag(true);
+    hexagonsList_->SetOnRotateListener(this);
+    hexagonsList_->RequestFocus();
+    fragmentView_.Add(hexagonsList_);
+}
+
+void HexagonsDesktopFragment::OnDestroyView()
+{
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HexagonsDesktopFragment::OnDestroyView");
+    ClearAppItemToList();
+    if (hexagonsList_ != nullptr) {
+        delete hexagonsList_;
+        hexagonsList_ = nullptr;
+    }
+}
+
+bool HexagonsDesktopFragment::OnRotate(UIView& view, const RotateEvent& event)
+{
+    UICustomHexagonsList* hexagonsView = dynamic_cast<UICustomHexagonsList *>(&view);
+    if (hexagonsView == nullptr) {
+        return false;
+    }
+    int8_t index = hexagonsView->GetFocusedImgIndex();
+    uint8_t focusIndex_ = 0;
+    if (index >= 0) {
+        focusIndex_ = static_cast<uint8_t>(index);
+    }
+    HexagonsItemView *itemView = dynamic_cast<HexagonsItemView *>(hexagonsView->GetViewByIndex(focusIndex_));
+    AppViewId viewId = itemView->GetViewId();
+    if (FloatMore(hexagonsView->GetGlobalScale(), 2.0f)) { // 2.0 threshold for beginning transition
+        hexagonsView->StopRotateAnimator();
+        NativeAbility::GetInstance().ChangeSlice(viewId, TransitionType::TRANSITION_HEXAGONS);
+        hexagonsView->ClearFocus();
+    }
+    return true;
+}
+
+bool HexagonsDesktopFragment::OnClick(UIView &view, const ClickEvent &event)
+{
+    UNUSED(event);
+    HexagonsItemView *itemView = dynamic_cast<HexagonsItemView *>(&view);
+    UIHexagonsList *hexagonsView = dynamic_cast<UIHexagonsList *>(itemView->GetParent());
+    if (hexagonsView == nullptr || itemView == nullptr) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "hexagonsView or itemView is nullptr");
+        return false;
+    }
+    AppViewId viewId = itemView->GetViewId();
+    char *uid = (char *)itemView->GetAppUid();
+    hexagonsView->SetDraggable(false);
+    hexagonsView->Scale(1.0f, itemView->GetViewIndex()); // switch focus to click view
+
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "WaterfallDesktopFragment::OnClick viewid = %d", viewId);
+    return SwitchView(viewId, uid, TransitionType::TRANSITION_HEXAGONS, HEXAGONS_STYLE);
+}
+
+void HexagonsDesktopFragment::AddAppItemToList(const AppItem &item)
+{
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "WaterfallDesktopFragment::AddAppItemToList");
+    HexagonsItemView *itemView = new HexagonsItemView();
+    if (!itemView->SetItemInfo(item)) {
+        delete itemView;
+        return;
+    }
+    itemView->SetTouchable(true);
+    itemView->SetOnClickListener(this);
+    hexagonsList_->Add(itemView);
+    listHexagonsView_.PushBack(itemView);
+}
+
+void HexagonsDesktopFragment::ClearAppItemToList()
+{
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HexagonsDesktopFragment::ClearAppItemToList");
+    if (hexagonsList_ != nullptr) {
+        hexagonsList_->RemoveAll();
+    }
+    ListNode<HexagonsItemView*>* viewNode = listHexagonsView_.Head();
+    while (viewNode != listHexagonsView_.End()) {
+        delete(viewNode->data_);
+        viewNode = viewNode->next_;
+    }
+    listHexagonsView_.Clear();
+}
+
+void HexagonsDesktopFragment::RefreshAppList(void)
+{
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "WaterfallDesktopFragment::RefreshAppList");
+    hexagonsList_->LayoutChildren(true);
+}
+
+HexagonsItemView::~HexagonsItemView()
+{
+    if (itemInfo_.iconSmall == nullptr && itemInfo_.resPath != nullptr) {
+        ImageCacheManager::GetInstance().UnloadOneInMultiRes(itemInfo_.resId, itemInfo_.resPath);
+    }
+}
+
+bool HexagonsItemView::SetItemInfo(const AppItem &itemInfo)
+{
+    itemInfo_ = itemInfo;
+    if (itemInfo.iconSmall == nullptr && itemInfo.resPath != nullptr) {
+        ImageInfo* image = ImageCacheManager::GetInstance().LoadOneInMultiRes(itemInfo.resId, itemInfo.resPath);
+        if (image == nullptr) {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Load App Icon path %s Image %x fail",
+                itemInfo.resId, itemInfo.resPath);
+            return false;
+        }
+        SetSrc(image);
+    } else {
+        SetSrc(itemInfo.iconSmall);
+    }
+    return true;
+}
+
+AppViewId HexagonsItemView::GetViewId()
+{
+    return static_cast<AppViewId>(itemInfo_.id);
+}
+
+const char *HexagonsItemView::GetAppUid()
+{
+    return itemInfo_.uid;
+}
+}
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/applist/src/ListDesktopFragment.cpp b/code/sdk/application/wearable/evb/nativeapp/nativeui/applist/src/ListDesktopFragment.cpp
new file mode 100644 (file)
index 0000000..15f446a
--- /dev/null
@@ -0,0 +1,138 @@
+/*
+ * Copyright (c) CompanyNameMagicTag 2025-2025. All rights reserved.
+ * Description: ListDesktopFragment.cpp
+ * Author:
+ * Create: 2025-07-04
+ */
+
+#include "applist/ListDesktopFragment.h"
+#include "applist/DesktopFactory.h"
+#include "applist/ApplistModel.h"
+
+namespace OHOS {
+REGIST_DESKTOP_STYLE(APPLIST_STYLE, ListDesktopFragment);
+
+static constexpr int16 NUM_2 = 2;
+static constexpr int16 MAX_SCROLL_DIS = 1000;
+
+void ListDesktopFragment::OnCreateView(void* data)
+{
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ListDesktopFragment::OnCreateView");
+    listAdapter_ = new ApplistAdapter();
+    if (listAdapter_ == nullptr) {
+        return;
+    }
+    listAdapter_->SetItemClickListener(this);
+
+    contentList_ = new UIList(UIList::VERTICAL);
+    if (contentList_ == nullptr) {
+        return;
+    }
+    contentList_->SetPosition(0, 0);
+    contentList_->Resize(HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);
+    contentList_->SetScrollBlankSize(VERTICAL_RESOLUTION / NUM_2);
+    contentList_->SetSelectPosition(VERTICAL_RESOLUTION / NUM_2); // middle position
+    contentList_->SetDraggable(true);
+    contentList_->SetThrowDrag(true);
+    contentList_->EnableAutoAlign(true);
+    contentList_->SetScrollStateListener(this);
+    contentList_->SetMaxScrollDistance(MAX_SCROLL_DIS);
+    contentList_->SetYScrollBarVisible(true);
+
+    dragListener_ = new AppListOnDragListener();
+    if (dragListener_ == nullptr) {
+        return;
+    }
+    contentList_->SetOnDragListener(dragListener_);
+    fragmentView_.Add(contentList_);
+}
+
+
+void ListDesktopFragment::OnDestroyView()
+{
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ListDesktopFragment::OnDestroyView");
+    int16_t listHeadY = contentList_->GetChildrenHead()->GetY();
+    int16_t listHeadIndex = contentList_->GetChildrenHead()->GetViewIndex();
+    ApplistModel *model = &ApplistModel::GetInstance();
+    model->SetHeadItemY(listHeadY);
+    model->SetStartIndex(listHeadIndex);
+
+    ClearAppItemToList();
+
+    if (listAdapter_ != nullptr) {
+        delete listAdapter_;
+        listAdapter_ = nullptr;
+    }
+    if (contentList_ != nullptr) {
+        delete contentList_;
+        contentList_ = nullptr;
+    }
+    if (dragListener_ != nullptr) {
+        delete dragListener_;
+        dragListener_ = nullptr;
+    }
+}
+
+bool ListDesktopFragment::OnClick(UIView &view, const ClickEvent &event)
+{
+    UNUSED(event);
+    AppItemView *itemView = dynamic_cast<AppItemView *>(&view);
+    if (itemView == nullptr) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "itemView is nullptr");
+        return false;
+    }
+    AppViewId viewId = itemView->GetViewId();
+    char *uid = (char *)itemView->GetAppUid();
+
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ListDesktopFragment::OnClick viewid = %d", viewId);
+    return SwitchView(viewId, uid, TransitionType::TRANSITION_INVALID, APPLIST_STYLE);
+}
+
+void ListDesktopFragment::OnItemSelected(int16 index, UIView *view)
+{
+    UNUSED(index);
+    if (view != nullptr) {
+        itemViewSele = static_cast<AppItemView *>(view);
+        itemViewSele->SelectedChange();
+
+        if (preItemViewSele != nullptr && preItemViewSele != itemViewSele) {
+            preItemViewSele->Reset();
+        }
+        preItemViewSele = itemViewSele;
+    }
+}
+
+void ListDesktopFragment::AddAppItemToList(const AppItem &item)
+{
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ListDesktopFragment::AddAppItemToList");
+    listAdapter_->AddListItem(item);
+}
+
+void ListDesktopFragment::ClearAppItemToList()
+{
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ListDesktopFragment::ClearAppItemToList");
+    listAdapter_->ClearItem();
+}
+
+void ListDesktopFragment::RefreshAppList(void)
+{
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ListDesktopFragment::RefreshAppList");
+    uint16_t startIndex = 0;
+    int16_t headY = 0;
+    ApplistModel *model = &ApplistModel::GetInstance();
+    if (model->GetStartIndex() >= model->GetAppListNum()) {
+        startIndex = model->GetAppListNum() - 1;
+        headY = VERTICAL_RESOLUTION / NUM_2;
+    } else {
+        startIndex = model->GetStartIndex();
+        headY = model->GetHeadItemY();
+        if (headY == 0) {
+            headY = VERTICAL_RESOLUTION / NUM_2;
+        }
+    }
+    contentList_->SetAdapter(listAdapter_);
+    contentList_->ScrollTo(startIndex);
+    contentList_->ScrollBy(headY);
+    contentList_->RefreshList();
+}
+}
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/applist/src/PlanetDesktopFragment.cpp b/code/sdk/application/wearable/evb/nativeapp/nativeui/applist/src/PlanetDesktopFragment.cpp
new file mode 100644 (file)
index 0000000..c735620
--- /dev/null
@@ -0,0 +1,134 @@
+/*
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.
+ * Description: PlanetDesktop
+ * Created: 2025-07-29
+ */
+
+#include "applist/PlanetDesktopFragment.h"
+#include "applist/DesktopFactory.h"
+#include "applist/ApplistModel.h"
+
+namespace OHOS {
+REGIST_DESKTOP_STYLE(PLANET_STYLE, PlanetDesktopFragment);
+
+static constexpr int16 LABEL_FONT_SIZE = 15;
+
+void PlanetDesktopFragment::OnCreateView(void* data)
+{
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "PlanetDesktopFragment::OnCreateView ");
+    imgSize_ = 100; // 100, size of item
+    int16_t imageDistance = 5; // 5, image distance
+    if (planetList_ == nullptr) {
+        planetList_ = new UICustomPlanetList(imgSize_, imageDistance);
+    }
+    planetList_->SetPosition(0, 0, fragmentView_.GetWidth(), fragmentView_.GetHeight());
+    planetList_->SetDraggable(true);
+    planetList_->SetThrowDrag(true);
+    planetList_->SetItemClickListener(this);
+    planetList_->RequestFocus();
+    fragmentView_.Add(planetList_);
+}
+
+void PlanetDesktopFragment::OnDestroyView()
+{
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "PlanetDesktopFragment::OnDestroyView");
+    ClearAppItemToList();
+    if (planetList_ != nullptr) {
+        delete planetList_;
+        planetList_ = nullptr;
+    }
+}
+
+bool PlanetDesktopFragment::OnClick(UIView &view, const ClickEvent &event)
+{
+    UNUSED(event);
+    PlanetItemView *itemView = dynamic_cast<PlanetItemView *>(&view);
+    AppViewId viewId = itemView->GetViewId();
+    char *uid = (char *)itemView->GetAppUid();
+
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "PlanetDesktopFragment::OnClick viewid = %d", viewId);
+    return SwitchView(viewId, uid, TransitionType::TRANSITION_INVALID, PLANET_STYLE);
+}
+
+void PlanetDesktopFragment::AddAppItemToList(const AppItem &item)
+{
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "PlanetDesktopFragment::AddAppItemToList");
+    PlanetItemView* itemView = new PlanetItemView();
+    UILabel* label = new UILabel();
+    itemView->SetItemInfo(item);
+    itemView->SetSrc(item.iconSmall);
+    itemView->SetTouchable(true);
+    itemView->SetAutoEnable(false);
+    itemView->SetResizeMode(UIImageView::ImageResizeMode::CONTAIN);
+    itemView->SetOnClickListener(this);
+    label->SetText(item.label);
+    label->SetFont(DEFAULT_VECTOR_FONT_FILENAME, LABEL_FONT_SIZE);
+    label->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);
+    label->SetVisible(false);
+    label->SetHeight(30); // 30, label height
+    label->SetWidth(100); // 100, label width
+    planetList_->AddItemVIew(itemView);
+    planetList_->AddLabel(label);
+    pltItemList_.PushBack(itemView);
+    pltLabelList_.PushBack(label);
+}
+
+void PlanetDesktopFragment::ClearAppItemToList()
+{
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "PlanetDesktopFragment::ClearAppItemToList");
+    int16_t offsetX = 0;
+    int16_t offsetY = 0;
+    ApplistModel *model = &ApplistModel::GetInstance();
+
+    planetList_->RestoreItemState();
+    planetList_->GetLastOffset(offsetX, offsetY);
+    model->SetLastOffset(offsetX, offsetY);
+    if (planetList_ != nullptr) {
+        planetList_->RemoveAll();
+    }
+    ListNode<PlanetItemView*>* viewNode = pltItemList_.Head();
+    while (viewNode != pltItemList_.End()) {
+        delete(viewNode->data_);
+        viewNode = viewNode->next_;
+    }
+    pltItemList_.Clear();
+    ListNode<UILabel*>* labelNode = pltLabelList_.Head();
+    while (labelNode != pltLabelList_.End()) {
+        delete(labelNode->data_);
+        labelNode = labelNode->next_;
+    }
+    pltLabelList_.Clear();
+}
+
+void PlanetDesktopFragment::RefreshAppList(void)
+{
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "PlanetDesktopFragment::RefreshAppList");
+    int16_t offsetX = 0;
+    int16_t offsetY = 0;
+    ApplistModel *model = &ApplistModel::GetInstance();
+    model->GetLastOffset(offsetX, offsetY);
+    planetList_->SetLastOffset(offsetX, offsetY);
+    planetList_->LayoutChildren(true);
+    planetList_->AddClickListenerToAppItems();
+}
+
+void PlanetItemView::SetItemInfo(const AppItem &itemInfo)
+{
+    itemInfo_ = itemInfo;
+}
+
+AppViewId PlanetItemView::GetViewId()
+{
+    return static_cast<AppViewId>(itemInfo_.id);
+}
+
+const char *PlanetItemView::GetAppUid()
+{
+    return itemInfo_.uid;
+}
+
+const char *PlanetItemView::GetAppLabel()
+{
+    return itemInfo_.label;
+}
+}
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/applist/src/SphereDesktopFragment.cpp b/code/sdk/application/wearable/evb/nativeapp/nativeui/applist/src/SphereDesktopFragment.cpp
new file mode 100644 (file)
index 0000000..844cb8b
--- /dev/null
@@ -0,0 +1,192 @@
+  /*
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025. All rights reserved.
+ * Description: SphereDesktopFragment
+ * Author: Hisi Graphic Team
+ * Created: 2025-09
+ */
+
+#include <cmath>
+#include "applist/SphereDesktopFragment.h"
+#include "applist/DesktopFactory.h"
+#include "common/image_cache_manager.h"
+#include "NativeAbility.h"
+#include "hal_tick.h"
+
+namespace OHOS {
+REGIST_DESKTOP_STYLE(SPHERE_STYLE, SphereDesktopFragment);
+
+void SphereDesktopFragment::OnCreateView(void* data)
+{
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SphereDesktopFragment::OnCreateView ");
+    if (sphereView_ == nullptr) {
+        sphereView_ = new UISphereView(1);
+    }
+    sphereView_->SetThrowDrag(true);
+
+    if (callback_ == nullptr) {
+        callback_ = new SphereAnimatorCallback(sphereView_, fragmentView_.GetWidth(), fragmentView_.GetHeight());
+    }
+
+    sphereView_->SetPosition(0, 0, fragmentView_.GetWidth(), fragmentView_.GetHeight());
+    enterAnimator_ = callback_->GetAnimator();
+    sphereView_->SetVisible(false);
+    fragmentView_.Add(sphereView_);
+    if (callback_ != nullptr) {
+        callback_->SetStartTime(HALTick::GetInstance().GetTime());
+    }
+}
+
+void SphereDesktopFragment::OnDestroyView()
+{
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SphereDesktopFragment::OnDestroyView");
+    ClearAppItemToList();
+    if (sphereView_ != nullptr) {
+        delete sphereView_;
+        sphereView_ = nullptr;
+    }
+    if (callback_ != nullptr) {
+        delete callback_;
+        callback_ = nullptr;
+    }
+    enterAnimator_ = nullptr;
+}
+
+void SphereDesktopFragment::OnResumeView()
+{
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SphereDesktopFragment::OnResumeView");
+    if (enterAnimator_ != nullptr) {
+        enterAnimator_->Start();
+    }
+}
+
+bool SphereDesktopFragment::OnRotate(UIView& view, const RotateEvent& event)
+{
+    UISphereView *sphereView = dynamic_cast<UISphereView *>(&view);
+    if (sphereView == nullptr) {
+        return false;
+    }
+    sphereView->UpdateItemAngle(event.GetRotate());
+    return true;
+}
+
+bool SphereDesktopFragment::OnClick(UIView &view, const ClickEvent &event)
+{
+    UNUSED(event);
+    SphereItemView *itemView = dynamic_cast<SphereItemView *>(&view);
+    UISphereView *sphereView = dynamic_cast<UISphereView *>(itemView->GetParent());
+    if (sphereView == nullptr || itemView == nullptr) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "sphereView or itemView is nullptr");
+        return false;
+    }
+    AppViewId viewId = itemView->GetViewId();
+    char *uid = (char *)itemView->GetAppUid();
+    sphereView->SetDraggable(false);
+
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SphereDesktopFragment::OnClick viewid = %d", viewId);
+    return SwitchView(viewId, uid, TransitionType::TRANSITION_FADEINOUT, SPHERE_STYLE);
+}
+
+void SphereDesktopFragment::AddAppItemToList(const AppItem &item)
+{
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SphereDesktopFragment::AddAppItemToList");
+    SphereItemView *itemView = new SphereItemView();
+    if (!itemView->SetItemInfo(item)) {
+        delete itemView;
+        return;
+    }
+    itemView->SetTouchable(true);
+    itemView->SetOnClickListener(this);
+    sphereView_->Add(itemView);
+    listSphereView_.PushBack(itemView);
+    sphereView_->SetNumberOfRow((listSphereView_.Size() + 2) / 3); // 控制在3排显示
+}
+
+void SphereDesktopFragment::ClearAppItemToList()
+{
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SphereDesktopFragment::ClearAppItemToList");
+    if (enterAnimator_ != nullptr) {
+        enterAnimator_->Stop();
+    }
+    if (sphereView_ != nullptr) {
+        sphereView_->RemoveAll();
+    }
+    ListNode<SphereItemView*>* viewNode = listSphereView_.Head();
+    while (viewNode != listSphereView_.End()) {
+        delete(viewNode->data_);
+        viewNode = viewNode->next_;
+    }
+    listSphereView_.Clear();
+}
+
+void SphereDesktopFragment::RefreshAppList(void)
+{
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SphereDesktopFragment::RefreshAppList");
+    sphereView_->LayoutChildren(true);
+}
+
+void SphereAnimatorCallback::Callback(UIView *view)
+{
+    if (HALTick::GetInstance().GetElapseTime(startTime_) < 300) { // 300: 动画延迟显示时间,观感效果更好
+        angle_=0;
+        return;
+    }
+    if (!view->IsVisible()) {
+        view->SetVisible(true);
+    }
+    if (!isStartAnim_) {
+        animator_->Stop();
+        animator_->Start();
+        isStartAnim_ = true;
+    }
+    UISphereView* sphereView = dynamic_cast<UISphereView*>(view);
+    const int16_t precision = 1000;// 1000: 精度
+    int16_t el = EasingEquation::QuadEaseOut(0, precision, animator_->GetRunTime(), animator_->GetTime()); 
+    int roateAngle = el * 360 / precision; // 360 : 一共旋转360度
+    sphereView->UpdateItemAngle(roateAngle - angle_);
+    angle_ = roateAngle;
+}
+
+SphereItemView::~SphereItemView()
+{
+    if (imageView_ != nullptr) {
+        delete imageView_;
+        imageView_ = nullptr;
+    }
+    if (itemInfo_.iconSmall == nullptr && itemInfo_.resPath != nullptr) {
+        ImageCacheManager::GetInstance().UnloadOneInMultiRes(itemInfo_.resId, itemInfo_.resPath);
+    }
+}
+
+bool SphereItemView::SetItemInfo(const AppItem &itemInfo)
+{
+    if (imageView_ == nullptr) {
+        imageView_ = new UIImageView();
+    }
+    itemInfo_ = itemInfo;
+    if (itemInfo.iconSmall == nullptr && itemInfo.resPath != nullptr) {
+        ImageInfo* image = ImageCacheManager::GetInstance().LoadOneInMultiRes(itemInfo.resId, itemInfo.resPath);
+        if (image == nullptr) {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Load App Icon path %s Image %x fail",
+                itemInfo.resId, itemInfo.resPath);
+            return false;
+        }
+        imageView_->SetSrc(image);
+    } else {
+        imageView_->SetSrc(itemInfo.iconSmall);
+    }
+    Add(imageView_);
+    SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);
+    Resize(imageView_->GetWidth(), imageView_->GetHeight());
+    return true;
+}
+
+AppViewId SphereItemView::GetViewId()
+{
+    return static_cast<AppViewId>(itemInfo_.id);
+}
+
+const char *SphereItemView::GetAppUid()
+{
+    return itemInfo_.uid;
+}
+}
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/applist/src/UIDesktopFragment.cpp b/code/sdk/application/wearable/evb/nativeapp/nativeui/applist/src/UIDesktopFragment.cpp
new file mode 100644 (file)
index 0000000..f486171
--- /dev/null
@@ -0,0 +1,50 @@
+/*
+ * Copyright (c) CompanyNameMagicTag 2025-2025. All rights reserved.
+ * Description: UIDesktopFragment.cpp
+ * Author:
+ * Create: 2025-07-07
+ */
+
+#include "applist/UIDesktopFragment.h"
+#include "common/image_cache_manager.h"
+#include "ability_manager.h"
+#include "NativeAbility.h"
+
+namespace OHOS {
+void UIDesktopFragment::SetPosition(int16_t x, int16_t y, int16_t width, int16_t height)
+{
+    fragmentView_.SetPosition(x, y, width, height);
+}
+
+bool UIDesktopFragment::SwitchView(AppViewId viewId, char *uid, TransitionType type, DesktopStyle style)
+{
+    if (viewId < VIEW_MAX_INTER_APP) {
+        if (viewId == VIEW_SETTING && style == DesktopStyle::APPLIST_STYLE) {
+            NativeAbility::GetInstance().ChangeSlice(viewId, type, gSliceDefaultPriority, true);
+        } else {
+            NativeAbility::GetInstance().ChangeSlice(viewId, type);
+        }
+        return true;
+    } else if (viewId == VIEW_EXTERN_APP) {
+#ifdef JS_ENABLE
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "UIDesktopFragment::OnClick bundleName = %s", uid);
+        Want *want = new Want();
+        memset_s(want, sizeof(Want), 0, sizeof(Want));
+        ElementName startElement = {};
+        startElement.abilityName = (char *)"default";
+        startElement.bundleName = uid;
+        startElement.deviceId = nullptr;
+        SetWantElement(want, startElement);
+        if (viewId == VIEW_SETTING && style == DesktopStyle::APPLIST_STYLE) {
+            StartAbilityWithAnimation(want, static_cast<uint8_t>(type), true);
+        } else {
+            StartAbilityWithAnimation(want, static_cast<uint8_t>(type), false);
+        }
+        ClearWant(want);
+        delete want;
+        return true;
+#endif
+    }
+    return false;
+}
+}
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/applist/src/WaterfallDesktopFragment.cpp b/code/sdk/application/wearable/evb/nativeapp/nativeui/applist/src/WaterfallDesktopFragment.cpp
new file mode 100644 (file)
index 0000000..0a0a7ee
--- /dev/null
@@ -0,0 +1,146 @@
+/*
+ * Copyright (c) CompanyNameMagicTag 2025-2025. All rights reserved.
+ * Description: WaterfallDesktopFragment.cpp
+ * Author:
+ * Create: 2025-07-04
+ */
+
+#include "applist/WaterfallDesktopFragment.h"
+#include "applist/DesktopFactory.h"
+#include "common/image_cache_manager.h"
+#include "common/screen.h"
+
+namespace OHOS {
+REGIST_DESKTOP_STYLE(WATERFALL_STYLE, WaterfallDesktopFragment);
+
+void WaterfallDesktopFragment::OnCreateView(void* data)
+{
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "WaterfallDesktopFragment::OnCreateView ");
+    if (waterfallList_ == nullptr) {
+        waterfallList_ = new UIWaterfallList();
+    }
+    waterfallList_->SetPosition(0, 0, fragmentView_.GetWidth(), fragmentView_.GetHeight());
+    imgDistance_ = waterfallList_->GetWidth() * 0.25991; // 0.25991, empirical coefficient
+    imgSize_ = waterfallList_->GetWidth() * 0.23348; // 0.23348, empirical coefficient
+    waterfallList_->SetImageDistance(imgDistance_);
+    waterfallList_->SetImageSizeInCenter(imgSize_);
+    int16_t blankSize = waterfallList_->GetRelativeRect().GetWidth() > waterfallList_->GetRelativeRect().GetHeight() ?
+        waterfallList_->GetRelativeRect().GetWidth() / 2 : waterfallList_->GetRelativeRect().GetHeight() / 2; // 2, half
+    waterfallList_->SetThrowDrag(true);
+    uint16_t layoutHeight = static_cast<uint16_t>(imgDistance_ * Sin(60));
+    waterfallList_->SetReboundSize(layoutHeight); // 60: degree, row's layout height
+    waterfallList_->SetScrollBlankSize(layoutHeight, UIAbstractScroll::Direction::TOP);
+    waterfallList_->SetScrollBlankSize(Screen::GetInstance().GetHeight() / 2 - layoutHeight, // 2: half
+        UIAbstractScroll::Direction::BOTTOM);
+    waterfallList_->RequestFocus();
+    waterfallList_->SetRotateFactor(10); // 10, empirical coefficient
+    waterfallList_->SetOnRotateListener(this);
+    waterfallList_->SetTouchable(false);
+    waterfallList_->SetDraggable(false); // ensure that it can't be dragged during animation to avoid error display
+    fragmentView_.Add(waterfallList_);
+}
+
+void WaterfallDesktopFragment::OnDestroyView()
+{
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "WaterfallDesktopFragment::OnDestroyView");
+    ClearAppItemToList();
+    if (waterfallList_ != nullptr) {
+        delete waterfallList_;
+        waterfallList_ = nullptr;
+    }
+}
+
+void WaterfallDesktopFragment::OnResumeView()
+{
+    if (waterfallList_ != nullptr) {
+        waterfallList_->SetTouchable(true);
+        waterfallList_->SetDraggable(true); // resume touchable after transition animation
+    }
+}
+
+bool WaterfallDesktopFragment::OnClick(UIView &view, const ClickEvent &event)
+{
+    UNUSED(event);
+    WaterfallItemView *itemView = dynamic_cast<WaterfallItemView *>(&view);
+    UIWaterfallList *waterfallView = dynamic_cast<UIWaterfallList *>(itemView->GetParent());
+    if (waterfallView == nullptr || itemView == nullptr) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "waterfallView or itemView is nullptr");
+        return false;
+    }
+    AppViewId viewId = itemView->GetViewId();
+    char *uid = (char *)itemView->GetAppUid();
+    waterfallView->SetDraggable(false);
+    waterfallView->Scale(1.0f, itemView->GetViewIndex());
+
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "WaterfallDesktopFragment::OnClick viewid = %d", viewId);
+    return SwitchView(viewId, uid, TransitionType::TRANSITION_WATERFALL, APPLIST_STYLE);
+}
+
+void WaterfallDesktopFragment::AddAppItemToList(const AppItem &item)
+{
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "WaterfallDesktopFragment::AddAppItemToList");
+    WaterfallItemView *itemView = new WaterfallItemView();
+    if (!itemView->SetItemInfo(item)) {
+        delete itemView;
+        return;
+    }
+    itemView->SetTouchable(true);
+    itemView->SetOnClickListener(this);
+    waterfallList_->Add(itemView);
+    waterfallItemList_.PushBack(itemView);
+}
+
+void WaterfallDesktopFragment::ClearAppItemToList()
+{
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "WaterfallDesktopFragment::ClearAppItemToList");
+    if (waterfallList_ != nullptr) {
+        waterfallList_->RemoveAll();
+    }
+    ListNode<WaterfallItemView*>* viewNode = waterfallItemList_.Head();
+    while (viewNode != waterfallItemList_.End()) {
+        delete(viewNode->data_);
+        viewNode = viewNode->next_;
+    }
+    waterfallItemList_.Clear();
+}
+
+void WaterfallDesktopFragment::RefreshAppList(void)
+{
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "WaterfallDesktopFragment::RefreshAppList");
+    waterfallList_->LayoutChildren(true);
+}
+
+WaterfallItemView::~WaterfallItemView()
+{
+    if (itemInfo_.iconSmall == nullptr && itemInfo_.resPath != nullptr) {
+        ImageCacheManager::GetInstance().UnloadOneInMultiRes(itemInfo_.resId, itemInfo_.resPath);
+    }
+}
+
+bool WaterfallItemView::SetItemInfo(const AppItem &itemInfo)
+{
+    itemInfo_ = itemInfo;
+    if (itemInfo.iconSmall == nullptr && itemInfo.resPath != nullptr) {
+        ImageInfo* image = ImageCacheManager::GetInstance().LoadOneInMultiRes(itemInfo.resId, itemInfo.resPath);
+        if (image == nullptr) {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Load App Icon path %s Image %x fail",
+                itemInfo.resId, itemInfo.resPath);
+            return false;
+        }
+        SetSrc(image);
+    } else {
+        SetSrc(itemInfo.iconSmall);
+    }
+    return true;
+}
+
+AppViewId WaterfallItemView::GetViewId()
+{
+    return static_cast<AppViewId>(itemInfo_.id);
+}
+
+const char *WaterfallItemView::GetAppUid()
+{
+    return itemInfo_.uid;
+}
+}
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/blood/src/BloodChartPage.cpp b/code/sdk/application/wearable/evb/nativeapp/nativeui/blood/src/BloodChartPage.cpp
new file mode 100644 (file)
index 0000000..bc2a3f8
--- /dev/null
@@ -0,0 +1,350 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: BloodChartPage\r
+ * Create: 2025-06\r
+ */\r
+\r
+#include <string>\r
+#include <random>\r
+#include <iostream>\r
+#include <chrono>\r
+#include "components/ui_list_nested.h"\r
+#include "components/ui_chart.h"\r
+#include "components/ui_scroll_view_nested.h"\r
+#include "common/image_cache_manager.h"\r
+#include "NativeAbility.h"\r
+#include "SlicePageFactory.h"\r
+#include "wearable_log.h"\r
+#include "main/LoadImg.h"\r
+#include "AppViewIDs.h"\r
+#include "ui_resource_blood.h"\r
+#include "blood/BloodModel.h"\r
+#include "blood/BloodChartPage.h"\r
+\r
+namespace OHOS {\r
+static constexpr uint16_t PERSEC_BLOOD_FONT_SIZE = 60;\r
+static constexpr uint16_t PERSEC_BLOOD_X = 203;\r
+static constexpr uint16_t PERSEC_BLOOD_Y = 40;\r
+static constexpr uint16_t PERSEC_BLOOD_WIDTH = 260;\r
+static constexpr uint16_t PERSEC_BLOOD_HEIGHT = 53;\r
+static constexpr uint16_t PERSEC_BLOOD_TEXT_X = 188;\r
+static constexpr uint16_t PERSEC_BLOOD_TEXT_Y = 96;\r
+static constexpr uint16_t PERSEC_BLOOD_TEXT_HEIGHT = 64;\r
+static constexpr uint16_t COORDINATE_POINT_X = 70;\r
+static constexpr uint16_t COORDINATE_POINT_Y = 120;\r
+static constexpr uint16_t COORDINATE_HEIGHT = 156;\r
+static constexpr uint16_t COORDINATE_WIDTH = 330;\r
+static constexpr uint16_t BLOOD_LIMIT_FONT_SIZE = 30;\r
+static constexpr uint16_t TOP_TEXT_WIDTH = 232;\r
+static constexpr uint16_t TOP_TEXT_HEIGHT = 76;\r
+static constexpr uint16_t TOP_TEXT_X = 107;\r
+static constexpr uint16_t TOP_TEXT_Y = 352;\r
+static constexpr uint16_t BOTTOM_TEXT_WIDTH = 35;\r
+static constexpr uint16_t BOTTOM_TEXT_HEIGHT = 36;\r
+static constexpr uint16_t BLOOD_LIMIT_FONT_SIZE_ONE = 24;\r
+static constexpr uint16_t BLOOD_LABLE_FONT_SIZE_ONE = 16;\r
+static constexpr uint16_t BOTTOM_TEXT_WIDTH_ONE = 89;\r
+static constexpr uint16_t BOTTOM_TEXT_HEIGHT_ONE = 29;\r
+static constexpr uint16_t BOTTOM_TEXT_ONE_X = 188;\r
+static constexpr uint16_t BOTTOM_TEXT_ONE_Y = 105;\r
+static constexpr uint16_t LABLE_XAXIS1_POSION_X = 50;\r
+static constexpr uint16_t LABLE_XAXIS2_POSION_X = 210;\r
+static constexpr uint16_t LABLE_XAXIS3_POSION_X = 370;\r
+static constexpr uint16_t LABLE_XAXIS_POSION_Y = 275;\r
+static constexpr uint16_t BLOOD_XAXIS_SETMARKNUM = 40;\r
+static constexpr uint16_t BLOOD_YAXIS_SETMARKNUM = 3;\r
+static constexpr uint16_t BLOOD_XAXIS_RANGE_MAX = 4;\r
+static constexpr uint16_t BLOOD_YAXIS_RANGE_MAX = 200;\r
+static constexpr uint16_t BLOOD_STYLE_LINE_NUM = 3;\r
+static constexpr uint16_t BLOOD_CHART_IMAGE_POSION_X = 15;\r
+static constexpr uint16_t BLOOD_CHART_IMAGE_POSION_Y = 140;\r
+static constexpr uint16_t BLOOD_BIND_IMAGE_X = 140;\r
+static constexpr uint16_t BLOOD_BIND_IMAGE_Y = 50;\r
+static constexpr uint16_t BLOOD_BIND_IMAGE_WIDTH = 50;\r
+static constexpr uint16_t BLOOD_BIND_IMAGE_HEIGHT = 50;\r
+static constexpr char *BLOOD_RETEST_BUTTON = "retestButton";\r
+\r
+const int g_imageAnimatorInfo[BLOOD_ANIMATOR_IMAGE_NUM] = {\r
+    IMAGE_BLOOD_FRAME00, IMAGE_BLOOD_FRAME01, IMAGE_BLOOD_FRAME02, IMAGE_BLOOD_FRAME03, IMAGE_BLOOD_FRAME04,\r
+    IMAGE_BLOOD_FRAME05, IMAGE_BLOOD_FRAME06, IMAGE_BLOOD_FRAME07, IMAGE_BLOOD_FRAME08, IMAGE_BLOOD_FRAME09,\r
+    IMAGE_BLOOD_FRAME10, IMAGE_BLOOD_FRAME11, IMAGE_BLOOD_FRAME12, IMAGE_BLOOD_FRAME13, IMAGE_BLOOD_FRAME14,\r
+    IMAGE_BLOOD_FRAME15, IMAGE_BLOOD_FRAME16, IMAGE_BLOOD_FRAME17, IMAGE_BLOOD_FRAME18, IMAGE_BLOOD_FRAME19,\r
+    IMAGE_BLOOD_FRAME20, IMAGE_BLOOD_FRAME21, IMAGE_BLOOD_FRAME22, IMAGE_BLOOD_FRAME23, IMAGE_BLOOD_FRAME24,\r
+    IMAGE_BLOOD_FRAME25, IMAGE_BLOOD_FRAME26, IMAGE_BLOOD_FRAME27, IMAGE_BLOOD_FRAME28, IMAGE_BLOOD_FRAME29,\r
+};\r
+\r
+REGIST_SLICE_PAGE(VIEW_BLOOD, BLOOD_PAGES::BLOOD_CHART_PAGE, BloodChartPage, false);\r
+\r
+BloodChartPage::BloodChartPage()\r
+{\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BloodChartPage::BloodChartPage");\r
+}\r
+\r
+void BloodChartPage::OnStart(void *data)\r
+{\r
+    group_ = new UIViewGroup();\r
+    if (group_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new UIViewGroup fail");\r
+        return;\r
+    }\r
+    group_->SetPosition(0, 0);\r
+    group_->Resize(HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);\r
+\r
+    mainImg_ = new UIImageView();\r
+    if (mainImg_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new mainImg_ fail");\r
+        return;\r
+    }\r
+    mainImg_->SetPosition(0, 0);\r
+    mainImg_->SetStyle(STYLE_BACKGROUND_OPA, OPA_OPAQUE);\r
+    LOADIMG::LoadImageViewImg(mainImg_, BLOOD_IMAGE, IMAGE_BLOOD_BG);\r
+    group_->Add(mainImg_);\r
+\r
+    labelTitle_ = new UILabel();\r
+    if (labelTitle_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new labelTitle_ fail");\r
+        return;\r
+    }\r
+    labelTitle_->SetPosition(PERSEC_BLOOD_X, PERSEC_BLOOD_Y);\r
+    labelTitle_->Resize(PERSEC_BLOOD_WIDTH, PERSEC_BLOOD_HEIGHT);\r
+    labelTitle_->SetStyle(STYLE_TEXT_FONT, PERSEC_BLOOD_FONT_SIZE);\r
+    labelTitle_->SetLineBreakMode(UILabel::LINE_BREAK_ADAPT);\r
+    labelTitle_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+    labelTitle_->SetRollSpeed(0);\r
+    labelTitle_->SetFont(BOLD_VECTOR_FONT_FILENAME, PERSEC_BLOOD_FONT_SIZE);\r
+\r
+    labelTestTime_ = new UILabel();\r
+    if (labelTestTime_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new labelTestTime_ fail");\r
+        return;\r
+    }\r
+    labelTestTime_->SetText("刚刚");\r
+    labelTestTime_->SetPosition(BOTTOM_TEXT_ONE_X, BOTTOM_TEXT_ONE_Y, BOTTOM_TEXT_WIDTH_ONE, BOTTOM_TEXT_HEIGHT_ONE);\r
+    labelTestTime_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, BLOOD_LIMIT_FONT_SIZE_ONE);\r
+    labelTestTime_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+    labelTestTime_->SetStyle(STYLE_TEXT_COLOR, 0xFFCCCCCC);\r
+    labelTestTime_->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+\r
+    bloodMeasurementInfo info = BloodModel::GetInstance().GetBlood();\r
+    std::string strBlood = std::to_string(info.blood) + "%";\r
+    labelTitle_->SetText(strBlood.c_str());\r
+\r
+    dataSerial_ = new UIChartDataSerial();\r
+    if (dataSerial_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new dataSerial_ fail");\r
+        return;\r
+    }\r
+    dataSerial_->SetMaxDataCount(BLOOD_XAXIS_RANGE_MAX);\r
+    // 打桩数据,真实测量数据的存储和更新需要客户自实现\r
+    Point pointArray[BLOOD_XAXIS_RANGE_MAX] = {{0, info.blood}, {1, 75}, {2, 100}, {3, 80}};\r
+    dataSerial_->AddPoints(pointArray, BLOOD_XAXIS_RANGE_MAX);\r
+    dataSerial_->SetLineColor(Color::Green());\r
+    dataSerial_->SetFillColor(Color::Green());\r
+    dataSerial_->EnableGradient(true);\r
+\r
+    chartPillar_ = new UIChartPillar();\r
+    if (chartPillar_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new chartPillar_ fail");\r
+        return;\r
+    }\r
+    chartPillar_->SetPosition(COORDINATE_POINT_X, COORDINATE_POINT_Y);\r
+    chartPillar_->SetWidth(COORDINATE_WIDTH);\r
+    chartPillar_->SetHeight(COORDINATE_HEIGHT);\r
+    chartPillar_->SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
+    chartPillar_->SetStyle(STYLE_BACKGROUND_OPA, 0);\r
+    chartPillar_->SetStyle(STYLE_LINE_WIDTH, BLOOD_STYLE_LINE_NUM);\r
+\r
+    chartPillar_->GetXAxis().SetDataRange(0, BLOOD_XAXIS_RANGE_MAX);\r
+    chartPillar_->GetXAxis().SetMarkNum(BLOOD_XAXIS_SETMARKNUM);\r
+    chartPillar_->GetYAxis().SetDataRange(0, BLOOD_YAXIS_RANGE_MAX);\r
+    chartPillar_->GetYAxis().SetMarkNum(BLOOD_YAXIS_SETMARKNUM);\r
+    chartPillar_->GetYAxis().SetVisible(false);\r
+    chartPillar_->AddDataSerial(dataSerial_);\r
+    group_->Add(chartPillar_);\r
+\r
+    chartImg_ = new UIImageView();\r
+    if (chartImg_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new chartImg_ fail");\r
+        return;\r
+    }\r
+    chartImg_->SetPosition(BLOOD_CHART_IMAGE_POSION_X, BLOOD_CHART_IMAGE_POSION_Y);\r
+    LOADIMG::LoadImageViewImg(chartImg_, BLOOD_IMAGE, IMAGE_BLOOD_SCALE);\r
+    chartImg_->SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
+    group_->Add(chartImg_);\r
+\r
+    labelXAxisPointOne_ = new UILabel();\r
+    if (labelXAxisPointOne_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new labelXAxisPointOne_ fail");\r
+        return;\r
+    }\r
+    labelXAxisPointOne_->SetText("00:00");\r
+    labelXAxisPointOne_->SetPosition(LABLE_XAXIS1_POSION_X, LABLE_XAXIS_POSION_Y, BOTTOM_TEXT_WIDTH_ONE,\r
+                                     BOTTOM_TEXT_HEIGHT_ONE);\r
+    labelXAxisPointOne_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, BLOOD_LABLE_FONT_SIZE_ONE);\r
+    group_->Add(labelXAxisPointOne_);\r
+\r
+    labelXAxisPointTwo_ = new UILabel();\r
+    if (labelXAxisPointTwo_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new labelXAxisPointTwo_ fail");\r
+        return;\r
+    }\r
+    labelXAxisPointTwo_->SetText("12:00");\r
+    labelXAxisPointTwo_->SetPosition(LABLE_XAXIS2_POSION_X, LABLE_XAXIS_POSION_Y, BOTTOM_TEXT_WIDTH_ONE,\r
+                                     BOTTOM_TEXT_HEIGHT_ONE);\r
+    labelXAxisPointTwo_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, BLOOD_LABLE_FONT_SIZE_ONE);\r
+    group_->Add(labelXAxisPointTwo_);\r
+\r
+    labelXAxisPointThree_ = new UILabel();\r
+    if (labelXAxisPointThree_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new labelXAxisPointThree_ fail");\r
+        return;\r
+    }\r
+    labelXAxisPointThree_->SetText("24:00");\r
+    labelXAxisPointThree_->SetPosition(LABLE_XAXIS3_POSION_X, LABLE_XAXIS_POSION_Y, BOTTOM_TEXT_WIDTH_ONE,\r
+                                       BOTTOM_TEXT_HEIGHT_ONE);\r
+    labelXAxisPointThree_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, BLOOD_LABLE_FONT_SIZE_ONE);\r
+    group_->Add(labelXAxisPointThree_);\r
+\r
+    labelButtonRetest_ = new UILabelButton();\r
+    if (labelButtonRetest_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new labelButtonRetest_ fail");\r
+        return;\r
+    }\r
+    labelButtonRetest_->SetPosition(TOP_TEXT_X, TOP_TEXT_Y, TOP_TEXT_WIDTH, TOP_TEXT_HEIGHT);\r
+    LOADIMG::LoadBtnImage(labelButtonRetest_, BLOOD_IMAGE, IMAGE_BLOOD_AGAIN, IMAGE_BLOOD_AGAIN);\r
+    labelButtonRetest_->SetViewId(BLOOD_RETEST_BUTTON);\r
+    labelButtonRetest_->SetOnClickListener(this);\r
+    labelButtonRetest_->SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
+    labelButtonRetest_->SetStyleForState(STYLE_BACKGROUND_COLOR, Color::Black().full, UIButton::PRESSED);\r
+    labelButtonRetest_->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+    labelButtonRetest_->SetVisible(true);\r
+    group_->Add(labelButtonRetest_);\r
+\r
+    group_->Add(labelTitle_);\r
+    group_->Add(labelTestTime_);\r
+    group_->SetOnDragListener(this);\r
+    group_->SetDraggable(true);\r
+    group_->SetTouchable(true);\r
+    InitImageAnimator();\r
+\r
+    AddViewToPageContainer(group_);\r
+}\r
+\r
+bool BloodChartPage::OnDrag(UIView &view, const DragEvent &event)\r
+{\r
+    UNUSED(view);\r
+    if (event.GetDragDirection() == DragEvent::DIRECTION_TOP_TO_BOTTOM) {\r
+        NativeAbility::GetInstance().SwitchPageInSlice(BLOOD_PAGES::BLOOD_RESULT_PAGE,\r
+            TransitionType::TRANSITION_INVALID, false);\r
+    } else if (event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT) {\r
+        NativeAbility::GetInstance().SwitchPageInSlice(BLOOD_PAGES::BLOOD_MAIN_PAGE,\r
+            TransitionType::TRANSITION_INVALID, false);\r
+    }\r
+    return true;\r
+}\r
+\r
+bool BloodChartPage::OnClick(UIView &view, const ClickEvent &event)\r
+{\r
+    UNUSED(event);\r
+    if (strcmp (view.GetViewId(), BLOOD_RETEST_BUTTON) == 0) {\r
+        NativeAbility::GetInstance().SwitchPageInSlice(BLOOD_PAGES::BLOOD_READY_PAGE,\r
+                                                       TransitionType::TRANSITION_INVALID, true);\r
+    }\r
+    return true;\r
+}\r
+\r
+void BloodChartPage::InitImageAnimator()\r
+{\r
+    imageAnimator_ = new UIImageAnimatorView();\r
+    if (imageAnimator_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new imageAnimator_ fail");\r
+        return;\r
+    }\r
+    for (uint8_t i = 0; i < BLOOD_ANIMATOR_IMAGE_NUM; i++) {\r
+        imageAnimatorImageInfo_[i].imageInfo =\r
+            ImageCacheManager::GetInstance().LoadOneInMultiRes(g_imageAnimatorInfo[i], BLOOD_IMAGE);\r
+        imageAnimatorImageInfo_[i].imageType = IMG_SRC_IMAGE_INFO;\r
+        imageAnimatorImageInfo_[i].pos.x = BLOOD_BIND_IMAGE_X;\r
+        imageAnimatorImageInfo_[i].pos.y = BLOOD_BIND_IMAGE_Y;\r
+        imageAnimatorImageInfo_[i].width = BLOOD_BIND_IMAGE_WIDTH;\r
+        imageAnimatorImageInfo_[i].height = BLOOD_BIND_IMAGE_HEIGHT;\r
+    }\r
+\r
+    imageAnimator_->SetPosition(PERSEC_BLOOD_TEXT_X, PERSEC_BLOOD_TEXT_Y);\r
+    imageAnimator_->SetImageAnimatorSrc(imageAnimatorImageInfo_,\r
+                                        BLOOD_ANIMATOR_IMAGE_NUM, BLOOD_ANIMATOR_IMAGE_UPDATE);\r
+    imageAnimator_->SetRepeat(true);\r
+    imageAnimator_->SetAutoEnable(false);\r
+    imageAnimator_->SetResizeMode(UIImageView::FILL);\r
+    imageAnimator_->Start();\r
+    imageAnimator_->LayoutCenterOfParent();\r
+    imageAnimator_->SetDraggable(true);\r
+    group_->Add(imageAnimator_);\r
+}\r
+\r
+BloodChartPage::~BloodChartPage()\r
+{\r
+    if (group_ != nullptr) {\r
+        group_->RemoveAll();\r
+        delete group_;\r
+        group_ = nullptr;\r
+    }\r
+\r
+    if (labelTitle_ != nullptr) {\r
+        delete labelTitle_;\r
+        labelTitle_ = nullptr;\r
+    }\r
+\r
+    if (labelButtonRetest_ != nullptr) {\r
+        delete labelButtonRetest_;\r
+        labelButtonRetest_ = nullptr;\r
+    }\r
+\r
+    if (labelTestTime_ != nullptr) {\r
+        delete labelTestTime_;\r
+        labelTestTime_ = nullptr;\r
+    }\r
+\r
+    if (dataSerial_ != nullptr) {\r
+        delete dataSerial_;\r
+        dataSerial_ = nullptr;\r
+    }\r
+\r
+    if (chartPillar_ != nullptr) {\r
+        delete chartPillar_;\r
+        chartPillar_ = nullptr;\r
+    }\r
+\r
+    if (labelXAxisPointOne_ != nullptr) {\r
+        delete labelXAxisPointOne_;\r
+        labelXAxisPointOne_ = nullptr;\r
+    }\r
+\r
+    if (labelXAxisPointTwo_ != nullptr) {\r
+        delete labelXAxisPointTwo_;\r
+        labelXAxisPointTwo_ = nullptr;\r
+    }\r
+\r
+    if (labelXAxisPointThree_ != nullptr) {\r
+        delete labelXAxisPointThree_;\r
+        labelXAxisPointThree_ = nullptr;\r
+    }\r
+\r
+    if (mainImg_ != nullptr) {\r
+        delete mainImg_;\r
+        mainImg_ = nullptr;\r
+    }\r
+\r
+    if (chartImg_ != nullptr) {\r
+        delete chartImg_;\r
+        chartImg_ = nullptr;\r
+    }\r
+\r
+    if (imageAnimator_ != nullptr) {\r
+        delete imageAnimator_;\r
+        imageAnimator_ = nullptr;\r
+    }\r
+    ImageCacheManager::GetInstance().UnloadSingleRes(BLOOD_IMAGE);\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BloodChartPage::~BloodChartPage");\r
+}\r
+}
\ No newline at end of file
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/blood/src/BloodExplainPage.cpp b/code/sdk/application/wearable/evb/nativeapp/nativeui/blood/src/BloodExplainPage.cpp
new file mode 100644 (file)
index 0000000..25e8bd2
--- /dev/null
@@ -0,0 +1,225 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: BloodExplainPage\r
+ * Create: 2025-06\r
+ */\r
+\r
+#include <string>\r
+#include "ui_test_group.h"\r
+#include "main/LoadImg.h"\r
+#include "ui_resource_blood.h"\r
+#include "blood/BloodPresenter.h"\r
+#include "blood/BloodView.h"\r
+#include "blood/BloodExplainPage.h"\r
+\r
+namespace OHOS {\r
+static BloodExplainPage *g_pBloodCalcPage = nullptr;\r
+static const char *BLOOD_LABEL_ONE = (char *)"血氧饱和度";\r
+static const char *BLOOD_LABEL_TWO =\r
+    (char\r
+         *)"血氧饱和度(SpO2)是血液中氧和血红蛋白(HbO2)的容量占全部血红蛋白的百分比,是维持人体正常机制的重要生理参数。";\r
+static const char *BLOOD_LABEL_THREE = (char *)"测量须知";\r
+static const char *BLOOD_LABEL_FOUR =\r
+    (char *)"本设备支持血氧测量范围为70%~100%"\r
+            "。在穿戴设备上启动血氧测量后,为确保测量准确,须按佩戴指引进行操作。受外界因素影响("\r
+            "血流灌注低、手臂毛发多、有纹身、低温等)影响,测量精度可能会下降,测量结果仅供参考,不作为医疗诊断依据。";\r
+static constexpr uint16_t BLOOD_FIRST_LABEL_FONT = 38;\r
+static constexpr uint16_t BLOOD_LABEL_FIRST_X = 45;\r
+static constexpr uint16_t BLOOD_LABEL_FIRST_Y = 40;\r
+static constexpr uint16_t BLOOD_LABEL_SECOND_X = 45;\r
+static constexpr uint16_t BLOOD_LABEL_SECOND_Y = 98;\r
+static constexpr uint16_t BLOOD_LABEL_THIRD_X = 45;\r
+static constexpr uint16_t BLOOD_LABEL_THIRD_Y = 514;\r
+static constexpr uint16_t BLOOD_LABEL_FOUR_X = 45;\r
+static constexpr uint16_t BLOOD_LABEL_FOUR_Y = 564;\r
+static constexpr uint16_t BLOOD_LABEL_FIRST_WIDTH = 350;\r
+static constexpr uint16_t BLOOD_LABEL_FIRST_HEIGHT = 400;\r
+static constexpr uint16_t BLOOD_LABEL_POSITION_WIDTH = 200;\r
+static constexpr uint16_t BLOOD_LABEL_POSITION_HEIGHT = 60;\r
+static constexpr uint16_t BLOOD_LABEL2_POSITION_Y = 404;\r
+static constexpr uint16_t BLOOD_BUTTONLEVEL_POSITION_X = 127;\r
+static constexpr uint16_t BLOOD_BUTTONLABLE_POSITION_X = 217;\r
+static constexpr uint16_t BLOOD_BUTTONLEVEL2_POSITION_Y = 440;\r
+static constexpr uint16_t BLOOD_BUTTONLEVEL3_POSITION_Y = 474;\r
+static constexpr uint16_t LIST_BLANK_SIZE = 50;\r
+static constexpr uint16_t INDEX_0 = 0;\r
+static constexpr uint16_t INDEX_1 = 1;\r
+static constexpr uint16_t INDEX_2 = 2;\r
+static constexpr uint16_t INDEX_3 = 3;\r
+REGIST_SLICE_PAGE(VIEW_BLOOD, BLOOD_PAGES::BLOOD_EXPLAIN_PAGE, BloodExplainPage, false);\r
+\r
+BloodExplainPage::BloodExplainPage()\r
+{\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BloodExplainPage::BloodExplainPage");\r
+}\r
+\r
+BloodExplainPage::~BloodExplainPage()\r
+{\r
+    if (scrollGroup_ != nullptr) {\r
+        scrollGroup_->RemoveAll();\r
+        delete scrollGroup_;\r
+        scrollGroup_ = nullptr;\r
+    }\r
+\r
+    if (imgNormal_ != nullptr) {\r
+        delete imgNormal_;\r
+        imgNormal_ = nullptr;\r
+    }\r
+\r
+    if (imgGeneral_ != nullptr) {\r
+        delete imgGeneral_;\r
+        imgGeneral_ = nullptr;\r
+    }\r
+\r
+    if (imgAbnormal_ != nullptr) {\r
+        delete imgAbnormal_;\r
+        imgAbnormal_ = nullptr;\r
+    }\r
+\r
+    if (labelNormal_ != nullptr) {\r
+        delete labelNormal_;\r
+        labelNormal_ = nullptr;\r
+    }\r
+\r
+    if (labelGeneral_ != nullptr) {\r
+        delete labelGeneral_;\r
+        labelGeneral_ = nullptr;\r
+    }\r
+\r
+    if (labelAbnormal_ != nullptr) {\r
+        delete labelAbnormal_;\r
+        labelAbnormal_ = nullptr;\r
+    }\r
+\r
+    for (int i = 0; i < LABEL_DES_COUNT; i++) {\r
+        if (labelDes_[i] != nullptr) {\r
+            delete labelDes_[i];\r
+            labelDes_[i] = nullptr;\r
+        }\r
+    }\r
+    ImageCacheManager::GetInstance().UnloadSingleRes(BLOOD_IMAGE);\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BloodExplainPage::~BloodExplainPage");\r
+}\r
+\r
+void BloodExplainPage::OnStart(void *data)\r
+{\r
+    scrollGroup_ = new UIScrollView();\r
+    if (scrollGroup_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new scrollGroup_ fail");\r
+        return;\r
+    }\r
+    scrollGroup_->SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);\r
+    scrollGroup_->SetThrowDrag(true);\r
+    scrollGroup_->SetScrollBlankSize(LIST_BLANK_SIZE);\r
+    scrollGroup_->SetOnDragListener(this);\r
+    scrollGroup_->SetDraggable(true);\r
+    scrollGroup_->SetTouchable(true);\r
+    if (!InitSimilarLabel(INDEX_0, BLOOD_LABEL_FIRST_X, BLOOD_LABEL_FIRST_Y, BLOOD_LABEL_ONE)) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new InitSimilarLabel[INDEX_0] error");\r
+    }\r
+    if (!InitSimilarLabel(INDEX_1, BLOOD_LABEL_SECOND_X, BLOOD_LABEL_SECOND_Y, BLOOD_LABEL_TWO)) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new InitSimilarLabel[INDEX_1] error");\r
+    }\r
+    if (!InitSimilarLabel(INDEX_2, BLOOD_LABEL_THIRD_X, BLOOD_LABEL_THIRD_Y, BLOOD_LABEL_THREE)) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new InitSimilarLabel[INDEX_2] error");\r
+    }\r
+    if (!InitSimilarLabel(INDEX_3, BLOOD_LABEL_FOUR_X, BLOOD_LABEL_FOUR_Y, BLOOD_LABEL_FOUR)) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new InitSimilarLabel[INDEX_3] error");\r
+    }\r
+\r
+    imgNormal_ = new UIImageView();\r
+    if (imgNormal_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new imgNormal_ fail");\r
+        return;\r
+    }\r
+    imgNormal_->SetPosition(BLOOD_BUTTONLEVEL_POSITION_X, BLOOD_LABEL2_POSITION_Y);\r
+    LOADIMG::LoadImageViewImg(imgNormal_, BLOOD_IMAGE, IMAGE_BLOOD_NORMAL);\r
+    scrollGroup_->Add(imgNormal_);\r
+\r
+    labelNormal_ = new UILabel();\r
+    if (labelNormal_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new labelNormal_ fail");\r
+        return;\r
+    }\r
+    labelNormal_->SetText(">=94%");\r
+    labelNormal_->SetPosition(BLOOD_BUTTONLABLE_POSITION_X, BLOOD_LABEL2_POSITION_Y);\r
+    labelNormal_->Resize(BLOOD_LABEL_POSITION_WIDTH, BLOOD_LABEL_POSITION_HEIGHT);\r
+    labelNormal_->SetTextColor(Color::White());\r
+    scrollGroup_->Add(labelNormal_);\r
+\r
+    imgGeneral_ = new UIImageView();\r
+    if (imgGeneral_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new imgGeneral_ fail");\r
+        return;\r
+    }\r
+    imgGeneral_->SetPosition(BLOOD_BUTTONLEVEL_POSITION_X, BLOOD_BUTTONLEVEL2_POSITION_Y);\r
+    LOADIMG::LoadImageViewImg(imgGeneral_, BLOOD_IMAGE, IMAGE_BLOOD_COMMON);\r
+    scrollGroup_->Add(imgGeneral_);\r
+\r
+    labelGeneral_ = new UILabel();\r
+    if (labelGeneral_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new labelGeneral_ fail");\r
+        return;\r
+    }\r
+    labelGeneral_->SetText("70%~93%");\r
+    labelGeneral_->SetPosition(BLOOD_BUTTONLABLE_POSITION_X, BLOOD_BUTTONLEVEL2_POSITION_Y);\r
+    labelGeneral_->Resize(BLOOD_LABEL_POSITION_WIDTH, BLOOD_LABEL_POSITION_HEIGHT);\r
+    labelGeneral_->SetTextColor(Color::White());\r
+    scrollGroup_->Add(labelGeneral_);\r
+\r
+    imgAbnormal_ = new UIImageView();\r
+    if (imgAbnormal_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new imgAbnormal_ fail");\r
+        return;\r
+    }\r
+    imgAbnormal_->SetPosition(BLOOD_BUTTONLEVEL_POSITION_X, BLOOD_BUTTONLEVEL3_POSITION_Y);\r
+    LOADIMG::LoadImageViewImg(imgAbnormal_, BLOOD_IMAGE, IMAGE_BLOOD_ABNORMAL);\r
+    scrollGroup_->Add(imgAbnormal_);\r
+\r
+    labelAbnormal_ = new UILabel();\r
+    if (labelAbnormal_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new labelAbnormal_ fail");\r
+        return;\r
+    }\r
+    labelAbnormal_->SetText("<70%");\r
+    labelAbnormal_->SetPosition(BLOOD_BUTTONLABLE_POSITION_X, BLOOD_BUTTONLEVEL3_POSITION_Y);\r
+    labelAbnormal_->Resize(BLOOD_LABEL_POSITION_WIDTH, BLOOD_LABEL_POSITION_HEIGHT);\r
+    labelAbnormal_->SetTextColor(Color::White());\r
+    scrollGroup_->Add(labelAbnormal_);\r
+    AddViewToPageContainer(scrollGroup_);\r
+}\r
+\r
+bool BloodExplainPage::InitSimilarLabel(int16 num, int16 labelX, int16 labelY, const char *labelText)\r
+{\r
+    if (num < 0 || num >= LABEL_DES_COUNT) {\r
+        return false;\r
+    }\r
+    labelDes_[num] = new UILabel();\r
+    if (labelDes_[num] == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new labelDes_[%d] error", num);\r
+        return false;\r
+    }\r
+    labelDes_[num]->SetPosition(labelX, labelY, BLOOD_LABEL_FIRST_WIDTH, BLOOD_LABEL_FIRST_HEIGHT);\r
+    labelDes_[num]->SetLineBreakMode(UILabel::LINE_BREAK_WRAP);\r
+    labelDes_[num]->SetText(labelText);\r
+    if (num == INDEX_0) {\r
+        labelDes_[num]->SetFont(BOLD_VECTOR_FONT_FILENAME, BLOOD_FIRST_LABEL_FONT);\r
+    } else {\r
+        labelDes_[num]->SetFont(DEFAULT_VECTOR_FONT_FILENAME, BLOOD_FIRST_LABEL_FONT);\r
+    }\r
+    labelDes_[num]->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+    scrollGroup_->Add(labelDes_[num]);\r
+    return true;\r
+}\r
+\r
+bool BloodExplainPage::OnDrag(UIView &view, const DragEvent &event)\r
+{\r
+    UNUSED(view);\r
+    if ((event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT) && (event.GetDeltaX() > X_DRAG_OFFSET) &&\r
+        (event.GetDeltaX() > (DOUBLES * MATH_ABS(event.GetDeltaY())))) {\r
+        NativeAbility::GetInstance().SwitchPageInSlice(BLOOD_PAGES::BLOOD_RESULT_PAGE,\r
+            TransitionType::TRANSITION_INVALID, false);\r
+    }\r
+    return true;\r
+}\r
+}\r
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/blood/src/BloodMainPage.cpp b/code/sdk/application/wearable/evb/nativeapp/nativeui/blood/src/BloodMainPage.cpp
new file mode 100644 (file)
index 0000000..07b8e36
--- /dev/null
@@ -0,0 +1,272 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: BloodMainPage\r
+ * Create: 2025-06\r
+ */\r
+\r
+#include <string>\r
+#include <chrono>\r
+#include <sstream>\r
+#include <string>\r
+#include <iomanip>\r
+#include "components/root_view.h"\r
+#include "sys/time.h"\r
+#include "ui_test_group.h"\r
+#include "main/LoadImg.h"\r
+#include "securec.h"\r
+#include "ui_resource_blood.h"\r
+#include "blood/BloodPresenter.h"\r
+#include "blood/BloodMainPage.h"\r
+\r
+namespace OHOS {\r
+static constexpr uint16_t BLOOD_BUTTON_POSITION_X = 110;\r
+static constexpr uint16_t BLOOD_BUTTON_HEIGHT = 76;\r
+static constexpr uint16_t BLOOD_TITLE_POSITION_X = 195;\r
+static constexpr uint16_t BLOOD_TITLE_POSITION_Y = 40;\r
+static constexpr uint16_t BLOOD_TITLE_WIDTH = 260;\r
+static constexpr uint16_t BLOOD_TITLE_HEIGHT = 53;\r
+static constexpr uint16_t BLOOD_TITLE_FONT_SIZE = 38;\r
+static constexpr uint16_t BLOOD_BUTTON_TWO_POSITION_Y = 330;\r
+static constexpr uint16_t BLOOD_BUTTON_TWO_WIDTH = 232;\r
+static constexpr uint16_t BLOOD_LABLETEST_POSITION_X = 158;\r
+static constexpr uint16_t BLOOD_LABLETEST_POSITION_Y = 281;\r
+static constexpr uint16_t BLOOD_LABLETEST_WIDTH = 200;\r
+static constexpr uint16_t BLOOD_LABLETEST_HEIGHT = 40;\r
+static constexpr uint16_t BLOOD_LABLETEST_SIZE_FONT = 24;\r
+static constexpr uint16_t VIDEO_WIDTH = 454;\r
+static constexpr uint16_t VIDEO_HEIGHT = 454;\r
+static constexpr uint16_t STRIDE_ALIGNMENT_VALUE = 128;\r
+static constexpr uint16_t BUFFER_QUEUE_SIZE = 3;\r
+static constexpr uint16_t JPEG_HEIGHT_DIVISOR = 2;\r
+static constexpr uint16_t JPEG_WIDTH_BYTE_ALIGNMENT = 128;\r
+static constexpr uint16_t JPEG_HEIGHT_BYTE_ALIGNMENT = 16;\r
+static constexpr uint16_t BLOOD_BUTTON_FONT_SIZE = 35;\r
+static constexpr uint16_t BLOOD_DATE_TIME_ONE = 90;\r
+static constexpr uint16_t BLOOD_DATE_TIME_TWO = 3000;\r
+static constexpr uint16_t BLOOD_DATE_TIME_THREE = 60;\r
+static constexpr uint16_t BLOOD_DATE_TIME_FOUR = 3600;\r
+static constexpr uint16_t BLOOD_OPA = 50;\r
+static constexpr char *BLOOD_START_BUTTON = "startButton";\r
+\r
+REGIST_SLICE_PAGE(VIEW_BLOOD, BLOOD_PAGES::BLOOD_MAIN_PAGE, BloodMainPage, true);\r
+\r
+BloodMainPage::BloodMainPage()\r
+{\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BloodMainPage::BloodMainPage");\r
+}\r
+\r
+BloodMainPage::~BloodMainPage()\r
+{\r
+    if (group_ != nullptr) {\r
+        group_->RemoveAll();\r
+        delete group_;\r
+        group_ = nullptr;\r
+    }\r
+\r
+    if (buttonStart_ != nullptr) {\r
+        delete buttonStart_;\r
+        buttonStart_ = nullptr;\r
+    }\r
+\r
+    if (labelTitle_ != nullptr) {\r
+        delete labelTitle_;\r
+        labelTitle_ = nullptr;\r
+    }\r
+\r
+    if (labelPreTest_ != nullptr) {\r
+        delete labelPreTest_;\r
+        labelPreTest_ = nullptr;\r
+    }\r
+\r
+    if (videoPlay_ != nullptr) {\r
+        videoPlay_->StopVideoPlay();\r
+        delete videoPlay_;\r
+        videoPlay_ = nullptr;\r
+    }\r
+\r
+    if (surfaceView_ != nullptr) {\r
+        delete surfaceView_;\r
+        surfaceView_ = nullptr;\r
+    }\r
+\r
+    ImageCacheManager::GetInstance().UnloadSingleRes(BLOOD_IMAGE);\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BloodMainPage::~BloodMainPage");\r
+}\r
+\r
+void BloodMainPage::OnStart(void *data)\r
+{\r
+    group_ = new UIViewGroup();\r
+    if (group_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new group_ fail");\r
+        return;\r
+    }\r
+    group_->SetPosition(0, 0);\r
+    group_->Resize(HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);\r
+    group_->SetOnDragListener(this);\r
+    group_->SetDraggable(true);\r
+    group_->SetTouchable(true);\r
+    group_->SetOnDragListener(this);\r
+\r
+    InitImageAnimator();\r
+\r
+    buttonStart_ = new UILabelButton();\r
+    if (buttonStart_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new buttonStart_ fail");\r
+        return;\r
+    }\r
+    buttonStart_->SetPosition(BLOOD_BUTTON_POSITION_X, BLOOD_BUTTON_TWO_POSITION_Y);\r
+    buttonStart_->Resize(BLOOD_BUTTON_TWO_WIDTH, BLOOD_BUTTON_HEIGHT);\r
+    buttonStart_->SetViewId(BLOOD_START_BUTTON);\r
+    buttonStart_->SetOnClickListener(this);\r
+    buttonStart_->SetStyleForState(STYLE_BACKGROUND_COLOR, 0x14FFFFFF, UIButton::RELEASED);\r
+    buttonStart_->SetStyleForState(STYLE_BACKGROUND_COLOR, 0x14FFFFFF, UIButton::PRESSED);\r
+    buttonStart_->SetStyleForState(STYLE_BACKGROUND_COLOR, 0x14FFFFFF, UIButton::INACTIVE);\r
+    buttonStart_->SetText("开始测量");\r
+    buttonStart_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, BLOOD_BUTTON_FONT_SIZE);\r
+    buttonStart_->SetVisible(true);\r
+\r
+    labelTitle_ = new UILabel();\r
+    if (labelTitle_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new labelTitle_ fail");\r
+        return;\r
+    }\r
+    labelTitle_->SetPosition(BLOOD_TITLE_POSITION_X, BLOOD_TITLE_POSITION_Y, BLOOD_TITLE_WIDTH, BLOOD_TITLE_HEIGHT);\r
+    labelTitle_->SetText("血氧");\r
+    labelTitle_->SetFont(BOLD_VECTOR_FONT_FILENAME, BLOOD_TITLE_FONT_SIZE);\r
+    SetTestTime();\r
+    group_->Add(buttonStart_);\r
+    group_->Add(labelPreTest_);\r
+    group_->Add(labelTitle_);\r
+\r
+    AddViewToPageContainer(group_);\r
+}\r
+\r
+void BloodMainPage::OnResume()\r
+{\r
+    videoPlay_->StartVideoPlay();\r
+}\r
+\r
+void BloodMainPage::OnPause()\r
+{\r
+    videoPlay_->StopVideoPlay();\r
+}\r
+\r
+void BloodMainPage::SetTestTime()\r
+{\r
+    labelPreTest_ = new UILabel();\r
+    if (labelPreTest_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new labelPreTest_ fail");\r
+        return;\r
+    }\r
+    labelPreTest_->SetPosition(BLOOD_LABLETEST_POSITION_X, BLOOD_LABLETEST_POSITION_Y, BLOOD_LABLETEST_WIDTH,\r
+                               BLOOD_LABLETEST_HEIGHT);\r
+    labelPreTest_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, BLOOD_LABLETEST_SIZE_FONT);\r
+    labelPreTest_->SetStyle(STYLE_TEXT_COLOR, 0xFFCCCCCC);\r
+    labelPreTest_->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+    labelPreTest_->SetVisible(false);\r
+    bloodMeasurementInfo info = BloodModel::GetInstance().GetBlood();\r
+    struct timeval current_time;\r
+    if (info.blood == 0) {\r
+        info.blood = BLOOD_DATE_TIME_ONE;\r
+        gettimeofday(&current_time, nullptr);\r
+        int64_t now = current_time.tv_sec;\r
+        struct timeval time1;\r
+        time1.tv_sec = now - BLOOD_DATE_TIME_TWO;\r
+        info.time = time1;\r
+    }\r
+    if (info.blood != 0) {\r
+        struct timeval tv = info.time;\r
+        std::time_t time = tv.tv_sec;\r
+        std::tm *tm_info = std::localtime(&time);\r
+        std::stringstream ss;\r
+        if (IsToday(tv)) {\r
+            gettimeofday(&current_time, nullptr);\r
+            int64_t now = current_time.tv_sec;\r
+            int64_t diff_seconds = now - tv.tv_sec;\r
+            if (diff_seconds < 0) {\r
+                ss << info.blood << "%  "\r
+                   << "刚刚";\r
+            } else if (diff_seconds < BLOOD_DATE_TIME_THREE) {\r
+                ss << info.blood << "%  (" << diff_seconds << "秒前)";\r
+            } else if (diff_seconds < BLOOD_DATE_TIME_FOUR) {\r
+                int minutes = diff_seconds / BLOOD_DATE_TIME_THREE;\r
+                ss << info.blood << "%  (" << minutes << "分钟前)";\r
+            } else {\r
+                int hours = diff_seconds / BLOOD_DATE_TIME_FOUR;\r
+                ss << info.blood << "%  (" << hours << "小时前)";\r
+            }\r
+        } else {\r
+            ss << info.blood << "%  " << (tm_info->tm_mon + 1) << "/" << tm_info->tm_mday;\r
+        }\r
+        labelPreTest_->SetText(ss.str().c_str());\r
+        int textWidth = labelPreTest_->GetTextWidth();\r
+        int posX = (HORIZONTAL_RESOLUTION - textWidth) / 2;\r
+        labelPreTest_->SetX(posX);\r
+        labelPreTest_->SetVisible(true);\r
+    }\r
+}\r
+\r
+bool BloodMainPage::IsToday(const struct timeval &tv)\r
+{\r
+    time_t now = time(nullptr);\r
+    std::tm *now_tm = localtime(&now);\r
+    std::time_t given_time = tv.tv_sec;\r
+    std::tm *given_tm = std::localtime(&given_time);\r
+\r
+    return (now_tm->tm_year == given_tm->tm_year) && (now_tm->tm_mon == given_tm->tm_mon) &&\r
+           (now_tm->tm_mday == given_tm->tm_mday);\r
+}\r
+\r
+bool BloodMainPage::OnDrag(UIView &view, const DragEvent &event)\r
+{\r
+    UNUSED(view);\r
+    if ((event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT) && (event.GetDeltaX() > X_DRAG_OFFSET) &&\r
+        (event.GetDeltaX() > (DOUBLES * MATH_ABS(event.GetDeltaY())))) {\r
+        NativeAbility::GetInstance().ChangeSliceToApplist();\r
+    }\r
+    return true;\r
+}\r
+\r
+bool BloodMainPage::OnClick(UIView &view, const ClickEvent &event)\r
+{\r
+    if (strcmp(view.GetViewId(), BLOOD_START_BUTTON) == 0) {\r
+        NativeAbility::GetInstance().SwitchPageInSlice(BLOOD_PAGES::BLOOD_READY_PAGE,\r
+            TransitionType::TRANSITION_INVALID, false);\r
+    }\r
+    UNUSED(event);\r
+    return true;\r
+}\r
+\r
+void BloodMainPage::InitImageAnimator()\r
+{\r
+    surfaceView_ = new UILiteSurfaceView();\r
+    if (surfaceView_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "InitImageAnimator new UILiteSurfaceView fail");\r
+        return;\r
+    }\r
+    colorKey_.full = 0xff202020;\r
+    surfaceView_->SetPosition(0, 0, VIDEO_WIDTH, VIDEO_HEIGHT);\r
+    surfaceView_->SetPreview(ImageCacheManager::GetInstance().LoadOneInMultiRes(IMAGE_BLOOD_PREVIEW1, BLOOD_IMAGE));\r
+    surfaceView_->SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
+    surfaceView_->SetSurfaceColorkey(colorKey_);\r
+    group_->Add(surfaceView_);\r
+\r
+    Surface *surface = surfaceView_->GetSurface();\r
+    surface->SetStrideAlignment(STRIDE_ALIGNMENT_VALUE);\r
+    surface->SetWidthAndHeight(VIDEO_WIDTH, VIDEO_HEIGHT);\r
+    surface->SetQueueSize(BUFFER_QUEUE_SIZE);\r
+    surface->SetFormat(PIXEL_FMT_YCBCR_420_SP);\r
+\r
+    int32_t ySize = ALIGN_BYTE(VIDEO_WIDTH, JPEG_WIDTH_BYTE_ALIGNMENT) * VIDEO_HEIGHT;\r
+    int32_t uvSize = ALIGN_BYTE(VIDEO_WIDTH, JPEG_WIDTH_BYTE_ALIGNMENT) *\r
+                     ALIGN_BYTE(VIDEO_HEIGHT, JPEG_HEIGHT_BYTE_ALIGNMENT) / JPEG_HEIGHT_DIVISOR;\r
+    int32_t bufferSize = ySize + uvSize;\r
+    surface->SetSize(bufferSize);\r
+    std::string uri("/user/res/video/bloodBackGround.mp4");\r
+    videoPlay_ = new MediaVideoPlay(surface, nullptr, uri, false);\r
+    if (videoPlay_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new videoPlay_ fail");\r
+        return;\r
+    }\r
+}\r
+}\r
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/blood/src/BloodMeasurementPage.cpp b/code/sdk/application/wearable/evb/nativeapp/nativeui/blood/src/BloodMeasurementPage.cpp
new file mode 100644 (file)
index 0000000..83b6c5e
--- /dev/null
@@ -0,0 +1,279 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: BloodMeasurementPage\r
+ * Create: 2025-06\r
+ */\r
+\r
+#include <string>\r
+#include <random>\r
+#include <chrono>\r
+#include "ui_test_group.h"\r
+#include "gfx_utils/graphic_math.h"\r
+#include "main/LoadImg.h"\r
+#include "surface.h"\r
+#include "settings/model/SettingDisplayModel.h"\r
+#include "ui_resource_blood.h"\r
+#include "blood/BloodPresenter.h"\r
+#include "blood/BloodMeasurementPage.h"\r
+\r
+namespace OHOS {\r
+static constexpr uint16_t BLOOD_BUTTON_TWO_POSITION_X = 152;\r
+static constexpr uint16_t BLOOD_BUTTON_TWO_POSITION_Y = 330;\r
+static constexpr uint16_t BLOOD_LABEL_FRONT = 72;\r
+static constexpr uint16_t BLOOD_LABEL_FRONT_BOTTOM = 36;\r
+static constexpr uint16_t BLOOD_LABEL2_POSITION_X = 183;\r
+static constexpr uint16_t BLOOD_LABEL2_POSITION_Y = 162;\r
+static constexpr uint16_t BLOOD_LABEL2_WIDTH = 180;\r
+static constexpr uint16_t BLOOD_LABEL2_HEIGHT = 42;\r
+static constexpr uint16_t VIDEO_WIDTH = 454;\r
+static constexpr uint16_t VIDEO_HEIGHT = 454;\r
+static constexpr uint16_t STRIDE_ALIGNMENT_VALUE = 128;\r
+static constexpr uint16_t BUFFER_QUEUE_SIZE = 3;\r
+static constexpr uint16_t JPEG_HEIGHT_DIVISOR = 2;\r
+static constexpr uint16_t JPEG_WIDTH_BYTE_ALIGNMENT = 128;\r
+static constexpr uint16_t JPEG_HEIGHT_BYTE_ALIGNMENT = 16;\r
+static constexpr uint16_t BLOOD_LABLETITLE_POSITION_X = 195;\r
+static constexpr uint16_t BLOOD_LABLETITLE_POSITION_Y = 40;\r
+static constexpr uint16_t BLOOD_LABLETITLE_WIDTH = 260;\r
+static constexpr uint16_t BLOOD_LABLETITLE_HEIGHT = 53;\r
+static constexpr uint16_t BLOOD_LABLETITLE_FONT_SIZE = 38;\r
+static constexpr uint16_t BLOOD_TIME = 15;\r
+static constexpr uint16_t BLOOD_NUM = 60;\r
+static constexpr uint16_t BLOOD_NUM_ONE = 40;\r
+\r
+REGIST_SLICE_PAGE(VIEW_BLOOD, BLOOD_PAGES::BLOOD_MEASUREMENT_PAGE, BloodMeasurementPage, false);\r
+\r
+BloodMeasurementPage::BloodMeasurementPage()\r
+{\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BloodMeasurementPage::BloodMeasurementPage");\r
+}\r
+\r
+BloodMeasurementPage::~BloodMeasurementPage()\r
+{\r
+    if (group_ != nullptr) {\r
+        group_->RemoveAll();\r
+        delete group_;\r
+        group_ = nullptr;\r
+    }\r
+\r
+    if (labelTitle_ != nullptr) {\r
+        delete labelTitle_;\r
+        labelTitle_ = nullptr;\r
+    }\r
+\r
+    if (labelTime_ != nullptr) {\r
+        delete labelTime_;\r
+        labelTime_ = nullptr;\r
+    }\r
+\r
+    if (labelTips_ != nullptr) {\r
+        delete labelTips_;\r
+        labelTips_ = nullptr;\r
+    }\r
+\r
+    if (animator_ != nullptr) {\r
+        delete animator_;\r
+        animator_ = nullptr;\r
+    }\r
+\r
+    if (callBack_ != nullptr) {\r
+        delete callBack_;\r
+        callBack_ = nullptr;\r
+    }\r
+\r
+    if (videoPlay_ != nullptr) {\r
+        videoPlay_->StopVideoPlay();\r
+        delete videoPlay_;\r
+        videoPlay_ = nullptr;\r
+    }\r
+\r
+    if (surfaceView_ != nullptr) {\r
+        delete surfaceView_;\r
+        surfaceView_ = nullptr;\r
+    }\r
+\r
+    ImageCacheManager::GetInstance().UnloadSingleRes(BLOOD_IMAGE);\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BloodMeasurementPage::~BloodMeasurementPage");\r
+}\r
+\r
+void BloodMeasurementPage::OnStart(void *data)\r
+{\r
+    group_ = new UIViewGroup();\r
+    if (group_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new group_ fail");\r
+        return;\r
+    }\r
+    group_->SetPosition(0, 0);\r
+    group_->Resize(HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);\r
+    group_->SetOnDragListener(this);\r
+    group_->SetDraggable(true);\r
+    group_->SetTouchable(true);\r
+    group_->SetOnDragListener(this);\r
+\r
+    InitImageAnimator();\r
+\r
+    labelTitle_ = new UILabel();\r
+    if (labelTitle_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new labelTitle_ fail");\r
+        return;\r
+    }\r
+    labelTitle_->SetPosition(BLOOD_LABLETITLE_POSITION_X, BLOOD_LABLETITLE_POSITION_Y, BLOOD_LABLETITLE_WIDTH,\r
+                             BLOOD_LABLETITLE_HEIGHT);\r
+    labelTitle_->SetText("血氧");\r
+    labelTitle_->SetFont(BOLD_VECTOR_FONT_FILENAME, BLOOD_LABLETITLE_FONT_SIZE);\r
+    labelTitle_->SetVisible(false);\r
+\r
+    InitAnimator();\r
+    gettimeofday(&startTime_, nullptr);\r
+    StartAnimator();\r
+    group_->Add(labelTitle_);\r
+    AddViewToPageContainer(group_);\r
+}\r
+\r
+void BloodMeasurementPage::OnResume()\r
+{\r
+    videoPlay_->StartVideoPlay();\r
+    SettingDisplayModel::GetInstance().EnableSteadyOn();\r
+}\r
+\r
+void BloodMeasurementPage::OnPause()\r
+{\r
+    videoPlay_->StopVideoPlay();\r
+    SettingDisplayModel::GetInstance().DisableSteadyOn();\r
+}\r
+\r
+void BloodMeasurementPage::InitAnimator()\r
+{\r
+    labelTime_ = new UILabel();\r
+    if (labelTime_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new labelTime_ fail");\r
+        return;\r
+    }\r
+    labelTime_->SetPosition(BLOOD_LABEL2_POSITION_X, BLOOD_LABEL2_POSITION_Y);\r
+    labelTime_->Resize(BLOOD_LABEL2_WIDTH, BLOOD_LABEL2_HEIGHT);\r
+    labelTime_->SetStyle(STYLE_TEXT_FONT, BLOOD_LABEL_FRONT);\r
+\r
+    labelTime_->SetLineBreakMode(UILabel::LINE_BREAK_ADAPT);\r
+    labelTime_->SetText("15s");\r
+    labelTime_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+    labelTime_->SetFont(BOLD_VECTOR_FONT_FILENAME, BLOOD_LABEL_FRONT);\r
+    labelTime_->SetVisible(false);\r
+\r
+    labelTips_ = new UILabel();\r
+    if (labelTips_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new labelTips_ fail");\r
+        return;\r
+    }\r
+    labelTips_->SetPosition(BLOOD_BUTTON_TWO_POSITION_X, BLOOD_BUTTON_TWO_POSITION_Y);\r
+    labelTips_->Resize(BLOOD_LABEL2_WIDTH, BLOOD_LABEL2_HEIGHT);\r
+    labelTips_->SetStyle(STYLE_TEXT_FONT, BLOOD_LABEL_FRONT_BOTTOM);\r
+    labelTips_->SetLineBreakMode(UILabel::LINE_BREAK_ADAPT);\r
+    labelTips_->SetText("正在测量");\r
+    labelTips_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+    labelTips_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, BLOOD_LABEL_FRONT_BOTTOM);\r
+    labelTips_->SetVisible(false);\r
+    group_->Add(labelTime_);\r
+    group_->Add(labelTips_);\r
+\r
+    callBack_ = new BloodAnimatorCallback(this);\r
+    if (callBack_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new callBack_ fail");\r
+        return;\r
+    }\r
+    animator_ = new Animator(callBack_, nullptr, 0, true);\r
+    if (animator_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new animator_ fail");\r
+        return;\r
+    }\r
+}\r
+\r
+void BloodMeasurementPage::BloodAnimatorCallback::Callback(UIView *view)\r
+{\r
+    (void)view;\r
+    static int count = 0;\r
+    struct timeval current_time;\r
+    gettimeofday(&current_time, nullptr);\r
+    int time = current_time.tv_sec - page_->startTime_.tv_sec;\r
+    std::string strTime1 = std::to_string(BLOOD_TIME - time) + "s";\r
+    page_->SetLabelTime(strTime1);\r
+    page_->ShowOnMeasurement();\r
+    if (time >= BLOOD_TIME) {\r
+        page_->StopAnimator();\r
+        int random_number = BLOOD_NUM + rand() % BLOOD_NUM_ONE;\r
+        struct timeval testTime;\r
+        gettimeofday(&testTime, nullptr);\r
+        bloodMeasurementInfo info;\r
+        info.blood = random_number;\r
+        info.time = testTime;\r
+        BloodModel::GetInstance().SetBlood(info);\r
+        NativeAbility::GetInstance().SwitchPageInSlice(BLOOD_PAGES::BLOOD_RESULT_PAGE,\r
+            TransitionType::TRANSITION_INVALID, false);\r
+    }\r
+}\r
+\r
+void BloodMeasurementPage::StopAnimator()\r
+{\r
+    animator_->Stop();\r
+}\r
+void BloodMeasurementPage::StartAnimator()\r
+{\r
+    animator_->Start();\r
+}\r
+\r
+void BloodMeasurementPage::SetLabelTime(std::string str)\r
+{\r
+    labelTime_->SetText(str.c_str());\r
+}\r
+\r
+void BloodMeasurementPage::ShowOnMeasurement()\r
+{\r
+    labelTips_->SetVisible(true);\r
+    labelTitle_->SetVisible(true);\r
+    labelTime_->SetVisible(true);\r
+}\r
+\r
+bool BloodMeasurementPage::OnDrag(UIView &view, const DragEvent &event)\r
+{\r
+    UNUSED(view);\r
+    if ((event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT) && (event.GetDeltaX() > X_DRAG_OFFSET) &&\r
+        (event.GetDeltaX() > (DOUBLES * MATH_ABS(event.GetDeltaY())))) {\r
+        StopAnimator();\r
+        NativeAbility::GetInstance().SwitchPageInSlice(BLOOD_PAGES::BLOOD_MAIN_PAGE,\r
+            TransitionType::TRANSITION_INVALID, false);\r
+    }\r
+    return true;\r
+}\r
+\r
+void BloodMeasurementPage::InitImageAnimator()\r
+{\r
+    surfaceView_ = new UILiteSurfaceView();\r
+    if (surfaceView_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new surfaceView_ fail");\r
+        return;\r
+    }\r
+    colorKey_.full = 0xff202020;\r
+    surfaceView_->SetPosition(0, 0, VIDEO_WIDTH, VIDEO_HEIGHT);\r
+    surfaceView_->SetPreview(ImageCacheManager::GetInstance().LoadOneInMultiRes(IMAGE_BLOOD_PREVIEW2, BLOOD_IMAGE));\r
+    surfaceView_->SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
+    surfaceView_->SetSurfaceColorkey(colorKey_);\r
+    group_->Add(surfaceView_);\r
+\r
+    Surface *surface = surfaceView_->GetSurface();\r
+    surface->SetStrideAlignment(STRIDE_ALIGNMENT_VALUE);\r
+    surface->SetWidthAndHeight(VIDEO_WIDTH, VIDEO_HEIGHT);\r
+    surface->SetQueueSize(BUFFER_QUEUE_SIZE);\r
+    surface->SetFormat(PIXEL_FMT_YCBCR_420_SP);\r
+\r
+    int32_t ySize = ALIGN_BYTE(VIDEO_WIDTH, JPEG_WIDTH_BYTE_ALIGNMENT) * VIDEO_HEIGHT;\r
+    int32_t uvSize = ALIGN_BYTE(VIDEO_WIDTH, JPEG_WIDTH_BYTE_ALIGNMENT) *\r
+                     ALIGN_BYTE(VIDEO_HEIGHT, JPEG_HEIGHT_BYTE_ALIGNMENT) / JPEG_HEIGHT_DIVISOR;\r
+    int32_t bufferSize = ySize + uvSize;\r
+    surface->SetSize(bufferSize);\r
+    std::string uri("/user/res/video/blood.mp4");\r
+    videoPlay_ = new MediaVideoPlay(surface, nullptr, uri, false);\r
+    if (videoPlay_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new videoPlay_ fail");\r
+        return;\r
+    }\r
+}\r
+}\r
index 692d2d9..e948704 100644 (file)
 /*\r
- * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
- */\r
-/*\r
- * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved.\r
- * Description: SettingModel.cpp\r
- * Author:\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: BloodModel\r
  * Create: 2025-03-23\r
  */\r
 \r
 #include <sys/time.h>\r
-#include "blood/BloodModel.h"\r
-#include "blood/BloodView.h"\r
 #include "ohos_timer.h"\r
 #include "wearable_log.h"\r
+#include "blood/BloodView.h"\r
+#include "blood/BloodModel.h"\r
 \r
 namespace OHOS {\r
-static constexpr uint64_t CENTI_SECOND_UNIT = 100;\r
-static constexpr uint64_t MS_ONE_SECONDS = 1000;\r
-static constexpr uint16_t NUM_TEN = 10;\r
-static constexpr uint16_t NUM_TIME_MIN = 60;\r
-static constexpr uint16_t NUM_TIME_HOUR = 3600;\r
-static constexpr int32_t NUM_TIME_DAY = 86400;\r
+BloodModel::BloodModel() {}\r
 \r
-static constexpr int16_t MIN_TO_HOUR = 60;\r
-static constexpr int16_t HOURLY_SYSTEM = 24;\r
-BloodModel::BloodModel()\r
-{\r
-    InitCurrentTimeTimer();\r
-}\r
-\r
-BloodModel::~BloodModel()\r
-{\r
-    DisableCurrentTimeTimer();\r
-}\r
+BloodModel::~BloodModel() {}\r
 \r
 BloodModel &BloodModel::GetInstance()\r
 {\r
     static BloodModel instance;\r
     return instance;\r
 }\r
-void BloodModel::SetbuttonStatus(bool status)\r
-{\r
-    buttonStatus = status;\r
-}\r
-\r
-bool BloodModel::GetbuttonStatus()\r
-{\r
-    return buttonStatus;\r
-}\r
-\r
-/* 定时器回调函数 */\r
-static void CurrentTimeTimerCallback(void *data)\r
-{\r
-    (void)data;\r
-    BloodView *view = BloodView::GetInstance();\r
-    if (view != nullptr && view->IsCurrentTimeLabelValid()) {\r
-        std::string currTime = BloodModel::GetInstance().GetCurrentTimeString();\r
-        view->UpdateCurrentTimeLabel(currTime.c_str());\r
-    }\r
-}\r
-\r
-std::string BloodModel::GetCurrentTimeString()\r
-{\r
-    std::string strHours;\r
-    std::string strMinute;\r
-    struct timeval tv;\r
-    gettimeofday(&tv, NULL);\r
-    uint64_t second = tv.tv_sec;\r
-    uint64_t uSecond = tv.tv_usec;\r
-    uint64_t minute = second / MIN_TO_HOUR;\r
-    uint64_t hour = minute / MIN_TO_HOUR;\r
-    uint8_t realHour = static_cast<uint8_t>(hour % HOURLY_SYSTEM);\r
-    uint8_t realMinute = static_cast<uint8_t>(minute % MIN_TO_HOUR);\r
-\r
-    if (realHour >= 0 && realHour < NUM_TEN) {\r
-        strHours = "0" + std::to_string(realHour);\r
-    } else {\r
-        strHours = std::to_string(realHour);\r
-    }\r
-    if (realMinute >= 0 && realMinute < NUM_TEN) {\r
-        strMinute = "0" + std::to_string(realMinute);\r
-    } else {\r
-        strMinute = std::to_string(realMinute);\r
-    }\r
-    return strHours + ":" + strMinute;\r
-}\r
-\r
-void BloodModel::InitCurrentTimeTimer()\r
-{\r
-    if (pCurrentTimeTimer_ != nullptr) {\r
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "StopwatchModel::InitCurrentTimeTimer GraphicTimer already exists!!");\r
-        return;\r
-    }\r
-    uint32_t tick = GetOSTick(MS_ONE_SECONDS);\r
-    pCurrentTimeTimer_ = new GraphicTimer(tick, CurrentTimeTimerCallback, nullptr, true);\r
-    if (pCurrentTimeTimer_ == nullptr) {\r
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "StopwatchModel::InitCurrentTimeTimer new GraphicTimer failed!!");\r
-        return;\r
-    }\r
-}\r
 \r
-void BloodModel::DisableCurrentTimeTimer()\r
-{\r
-    if (pCurrentTimeTimer_ != nullptr) {\r
-        pCurrentTimeTimer_->Stop();\r
-        delete pCurrentTimeTimer_;\r
-        pCurrentTimeTimer_ = nullptr;\r
-    }\r
-}\r
-\r
-void BloodModel::StartCurrentTimeTimer()\r
-{\r
-    if (pCurrentTimeTimer_ != nullptr) {\r
-        bool retTimer = pCurrentTimeTimer_->Start();\r
-        if (!retTimer) {\r
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "StartStopwatchTimer GraphicTimer Start failed!!");\r
-            if (pCurrentTimeTimer_ != nullptr) {\r
-                delete pCurrentTimeTimer_;\r
-                pCurrentTimeTimer_ = nullptr;\r
-            }\r
-            return;\r
-        }\r
-    }\r
-}\r
-\r
-void BloodModel::PauseCurrentTimeTimer()\r
-{\r
-    if (pCurrentTimeTimer_ != nullptr) {\r
-        pCurrentTimeTimer_->Stop();\r
-    }\r
-}\r
 }\r
index 5e98671..7013d7a 100644 (file)
@@ -1,89 +1,15 @@
 /*\r
- * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
- * Description: SettingPresenter.cpp\r
- * Author:\r
- * Create: 2025-03-23\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: BloodPresenter\r
+ * Create: 2025-06\r
  */\r
 \r
-#include "blood/BloodPresenter.h"\r
-#include "blood/BloodView.h"\r
-#include "blood/BloodModel.h"\r
 #include "uiservice/ui_service.h"\r
 #include "NativeRegisterManager.h"\r
-namespace OHOS {\r
-\r
-REGIST_MENU(VIEW_BLOOD, BloodView, BloodPresenter, PNG_APPLIST_TEMP_IMAGE, PNG_APPLIST_TEMP_IMAGE, "血氧");\r
-\r
-static BloodPresenter *g_pBloodPresenter = nullptr;\r
-\r
-BloodPresenter::BloodPresenter()\r
-{\r
-    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BloodPresenter::BloodPresenter");\r
-    findPhoneModel = &BloodModel::GetInstance();\r
-    g_pBloodPresenter = this;\r
-}\r
-\r
-BloodPresenter::~BloodPresenter()\r
-{\r
-    g_pBloodPresenter = nullptr;\r
-}\r
-\r
-void BloodPresenter::OnResume(void)\r
-{\r
-    Presenter<BloodView>::OnResume();\r
-    SendMsgToUIService(UI_ADD_SLEEP_VETO, 0, nullptr, 0);\r
-    BloodModel::GetInstance().StartCurrentTimeTimer();\r
-}\r
-\r
-void BloodPresenter::OnPause(void)\r
-{\r
-    Presenter<BloodView>::OnPause();\r
-    SendMsgToUIService(UI_RM_SLEEP_VETO, 0, nullptr, 0);\r
-    BloodModel::GetInstance().PauseCurrentTimeTimer();\r
-    return;\r
-}\r
-\r
-BloodPresenter *BloodPresenter::GetInstance()\r
-{\r
-    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BloodPresenter GetInstance");\r
-    return g_pBloodPresenter;\r
-}\r
-\r
-bool BloodPresenter::ClickFuncId(const char *buttonName)\r
-{\r
-    if (buttonName == nullptr) {\r
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "TempPresenter::ClickFuncId buttonName nullptr error!");\r
-        return false;\r
-    }\r
-    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "TempPresenter::ClickFuncId buttonName = %s", buttonName);\r
-    if (strcmp(buttonName, "button1") == 0) {\r
-    } else if (strcmp(buttonName, "button2") == 0) {\r
-    }\r
-    return false;\r
-}\r
-\r
-bool BloodPresenter::OnClick(UIView &view, const ClickEvent &event)\r
-{\r
-    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "TempPresenter::OnClick ");\r
-    UNUSED(event);\r
-    BloodView::GetInstance()->DropView(view, 1);\r
-    return true;\r
-}\r
-\r
-bool BloodPresenter::OnDrag(UIView &view, const DragEvent &event)\r
-{\r
-    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "WeatherOnDragListener::OnDrag");\r
-    UNUSED(view);\r
-    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "WeatherPresenter::OnDrag %s", view.GetViewId());\r
-    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "WeatherPresenter::OnDrag %s", event.GetDragDirection());\r
-    if (event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT) {\r
-        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "WeatherPresenter::OnDrag ChangeSlice(VIEW_APPLIST)");\r
-        BloodView::GetInstance()->DropView(view, 0);\r
-    } else if (event.GetDragDirection() == DragEvent::DIRECTION_RIGHT_TO_LEFT) {\r
-        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "WeatherPresenter::OnDrag DIRECTION_RIGHT_TO_LEFT");\r
-        BloodView::GetInstance()->DropView(view, 1);\r
-    }\r
-    return false;\r
-}\r
+#include "blood/BloodView.h"\r
+#include "blood/BloodModel.h"\r
+#include "blood/BloodPresenter.h"\r
 \r
+namespace OHOS {\r
+REGIST_MENU(VIEW_BLOOD, BloodView, BloodPresenter, BLOOD_ICON, BLOOD_ICON, "血氧");\r
 }\r
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/blood/src/BloodReadyPage.cpp b/code/sdk/application/wearable/evb/nativeapp/nativeui/blood/src/BloodReadyPage.cpp
new file mode 100644 (file)
index 0000000..e14eacd
--- /dev/null
@@ -0,0 +1,264 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: BloodReadyPage\r
+ * Create: 2025-06\r
+ */\r
+\r
+#include <string>\r
+#include <cmath>\r
+#include "ui_test_group.h"\r
+#include "main/LoadImg.h"\r
+#include "surface.h"\r
+#include "ui_resource_blood.h"\r
+#include "blood/BloodPresenter.h"\r
+#include "blood/BloodReadyPage.h"\r
+\r
+namespace OHOS {\r
+static constexpr uint16_t BLOOD_BUTTON_POSITION_X = 188;\r
+static constexpr uint16_t BLOOD_BUTTON_WIDTH = 96;\r
+static constexpr uint16_t BLOOD_BUTTON_HEIGHT = 96;\r
+static constexpr uint16_t BLOOD_BUTTON_TWO_POSITION_Y = 288;\r
+static constexpr uint16_t BLOOD_LABEL3_POSITION_X = 65;\r
+static constexpr uint16_t BLOOD_LABEL3_POSITION_Y = 150;\r
+static constexpr uint16_t BLOOD_LABLETIPSSATRT_POSITION_X = 110;\r
+static constexpr uint16_t BLOOD_LABLETIPSSATRT_POSITION_Y = 200;\r
+static constexpr uint16_t BLOOD_LABLETIPSSATRT_WIDTH = 424;\r
+static constexpr uint16_t BLOOD_LABLETIPSSATRT_HEIGHT = 424;\r
+static constexpr uint16_t BLOOD_LABLETIPSSATRT_FONT_SIZE = 36;\r
+static constexpr uint16_t BLOOD_LABLEBACK_POSITION_X = 218;\r
+static constexpr uint16_t BLOOD_LABLEBACK_POSITION_Y = 318;\r
+static constexpr uint16_t BLOOD_LABLEBACK_WIDTH = 50;\r
+static constexpr uint16_t BLOOD_LABLEBACK_HEIGHT = 50;\r
+static constexpr uint16_t BLOOD_LABLEBACK_FONT_SIZE = 30;\r
+static constexpr uint16_t BLOOD_PLAYBACK_POSITION_X = 140;\r
+static constexpr uint16_t BLOOD_PLAYBACK_POSITION_Y = 250;\r
+static constexpr uint16_t BLOOD_PLAYBACK_WIDTH = 172;\r
+static constexpr uint16_t BLOOD_PLAYBACK_HEIGHT = 172;\r
+static constexpr uint16_t BLOOD_PLAYBACK_VENTER_POSITION = 86;\r
+static constexpr uint32_t BLOOD_PLAYBACK_RANGE = 100000;\r
+static constexpr uint16_t BLOOD_PLAYBACK_RADIUS = 48;\r
+static constexpr uint16_t BLOOD_PLAYBACK_START_ANGLE = 360;\r
+static constexpr uint16_t BLOOD_PLAYBACK_STYLE_LINE_WIDTH = 12;\r
+static constexpr uint16_t BLOOD_TIME = 3;\r
+static constexpr uint16_t BLOOD_PROGRESS_TIME = 3;\r
+static constexpr uint16_t BLOOD_TIME_USEC = 1000;\r
+static constexpr char *BLOOD_START_BUTTON = "startButton";\r
+\r
+REGIST_SLICE_PAGE(VIEW_BLOOD, BLOOD_PAGES::BLOOD_READY_PAGE, BloodReadyPage, false);\r
+\r
+BloodReadyPage::BloodReadyPage()\r
+{\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BloodReadyPage::BloodReadyPage");\r
+}\r
+\r
+BloodReadyPage::~BloodReadyPage()\r
+{\r
+    if (group_ != nullptr) {\r
+        group_->RemoveAll();\r
+        delete group_;\r
+        group_ = nullptr;\r
+    }\r
+\r
+    if (buttonStart_ != nullptr) {\r
+        delete buttonStart_;\r
+        buttonStart_ = nullptr;\r
+    }\r
+\r
+    if (labelTips_ != nullptr) {\r
+        delete labelTips_;\r
+        labelTips_ = nullptr;\r
+    }\r
+\r
+    if (timeProgress_ != nullptr) {\r
+        delete timeProgress_;\r
+        timeProgress_ = nullptr;\r
+    }\r
+\r
+    if (labelProgressTime_ != nullptr) {\r
+        delete labelProgressTime_;\r
+        labelProgressTime_ = nullptr;\r
+    }\r
+\r
+    if (animator_ != nullptr) {\r
+        delete animator_;\r
+        animator_ = nullptr;\r
+    }\r
+\r
+    if (callBack_ != nullptr) {\r
+        delete callBack_;\r
+        callBack_ = nullptr;\r
+    }\r
+\r
+    ImageCacheManager::GetInstance().UnloadSingleRes(BLOOD_IMAGE);\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BloodReadyPage::~BloodReadyPage");\r
+}\r
+\r
+void BloodReadyPage::OnStart(void *data)\r
+{\r
+    group_ = new UIViewGroup();\r
+    if (group_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new group_ fail");\r
+        return;\r
+    }\r
+    group_->SetPosition(0, 0);\r
+    group_->Resize(HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);\r
+    group_->SetOnDragListener(this);\r
+    group_->SetDraggable(true);\r
+    group_->SetTouchable(true);\r
+    group_->SetOnDragListener(this);\r
+\r
+    buttonStart_ = new UILabelButton();\r
+    if (buttonStart_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new buttonStart_ fail");\r
+        return;\r
+    }\r
+    buttonStart_->SetPosition(BLOOD_BUTTON_POSITION_X, BLOOD_BUTTON_TWO_POSITION_Y);\r
+    buttonStart_->Resize(BLOOD_BUTTON_WIDTH, BLOOD_BUTTON_HEIGHT);\r
+    LOADIMG::LoadBtnImage(buttonStart_, BLOOD_IMAGE, IMAGE_BLOOD_RESET, IMAGE_BLOOD_RESET);\r
+    buttonStart_->SetViewId(BLOOD_START_BUTTON);\r
+    buttonStart_->SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
+    buttonStart_->SetStyleForState(STYLE_BACKGROUND_COLOR, Color::Black().full, UIButton::PRESSED);\r
+    buttonStart_->SetVisible(true);\r
+    buttonStart_->SetOnClickListener(this);\r
+    group_->Add(buttonStart_);\r
+\r
+    labelTips_ = new UILabel();\r
+    if (labelTips_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new labelTips_ fail");\r
+        return;\r
+    }\r
+    labelTips_->SetPosition(BLOOD_LABLETIPSSATRT_POSITION_X, BLOOD_LABLETIPSSATRT_POSITION_Y,\r
+                            BLOOD_LABLETIPSSATRT_WIDTH, BLOOD_LABLETIPSSATRT_HEIGHT);\r
+    labelTips_->SetText("请佩戴手表测量");\r
+    labelTips_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, BLOOD_LABLETIPSSATRT_FONT_SIZE);\r
+    labelTips_->SetVisible(true);\r
+    group_->Add(labelTips_);\r
+\r
+    InitCircleProgress();\r
+\r
+    InitAnimator();\r
+\r
+    AddViewToPageContainer(group_);\r
+}\r
+\r
+void BloodReadyPage::InitAnimator()\r
+{\r
+    callBack_ = new BloodAnimatorCallback(this);\r
+    if (callBack_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new callBack_ fail");\r
+        return;\r
+    }\r
+    animator_ = new Animator(callBack_, nullptr, 0, true);\r
+    if (animator_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new animator_ fail");\r
+        return;\r
+    }\r
+}\r
+\r
+int BloodReadyPage::InitCircleProgress()\r
+{\r
+    labelProgressTime_ = new UILabel();\r
+    if (labelProgressTime_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new labelProgressTime_ fail");\r
+        return OHOS_FAILURE;\r
+    }\r
+    labelProgressTime_->SetPosition(BLOOD_LABLEBACK_POSITION_X, BLOOD_LABLEBACK_POSITION_Y, BLOOD_LABLEBACK_WIDTH,\r
+                                    BLOOD_LABLEBACK_HEIGHT);\r
+    labelProgressTime_->SetText("3");\r
+    labelProgressTime_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, BLOOD_LABLEBACK_FONT_SIZE);\r
+    labelProgressTime_->SetVisible(true);\r
+    labelProgressTime_->SetVisible(false);\r
+    group_->Add(labelProgressTime_);\r
+    timeProgress_ = new UICircleProgress();\r
+    if (timeProgress_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new timeProgress_ fail");\r
+        return OHOS_FAILURE;\r
+    }\r
+    timeProgress_->SetPosition(BLOOD_PLAYBACK_POSITION_X, BLOOD_PLAYBACK_POSITION_Y, BLOOD_PLAYBACK_WIDTH,\r
+                               BLOOD_PLAYBACK_HEIGHT);\r
+    timeProgress_->SetCenterPosition(BLOOD_PLAYBACK_VENTER_POSITION, BLOOD_PLAYBACK_VENTER_POSITION);\r
+    timeProgress_->SetRange(BLOOD_PLAYBACK_RANGE, 0);\r
+    timeProgress_->SetRadius(BLOOD_PLAYBACK_RADIUS);\r
+    timeProgress_->SetStartAngle(BLOOD_PLAYBACK_START_ANGLE);\r
+    timeProgress_->SetEndAngle(0);\r
+    timeProgress_->SetValue(0);\r
+    timeProgress_->SetForegroundStyle(STYLE_LINE_COLOR, 0xFF491010);\r
+    timeProgress_->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+    timeProgress_->SetBackgroundStyle(STYLE_LINE_COLOR, 0xFFD72C2E);\r
+    timeProgress_->SetBackgroundStyle(STYLE_LINE_WIDTH, BLOOD_PLAYBACK_STYLE_LINE_WIDTH);\r
+    timeProgress_->SetForegroundStyle(STYLE_LINE_WIDTH, BLOOD_PLAYBACK_STYLE_LINE_WIDTH);\r
+    timeProgress_->SetVisible(false);\r
+    group_->Add(timeProgress_);\r
+    return OHOS_SUCCESS;\r
+}\r
+\r
+void BloodReadyPage::BloodAnimatorCallback::Callback(UIView *view)\r
+{\r
+    (void)view;\r
+    static int count = 0;\r
+    struct timeval current_time;\r
+    gettimeofday(&current_time, nullptr);\r
+    long seconds = current_time.tv_sec - page_->startTime_.tv_sec;\r
+    long micros = current_time.tv_usec - page_->startTime_.tv_usec;\r
+    long time = (seconds * BLOOD_TIME_USEC) + (micros / BLOOD_TIME_USEC);\r
+    page_->SetLabelProgressTime(time);\r
+    if ((time / BLOOD_TIME_USEC) == BLOOD_TIME) {\r
+        page_->ShowOnMeasurement();\r
+        page_->StopAnimator();\r
+        NativeAbility::GetInstance().SwitchPageInSlice(BLOOD_PAGES::BLOOD_MEASUREMENT_PAGE,\r
+            TransitionType::TRANSITION_INVALID, false);\r
+    }\r
+}\r
+\r
+void BloodReadyPage::StopAnimator()\r
+{\r
+    animator_->Stop();\r
+}\r
+\r
+void BloodReadyPage::SetLabelProgressTime(int time)\r
+{\r
+    int progressTime = BLOOD_PROGRESS_TIME - (time / BLOOD_TIME_USEC);\r
+    std::string strTime = std::to_string(progressTime);\r
+    labelProgressTime_->SetText(strTime.c_str());\r
+    double percentage = static_cast<double>(time) / (BLOOD_TIME * BLOOD_TIME_USEC);\r
+    double value = round(percentage * BLOOD_PLAYBACK_RANGE);\r
+    timeProgress_->SetValue(value);\r
+}\r
+\r
+void BloodReadyPage::ShowOnMeasurement()\r
+{\r
+    buttonStart_->SetVisible(false);\r
+    labelTips_->SetVisible(false);\r
+    timeProgress_->SetVisible(false);\r
+    labelProgressTime_->SetVisible(false);\r
+}\r
+\r
+bool BloodReadyPage::OnDrag(UIView &view, const DragEvent &event)\r
+{\r
+    UNUSED(view);\r
+    if ((event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT) && (event.GetDeltaX() > X_DRAG_OFFSET) &&\r
+        (event.GetDeltaX() > (DOUBLES * MATH_ABS(event.GetDeltaY())))) {\r
+        StopAnimator();\r
+        NativeAbility::GetInstance().SwitchPageInSlice(BLOOD_PAGES::BLOOD_MAIN_PAGE,\r
+            TransitionType::TRANSITION_INVALID, false);\r
+    }\r
+    return true;\r
+}\r
+\r
+bool BloodReadyPage::OnClick(UIView &view, const ClickEvent &event)\r
+{\r
+    UNUSED(event);\r
+    if (strcmp(view.GetViewId(), BLOOD_START_BUTTON) == 0) {\r
+        labelTips_->SetVisible(false);\r
+        labelTips_->SetPosition(BLOOD_LABEL3_POSITION_X, BLOOD_LABEL3_POSITION_Y);\r
+        labelTips_->SetText("请屏幕朝上偏紧佩戴,                  保持静止");\r
+        labelTips_->SetVisible(true);\r
+        buttonStart_->SetVisible(false);\r
+        animator_->Start();\r
+        timeProgress_->SetVisible(true);\r
+        labelProgressTime_->SetVisible(true);\r
+        gettimeofday(&startTime_, nullptr);\r
+    }\r
+    return true;\r
+}\r
+}\r
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/blood/src/BloodResultPage.cpp b/code/sdk/application/wearable/evb/nativeapp/nativeui/blood/src/BloodResultPage.cpp
new file mode 100644 (file)
index 0000000..a8cb0f1
--- /dev/null
@@ -0,0 +1,235 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: BloodResultPage\r
+ * Create: 2025-06\r
+ */\r
+\r
+#include <string>\r
+#include <random>\r
+#include <chrono>\r
+#include <iostream>\r
+#include "ui_test_group.h"\r
+#include "main/LoadImg.h"\r
+#include "ui_resource_blood.h"\r
+#include "msg_center_device.h"\r
+#include "blood/BloodPresenter.h"\r
+#include "blood/BloodView.h"\r
+#include "blood/BloodResultPage.h"\r
+\r
+namespace OHOS {\r
+static constexpr uint16_t BLOOD_BUTTON_POSITION_X = 120;\r
+static constexpr uint16_t BLOOD_BUTTON_POSITION_Y = 320;\r
+static constexpr uint16_t BLOOD_BUTTON_WIDTH = 232;\r
+static constexpr uint16_t BLOOD_BUTTON_HEIGHT = 76;\r
+static constexpr uint16_t BLOOD_BUTTON_FONT_SIZE = 35;\r
+static constexpr uint16_t BLOOD_LABEL_FRONT = 30;\r
+static constexpr uint16_t BLOOD_LABEL_ONE_POSITION_X = 170;\r
+static constexpr uint16_t BLOOD_LABEL_ONE_POSITION_Y = 150;\r
+static constexpr uint16_t BLOOD_LABEL_ONE_POSITION_WIDTH = 72;\r
+static constexpr uint16_t BLOOD_LABEL_ONE_POSITION_HEIGHT = 32;\r
+static constexpr uint16_t BLOOD_LABEL_ONE_WIDTH = 200;\r
+static constexpr uint16_t BLOOD_LABEL_ONE_HEIGHT = 60;\r
+static constexpr uint16_t BLOOD_LABEL_FRONT_ONE = 60;\r
+static constexpr uint16_t BLOOD_LABEL2_POSITION_X = 117;\r
+static constexpr uint16_t BLOOD_LABEL2_POSITION_Y = 212;\r
+static constexpr uint16_t BLOOD_LABEL3_POSITION_Y = 212;\r
+static constexpr uint16_t BLOOD_LABEL2_WIDTH = 200;\r
+static constexpr uint16_t BLOOD_LABEL2_HEIGHT = 60;\r
+static constexpr uint16_t BLOOD_TITLE_POSITION_X = 195;\r
+static constexpr uint16_t BLOOD_TITLE_POSITION_Y = 40;\r
+static constexpr uint16_t BLOOD_TITLE_WIDTH = 260;\r
+static constexpr uint16_t BLOOD_TITLE_HEIGHT = 53;\r
+static constexpr uint16_t BLOOD_TITLE_FONT_SIZE = 38;\r
+static constexpr uint16_t BLOOD_BUTTONLEVEL_POSITION_X = 277;\r
+static constexpr uint16_t BLOOD_RANDOM_NUMBER_HIGH = 90;\r
+static constexpr uint16_t BLOOD_RANDOM_NUMBER_LOW = 70;\r
+static constexpr uint16_t BLOOD_OPA = 50;\r
+static constexpr char *BLOOD_BUTTON_MORE = "moreButton";\r
+\r
+REGIST_SLICE_PAGE(VIEW_BLOOD, BLOOD_PAGES::BLOOD_RESULT_PAGE, BloodResultPage, false);\r
+\r
+BloodResultPage::BloodResultPage()\r
+{\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BloodResultPage::BloodResultPage");\r
+}\r
+\r
+BloodResultPage::~BloodResultPage()\r
+{\r
+    if (group_ != nullptr) {\r
+        group_->RemoveAll();\r
+        delete group_;\r
+        group_ = nullptr;\r
+    }\r
+\r
+    if (buttonMore_ != nullptr) {\r
+        delete buttonMore_;\r
+        buttonMore_ = nullptr;\r
+    }\r
+\r
+    if (labelData_ != nullptr) {\r
+        delete labelData_;\r
+        labelData_ = nullptr;\r
+    }\r
+\r
+    if (labelBloodOxygen_ != nullptr) {\r
+        delete labelBloodOxygen_;\r
+        labelBloodOxygen_ = nullptr;\r
+    }\r
+\r
+    if (mainImg_ != nullptr) {\r
+        delete mainImg_;\r
+        mainImg_ = nullptr;\r
+    }\r
+\r
+    if (labelTitle_ != nullptr) {\r
+        delete labelTitle_;\r
+        labelTitle_ = nullptr;\r
+    }\r
+\r
+    if (levelImg_ != nullptr) {\r
+        delete levelImg_;\r
+        levelImg_ = nullptr;\r
+    }\r
+\r
+    ImageCacheManager::GetInstance().UnloadSingleRes(BLOOD_IMAGE);\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BloodResultPage::~BloodResultPage");\r
+}\r
+\r
+void BloodResultPage::OnStart(void *data)\r
+{\r
+    group_ = new UIViewGroup();\r
+    if (group_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new group_ fail");\r
+        return;\r
+    }\r
+    group_->SetPosition(0, 0);\r
+    group_->Resize(HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);\r
+    group_->SetOnDragListener(this);\r
+    group_->SetDraggable(true);\r
+    group_->SetTouchable(true);\r
+\r
+    mainImg_ = new UIImageView();\r
+    if (mainImg_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new mainImg_ fail");\r
+        return;\r
+    }\r
+    mainImg_->SetPosition(0, 0);\r
+    mainImg_->SetStyle(STYLE_BACKGROUND_OPA, OPA_OPAQUE);\r
+    LOADIMG::LoadImageViewImg(mainImg_, BLOOD_IMAGE, IMAGE_BLOOD_BG);\r
+    group_->Add(mainImg_);\r
+\r
+    labelTitle_ = new UILabel();\r
+    if (labelTitle_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new labelTitle_ fail");\r
+        return;\r
+    }\r
+    labelTitle_->SetPosition(BLOOD_TITLE_POSITION_X, BLOOD_TITLE_POSITION_Y, BLOOD_TITLE_WIDTH, BLOOD_TITLE_HEIGHT);\r
+    labelTitle_->SetText("结果");\r
+    labelTitle_->SetFont(BOLD_VECTOR_FONT_FILENAME, BLOOD_TITLE_FONT_SIZE);\r
+    labelTitle_->SetLineBreakMode(UILabel::LINE_BREAK_ADAPT);\r
+    labelTitle_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+    labelTitle_->SetRollSpeed(0);\r
+\r
+    labelData_ = new UILabel();\r
+    if (labelData_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new labelData_ fail");\r
+        return;\r
+    }\r
+    labelData_->SetPosition(BLOOD_LABEL_ONE_POSITION_X, BLOOD_LABEL_ONE_POSITION_Y);\r
+    labelData_->Resize(BLOOD_LABEL_ONE_WIDTH, BLOOD_LABEL_ONE_HEIGHT);\r
+    labelData_->SetStyle(STYLE_TEXT_FONT, BLOOD_LABEL_FRONT_ONE);\r
+    labelData_->SetLineBreakMode(UILabel::LINE_BREAK_ADAPT);\r
+    labelData_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+    labelData_->SetRollSpeed(0);\r
+    labelData_->SetFont(BOLD_VECTOR_FONT_FILENAME, BLOOD_LABEL_FRONT_ONE);\r
+\r
+    labelBloodOxygen_ = new UILabel();\r
+    if (labelBloodOxygen_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new labelBloodOxygen_ fail");\r
+        return;\r
+    }\r
+    labelBloodOxygen_->SetPosition(BLOOD_LABEL2_POSITION_X, BLOOD_LABEL2_POSITION_Y);\r
+    labelBloodOxygen_->Resize(BLOOD_LABEL2_WIDTH, BLOOD_LABEL2_HEIGHT);\r
+    labelBloodOxygen_->SetStyle(STYLE_TEXT_FONT, BLOOD_LABEL_FRONT);\r
+    labelBloodOxygen_->SetText("血氧饱和度");\r
+    labelBloodOxygen_->SetLineBreakMode(UILabel::LINE_BREAK_ADAPT);\r
+    labelBloodOxygen_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+    labelBloodOxygen_->SetRollSpeed(0);\r
+    labelBloodOxygen_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, BLOOD_LABEL_FRONT);\r
+    labelBloodOxygen_->SetVisible(true);\r
+\r
+    buttonMore_ = new UILabelButton();\r
+    if (buttonMore_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new buttonMore_ fail");\r
+        return;\r
+    }\r
+    buttonMore_->SetPosition(BLOOD_BUTTON_POSITION_X, BLOOD_BUTTON_POSITION_Y);\r
+    buttonMore_->Resize(BLOOD_BUTTON_WIDTH, BLOOD_BUTTON_HEIGHT);\r
+    buttonMore_->SetViewId(BLOOD_BUTTON_MORE);\r
+    buttonMore_->SetOnClickListener(this);\r
+    buttonMore_->SetStyleForState(STYLE_BACKGROUND_COLOR, 0x14FFFFFF, UIButton::RELEASED);\r
+    buttonMore_->SetStyleForState(STYLE_BACKGROUND_COLOR, 0x14FFFFFF, UIButton::PRESSED);\r
+    buttonMore_->SetStyleForState(STYLE_BACKGROUND_COLOR, 0x14FFFFFF, UIButton::INACTIVE);\r
+    buttonMore_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, BLOOD_BUTTON_FONT_SIZE);\r
+    buttonMore_->SetText("进一步了解");\r
+    buttonMore_->SetStyle(STYLE_TEXT_COLOR, 0xFFCCCCCC);\r
+    buttonMore_->SetStyle(STYLE_BACKGROUND_OPA, OPA_OPAQUE);\r
+    buttonMore_->SetVisible(true);\r
+\r
+    levelImg_ = new UIImageView();\r
+    if (levelImg_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new levelImg_ fail");\r
+        return;\r
+    }\r
+    levelImg_->SetPosition(BLOOD_BUTTONLEVEL_POSITION_X, BLOOD_LABEL3_POSITION_Y);\r
+    bloodMeasurementInfo info = BloodModel::GetInstance().GetBlood();\r
+    std::string strBlood = std::to_string(info.blood) + "%";\r
+    labelData_->SetText(strBlood.c_str());\r
+    errcode_t result;\r
+#ifdef _WIN32\r
+    result = 0;\r
+#else\r
+    result = msg_center_send_data(MSGCENTER_CMD_DEVICE, MSGCENTER_TYPE_ID_DEVICE_BLOODOXYGEN, &info.blood,\r
+                                  sizeof(info.blood));\r
+    WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "send blood result:%d ", result);\r
+#endif\r
+    if (info.blood >= BLOOD_RANDOM_NUMBER_HIGH) {\r
+        LOADIMG::LoadImageViewImg(levelImg_, BLOOD_IMAGE, IMAGE_BLOOD_NORMAL);\r
+    } else if (info.blood >= BLOOD_RANDOM_NUMBER_LOW && info.blood < BLOOD_RANDOM_NUMBER_HIGH) {\r
+        LOADIMG::LoadImageViewImg(levelImg_, BLOOD_IMAGE, IMAGE_BLOOD_COMMON);\r
+    } else {\r
+        LOADIMG::LoadImageViewImg(levelImg_, BLOOD_IMAGE, IMAGE_BLOOD_ABNORMAL);\r
+    }\r
+\r
+    group_->Add(labelTitle_);\r
+    group_->Add(labelData_);\r
+    group_->Add(labelBloodOxygen_);\r
+    group_->Add(buttonMore_);\r
+    group_->Add(levelImg_);\r
+    AddViewToPageContainer(group_);\r
+}\r
+\r
+bool BloodResultPage::OnDrag(UIView &view, const DragEvent &event)\r
+{\r
+    UNUSED(view);\r
+    if (event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT) {\r
+        NativeAbility::GetInstance().SwitchPageInSlice(BLOOD_PAGES::BLOOD_MAIN_PAGE,\r
+            TransitionType::TRANSITION_INVALID, false);\r
+    } else if (event.GetDragDirection() == DragEvent::DIRECTION_BOTTOM_TO_TOP) {\r
+        NativeAbility::GetInstance().SwitchPageInSlice(BLOOD_PAGES::BLOOD_CHART_PAGE,\r
+            TransitionType::TRANSITION_INVALID, false);\r
+    }\r
+    return true;\r
+}\r
+\r
+bool BloodResultPage::OnClick(UIView &view, const ClickEvent &event)\r
+{\r
+    if (strcmp(view.GetViewId(), BLOOD_BUTTON_MORE) == 0) {\r
+        NativeAbility::GetInstance().SwitchPageInSlice(BLOOD_PAGES::BLOOD_EXPLAIN_PAGE,\r
+            TransitionType::TRANSITION_INVALID, false);\r
+    }\r
+    UNUSED(event);\r
+    return true;\r
+}\r
+\r
+}\r
index 0e074c9..099cd22 100644 (file)
@@ -13,9 +13,12 @@ extern "C" {
 #endif\r
 \r
 static bool gatts_register_flag = false;\r
+static bool gattc_register_flag = false;\r
 static uint8_t gatts_server_id = 0;\r
+static uint8_t gattc_client_id = 0;\r
 std::list<gap_ble_callbacks_t> g_gap_ble_callback_list;\r
 std::list<gatts_callbacks_t> g_gatts_callback_list;\r
+std::list<gattc_callbacks_t> g_gattc_callback_list;\r
 std::list<bt_uuid_t> g_uuid_list;\r
 std::list<uint16_t> g_svr_handle_list;\r
 \r
@@ -31,6 +34,12 @@ errcode_t wrapper_gatts_register_callbacks(gatts_callbacks_t *func)
     return ERRCODE_SUCC;\r
 }\r
 \r
+errcode_t wrapper_gattc_register_callbacks(gattc_callbacks_t *func)\r
+{\r
+    g_gattc_callback_list.push_back(*func);\r
+    return ERRCODE_SUCC;\r
+}\r
+\r
 void wrapper_gap_ble_enable_callback(errcode_t status)\r
 {\r
     for (auto callback : g_gap_ble_callback_list) {\r
@@ -219,7 +228,7 @@ void wrapper_gatts_delete_all_service_callback(uint8_t server_id, errcode_t stat
         if (callback.delete_service_cb) {\r
             callback.delete_service_cb(server_id, status);\r
         }\r
-    }    \r
+    }\r
 }\r
 void wrapper_gatts_read_request_callback(uint8_t server_id, uint16_t conn_id, gatts_req_read_cb_t *read_cb_para, errcode_t status)\r
 {\r
@@ -237,6 +246,7 @@ void wrapper_gatts_write_request_callback(uint8_t server_id, uint16_t conn_id, g
         }\r
     }\r
 }\r
+\r
 void wrapper_gatts_mtu_changed_callback(uint8_t server_id, uint16_t conn_id, uint16_t mtu_size, errcode_t status)\r
 {\r
     for (auto callback : g_gatts_callback_list) {\r
@@ -246,6 +256,124 @@ void wrapper_gatts_mtu_changed_callback(uint8_t server_id, uint16_t conn_id, uin
     }\r
 }\r
 \r
+void wrapper_gattc_discovery_svc_callback(uint8_t client_id, uint16_t conn_id,\r
+    gattc_discovery_service_result_t *service, errcode_t status)\r
+{\r
+    for (auto callback : g_gattc_callback_list) {\r
+        if (callback.discovery_svc_cb) {\r
+            callback.discovery_svc_cb(client_id, conn_id, service, status);\r
+        }\r
+    }\r
+}\r
+\r
+void wrapper_gattc_discovery_svc_cmp_callback(uint8_t client_id, uint16_t conn_id,\r
+    bt_uuid_t *uuid, errcode_t status)\r
+{\r
+    for (auto callback : g_gattc_callback_list) {\r
+        if (callback.discovery_svc_cmp_cb) {\r
+            callback.discovery_svc_cmp_cb(client_id, conn_id, uuid, status);\r
+        }\r
+    }\r
+}\r
+\r
+void wrapper_gattc_discovery_chara_callback(uint8_t client_id, uint16_t conn_id,\r
+    gattc_discovery_character_result_t *character, errcode_t status)\r
+{\r
+    for (auto callback : g_gattc_callback_list) {\r
+        if (callback.discovery_chara_cb) {\r
+            callback.discovery_chara_cb(client_id, conn_id, character, status);\r
+        }\r
+    }\r
+}\r
+\r
+void wrapper_gattc_discovery_chara_cmp_callback(uint8_t client_id, uint16_t conn_id,\r
+    gattc_discovery_character_param_t *param, errcode_t status)\r
+{\r
+    for (auto callback : g_gattc_callback_list) {\r
+        if (callback.discovery_chara_cmp_cb) {\r
+            callback.discovery_chara_cmp_cb(client_id, conn_id, param, status);\r
+        }\r
+    }\r
+}\r
+\r
+void wrapper_gattc_discovery_desc_callback(uint8_t client_id, uint16_t conn_id,\r
+    gattc_discovery_descriptor_result_t *descriptor, errcode_t status)\r
+{\r
+    for (auto callback : g_gattc_callback_list) {\r
+        if (callback.discovery_desc_cb) {\r
+            callback.discovery_desc_cb(client_id, conn_id, descriptor, status);\r
+        }\r
+    }\r
+}\r
+\r
+void wrapper_gattc_discovery_desc_cmp_callback(uint8_t client_id, uint16_t conn_id,\r
+    uint16_t character_handle, errcode_t status)\r
+{\r
+    for (auto callback : g_gattc_callback_list) {\r
+        if (callback.discovery_desc_cmp_cb) {\r
+            callback.discovery_desc_cmp_cb(client_id, conn_id, character_handle, status);\r
+        }\r
+    }\r
+}\r
+\r
+void wrapper_gattc_read_callback(uint8_t client_id, uint16_t conn_id,\r
+    gattc_handle_value_t *read_result, gatt_status_t status)\r
+{\r
+    for (auto callback : g_gattc_callback_list) {\r
+        if (callback.read_cb) {\r
+            callback.read_cb(client_id, conn_id, read_result, status);\r
+        }\r
+    }\r
+}\r
+\r
+void wrapper_gattc_read_cmp_callback(uint8_t client_id, uint16_t conn_id,\r
+    gattc_read_req_by_uuid_param_t *param, errcode_t status)\r
+{\r
+    for (auto callback : g_gattc_callback_list) {\r
+        if (callback.read_cmp_cb) {\r
+            callback.read_cmp_cb(client_id, conn_id, param, status);\r
+        }\r
+    }\r
+}\r
+\r
+void wrapper_gattc_write_callback(uint8_t client_id, uint16_t conn_id, uint16_t handle, gatt_status_t status)\r
+{\r
+    for (auto callback : g_gattc_callback_list) {\r
+        if (callback.write_cb) {\r
+            callback.write_cb(client_id, conn_id, handle, status);\r
+        }\r
+    }\r
+}\r
+\r
+void wrapper_gattc_mtu_changed_callback(uint8_t client_id, uint16_t conn_id, uint16_t mtu_size, errcode_t status)\r
+{\r
+    for (auto callback : g_gattc_callback_list) {\r
+        if (callback.mtu_changed_cb) {\r
+            callback.mtu_changed_cb(client_id, conn_id, mtu_size, status);\r
+        }\r
+    }\r
+}\r
+\r
+void wrapper_gattc_notification_callback(uint8_t client_id, uint16_t conn_id, gattc_handle_value_t *data,\r
+    errcode_t status)\r
+{\r
+    for (auto callback : g_gattc_callback_list) {\r
+        if (callback.notification_cb) {\r
+            callback.notification_cb(client_id, conn_id, data, status);\r
+        }\r
+    }\r
+}\r
+\r
+void wrapper_indication_callback(uint8_t client_id, uint16_t conn_id, gattc_handle_value_t *data,\r
+    errcode_t status)\r
+{\r
+    for (auto callback : g_gattc_callback_list) {\r
+        if (callback.indication_cb) {\r
+            callback.indication_cb(client_id, conn_id, data, status);\r
+        }\r
+    }\r
+}\r
+\r
 static gap_ble_callbacks_t g_wrapper_gap_ble_callbacks = {\r
     .ble_enable_cb = wrapper_gap_ble_enable_callback,\r
     .ble_disable_cb = wrapper_gap_ble_disable_callback,\r
@@ -260,7 +388,7 @@ static gap_ble_callbacks_t g_wrapper_gap_ble_callbacks = {
     .read_rssi_cb = wrapper_gap_ble_read_rssi_callback,\r
     .terminate_adv_cb = wrapper_gap_ble_terminate_adv_callback,\r
     .auth_complete_cb = wrapper_gap_ble_auth_complete_callback,\r
-    .conn_param_update_cb = wrapper_gap_ble_connect_param_update_callback,  \r
+    .conn_param_update_cb = wrapper_gap_ble_connect_param_update_callback,\r
 };\r
 \r
 static gatts_callbacks_t g_wrapper_gatts_callbacks = {\r
@@ -272,15 +400,44 @@ static gatts_callbacks_t g_wrapper_gatts_callbacks = {
     .delete_service_cb = wrapper_gatts_delete_all_service_callback,\r
     .read_request_cb = wrapper_gatts_read_request_callback,\r
     .write_request_cb = wrapper_gatts_write_request_callback,\r
-    .mtu_changed_cb = wrapper_gatts_mtu_changed_callback,   \r
+    .mtu_changed_cb = wrapper_gatts_mtu_changed_callback,\r
+};\r
+\r
+static gattc_callbacks_t g_wrapper_gattc_callbacks = {\r
+    .discovery_svc_cb = wrapper_gattc_discovery_svc_callback,\r
+    .discovery_svc_cmp_cb = wrapper_gattc_discovery_svc_cmp_callback,\r
+    .discovery_chara_cb = wrapper_gattc_discovery_chara_callback,\r
+    .discovery_chara_cmp_cb = wrapper_gattc_discovery_chara_cmp_callback,\r
+    .discovery_desc_cb = wrapper_gattc_discovery_desc_callback,\r
+    .discovery_desc_cmp_cb = wrapper_gattc_discovery_desc_cmp_callback,\r
+    .read_cb = wrapper_gattc_read_callback,\r
+    .read_cmp_cb = wrapper_gattc_read_cmp_callback,\r
+    .write_cb = wrapper_gattc_write_callback,\r
+    .mtu_changed_cb = wrapper_gattc_mtu_changed_callback,\r
+    .notification_cb = wrapper_gattc_notification_callback,\r
+    .indication_cb = wrapper_indication_callback,\r
 };\r
 \r
 void wrapper_ble_register(void)\r
 {\r
     gap_ble_register_callbacks(&g_wrapper_gap_ble_callbacks);\r
     gatts_register_callbacks(&g_wrapper_gatts_callbacks);\r
+    gattc_register_callbacks(&g_wrapper_gattc_callbacks);\r
 }\r
 \r
+errcode_t wrapper_gattc_register_client(bt_uuid_t *uuid, uint8_t *clientId)\r
+{\r
+    errcode_t ret = ERRCODE_SUCC;\r
+    if (gattc_register_flag) {\r
+        *clientId = gattc_client_id;\r
+        ret = ERRCODE_SUCC;\r
+    } else {\r
+        gattc_register_flag = true;\r
+        ret = gattc_register_client(uuid, clientId);\r
+        gattc_client_id = *clientId;\r
+    }\r
+    return ret;\r
+}\r
 \r
 errcode_t wrapper_gatts_register_server(bt_uuid_t *app_uuid, uint8_t *server_id)\r
 {\r
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/breathexercise/src/BreathExerPage.cpp b/code/sdk/application/wearable/evb/nativeapp/nativeui/breathexercise/src/BreathExerPage.cpp
new file mode 100644 (file)
index 0000000..eb41dc9
--- /dev/null
@@ -0,0 +1,311 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: BreathExerPage\r
+ * Create: 2025-5-13\r
+ */\r
+#include <sys/time.h>\r
+#include <chrono>\r
+#include <iostream>\r
+#include <string>\r
+#include <sys/time.h>\r
+#include "AppViewIDs.h"\r
+#include "NativeAbility.h"\r
+#include "PageTransitionMgr.h"\r
+#include "SlicePageFactory.h"\r
+#include "UiConfig.h"\r
+#include "common/image_cache_manager.h"\r
+#include "components/root_view.h"\r
+#include "components/ui_image_animator.h"\r
+#include "gfx_utils/graphic_math.h"\r
+#include "main/LoadImg.h"\r
+#include "ohos_timer.h"\r
+#include "ui_resource_breath.h"\r
+#include "wearable_log.h"\r
+#include "settings/model/SettingDisplayModel.h"\r
+#include "breathexercise/BreathView.h"\r
+#include "breathexercise/BreathExerPage.h"\r
+\r
+namespace OHOS {\r
+static constexpr int16_t BREATH_GROUP_SIZE = 454;\r
+static constexpr int16_t BREATH_ZERO = 0;\r
+static constexpr int16_t BREATH_ONE = 1;\r
+static constexpr int16_t BREATH_TWO = 2;\r
+static constexpr int16_t BREATH_THREE = 3;\r
+static constexpr uint16_t IMAGEANIMATOERVIEW_SIZE = 80;\r
+static constexpr uint16_t END_TIME = 20;\r
+static constexpr int16_t BREATH_INHALE_POSITION_X = 180;\r
+static constexpr int16_t BREATH_INHALE_POSITION_Y = 380;\r
+static constexpr int16_t BREATH_INHALE_SIZE_WIDTH = 100;\r
+static constexpr int16_t BREATH_INHALE_SIZE_HEIGHT = 50;\r
+static constexpr int16_t BREATH_FRONT = 40;\r
+static constexpr int16_t BREATH_HALF = 2;\r
+static constexpr int16_t ONE_MINUTE = 60;\r
+static constexpr float BREATH_DEFAULT_SCALE = 0.5f;\r
+static constexpr float BREATH_DEFAULT_ANGLE = 30.0f;\r
+static constexpr float BREATH_MID_ANGLE = 60.0f;\r
+static constexpr float BREATH_MAX_ANGLE = 90.0f;\r
+static constexpr float BREATH_MAX_FACTOR = 1.0f;\r
+static constexpr float BREATH_MIN_FACTOR = 0.5f;\r
+const Vector2<float> VIEW_CENTER = {227, 227};\r
+enum class State { FadingOutFirst, FadingInSecond, FadingOutSecond, FadingInFirst } currentState;\r
+\r
+REGIST_SLICE_PAGE(VIEW_BREATH, BREATH_PAGE::BREATH_EXER_VIEW, BreathExerPage, false);\r
+\r
+BreathExerPage::BreathExerPage()\r
+{\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BreathExerPage::BreathExerPage");\r
+}\r
+\r
+BreathExerPage::~BreathExerPage()\r
+{\r
+    if (group_ != nullptr) {\r
+        group_->RemoveAll();\r
+        delete group_;\r
+        group_ = nullptr;\r
+    }\r
+\r
+    if (mainImg_ != nullptr) {\r
+        delete mainImg_;\r
+        mainImg_ = nullptr;\r
+    }\r
+\r
+    if (romataImg_ != nullptr) {\r
+        delete romataImg_;\r
+        romataImg_ = nullptr;\r
+    }\r
+\r
+    if (romataImgVirtual_ != nullptr) {\r
+        delete romataImgVirtual_;\r
+        romataImgVirtual_ = nullptr;\r
+    }\r
+\r
+    if (breathInhale_ != nullptr) {\r
+        delete breathInhale_;\r
+        breathInhale_ = nullptr;\r
+    }\r
+\r
+    if (breathExhale_ != nullptr) {\r
+        delete breathExhale_;\r
+        breathExhale_ = nullptr;\r
+    }\r
+\r
+    if (animatorCallBack_ != nullptr) {\r
+        delete animatorCallBack_;\r
+        animatorCallBack_ = nullptr;\r
+    }\r
+\r
+    if (animator_ != nullptr) {\r
+        delete animator_;\r
+        animator_ = nullptr;\r
+    }\r
+    \r
+    ImageCacheManager::GetInstance().UnloadAllInMultiRes(BREATH_IMAGE);\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BreathExerPage::~BreathExerPage");\r
+}\r
+\r
+void BreathExerPage::OnStart(void *data)\r
+{\r
+    group_ = new UIViewGroup();\r
+    if (group_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new group_ ERROR");\r
+        return;\r
+    }\r
+    group_->SetPosition(0, 0);\r
+    group_->Resize(BREATH_GROUP_SIZE, BREATH_GROUP_SIZE);\r
+    group_->SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
+    group_->SetTouchable(true);\r
+    group_->SetDraggable(true);\r
+    group_->SetOnDragListener(this);\r
+\r
+    mainImg_ = new UIImageView();\r
+    if (mainImg_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "mainImg_ new image fail");\r
+        return;\r
+    }\r
+    mainImg_->SetPosition(0, 0);\r
+    mainImg_->SetStyle(STYLE_BACKGROUND_OPA, OPA_OPAQUE);\r
+    LOADIMG::LoadImageViewImg(mainImg_, BREATH_IMAGE, IMAGE_BREATH_BG1);\r
+    group_->Add(mainImg_);\r
+\r
+    romataImg_ = new UIImageView();\r
+    if (romataImg_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "mainImg_ new romataImg_ fail");\r
+        return;\r
+    }\r
+    romataImg_->SetPosition(0, 0);\r
+    romataImg_->SetStyle(STYLE_BACKGROUND_OPA, 0);\r
+    romataImg_->Rotate(0, VIEW_CENTER);\r
+    LOADIMG::LoadImageViewImg(romataImg_, BREATH_IMAGE, IMAGE_BREATH_ROMATA1);\r
+    group_->Add(romataImg_);\r
+\r
+    romataImgVirtual_ = new UIImageView();\r
+    if (romataImgVirtual_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "mainImg_ new romataImgVirtual_ fail");\r
+        return;\r
+    }\r
+    romataImgVirtual_->SetPosition(0, 0);\r
+    romataImgVirtual_->SetStyle(STYLE_BACKGROUND_OPA, 0);\r
+    romataImgVirtual_->Rotate(0, VIEW_CENTER);\r
+    LOADIMG::LoadImageViewImg(romataImgVirtual_, BREATH_IMAGE, IMAGE_BREATH_ROMATA2);\r
+    group_->Add(romataImgVirtual_);\r
+\r
+    breathInhale_ = new UILabel();\r
+    breathInhale_->SetPosition(BREATH_INHALE_POSITION_X, BREATH_INHALE_POSITION_Y, BREATH_INHALE_SIZE_WIDTH,\r
+                               BREATH_INHALE_SIZE_HEIGHT);\r
+    breathInhale_->SetText("吸气");\r
+    breathInhale_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, BREATH_FRONT);\r
+    breathInhale_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+    breathInhale_->SetStyle(STYLE_TEXT_OPA, OPA_OPAQUE);\r
+    group_->Add(breathInhale_);\r
+\r
+    breathExhale_ = new UILabel();\r
+    breathExhale_->SetPosition(BREATH_INHALE_POSITION_X, BREATH_INHALE_POSITION_Y, BREATH_INHALE_SIZE_WIDTH,\r
+                               BREATH_INHALE_SIZE_HEIGHT);\r
+    breathExhale_->SetText("呼气");\r
+    breathExhale_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, BREATH_FRONT);\r
+    breathExhale_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+    breathExhale_->SetStyle(STYLE_TEXT_OPA, OPA_TRANSPARENT);\r
+    group_->Add(breathExhale_);\r
+\r
+    animatorCallBack_ = new BreathExerPageCallback(this);\r
+    if (animatorCallBack_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new animatorCallBack_ ERROR");\r
+        return;\r
+    }\r
+    animator_ = new Animator(animatorCallBack_, nullptr, 0, true);\r
+    if (animator_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new animator_ ERROR");\r
+        return;\r
+    }\r
+\r
+    currentState = State::FadingOutFirst;\r
+    g_StartTime = BreathModel::GetInstance().GetBeginTime();\r
+    rotateStep_ = BreathModel::GetInstance().GetRotateStep();\r
+    flag_ = true;\r
+    scale_ = BREATH_DEFAULT_SCALE;\r
+    angle_ = BREATH_DEFAULT_ANGLE;\r
+    animator_->Start();\r
+    SettingDisplayModel::GetInstance().EnableSteadyOn();\r
+    AddViewToPageContainer(group_);\r
+}\r
+\r
+void BreathExerPage::UpdateTextOpa()\r
+{\r
+    static float alpha = 0;\r
+    float totalRotationSteps = (BREATH_MAX_ANGLE - BREATH_DEFAULT_ANGLE) / rotateStep_;\r
+    float deltaAlpha = (float)OPA_OPAQUE / totalRotationSteps * BREATH_HALF;\r
+    switch (currentState) {\r
+        case State::FadingOutFirst:\r
+            if (angle_ < BREATH_MID_ANGLE) {\r
+                alpha += deltaAlpha;\r
+                alpha = (alpha > (float)OPA_OPAQUE) ? (float)OPA_OPAQUE : alpha;\r
+                breathInhale_->SetStyle(STYLE_TEXT_OPA, alpha);\r
+                breathInhale_->SetVisible(true);\r
+                breathExhale_->SetVisible(false);\r
+            } else {\r
+                currentState = State::FadingInSecond;\r
+                alpha = OPA_OPAQUE;\r
+            }\r
+            break;\r
+        case State::FadingInSecond:\r
+            if (angle_ < BREATH_MAX_ANGLE) {\r
+                alpha -= deltaAlpha;\r
+                alpha = (alpha < 0.0f) ? 0.0f : alpha;\r
+                breathInhale_->SetStyle(STYLE_TEXT_OPA, alpha);\r
+                breathInhale_->SetVisible(true);\r
+                breathExhale_->SetVisible(false);\r
+            } else {\r
+                currentState = State::FadingOutSecond;\r
+                alpha = 0;\r
+            }\r
+            break;\r
+        case State::FadingOutSecond:\r
+            if (angle_ > BREATH_MID_ANGLE) {\r
+                alpha += deltaAlpha;\r
+                alpha = (alpha > (float)OPA_OPAQUE) ? ((float)OPA_OPAQUE) : alpha;\r
+                breathExhale_->SetStyle(STYLE_TEXT_OPA, alpha);\r
+                breathInhale_->SetVisible(false);\r
+                breathExhale_->SetVisible(true);\r
+            } else {\r
+                currentState = State::FadingInFirst;\r
+                alpha = OPA_OPAQUE;\r
+            }\r
+            break;\r
+        case State::FadingInFirst:\r
+            if (angle_ > BREATH_DEFAULT_ANGLE) {\r
+                alpha -= deltaAlpha;\r
+                alpha = (alpha < 0.0f) ? 0.0f : alpha;\r
+                breathExhale_->SetStyle(STYLE_TEXT_OPA, alpha);\r
+                breathInhale_->SetVisible(false);\r
+                breathExhale_->SetVisible(true);\r
+            } else {\r
+                currentState = State::FadingOutFirst;\r
+                alpha = 0;\r
+            }\r
+            break;\r
+    }\r
+}\r
+\r
+void BreathExerPage::UpdateImageRotate()\r
+{\r
+    if (flag_) {\r
+        angle_ += rotateStep_;\r
+        scale_ += (BREATH_MAX_FACTOR - BREATH_MIN_FACTOR) / ((BREATH_MAX_ANGLE - BREATH_DEFAULT_ANGLE) / rotateStep_);\r
+    } else {\r
+        angle_ -= rotateStep_;\r
+        scale_ -= (BREATH_MAX_FACTOR - BREATH_MIN_FACTOR) / ((BREATH_MAX_ANGLE - BREATH_DEFAULT_ANGLE) / rotateStep_);\r
+    }\r
+    scale_ = (scale_ > BREATH_MAX_FACTOR) ? BREATH_MAX_FACTOR : scale_;\r
+    scale_ = (scale_ < BREATH_MIN_FACTOR) ? BREATH_MIN_FACTOR : scale_;\r
+\r
+    if (angle_ >= BREATH_MAX_ANGLE) {\r
+        angle_ = BREATH_MAX_ANGLE;\r
+        flag_ = false;\r
+    } else if (angle_ <= BREATH_DEFAULT_ANGLE) {\r
+        angle_ = BREATH_DEFAULT_ANGLE;\r
+        flag_ = true;\r
+    }\r
+\r
+    romataImgVirtual_->Scale(Vector2<float>{scale_, scale_}, VIEW_CENTER);\r
+    romataImgVirtual_->Rotate(angle_, VIEW_CENTER);\r
+    romataImgVirtual_->Invalidate();\r
+    romataImg_->Scale(Vector2<float>{scale_, scale_}, VIEW_CENTER);\r
+    romataImg_->Rotate(BREATH_MID_ANGLE - angle_, VIEW_CENTER);\r
+    romataImg_->Invalidate();\r
+}\r
+\r
+void BreathExerPage::OnPause()\r
+{\r
+    animator_->Stop();\r
+    SettingDisplayModel::GetInstance().DisableSteadyOn();\r
+}\r
+\r
+bool BreathExerPage::OnDrag(UIView &view, const DragEvent &event)\r
+{\r
+    UNUSED(view);\r
+    if ((event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT) && (event.GetDeltaX() > X_DRAG_OFFSET) &&\r
+        (event.GetDeltaX() > (DOUBLES * MATH_ABS(event.GetDeltaY())))) {\r
+        animator_->Stop();\r
+        NativeAbility::GetInstance().SwitchPageInSlice(BREATH_PAGE::BREATH_MAIN_VIEW,\r
+            TransitionType::TRANSITION_INVALID, false);\r
+    }\r
+    return true;\r
+}\r
+\r
+void BreathExerPage::BreathExerPageCallback::Callback(UIView *view)\r
+{\r
+    UNUSED(view);\r
+    struct timeval currentTime;\r
+    gettimeofday(&currentTime, nullptr);\r
+    uint32_t breathingTime = (BreathModel::GetInstance().GetTrainTime() + 1) * ONE_MINUTE;\r
+    if (breathingTime <= currentTime.tv_sec - g_StartTime) {\r
+        BreathExerPage->animator_->Stop();\r
+        NativeAbility::GetInstance().SwitchPageInSlice(BREATH_PAGE::BREATH_RESULT_VIEW,\r
+            TransitionType::TRANSITION_INVALID, false);\r
+    } else {\r
+        BreathExerPage->UpdateImageRotate();\r
+        BreathExerPage->UpdateTextOpa();\r
+    }\r
+}\r
+\r
+}
\ No newline at end of file
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/breathexercise/src/BreathMainPage.cpp b/code/sdk/application/wearable/evb/nativeapp/nativeui/breathexercise/src/BreathMainPage.cpp
new file mode 100644 (file)
index 0000000..bdd7df5
--- /dev/null
@@ -0,0 +1,277 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: BreathMainPage\r
+ * Create: 2025-5-13\r
+ */\r
+#include <sstream>\r
+#include <sys/time.h>\r
+#include "AppViewIDs.h"\r
+#include "NativeAbility.h"\r
+#include "PageTransitionMgr.h"\r
+#include "SlicePageFactory.h"\r
+#include "TransitionType.h"\r
+#include "UiConfig.h"\r
+#include "gfx_utils/graphic_math.h"\r
+#include "main/LoadImg.h"\r
+#include "ui_resource_breath.h"\r
+#include "wearable_log.h"\r
+#ifdef BUILD_IN_LINUX\r
+#include "localtime.h"\r
+#endif\r
+#include "breathexercise/BreathModel.h"\r
+#include "breathexercise/BreathMainPage.h"\r
+\r
+namespace OHOS {\r
+static constexpr char *BREATH_MAIN_BTN_TIMEID = "timeButton";\r
+static constexpr char *BREATH_MAIN_BTN_RHYTHM_ID = "rhythmButton";\r
+static constexpr char *BREATH_MAIN_BTN_START_ID = "startButton";\r
+static constexpr int16_t BREATH_MAIN_TITLE_X = 97;\r
+static constexpr int16_t BREATH_MAIN_TITLE_Y = 34;\r
+static constexpr int16_t BREATH_MAIN_TITLE_W = 260;\r
+static constexpr int16_t BREATH_MAIN_TITLE_H = 53;\r
+static constexpr int16_t BREATH_MAIN_TITLE_FONT_SIZE = 38;\r
+static constexpr int16_t BREATH_MAIN_DURBTN_X = 16;\r
+static constexpr int16_t BREATH_MAIN_DURBTN_Y = 190;\r
+static constexpr int16_t BREATH_MAIN_DURBTN_W = 74;\r
+static constexpr int16_t BREATH_MAIN_DURBTN_H = 74;\r
+static constexpr int16_t BREATH_MAIN_RHYBTN_X = 364;\r
+static constexpr int16_t BREATH_MAIN_RHYBTN_Y = 190;\r
+static constexpr int16_t BREATH_MAIN_RHYBTN_W = 74;\r
+static constexpr int16_t BREATH_MAIN_RHYBTN_H = 74;\r
+static constexpr int16_t BREATH_MAIN_STARTBTN_X = 60;\r
+static constexpr int16_t BREATH_MAIN_STARTBTN_Y = 358;\r
+static constexpr int16_t BREATH_MAIN_STARTBTN_W = 333;\r
+static constexpr int16_t BREATH_MAIN_STARTBTN_H = 96;\r
+static constexpr int16_t BREATH_MAIN_DURLAB_X = 20;\r
+static constexpr int16_t BREATH_MAIN_DURLAB_Y = 275;\r
+static constexpr int16_t BREATH_MAIN_DURLAB_W = 65;\r
+static constexpr int16_t BREATH_MAIN_DURLAB_H = 30;\r
+static constexpr int16_t BREATH_MAIN_RHYLAB_X = 376;\r
+static constexpr int16_t BREATH_MAIN_RHYLAB_Y = 275;\r
+static constexpr int16_t BREATH_MAIN_RHYLAB_W = 50;\r
+static constexpr int16_t BREATH_MAIN_RHYLAB_H = 30;\r
+static constexpr int16_t BREATH_MAIN_CENTER_XY = 127;\r
+static constexpr int16_t BREATH_MAIN_CENTER_WH = 200;\r
+static constexpr int16_t BREATH_MAIN_SETTING_FONT_SIZE = 24;\r
+static constexpr int16_t BREATH_MAIN_TIME_FONT_SIZE = 20;\r
+static constexpr int16_t BREATH_GROUP_SIZE = 466;\r
+static constexpr uint16_t Y_OFFSET = 300;\r
+\r
+REGIST_SLICE_PAGE(VIEW_BREATH, BREATH_PAGE::BREATH_MAIN_VIEW, BreathMainPage, true);\r
+\r
+BreathMainPage::BreathMainPage()\r
+{\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BreathMainPage::BreathMainPage");\r
+}\r
+\r
+BreathMainPage::~BreathMainPage()\r
+{\r
+    if (group_ != nullptr) {\r
+        group_->RemoveAll();\r
+        delete group_;\r
+        group_ = nullptr;\r
+    }\r
+    if (lableSetting_ != nullptr) {\r
+        delete lableSetting_;\r
+        lableSetting_ = nullptr;\r
+    }\r
+    if (buttonStart_ != nullptr) {\r
+        delete buttonStart_;\r
+        buttonStart_ = nullptr;\r
+    }\r
+    if (buttonSetting_ != nullptr) {\r
+        delete buttonSetting_;\r
+        buttonSetting_ = nullptr;\r
+    }\r
+    if (buttonTime_ != nullptr) {\r
+        delete buttonTime_;\r
+        buttonTime_ = nullptr;\r
+    }\r
+    if (labelTitle_ != nullptr) {\r
+        delete labelTitle_;\r
+        labelTitle_ = nullptr;\r
+    }\r
+    if (lableTime_ != nullptr) {\r
+        delete lableTime_;\r
+        lableTime_ = nullptr;\r
+    }\r
+    if (bgImg_ != nullptr) {\r
+        delete bgImg_;\r
+        bgImg_ = nullptr;\r
+    }\r
+    if (center_ != nullptr) {\r
+        delete center_;\r
+        center_ = nullptr;\r
+    }\r
+    ImageCacheManager::GetInstance().UnloadAllInMultiRes(BREATH_IMAGE);\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BreathMainPage::~BreathMainPage");\r
+}\r
+\r
+void BreathMainPage::OnStart(void *data)\r
+{\r
+    group_ = new UIViewGroup();\r
+    if (group_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new group_ ERROR");\r
+        return;\r
+    }\r
+    group_->SetPosition(0, 0);\r
+    group_->Resize(HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);\r
+    group_->SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
+    group_->SetTouchable(true);\r
+    group_->SetDraggable(true);\r
+    group_->SetOnDragListener(this);\r
+\r
+    bgImg_ = new UIImageView();\r
+    if (bgImg_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new Background ERROR");\r
+        return;\r
+    }\r
+    bgImg_->SetPosition(0, 0);\r
+    bgImg_->Resize(BREATH_GROUP_SIZE, BREATH_GROUP_SIZE);\r
+    LOADIMG::LoadImageViewImg(bgImg_, BREATH_IMAGE, IMAGE_BREATH_BG3);\r
+    group_->Add(bgImg_);\r
+\r
+    center_ = new UIImageView();\r
+    if (center_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new Center ERROR");\r
+        return;\r
+    }\r
+    center_->SetPosition(BREATH_MAIN_CENTER_XY, BREATH_MAIN_CENTER_XY);\r
+    center_->Resize(BREATH_MAIN_CENTER_WH, BREATH_MAIN_CENTER_WH);\r
+    LOADIMG::LoadImageViewImg(center_, BREATH_IMAGE, IMAGE_BREATH_CENTER2);\r
+    group_->Add(center_);\r
+\r
+    labelTitle_ = new UILabel();\r
+    if (labelTitle_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new labelTitle_ ERROR");\r
+        return;\r
+    }\r
+    labelTitle_->SetPosition(BREATH_MAIN_TITLE_X, BREATH_MAIN_TITLE_Y);\r
+    labelTitle_->Resize(BREATH_MAIN_TITLE_W, BREATH_MAIN_TITLE_H);\r
+    labelTitle_->SetText("呼吸");\r
+    labelTitle_->SetTextColor(Color::White());\r
+    labelTitle_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+    labelTitle_->SetFont(BOLD_VECTOR_FONT_FILENAME, BREATH_MAIN_TITLE_FONT_SIZE);\r
+    group_->Add(labelTitle_);\r
+\r
+    buttonTime_ = new UIButton();\r
+    if (buttonTime_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new buttonTime_ ERROR");\r
+        return;\r
+    }\r
+    buttonTime_->SetPosition(BREATH_MAIN_DURBTN_X, BREATH_MAIN_DURBTN_Y);\r
+    buttonTime_->Resize(BREATH_MAIN_DURBTN_W, BREATH_MAIN_DURBTN_H);\r
+    buttonTime_->SetViewId(BREATH_MAIN_BTN_TIMEID);\r
+    buttonTime_->SetOnClickListener(this);\r
+    LOADIMG::LoadBtnImage(buttonTime_, BREATH_IMAGE, IMAGE_BREATH_TIME, IMAGE_BREATH_TIME);\r
+    buttonTime_->SetStyleForState(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT, UIButton::PRESSED);\r
+    buttonTime_->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+    group_->Add(buttonTime_);\r
+\r
+    buttonSetting_ = new UIButton();\r
+    if (buttonSetting_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new buttonSetting_ ERROR");\r
+        return;\r
+    }\r
+    buttonSetting_->SetPosition(BREATH_MAIN_RHYBTN_X, BREATH_MAIN_RHYBTN_Y);\r
+    buttonSetting_->Resize(BREATH_MAIN_RHYBTN_W, BREATH_MAIN_RHYBTN_H);\r
+    buttonSetting_->SetViewId(BREATH_MAIN_BTN_RHYTHM_ID);\r
+    buttonSetting_->SetOnClickListener(this);\r
+    LOADIMG::LoadBtnImage(buttonSetting_, BREATH_IMAGE, IMAGE_BREATH_SETTING, IMAGE_BREATH_SETTING);\r
+    buttonSetting_->SetStyleForState(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT, UIButton::PRESSED);\r
+    buttonSetting_->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+    group_->Add(buttonSetting_);\r
+\r
+    buttonStart_ = new UIButton();\r
+    if (buttonStart_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new buttonStart_ ERROR");\r
+        return;\r
+    }\r
+    buttonStart_->SetPosition(BREATH_MAIN_STARTBTN_X, BREATH_MAIN_STARTBTN_Y);\r
+    buttonStart_->Resize(BREATH_MAIN_STARTBTN_W, BREATH_MAIN_STARTBTN_H);\r
+    buttonStart_->SetViewId(BREATH_MAIN_BTN_START_ID);\r
+    buttonStart_->SetOnClickListener(this);\r
+    LOADIMG::LoadBtnImage(buttonStart_, BREATH_IMAGE, IMAGE_BREATH_START, IMAGE_BREATH_START);\r
+    buttonStart_->SetStyleForState(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT, UIButton::PRESSED);\r
+    buttonStart_->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+    group_->Add(buttonStart_);\r
+\r
+    lableSetting_ = new UILabel();\r
+    if (lableSetting_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new lableSetting_ ERROR");\r
+        return;\r
+    }\r
+    lableSetting_->SetPosition(BREATH_MAIN_RHYLAB_X, BREATH_MAIN_RHYLAB_Y);\r
+    lableSetting_->Resize(BREATH_MAIN_RHYLAB_W, BREATH_MAIN_RHYLAB_H);\r
+    lableSetting_->SetText("设置");\r
+    lableSetting_->SetLineBreakMode(UILabel::LINE_BREAK_ELLIPSIS);\r
+    lableSetting_->SetTextColor(Color::White());\r
+    lableSetting_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+    lableSetting_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, BREATH_MAIN_SETTING_FONT_SIZE);\r
+    group_->Add(lableSetting_);\r
+\r
+    lableTime_ = new UILabel();\r
+    if (lableTime_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new lableTime_ ERROR");\r
+        return;\r
+    }\r
+    lableTime_->SetPosition(BREATH_MAIN_DURLAB_X, BREATH_MAIN_DURLAB_Y);\r
+    lableTime_->Resize(BREATH_MAIN_DURLAB_W, BREATH_MAIN_DURLAB_H);\r
+    lableTime_->SetLineBreakMode(UILabel::LINE_BREAK_ELLIPSIS);\r
+    lableTime_->SetTextColor(Color::White());\r
+    lableTime_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+    lableTime_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, BREATH_MAIN_TIME_FONT_SIZE);\r
+    group_->Add(lableTime_);\r
+\r
+    AddViewToPageContainer(group_);\r
+}\r
+\r
+void BreathMainPage::OnResume(void)\r
+{\r
+    int time = BreathModel::GetInstance().GetTrainTime() + 1;\r
+    std::ostringstream oss;\r
+    oss << time << " 分钟";\r
+    std::string timeStr = oss.str();\r
+    lableTime_->SetText(timeStr.c_str());\r
+}\r
+\r
+bool BreathMainPage::OnClick(UIView &view, const ClickEvent &event)\r
+{\r
+    if (strcmp(view.GetViewId(), BREATH_MAIN_BTN_TIMEID) == 0) {\r
+        NativeAbility::GetInstance().SwitchPageInSlice(BREATH_PAGE::BREATH_DUR_VIEW,\r
+            TransitionType::TRANSITION_INVALID, false);\r
+    } else if (strcmp(view.GetViewId(), BREATH_MAIN_BTN_RHYTHM_ID) == 0) {\r
+        NativeAbility::GetInstance().SwitchPageInSlice(BREATH_PAGE::BREATH_RHY_VIEW,\r
+            TransitionType::TRANSITION_INVALID, false);\r
+    } else if (strcmp(view.GetViewId(), BREATH_MAIN_BTN_START_ID) == 0) {\r
+        NativeAbility::GetInstance().SwitchPageInSlice(BREATH_PAGE::BREATH_START_VIEW,\r
+            TransitionType::TRANSITION_INVALID, false);\r
+#ifdef _WIN32\r
+        struct timeval tv;\r
+        gettimeofday(&tv, NULL);\r
+#else\r
+        struct timeval64 tv;\r
+        gettimeofday64(&tv, NULL);\r
+#endif\r
+        uint32_t remTime = tv.tv_sec;\r
+        BreathModel::GetInstance().SetStartTime(remTime);\r
+    } else {\r
+        return false;\r
+    }\r
+    return true;\r
+}\r
+\r
+bool BreathMainPage::OnDrag(UIView &view, const DragEvent &event)\r
+{\r
+    UNUSED(view);\r
+    if ((event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT) && (event.GetDeltaX() > X_DRAG_OFFSET) &&\r
+        (event.GetDeltaX() > (DOUBLES * MATH_ABS(event.GetDeltaY())))) {\r
+        NativeAbility::GetInstance().ChangeSliceToApplist();\r
+    } else if ((event.GetDragDirection() == DragEvent::DIRECTION_BOTTOM_TO_TOP) &&\r
+               (event.GetStartPoint().y > Y_OFFSET)) {\r
+        NativeAbility::GetInstance().SwitchPageInSlice(BREATH_PAGE::BREATH_TRAINING_VIEW,\r
+            TransitionType::TRANSITION_INVALID, false);\r
+    }\r
+    return true;\r
+}\r
+}
\ No newline at end of file
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/breathexercise/src/BreathModel.cpp b/code/sdk/application/wearable/evb/nativeapp/nativeui/breathexercise/src/BreathModel.cpp
new file mode 100644 (file)
index 0000000..aab4095
--- /dev/null
@@ -0,0 +1,159 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: BreathModel\r
+ * Create: 2025-5-13\r
+ */\r
+#include "main/HealthModel.h"\r
+#include "UiConfig.h"\r
+#include "common/image_cache_manager.h"\r
+#include "uiservice/ui_service.h"\r
+#include "wearable_log.h"\r
+#include "breathexercise/BreathTimeSetPage.h"\r
+#include "breathexercise/BreathModel.h"\r
+\r
+\r
+namespace OHOS {\r
+static constexpr char *SPEED_FASTER_LITTLE = "稍快";\r
+static constexpr char *SPEED_SOOTHING = "舒缓";\r
+static constexpr char *SPEED_SLOWING = "缓慢";\r
+static constexpr uint16_t MINUTE_0_DATA = 0;\r
+static constexpr uint16_t MINUTE_1_DATA = 1;\r
+static constexpr uint16_t MINUTE_2_DATA = 2;\r
+static constexpr uint16_t Frequency_Score_LOWER = 60;\r
+static constexpr uint16_t Frequency_Score_RANGE = 40;\r
+static constexpr uint16_t Heart_Rate_LOWER = 90;\r
+static constexpr uint16_t Heart_Rate_RANGE = 10;\r
+static constexpr uint16_t ONE_MINUTE = 60;\r
+static constexpr uint16_t TWO_MINUTES = 120;\r
+static constexpr uint16_t THREE_MINUTES = 180;\r
+static constexpr uint8_t FREQUENCY_8 = 0;\r
+static constexpr uint8_t FREQUENCY_7 = 1;\r
+static constexpr uint8_t FREQUENCY_6 = 2;\r
+static constexpr float BREATH_ROTETAESTEP_6 = 0.295f;\r
+static constexpr float BREATH_ROTETAESTEP_7 = 0.347f;\r
+static constexpr float BREATH_ROTETAESTEP_8 = 0.393f;\r
+\r
+BreathModel::BreathModel() {}\r
+\r
+BreathModel::~BreathModel() {}\r
+\r
+BreathModel &BreathModel::GetInstance()\r
+{\r
+    static BreathModel instance;\r
+    return instance;\r
+}\r
+\r
+uint8_t BreathModel::GetTrainTime()\r
+{\r
+    return selectTrainTime_;\r
+}\r
+\r
+void BreathModel::SetTrainTime(uint16_t value)\r
+{\r
+    selectTrainTime_ = value;\r
+}\r
+\r
+uint8_t BreathModel::GetRhythm()\r
+{\r
+    return selectRhythm_;\r
+}\r
+\r
+void BreathModel::SetRhythm(uint16_t value)\r
+{\r
+    selectRhythm_ = value;\r
+}\r
+\r
+int32_t BreathModel::GetStartTime()\r
+{\r
+    return startTime_;\r
+}\r
+\r
+void BreathModel::SetStartTime(int32_t value)\r
+{\r
+    startTime_ = value;\r
+}\r
+\r
+int32_t BreathModel::GetBeginTime()\r
+{\r
+    return beginTime_;\r
+}\r
+\r
+void BreathModel::SetBeginTime(int32_t value)\r
+{\r
+    beginTime_ = value;\r
+}\r
+\r
+uint8_t BreathModel::GetFrequencyScore()\r
+{\r
+    if (frequencyScore_ == 0) {\r
+        BreathModel::GetInstance().SetFrequencyScore();\r
+        return frequencyScore_;\r
+    }\r
+    return frequencyScore_;\r
+}\r
+\r
+void BreathModel::SetFrequencyScore()\r
+{\r
+    frequencyScore_ = Frequency_Score_LOWER + rand() % Frequency_Score_RANGE;\r
+}\r
+\r
+std::string BreathModel::GetTrainingDurationTime()\r
+{\r
+    return std::to_string(trainingDurationTime_);\r
+}\r
+\r
+void BreathModel::SetTrainingDurationTime(uint16_t selectTrainTime)\r
+{\r
+    trainingDurationTime_ += selectTrainTime;\r
+}\r
+\r
+std::string BreathModel::GetTrainingCount()\r
+{\r
+    return std::to_string(trainingCount_);\r
+}\r
+\r
+void BreathModel::SetTrainingCount()\r
+{\r
+    trainingCount_++;\r
+}\r
+\r
+uint8_t BreathModel::GetHeartRate()\r
+{\r
+    if (heartRate_ == 0) {\r
+        BreathModel::GetInstance().SetHeartRate();\r
+        return heartRate_;\r
+    }\r
+    return heartRate_;\r
+}\r
+\r
+void BreathModel::SetHeartRate()\r
+{\r
+    heartRate_ = Heart_Rate_LOWER + rand() % Heart_Rate_RANGE;\r
+}\r
+\r
+float BreathModel::GetRotateStep()\r
+{\r
+    switch (selectRhythm_) {\r
+        case FREQUENCY_6:\r
+            return BREATH_ROTETAESTEP_6;\r
+        case FREQUENCY_7:\r
+            return BREATH_ROTETAESTEP_7;\r
+        case FREQUENCY_8:\r
+            return BREATH_ROTETAESTEP_8;\r
+        default:\r
+            return BREATH_ROTETAESTEP_6;\r
+    }\r
+}\r
+\r
+char *BreathModel::GetRhythmText()\r
+{\r
+    if (selectRhythm_ == MINUTE_0_DATA) {\r
+        return SPEED_FASTER_LITTLE;\r
+    } else if (selectRhythm_ == MINUTE_1_DATA) {\r
+        return SPEED_SOOTHING;\r
+    } else if (selectRhythm_ == MINUTE_2_DATA) {\r
+        return SPEED_SLOWING;\r
+    }\r
+    return nullptr;\r
+}\r
+}  // namespace OHOS
\ No newline at end of file
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/breathexercise/src/BreathPresenter.cpp b/code/sdk/application/wearable/evb/nativeapp/nativeui/breathexercise/src/BreathPresenter.cpp
new file mode 100644 (file)
index 0000000..faea9f9
--- /dev/null
@@ -0,0 +1,13 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: BreathPresenter\r
+ * Create: 2025-5-13\r
+ */\r
+#include "AppViewIDs.h"\r
+#include "NativeRegisterManager.h"\r
+#include "breathexercise/BreathView.h"\r
+#include "breathexercise/BreathPresenter.h"\r
+\r
+namespace OHOS {\r
+REGIST_MENU(VIEW_BREATH, BreathView, BreathPresenter, BREATH_ICON, BREATH_ICON, "呼吸训练");\r
+}
\ No newline at end of file
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/breathexercise/src/BreathResultPage.cpp b/code/sdk/application/wearable/evb/nativeapp/nativeui/breathexercise/src/BreathResultPage.cpp
new file mode 100644 (file)
index 0000000..1effbbd
--- /dev/null
@@ -0,0 +1,407 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: BreathReult\r
+ * Create: 2025-5-13\r
+ */\r
+#include <sstream>\r
+#include <sys/time.h>\r
+#include "AppViewIDs.h"\r
+#include "NativeAbility.h"\r
+#include "PageTransitionMgr.h"\r
+#include "SlicePageFactory.h"\r
+#include "TransitionType.h"\r
+#include "UiConfig.h"\r
+#include "components/root_view.h"\r
+#include "gfx_utils/graphic_math.h"\r
+#include "main/LoadImg.h"\r
+#include "ui_resource_breath.h"\r
+#include "wearable_log.h"\r
+#ifdef BUILD_IN_LINUX\r
+#include "localtime.h"\r
+#endif\r
+#include "breathexercise/BreathView.h"\r
+#include "breathexercise/BreathResultPage.h"\r
+\r
+namespace OHOS {\r
+static constexpr char *BREATH_BUTTON_COMPLETE_ID = "completeButton";\r
+static constexpr char *BREATH_BUTTON_RESTART_ID = "restartButton";\r
+static constexpr uint16_t BREATH_RESULTS_X = 97;\r
+static constexpr uint16_t BREATH_RESULTS_Y = 34;\r
+static constexpr uint16_t BREATH_RESULTS_W = 260;\r
+static constexpr uint16_t BREATH_RESULTS_H = 53;\r
+static constexpr uint16_t BREATH_MAX_FONT_SIZE = 38;\r
+static constexpr uint16_t BREATH_MIN_FONT_SIZE = 28;\r
+static constexpr uint16_t BREATH_SCOUT_FONT_SIZE = 40;\r
+static constexpr uint16_t BREATH_RHYTHM_X = 77;\r
+static constexpr uint16_t BREATH_RHYTHM_Y = 83;\r
+static constexpr uint16_t BREATH_RHYTHM_W = 300;\r
+static constexpr uint16_t BREATH_RHYTHM_H = 30;\r
+static constexpr uint16_t BREATH_SCORES_X = 241;\r
+static constexpr uint16_t BREATH_SCORES_Y = 190;\r
+static constexpr uint16_t BREATH_SCORES_W = 72;\r
+static constexpr uint16_t BREATH_SCORES_H = 32;\r
+static constexpr uint16_t BREATH_COMPLETE_X = 111;\r
+static constexpr uint16_t BREATH_COMPLETE_Y = 730;\r
+static constexpr uint16_t BREATH_RESTART_Y = 815;\r
+static constexpr uint16_t BREATH_COMPLETE_W = 232;\r
+static constexpr uint16_t BREATH_COMPLETE_H = 76;\r
+static constexpr uint16_t BREATH_GUINEAS_SIZE = 100;\r
+static constexpr uint16_t BREATH_NINETY_SIZE = 90;\r
+static constexpr uint16_t BREATH_EIGHTY_NINE_SIZE = 89;\r
+static constexpr uint16_t BREATH_EIGHTY_SIZE = 80;\r
+static constexpr uint16_t BREATH_SEVENTY_NINE_SIZE = 79;\r
+static constexpr uint16_t BREATH_SEVENTY_SIZE = 70;\r
+static constexpr uint16_t BREATH_SIXTY_NINE_SIZE = 69;\r
+static constexpr uint16_t BREATH_SIXTY_SIZE = 60;\r
+static constexpr uint16_t TEXT_OPACITY = 147;\r
+static constexpr uint16_t TEXT_OPACITY_TWO = 220;\r
+static constexpr uint16_t INDEX_0 = 0;\r
+static constexpr uint16_t INDEX_1 = 1;\r
+static constexpr uint16_t INDEX_2 = 2;\r
+static constexpr uint16_t INDEX_3 = 3;\r
+static constexpr uint16_t INDEX_4 = 4;\r
+static constexpr uint16_t BREATH_RESULT_POSY_OFFSET = 118;\r
+static constexpr uint16_t BREATH_RESULT_BUTTON_BG_POSITION_X = 92;\r
+static constexpr uint16_t BREATH_RESULT_BUTTON_BG_POSITION_Y = 132;\r
+static constexpr uint16_t BREATH_RESULT_BUTTON_BG_WIDTH = 270;\r
+static constexpr uint16_t BREATH_RESULT_BUTTON_BG_HEIGHT = 108;\r
+static constexpr uint16_t BREATH_RESULT_LABEL_DES_POSITION_X = 112;\r
+static constexpr uint16_t BREATH_RESULT_LABEL_DES_POSITION_Y = 142;\r
+static constexpr uint16_t BREATH_RESULT_LABEL_DES_WIDTH = 200;\r
+static constexpr uint16_t BREATH_RESULT_LABEL_DES_HEIGHT = 30;\r
+static constexpr uint16_t BREATH_RESULT_LABEL_COUNT_POSITION_X = 112;\r
+static constexpr uint16_t BREATH_RESULT_LABEL_COUNT_POSITION_Y = 182;\r
+static constexpr uint16_t BREATH_RESULT_LABEL_COUNT_WIDTH = 50;\r
+static constexpr uint16_t BREATH_RESULT_LABEL_COUNT_HEIGHT = 44;\r
+static constexpr uint16_t BREATH_RESULT_LABEL_UNIT_POSITION_X = 112;\r
+static constexpr uint16_t BREATH_RESULT_LABEL_UNIT_POSITION_Y = 192;\r
+static constexpr uint16_t BREATH_RESULT_LABEL_UNIT_WIDTH = 70;\r
+static constexpr uint16_t BREATH_RESULT_LABEL_UNIT_HEIGHT = 34;\r
+static constexpr uint16_t BREATH_RESULT_BORDER_RADIUS = 8;\r
+\r
+REGIST_SLICE_PAGE(VIEW_BREATH, BREATH_PAGE::BREATH_RESULT_VIEW, BreathResultPage, false);\r
+\r
+BreathResultPage::BreathResultPage()\r
+{\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BreathResultPage::BreathResultPage");\r
+}\r
+\r
+BreathResultPage::~BreathResultPage()\r
+{\r
+    if (group_ != nullptr) {\r
+        group_->RemoveAll();\r
+        delete group_;\r
+        group_ = nullptr;\r
+    }\r
+\r
+    if (labelTitle_ != nullptr) {\r
+        delete labelTitle_;\r
+        labelTitle_ = nullptr;\r
+    }\r
+\r
+    if (labelTimeAndRhythmTitle_ != nullptr) {\r
+        delete labelTimeAndRhythmTitle_;\r
+        labelTimeAndRhythmTitle_ = nullptr;\r
+    }\r
+\r
+    if (scores_ != nullptr) {\r
+        delete scores_;\r
+        scores_ = nullptr;\r
+    }\r
+\r
+    if (pageBgImg_ != nullptr) {\r
+        delete pageBgImg_;\r
+        pageBgImg_ = nullptr;\r
+    }\r
+\r
+    if (buttonComplete_ != nullptr) {\r
+        delete buttonComplete_;\r
+        buttonComplete_ = nullptr;\r
+    }\r
+\r
+    if (buttonRestart_ != nullptr) {\r
+        delete buttonRestart_;\r
+        buttonRestart_ = nullptr;\r
+    }\r
+\r
+    for (int i = 0; i < LABEL_COUNT; i++) {\r
+        if (buttonBg_[i] != nullptr) {\r
+            delete buttonBg_[i];\r
+            buttonBg_[i] = nullptr;\r
+        }\r
+    }\r
+\r
+    for (int i = 0; i < LABEL_COUNT; i++) {\r
+        if (labelDes_[i] != nullptr) {\r
+            delete labelDes_[i];\r
+            labelDes_[i] = nullptr;\r
+        }\r
+    }\r
+\r
+    for (int i = 0; i < LABEL_COUNT; i++) {\r
+        if (labelValue_[i] != nullptr) {\r
+            delete labelValue_[i];\r
+            labelValue_[i] = nullptr;\r
+        }\r
+    }\r
+\r
+    for (int i = 0; i < LABEL_COUNT; i++) {\r
+        if (labelUnit_[i] != nullptr) {\r
+            delete labelUnit_[i];\r
+            labelUnit_[i] = nullptr;\r
+        }\r
+    }\r
+    ImageCacheManager::GetInstance().UnloadAllInMultiRes(BREATH_IMAGE);\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BreathResultPage::~BreathResultPage");\r
+}\r
+\r
+void BreathResultPage::OnStart(void *data)\r
+{\r
+    group_ = new UIScrollView();\r
+    if (group_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new group_ ERROR");\r
+        return;\r
+    }\r
+\r
+    group_->SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);\r
+    group_->SetThrowDrag(true);\r
+    group_->SetScrollBlankSize(BREATH_RESULTS_Y);\r
+    group_->SetOnDragListener(this);\r
+    group_->SetDraggable(true);\r
+    group_->SetTouchable(true);\r
+    group_->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+\r
+    labelTitle_ = new UILabel();\r
+    if (labelTitle_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new labelTitle_ ERROR");\r
+        return;\r
+    }\r
+    labelTitle_->SetPosition(BREATH_RESULTS_X, BREATH_RESULTS_Y);\r
+    labelTitle_->Resize(BREATH_RESULTS_W, BREATH_RESULTS_H);\r
+    labelTitle_->SetText("训练结果");\r
+    labelTitle_->SetTextColor(Color::White());\r
+    labelTitle_->SetFont(BOLD_VECTOR_FONT_FILENAME, BREATH_MAX_FONT_SIZE);\r
+    labelTitle_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+    group_->Add(labelTitle_);\r
+\r
+    labelTimeAndRhythmTitle_ = new UILabel();\r
+    if (labelTimeAndRhythmTitle_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new Rhythm ERROR");\r
+        return;\r
+    }\r
+    labelTimeAndRhythmTitle_->SetPosition(BREATH_RHYTHM_X, BREATH_RHYTHM_Y);\r
+    labelTimeAndRhythmTitle_->Resize(BREATH_RHYTHM_W, BREATH_RHYTHM_H);\r
+    labelTimeAndRhythmTitle_->SetTextColor(Color::Green());\r
+    labelTimeAndRhythmTitle_->SetFont(BOLD_VECTOR_FONT_FILENAME, BREATH_MIN_FONT_SIZE);\r
+    labelTimeAndRhythmTitle_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+    uint8_t durationTime = BreathModel::GetInstance().GetTrainTime() + 1;\r
+    std::ostringstream oss;\r
+    oss << std::to_string(durationTime) << " 分钟" << " | ";\r
+    if (const char* rhythm = BreathModel::GetInstance().GetRhythmText()) {\r
+        oss << rhythm;\r
+    } else {\r
+        oss << "缓慢";  // 默认值\r
+    }\r
+    \r
+    std::string weatherHumidity = oss.str();\r
+    labelTimeAndRhythmTitle_->SetText(weatherHumidity.c_str());\r
+    group_->Add(labelTimeAndRhythmTitle_);\r
+\r
+    BreathModel::GetInstance().SetFrequencyScore();\r
+    BreathModel::GetInstance().SetHeartRate();\r
+    BreathModel::GetInstance().SetTrainingDurationTime(BreathModel::GetInstance().GetTrainTime() + 1);\r
+    BreathModel::GetInstance().SetTrainingCount();\r
+    InitBtnBg();\r
+    InitLabelDes();\r
+    InitLabelCount();\r
+    InitLabelUnit();\r
+    InitBtn();\r
+    pageBgImg_ = new UIImageView();\r
+    if (pageBgImg_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new pageBgImg_ ERROR");\r
+        return;\r
+    }\r
+    pageBgImg_->SetPosition(0, 0);\r
+    LOADIMG::LoadImageViewImg(pageBgImg_, BREATH_IMAGE, IMAGE_BREATH_BG2);\r
+    AddViewToPageContainer(pageBgImg_);\r
+    AddViewToPageContainer(group_);\r
+}\r
+\r
+void BreathResultPage::InitBtn()\r
+{\r
+    buttonComplete_ = new UIButton();\r
+    if (buttonComplete_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new buttonComplete_ ERROR");\r
+        return;\r
+    }\r
+    buttonComplete_->SetPosition(BREATH_COMPLETE_X, BREATH_COMPLETE_Y);\r
+    buttonComplete_->Resize(BREATH_COMPLETE_W, BREATH_COMPLETE_H);\r
+    buttonComplete_->SetViewId(BREATH_BUTTON_COMPLETE_ID);\r
+    buttonComplete_->SetOnClickListener(this);\r
+    LOADIMG::LoadBtnImage(buttonComplete_, BREATH_IMAGE, IMAGE_BREATH_COMPLETE, IMAGE_BREATH_COMPLETE);\r
+    buttonComplete_->SetStyleForState(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT, UIButton::PRESSED);\r
+    buttonComplete_->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+    group_->Add(buttonComplete_);\r
+\r
+    buttonRestart_ = new UIButton();\r
+    if (buttonRestart_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new buttonRestart_ ERROR");\r
+        return;\r
+    }\r
+    buttonRestart_->SetPosition(BREATH_COMPLETE_X, BREATH_RESTART_Y);\r
+    buttonRestart_->Resize(BREATH_COMPLETE_W, BREATH_COMPLETE_H);\r
+    buttonRestart_->SetViewId(BREATH_BUTTON_RESTART_ID);\r
+    buttonRestart_->SetOnClickListener(this);\r
+    LOADIMG::LoadBtnImage(buttonRestart_, BREATH_IMAGE, IMAGE_BREATH_RETEST, IMAGE_BREATH_RETEST);\r
+    buttonRestart_->SetStyleForState(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT, UIButton::PRESSED);\r
+    buttonRestart_->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+    group_->Add(buttonRestart_);\r
+}\r
+\r
+void BreathResultPage::InitBtnBg()\r
+{\r
+    for (int i = 0; i < LABEL_COUNT; i++) {\r
+        buttonBg_[i] = new UIButton();\r
+        if (buttonBg_[i] == nullptr) {\r
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new button ERROR");\r
+            return;\r
+        }\r
+\r
+        int posY = BREATH_RESULT_BUTTON_BG_POSITION_Y + BREATH_RESULT_POSY_OFFSET * i;\r
+        buttonBg_[i]->SetPosition(BREATH_RESULT_BUTTON_BG_POSITION_X, posY, BREATH_RESULT_BUTTON_BG_WIDTH,\r
+                                  BREATH_RESULT_BUTTON_BG_HEIGHT);\r
+        buttonBg_[i]->SetStyleForState(STYLE_BACKGROUND_COLOR, 0X36FFFFFF, UIButton::PRESSED);\r
+        buttonBg_[i]->SetStyleForState(STYLE_BACKGROUND_COLOR, 0X36FFFFFF, UIButton::INACTIVE);\r
+        buttonBg_[i]->SetStyleForState(STYLE_BACKGROUND_COLOR, 0X36FFFFFF, UIButton::RELEASED);\r
+        buttonBg_[i]->SetStyleForState(STYLE_BORDER_RADIUS, BREATH_RESULT_BORDER_RADIUS, UIButton::PRESSED);\r
+        buttonBg_[i]->SetStyleForState(STYLE_BORDER_RADIUS, BREATH_RESULT_BORDER_RADIUS, UIButton::INACTIVE);\r
+        buttonBg_[i]->SetStyleForState(STYLE_BORDER_RADIUS, BREATH_RESULT_BORDER_RADIUS, UIButton::RELEASED);\r
+        group_->Add(buttonBg_[i]);\r
+    }\r
+}\r
+\r
+void BreathResultPage::InitLabelDes()\r
+{\r
+    std::string strDes[LABEL_COUNT] = {"呼吸频率", "呼吸前心率", "训练时长", "今日累计时长", "今日累计次数"};\r
+    for (int i = 0; i < LABEL_COUNT; i++) {\r
+        labelDes_[i] = new UILabel();\r
+        if (labelDes_[i] == nullptr) {\r
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new button ERROR");\r
+            return;\r
+        }\r
+\r
+        int posY = BREATH_RESULT_LABEL_DES_POSITION_Y + BREATH_RESULT_POSY_OFFSET * i;\r
+        labelDes_[i]->SetPosition(BREATH_RESULT_LABEL_DES_POSITION_X, posY, BREATH_RESULT_LABEL_DES_WIDTH,\r
+                                  BREATH_RESULT_LABEL_DES_HEIGHT);\r
+        labelDes_[i]->SetText(strDes[i].c_str());\r
+        labelDes_[i]->SetTextColor(Color::White());\r
+        labelDes_[i]->SetFont(DEFAULT_VECTOR_FONT_FILENAME, BREATH_MIN_FONT_SIZE);\r
+        labelDes_[i]->SetAlign(TEXT_ALIGNMENT_LEFT, TEXT_ALIGNMENT_CENTER);\r
+        labelDes_[i]->SetStyle(STYLE_TEXT_OPA, TEXT_OPACITY);\r
+        group_->Add(labelDes_[i]);\r
+    }\r
+}\r
+\r
+void BreathResultPage::InitLabelCount()\r
+{\r
+    for (int i = 0; i < LABEL_COUNT; i++) {\r
+        labelValue_[i] = new UILabel();\r
+        if (labelValue_[i] == nullptr) {\r
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new button ERROR");\r
+            return;\r
+        }\r
+\r
+        int posY = BREATH_RESULT_LABEL_COUNT_POSITION_Y + BREATH_RESULT_POSY_OFFSET * i;\r
+        labelValue_[i]->SetPosition(BREATH_RESULT_LABEL_COUNT_POSITION_X, posY, BREATH_RESULT_LABEL_COUNT_WIDTH,\r
+                                    BREATH_RESULT_LABEL_COUNT_HEIGHT);\r
+        labelValue_[i]->SetText("20");\r
+        labelValue_[i]->SetTextColor(Color::White());\r
+        labelValue_[i]->SetFont(BOLD_VECTOR_FONT_FILENAME, BREATH_SCOUT_FONT_SIZE);\r
+        labelValue_[i]->SetAlign(TEXT_ALIGNMENT_LEFT, TEXT_ALIGNMENT_CENTER);\r
+        group_->Add(labelValue_[i]);\r
+    }\r
+    scores_ = new UIImageView();\r
+    if (scores_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new Scores ERROR");\r
+        return;\r
+    }\r
+    scores_->SetPosition(BREATH_SCORES_X, BREATH_SCORES_Y);\r
+    scores_->Resize(BREATH_SCORES_W, BREATH_SCORES_H);\r
+    group_->Add(scores_);\r
+    uint8_t heartRate_ = BreathModel::GetInstance().GetHeartRate();\r
+    uint8_t frequencyScore_ = BreathModel::GetInstance().GetFrequencyScore();\r
+    if (frequencyScore_ >= BREATH_NINETY_SIZE && frequencyScore_ <= BREATH_GUINEAS_SIZE) {\r
+        LOADIMG::LoadImageViewImg(scores_, BREATH_IMAGE, IMAGE_BREATH_EXCELLENT);\r
+    } else if (frequencyScore_ >= BREATH_EIGHTY_SIZE && frequencyScore_ <= BREATH_EIGHTY_NINE_SIZE) {\r
+        LOADIMG::LoadImageViewImg(scores_, BREATH_IMAGE, IMAGE_BREATH_GOOD);\r
+    } else if (frequencyScore_ >= BREATH_SEVENTY_SIZE && frequencyScore_ <= BREATH_SEVENTY_NINE_SIZE) {\r
+        LOADIMG::LoadImageViewImg(scores_, BREATH_IMAGE, IMAGE_BREATH_NORMAL);\r
+    } else if (frequencyScore_ >= BREATH_SIXTY_SIZE && frequencyScore_ <= BREATH_SIXTY_NINE_SIZE) {\r
+        LOADIMG::LoadImageViewImg(scores_, BREATH_IMAGE, IMAGE_BREATH_PASS);\r
+    } else {\r
+        LOADIMG::LoadImageViewImg(scores_, BREATH_IMAGE, IMAGE_BREATH_BAD);\r
+    }\r
+    labelValue_[INDEX_0]->SetText(std::to_string(heartRate_).c_str());\r
+    labelValue_[INDEX_1]->SetText(std::to_string(frequencyScore_).c_str());\r
+    int selectTime = BreathModel::GetInstance().GetTrainTime() + 1;\r
+    labelValue_[INDEX_2]->SetText(std::to_string(selectTime).c_str());\r
+    labelValue_[INDEX_3]->SetText(BreathModel::GetInstance().GetTrainingDurationTime().c_str());\r
+    labelValue_[INDEX_4]->SetText(BreathModel::GetInstance().GetTrainingCount().c_str());\r
+}\r
+\r
+void BreathResultPage::InitLabelUnit()\r
+{\r
+    std::string strDes[LABEL_COUNT] = {"次/分", "次/分", "分", "分钟", "次"};\r
+    for (int i = 0; i < LABEL_COUNT; i++) {\r
+        labelUnit_[i] = new UILabel();\r
+        if (labelUnit_[i] == nullptr) {\r
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new button ERROR");\r
+            return;\r
+        }\r
+\r
+        int offset = 10;\r
+        int posY = BREATH_RESULT_LABEL_UNIT_POSITION_Y + BREATH_RESULT_POSY_OFFSET * i;\r
+        int posX = BREATH_RESULT_LABEL_UNIT_POSITION_X + labelValue_[i]->GetTextWidth() + offset;\r
+        labelUnit_[i]->SetPosition(posX, posY, BREATH_RESULT_LABEL_UNIT_WIDTH, BREATH_RESULT_LABEL_UNIT_HEIGHT);\r
+        labelUnit_[i]->SetText(strDes[i].c_str());\r
+        labelUnit_[i]->SetTextColor(Color::White());\r
+        labelUnit_[i]->SetFont(DEFAULT_VECTOR_FONT_FILENAME, BREATH_MIN_FONT_SIZE);\r
+        labelUnit_[i]->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+        labelUnit_[i]->SetStyle(STYLE_TEXT_OPA, TEXT_OPACITY_TWO);\r
+        labelUnit_[i]->SetWidth(labelUnit_[i]->GetTextWidth());\r
+        group_->Add(labelUnit_[i]);\r
+    }\r
+}\r
+\r
+bool BreathResultPage::OnClick(UIView &view, const ClickEvent &event)\r
+{\r
+    if (strcmp(view.GetViewId(), BREATH_BUTTON_COMPLETE_ID) == 0) {\r
+        NativeAbility::GetInstance().SwitchPageInSlice(BREATH_PAGE::BREATH_MAIN_VIEW,\r
+            TransitionType::TRANSITION_INVALID, false);\r
+    } else if (strcmp(view.GetViewId(), BREATH_BUTTON_RESTART_ID) == 0) {\r
+        NativeAbility::GetInstance().SwitchPageInSlice(BREATH_PAGE::BREATH_START_VIEW,\r
+            TransitionType::TRANSITION_INVALID, false);\r
+#ifdef _WIN32\r
+        struct timeval tv;\r
+        gettimeofday(&tv, NULL);\r
+#else\r
+        struct timeval64 tv;\r
+        gettimeofday64(&tv, NULL);\r
+#endif\r
+        uint32_t remTime = tv.tv_sec;\r
+        BreathModel::GetInstance().SetStartTime(remTime);\r
+    }\r
+    return true;\r
+}\r
+\r
+bool BreathResultPage::OnDrag(UIView &view, const DragEvent &event)\r
+{\r
+    UNUSED(view);\r
+    if ((event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT) && (event.GetDeltaX() > X_DRAG_OFFSET) &&\r
+        (event.GetDeltaX() > (DOUBLES * MATH_ABS(event.GetDeltaY())))) {\r
+        NativeAbility::GetInstance().SwitchPageInSlice(BREATH_PAGE::BREATH_MAIN_VIEW,\r
+            TransitionType::TRANSITION_INVALID, false);\r
+    }\r
+    return true;\r
+}\r
+}
\ No newline at end of file
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/breathexercise/src/BreathRhythmSetPage.cpp b/code/sdk/application/wearable/evb/nativeapp/nativeui/breathexercise/src/BreathRhythmSetPage.cpp
new file mode 100644 (file)
index 0000000..b508a1e
--- /dev/null
@@ -0,0 +1,174 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: BreathRhythmSetPage\r
+ * Create: 2025-5-13\r
+ */\r
+#include "AppViewIDs.h"\r
+#include "NativeAbility.h"\r
+#include "SlicePageFactory.h"\r
+#include "UiConfig.h"\r
+#include "gfx_utils/graphic_math.h"\r
+#include "main/LoadImg.h"\r
+#include "ui_resource_breath.h"\r
+#include "wearable_log.h"\r
+#include "breathexercise/BreathModel.h"\r
+#include "breathexercise/BreathView.h"\r
+#include "breathexercise/BreathRhythmSetPage.h"\r
+\r
+namespace OHOS {\r
+static constexpr char *BREATH_RHYTHM_BUTTON_OK_ID = "okButton";\r
+static constexpr uint16_t BREATH_RHYTHM_TITLE_X = 100;\r
+static constexpr uint16_t BREATH_RHYTHM_TITLE_Y = 38;\r
+static constexpr uint16_t BREATH_RHYTHM_TITLE_W = 253;\r
+static constexpr uint16_t BREATH_RHYTHM_TITLE_H = 53;\r
+static constexpr uint16_t BREATH_RHYTHM_TITLE_FONT_SIZE = 38;\r
+static constexpr uint16_t BREATH_RHYTHM_PICKER_X = 64;\r
+static constexpr uint16_t BREATH_RHYTHM_PICKER_Y = 109;\r
+static constexpr uint16_t BREATH_RHYTHM_PICKER_W = 321;\r
+static constexpr uint16_t BREATH_RHYTHM_PICKER_H = 218;\r
+static constexpr uint16_t BREATH_RHYTHM_PICKER_FONT_SIZE = 44;\r
+static constexpr uint16_t BREATH_RHYTHM_PICKER_ITEM_H = 80;\r
+static constexpr uint16_t BREATH_RHYTHM_OK_X = 61;\r
+static constexpr uint16_t BREATH_RHYTHM_OK_Y = 362;\r
+static constexpr uint16_t BREATH_RHYTHM_OK_W = 331;\r
+static constexpr uint16_t BREATH_RHYTHM_OK_H = 98;\r
+static constexpr uint16_t BREATH_GROUP_SIZE = 466;\r
+static constexpr uint8_t PICKER_SIZE = 3;\r
+const char *g_rhythmListData[PICKER_SIZE] = {"稍快 8次/分", "舒缓 7次/分", "缓慢 6次/分"};\r
+\r
+REGIST_SLICE_PAGE(VIEW_BREATH, BREATH_PAGE::BREATH_RHY_VIEW, BreathRhythmSetPage, false);\r
+\r
+BreathRhythmSetPage::BreathRhythmSetPage()\r
+{\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BreathRhythmSetPage::BreathRhythmSetPage");\r
+}\r
+\r
+BreathRhythmSetPage::~BreathRhythmSetPage()\r
+{\r
+    if (group_ != nullptr) {\r
+        group_->RemoveAll();\r
+        delete group_;\r
+        group_ = nullptr;\r
+    }\r
+    if (lableRhythm_ != nullptr) {\r
+        delete lableRhythm_;\r
+        lableRhythm_ = nullptr;\r
+    }\r
+    if (pickerRhythm_ != nullptr) {\r
+        delete pickerRhythm_;\r
+        pickerRhythm_ = nullptr;\r
+    }\r
+    if (buttonOk_ != nullptr) {\r
+        delete buttonOk_;\r
+        buttonOk_ = nullptr;\r
+    }\r
+    if (pickerImg_ != nullptr) {\r
+        delete pickerImg_;\r
+        pickerImg_ = nullptr;\r
+    }\r
+    ImageCacheManager::GetInstance().UnloadAllInMultiRes(BREATH_IMAGE);\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BreathRhythmSetPage::~BreathRhythmSetPage");\r
+}\r
+\r
+void BreathRhythmSetPage::OnStart(void *data)\r
+{\r
+    group_ = new UIViewGroup();\r
+    if (group_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new group_ ERROR");\r
+        return;\r
+    }\r
+    group_->SetPosition(0, 0);\r
+    group_->Resize(BREATH_GROUP_SIZE, BREATH_GROUP_SIZE);\r
+    group_->SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
+    group_->SetTouchable(false);\r
+    group_->SetDraggable(false);\r
+\r
+    lableRhythm_ = new UILabel();\r
+    if (lableRhythm_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new lableRhythm_ ERROR");\r
+        return;\r
+    }\r
+    lableRhythm_->SetPosition(BREATH_RHYTHM_TITLE_X, BREATH_RHYTHM_TITLE_Y);\r
+    lableRhythm_->Resize(BREATH_RHYTHM_TITLE_W, BREATH_RHYTHM_TITLE_H);\r
+    lableRhythm_->SetText("节奏设置");\r
+    lableRhythm_->SetTextColor(Color::White());\r
+    lableRhythm_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+    lableRhythm_->SetFont(BOLD_VECTOR_FONT_FILENAME, BREATH_RHYTHM_TITLE_FONT_SIZE);\r
+    group_->Add(lableRhythm_);\r
+\r
+    pickerRhythm_ = new UIPicker();\r
+    if (pickerRhythm_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new pickerRhythm_ ERROR");\r
+        return;\r
+    }\r
+    pickerRhythm_->SetPosition(BREATH_RHYTHM_PICKER_X, BREATH_RHYTHM_PICKER_Y);\r
+    pickerRhythm_->Resize(BREATH_RHYTHM_PICKER_W, BREATH_RHYTHM_PICKER_H);\r
+    pickerRhythm_->SetBackgroundFont(DEFAULT_VECTOR_FONT_FILENAME, BREATH_RHYTHM_PICKER_FONT_SIZE);\r
+    pickerRhythm_->SetHighlightFont(DEFAULT_VECTOR_FONT_FILENAME, BREATH_RHYTHM_PICKER_FONT_SIZE);\r
+    pickerRhythm_->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+    pickerRhythm_->SetItemHeight(BREATH_RHYTHM_PICKER_ITEM_H);\r
+    pickerRhythm_->SetTextColor(Color::GetColorFromRGBA(0xfa, 0xf3, 0xf3, 0xff),\r
+                                Color::GetColorFromRGBA(0xfa, 0xf3, 0xf3, 0xff));\r
+    uint8_t selectPick = BreathModel::GetInstance().GetRhythm();\r
+    pickerRhythm_->SetSelected(selectPick);\r
+    pickerRhythm_->RegisterSelectedListener(this);\r
+    pickerRhythm_->SetVisible(true);\r
+    pickerRhythm_->SetOnDragListener(this);\r
+    pickerRhythm_->SetLoopState(false);\r
+    group_->Add(pickerRhythm_);\r
+\r
+    pickerImg_ = new UIImageView();\r
+    if (pickerImg_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new Center ERROR");\r
+        return;\r
+    }\r
+    pickerImg_->SetPosition(BREATH_RHYTHM_PICKER_X, BREATH_RHYTHM_PICKER_Y);\r
+    pickerImg_->Resize(BREATH_RHYTHM_PICKER_W, BREATH_RHYTHM_PICKER_H);\r
+    LOADIMG::LoadImageViewImg(pickerImg_, BREATH_IMAGE, IMAGE_BREATH_CENTER);\r
+    group_->Add(pickerImg_);\r
+\r
+    buttonOk_ = new UIButton();\r
+    if (buttonOk_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new buttonOk_ ERROR");\r
+        return;\r
+    }\r
+    buttonOk_->SetPosition(BREATH_RHYTHM_OK_X, BREATH_RHYTHM_OK_Y);\r
+    buttonOk_->Resize(BREATH_RHYTHM_OK_W, BREATH_RHYTHM_OK_H);\r
+    buttonOk_->SetViewId(BREATH_RHYTHM_BUTTON_OK_ID);\r
+    buttonOk_->SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
+    LOADIMG::LoadBtnImage(buttonOk_, BREATH_IMAGE, IMAGE_BREATH_OK, IMAGE_BREATH_OK);\r
+    buttonOk_->SetStyleForState(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT, UIButton::PRESSED);\r
+    buttonOk_->SetOnClickListener(this);\r
+    group_->Add(buttonOk_);\r
+\r
+    AddViewToPageContainer(group_);\r
+}\r
+\r
+void BreathRhythmSetPage::OnResume()\r
+{\r
+    pickerRhythm_->SetValues(g_rhythmListData, PICKER_SIZE);\r
+    GetSlicePageContainer()->SetIntercept(true);\r
+    GetSlicePageContainer()->SetOnDragListener(nullptr);\r
+}\r
+\r
+bool BreathRhythmSetPage::OnClick(UIView &view, const ClickEvent &event)\r
+{\r
+    if (strcmp(view.GetViewId(), BREATH_RHYTHM_BUTTON_OK_ID) == 0) {\r
+        NativeAbility::GetInstance().SwitchPageInSlice(BREATH_PAGE::BREATH_MAIN_VIEW,\r
+            TransitionType::TRANSITION_INVALID, false);\r
+        BreathModel::GetInstance().SetRhythm(pickerRhythm_->GetSelected());\r
+    }\r
+    return true;\r
+}\r
+\r
+bool BreathRhythmSetPage::OnDrag(UIView &view, const DragEvent &event)\r
+{\r
+    UNUSED(view);\r
+    if ((event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT) && (event.GetDeltaX() > X_DRAG_OFFSET) &&\r
+        (event.GetDeltaX() > (DOUBLES * MATH_ABS(event.GetDeltaY())))) {\r
+        NativeAbility::GetInstance().SwitchPageInSlice(BREATH_PAGE::BREATH_MAIN_VIEW,\r
+            TransitionType::TRANSITION_INVALID, false);\r
+    }\r
+    return true;\r
+}\r
+}
\ No newline at end of file
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/breathexercise/src/BreathStartPage.cpp b/code/sdk/application/wearable/evb/nativeapp/nativeui/breathexercise/src/BreathStartPage.cpp
new file mode 100644 (file)
index 0000000..4c8b357
--- /dev/null
@@ -0,0 +1,223 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: BreathStartPage\r
+ * Create: 2025-5-13\r
+ */\r
+#include <sys/time.h>\r
+#include <iostream>\r
+#include <sstream>\r
+#include <string>\r
+#include <sys/time.h>\r
+#include "AppViewIDs.h"\r
+#include "NativeAbility.h"\r
+#include "PageTransitionMgr.h"\r
+#include "SlicePageFactory.h"\r
+#include "TransitionType.h"\r
+#include "UiConfig.h"\r
+#include "components/root_view.h"\r
+#include "gfx_utils/graphic_math.h"\r
+#include "main/LoadImg.h"\r
+#include "ohos_timer.h"\r
+#include "ui_resource_breath.h"\r
+#include "wearable_log.h"\r
+#ifdef BUILD_IN_LINUX\r
+#include "localtime.h"\r
+#endif\r
+#include "breathexercise/BreathModel.h"\r
+#include "breathexercise/BreathView.h"\r
+#include "breathexercise/BreathStartPage.h"\r
+\r
+namespace OHOS {\r
+static constexpr uint16_t BREATH_START_TITLE_X = 97;\r
+static constexpr uint16_t BREATH_START_TITLE_Y = 40;\r
+static constexpr uint16_t BREATH_START_TITLE_W = 260;\r
+static constexpr uint16_t BREATH_START_TITLE_H = 53;\r
+static constexpr uint16_t BREATH_START_TITLE_FONT_SIZE = 36;\r
+static constexpr uint16_t BREATH_START_CENTERIMG_X = 88;\r
+static constexpr uint16_t BREATH_START_CENTERIMG_Y = 88;\r
+static constexpr uint16_t BREATH_START_CENTERIMG_W = 279;\r
+static constexpr uint16_t BREATH_START_CENTERIMG_H = 280;\r
+static constexpr uint16_t BREATH_START_GUIDE_X = 126;\r
+static constexpr uint16_t BREATH_START_GUIDE_Y = 354;\r
+static constexpr uint16_t BREATH_START_GUIDE_W = 202;\r
+static constexpr uint16_t BREATH_START_GUIDE_H = 68;\r
+static constexpr uint16_t BREATH_START_GUIDE_FONT_SIZE = 24;\r
+static constexpr uint16_t BREATH_GROUP_SIZE = 466;\r
+static constexpr uint16_t TEXT_OPACITY = 147;\r
+static constexpr uint16_t COUNTDOWN = 5;\r
+static constexpr uint16_t SIZE = 64;\r
+\r
+REGIST_SLICE_PAGE(VIEW_BREATH, BREATH_PAGE::BREATH_START_VIEW, BreathStartPage, false);\r
+\r
+BreathStartPage::BreathStartPage()\r
+{\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BreathStartPage::BreathStartPage");\r
+}\r
+\r
+BreathStartPage::~BreathStartPage()\r
+{\r
+    if (group_ != nullptr) {\r
+        group_->RemoveAll();\r
+        delete group_;\r
+        group_ = nullptr;\r
+    }\r
+\r
+    if (titleLable_ != nullptr) {\r
+        delete titleLable_;\r
+        titleLable_ = nullptr;\r
+    }\r
+\r
+    if (guideLable_ != nullptr) {\r
+        delete guideLable_;\r
+        guideLable_ = nullptr;\r
+    }\r
+\r
+    if (centerImg_ != nullptr) {\r
+        delete centerImg_;\r
+        centerImg_ = nullptr;\r
+    }\r
+\r
+    if (bgImg_ != nullptr) {\r
+        delete bgImg_;\r
+        bgImg_ = nullptr;\r
+    }\r
+\r
+    if (animator_ != nullptr) {\r
+        delete animator_;\r
+        animator_ = nullptr;\r
+    }\r
+\r
+    if (animatorCallBack_ != nullptr) {\r
+        delete animatorCallBack_;\r
+        animatorCallBack_ = nullptr;\r
+    }\r
+    ImageCacheManager::GetInstance().UnloadAllInMultiRes(BREATH_IMAGE);\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BreathStartPage::~BreathStartPage");\r
+}\r
+\r
+void BreathStartPage::OnStart(void *data)\r
+{\r
+    group_ = new UIViewGroup();\r
+    if (group_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new group_ ERROR");\r
+        return;\r
+    }\r
+    group_->SetPosition(0, 0);\r
+    group_->Resize(BREATH_GROUP_SIZE, BREATH_GROUP_SIZE);\r
+    group_->SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
+    group_->SetTouchable(true);\r
+    group_->SetDraggable(true);\r
+    group_->SetOnDragListener(this);\r
+\r
+    bgImg_ = new UIImageView();\r
+    if (bgImg_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new bgImg_ ERROR");\r
+        return;\r
+    }\r
+    bgImg_->SetPosition(0, 0);\r
+    bgImg_->Resize(BREATH_GROUP_SIZE, BREATH_GROUP_SIZE);\r
+    LOADIMG::LoadImageViewImg(bgImg_, BREATH_IMAGE, IMAGE_BREATH_BG3);\r
+    group_->Add(bgImg_);\r
+\r
+    titleLable_ = new UILabel();\r
+    if (titleLable_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new titleLable_ ERROR");\r
+        return;\r
+    }\r
+    titleLable_->SetPosition(BREATH_START_TITLE_X, BREATH_START_TITLE_Y);\r
+    titleLable_->Resize(BREATH_START_TITLE_W, BREATH_START_TITLE_H);\r
+    titleLable_->SetText("请保持静止");\r
+    titleLable_->SetTextColor(Color::White());\r
+    titleLable_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+    titleLable_->SetFont(BOLD_VECTOR_FONT_FILENAME, BREATH_START_TITLE_FONT_SIZE);\r
+    group_->Add(titleLable_);\r
+\r
+    centerImg_ = new UIImageView();\r
+    if (centerImg_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new centerImg ERROR");\r
+        return;\r
+    }\r
+    centerImg_->SetPosition(BREATH_START_CENTERIMG_X, BREATH_START_CENTERIMG_Y);\r
+    centerImg_->Resize(BREATH_START_CENTERIMG_W, BREATH_START_CENTERIMG_H);\r
+    LOADIMG::LoadImageViewImg(centerImg_, BREATH_IMAGE, IMAGE_BREATH_CENTER1);\r
+    group_->Add(centerImg_);\r
+\r
+    guideLable_ = new UILabel();\r
+    if (guideLable_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new guideLable_ ERROR");\r
+        return;\r
+    }\r
+    guideLable_->SetPosition(BREATH_START_GUIDE_X, BREATH_START_GUIDE_Y);\r
+    guideLable_->Resize(BREATH_START_GUIDE_W, BREATH_START_GUIDE_H);\r
+    guideLable_->SetTextColor(Color::White());\r
+    guideLable_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+    guideLable_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, BREATH_START_GUIDE_FONT_SIZE);\r
+    guideLable_->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+    guideLable_->SetStyle(STYLE_TEXT_OPA, TEXT_OPACITY);\r
+    group_->Add(guideLable_);\r
+\r
+    animatorCallBack_ = new BreathStartCallback(this);\r
+    if (animatorCallBack_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new animatorCallBack_ ERROR");\r
+        return;\r
+    }\r
+    animator_ = new Animator(animatorCallBack_, nullptr, 0, true);\r
+    if (animator_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new animator_ ERROR");\r
+        return;\r
+    }\r
+    animator_->Start();\r
+    AddViewToPageContainer(group_);\r
+}\r
+\r
+void BreathStartPage::BreathStartCallback::Callback(UIView *view)\r
+{\r
+    UNUSED(view);\r
+#ifdef _WIN32\r
+    struct timeval tv;\r
+    gettimeofday(&tv, NULL);\r
+#else\r
+    struct timeval64 tv;\r
+    gettimeofday64(&tv, NULL);\r
+#endif\r
+    int32_t start_time = BreathModel::GetInstance().GetStartTime();\r
+    int32_t remTime = COUNTDOWN - (tv.tv_sec - start_time);\r
+    if (remTime <= 0) {\r
+        BreathStartPage->animator_->Stop();\r
+#ifdef _WIN32\r
+        struct timeval time;\r
+        gettimeofday(&time, NULL);\r
+#else\r
+        struct timeval64 time;\r
+        gettimeofday64(&time, NULL);\r
+#endif\r
+        uint32_t breathing_time = time.tv_sec;\r
+        BreathModel::GetInstance().SetBeginTime(breathing_time);\r
+        NativeAbility::GetInstance().SwitchPageInSlice(BREATH_PAGE::BREATH_EXER_VIEW,\r
+            TransitionType::TRANSITION_INVALID, false);\r
+    } else {\r
+        char szText[SIZE] = "";\r
+        sprintf_s(szText, sizeof(szText), "%d秒后跟随训练指引开始吸气和呼气", remTime);\r
+        BreathStartPage->guideLable_->SetText(szText);\r
+    }\r
+}\r
+\r
+void BreathStartPage::OnPause()\r
+{\r
+    animator_->Stop();\r
+}\r
+\r
+bool BreathStartPage::OnDrag(UIView &view, const DragEvent &event)\r
+{\r
+    UNUSED(view);\r
+    if ((event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT) && (event.GetDeltaX() > X_DRAG_OFFSET) &&\r
+        (event.GetDeltaX() > (DOUBLES * MATH_ABS(event.GetDeltaY())))) {\r
+        NativeAbility::GetInstance().SwitchPageInSlice(BREATH_PAGE::BREATH_MAIN_VIEW,\r
+            TransitionType::TRANSITION_INVALID, false);\r
+    }\r
+    return true;\r
+}\r
+\r
+void BreathStartPage::OnTimer() {}\r
+\r
+}
\ No newline at end of file
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/breathexercise/src/BreathTimeSetPage.cpp b/code/sdk/application/wearable/evb/nativeapp/nativeui/breathexercise/src/BreathTimeSetPage.cpp
new file mode 100644 (file)
index 0000000..a622c5b
--- /dev/null
@@ -0,0 +1,171 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: BreathTimeSetPage\r
+ * Create: 2025-5-13\r
+ */\r
+#include "AppViewIDs.h"\r
+#include "NativeAbility.h"\r
+#include "SlicePageFactory.h"\r
+#include "TransitionType.h"\r
+#include "UiConfig.h"\r
+#include "components/root_view.h"\r
+#include "gfx_utils/graphic_math.h"\r
+#include "main/LoadImg.h"\r
+#include "ui_resource_breath.h"\r
+#include "wearable_log.h"\r
+#include "breathexercise/BreathView.h"\r
+#include "breathexercise/BreathTimeSetPage.h"\r
+\r
+namespace OHOS {\r
+static constexpr char *BREATH_TIME_BUTTON_OK_ID = "okButton";\r
+static constexpr uint16_t BREATH_TIME_TITLE_X = 100;\r
+static constexpr uint16_t BREATH_TIME_TITLE_Y = 38;\r
+static constexpr uint16_t BREATH_TIME_TITLE_W = 253;\r
+static constexpr uint16_t BREATH_TIME_TITLE_H = 53;\r
+static constexpr uint16_t BREATH_TIME_TITLE_FONT_SIZE = 38;\r
+static constexpr uint16_t BREATH_TIME_PICKER_X = 64;\r
+static constexpr uint16_t BREATH_TIME_PICKER_Y = 109;\r
+static constexpr uint16_t BREATH_TIME_PICKER_W = 321;\r
+static constexpr uint16_t BREATH_TIME_PICKER_H = 218;\r
+static constexpr uint16_t BREATH_TIME_PICKER_FONT_SIZE = 44;\r
+static constexpr uint16_t BREATH_TIME_PICKER_ITEM_H = 80;\r
+static constexpr uint16_t BREATH_TIME_OK_X = 61;\r
+static constexpr uint16_t BREATH_TIME_OK_Y = 362;\r
+static constexpr uint16_t BREATH_TIME_OK_W = 331;\r
+static constexpr uint16_t BREATH_TIME_OK_H = 98;\r
+static constexpr uint16_t BREATH_GROUP_SIZE = 466;\r
+static constexpr uint8_t PICKER_SIZE = 3;\r
+const char *g_timeList[PICKER_SIZE] = {"1 分钟", "2 分钟", "3 分钟"};\r
+\r
+REGIST_SLICE_PAGE(VIEW_BREATH, BREATH_PAGE::BREATH_DUR_VIEW, BreathTimeSetPage, false);\r
+\r
+BreathTimeSetPage::BreathTimeSetPage()\r
+{\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BreathTimeSetPage::BreathTimeSetPage");\r
+}\r
+\r
+BreathTimeSetPage::~BreathTimeSetPage()\r
+{\r
+    if (group_ != nullptr) {\r
+        group_->RemoveAll();\r
+        delete group_;\r
+        group_ = nullptr;\r
+    }\r
+    if (labelTitle_ != nullptr) {\r
+        delete labelTitle_;\r
+        labelTitle_ = nullptr;\r
+    }\r
+    if (pickerTime_ != nullptr) {\r
+        delete pickerTime_;\r
+        pickerTime_ = nullptr;\r
+    }\r
+    if (buttonOk_ != nullptr) {\r
+        delete buttonOk_;\r
+        buttonOk_ = nullptr;\r
+    }\r
+    if (pickerImg_ != nullptr) {\r
+        delete pickerImg_;\r
+        pickerImg_ = nullptr;\r
+    }\r
+    ImageCacheManager::GetInstance().UnloadAllInMultiRes(BREATH_IMAGE);\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BreathTimeSetPage::~BreathTimeSetPage");\r
+}\r
+\r
+void BreathTimeSetPage::OnStart(void *data)\r
+{\r
+    group_ = new UIViewGroup();\r
+    if (group_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new Group ERROR");\r
+        return;\r
+    }\r
+    group_->SetPosition(0, 0);\r
+    group_->Resize(BREATH_GROUP_SIZE, BREATH_GROUP_SIZE);\r
+    group_->SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
+\r
+    labelTitle_ = new UILabel();\r
+    if (labelTitle_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new labelTitle_ ERROR");\r
+        return;\r
+    }\r
+    labelTitle_->SetPosition(BREATH_TIME_TITLE_X, BREATH_TIME_TITLE_Y);\r
+    labelTitle_->Resize(BREATH_TIME_TITLE_W, BREATH_TIME_TITLE_H);\r
+    labelTitle_->SetText("时间设置");\r
+    labelTitle_->SetTextColor(Color::White());\r
+    labelTitle_->SetFont(BOLD_VECTOR_FONT_FILENAME, BREATH_TIME_TITLE_FONT_SIZE);\r
+    labelTitle_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+    group_->Add(labelTitle_);\r
+\r
+    pickerTime_ = new UIPicker();\r
+    if (pickerTime_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new pickerTime_ ERROR");\r
+        return;\r
+    }\r
+    pickerTime_->SetPosition(BREATH_TIME_PICKER_X, BREATH_TIME_PICKER_Y);\r
+    pickerTime_->Resize(BREATH_TIME_PICKER_W, BREATH_TIME_PICKER_H);\r
+    pickerTime_->SetStyle(STYLE_BACKGROUND_OPA, OPA_OPAQUE);\r
+    pickerTime_->SetBackgroundFont(DEFAULT_VECTOR_FONT_FILENAME, BREATH_TIME_PICKER_FONT_SIZE);\r
+    pickerTime_->SetHighlightFont(DEFAULT_VECTOR_FONT_FILENAME, BREATH_TIME_PICKER_FONT_SIZE);\r
+    pickerTime_->SetItemHeight(BREATH_TIME_PICKER_ITEM_H);\r
+    pickerTime_->SetTextColor(Color::GetColorFromRGBA(0xfa, 0xf3, 0xf3, 0xff),\r
+                              Color::GetColorFromRGBA(0xfa, 0xf3, 0xf3, 0xff));\r
+    uint8_t selectTime = BreathModel::GetInstance().GetTrainTime();\r
+    pickerTime_->SetSelected(selectTime);\r
+    pickerTime_->SetOnDragListener(this);\r
+    pickerTime_->SetLoopState(false);\r
+    group_->Add(pickerTime_);\r
+\r
+    pickerImg_ = new UIImageView();\r
+    if (pickerImg_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new pickerImg_ ERROR");\r
+        return;\r
+    }\r
+    pickerImg_->SetPosition(BREATH_TIME_PICKER_X, BREATH_TIME_PICKER_Y);\r
+    pickerImg_->Resize(BREATH_TIME_PICKER_W, BREATH_TIME_PICKER_H);\r
+    LOADIMG::LoadImageViewImg(pickerImg_, BREATH_IMAGE, IMAGE_BREATH_CENTER);\r
+    group_->Add(pickerImg_);\r
+\r
+    buttonOk_ = new UIButton();\r
+    if (buttonOk_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new buttonOk_ ERROR");\r
+        return;\r
+    }\r
+    buttonOk_->SetPosition(BREATH_TIME_OK_X, BREATH_TIME_OK_Y);\r
+    buttonOk_->Resize(BREATH_TIME_OK_W, BREATH_TIME_OK_H);\r
+    buttonOk_->SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
+    buttonOk_->SetViewId(BREATH_TIME_BUTTON_OK_ID);\r
+    LOADIMG::LoadBtnImage(buttonOk_, BREATH_IMAGE, IMAGE_BREATH_OK, IMAGE_BREATH_OK);\r
+    buttonOk_->SetStyleForState(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT, UIButton::PRESSED);\r
+    buttonOk_->SetOnClickListener(this);\r
+    group_->Add(buttonOk_);\r
+\r
+    AddViewToPageContainer(group_);\r
+}\r
+\r
+void BreathTimeSetPage::OnResume()\r
+{\r
+    pickerTime_->SetValues(g_timeList, PICKER_SIZE);\r
+    GetSlicePageContainer()->SetIntercept(true);\r
+    GetSlicePageContainer()->SetOnDragListener(nullptr);\r
+}\r
+\r
+bool BreathTimeSetPage::OnClick(UIView &view, const ClickEvent &event)\r
+{\r
+    if (strcmp(view.GetViewId(), BREATH_TIME_BUTTON_OK_ID) == 0) {\r
+        BreathModel::GetInstance().SetTrainTime(pickerTime_->GetSelected());\r
+        NativeAbility::GetInstance().SwitchPageInSlice(BREATH_PAGE::BREATH_MAIN_VIEW,\r
+            TransitionType::TRANSITION_INVALID, false);\r
+    }\r
+    return true;\r
+}\r
+\r
+bool BreathTimeSetPage::OnDrag(UIView &view, const DragEvent &event)\r
+{\r
+    UNUSED(view);\r
+    if ((event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT) && (event.GetDeltaX() > X_DRAG_OFFSET) &&\r
+        (event.GetDeltaX() > (DOUBLES * MATH_ABS(event.GetDeltaY())))) {\r
+        NativeAbility::GetInstance().SwitchPageInSlice(BREATH_PAGE::BREATH_MAIN_VIEW,\r
+            TransitionType::TRANSITION_INVALID, false);\r
+    }\r
+    return true;\r
+}\r
+}
\ No newline at end of file
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/breathexercise/src/BreathTrainingRecordsPage.cpp b/code/sdk/application/wearable/evb/nativeapp/nativeui/breathexercise/src/BreathTrainingRecordsPage.cpp
new file mode 100644 (file)
index 0000000..fa622d2
--- /dev/null
@@ -0,0 +1,301 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: BreathTrainingRecordsPage\r
+ * Create: 2025-5-13\r
+ */\r
+#include <sstream>\r
+#include "AppViewIDs.h"\r
+#include "NativeAbility.h"\r
+#include "SlicePageFactory.h"\r
+#include "TransitionType.h"\r
+#include "UiConfig.h"\r
+#include "components/root_view.h"\r
+#include "gfx_utils/graphic_math.h"\r
+#include "main/LoadImg.h"\r
+#include "ui_resource_breath.h"\r
+#include "wearable_log.h"\r
+#include "breathexercise/BreathView.h"\r
+#include "breathexercise/BreathTrainingRecordsPage.h"\r
+\r
+namespace OHOS {\r
+static constexpr uint16_t BREATH_TRAINING_RECORDS_X = 97;\r
+static constexpr uint16_t BREATH_TRAINING_RECORDS_Y = 34;\r
+static constexpr uint16_t BREATH_TRAINING_RECORDS_W = 260;\r
+static constexpr uint16_t BREATH_TRAINING_RECORDS_H = 53;\r
+static constexpr uint16_t BREATH_TRAINING_RECORDS_FONT_SIZE = 38;\r
+static constexpr uint16_t BREATH_TRAINING_TOTALDURATION_X = 236;\r
+static constexpr uint16_t BREATH_TRAINING_TOTALDURATION_Y = 139;\r
+static constexpr uint16_t BREATH_TRAINING_TOTALDURATION_W = 96;\r
+static constexpr uint16_t BREATH_TRAINING_TOTALDURATION_H = 30;\r
+static constexpr uint16_t BREATH_TRAINING_FONT_SIZE = 24;\r
+static constexpr uint16_t BREATH_TRAINING_DURATION_MINUTE_X = 290;\r
+static constexpr uint16_t BREATH_TRAINING_DURATION_MINUTE_Y = 185;\r
+static constexpr uint16_t BREATH_TRAINING_DURATION_MINUTE_W = 48;\r
+static constexpr uint16_t BREATH_TRAINING_DURATION_MINUTE_H = 29;\r
+static constexpr uint16_t BREATH_TRAINING_TOTAL_NUMBLE_OF_TIMES_X = 236;\r
+static constexpr uint16_t BREATH_TRAINING_TOTAL_NUMBLE_OF_TIMES_Y = 268;\r
+static constexpr uint16_t BREATH_TRAINING_TOTAL_NUMBLE_OF_TIMES_W = 96;\r
+static constexpr uint16_t BREATH_TRAINING_TOTAL_NUMBLE_OF_TIMES_H = 30;\r
+static constexpr uint16_t BREATH_TRAINING_NUMBER_OF_TIMES_X = 290;\r
+static constexpr uint16_t BREATH_TRAINING_NUMBER_OF_TIMES_Y = 315;\r
+static constexpr uint16_t BREATH_TRAINING_NUMBER_OF_TIMES_W = 29;\r
+static constexpr uint16_t BREATH_TRAINING_NUMBER_OF_TIMES_H = 29;\r
+static constexpr uint16_t BREATH_TRAINING_TIME_X = 236;\r
+static constexpr uint16_t BREATH_TRAINING_TIME_Y = 171;\r
+static constexpr uint16_t BREATH_TRAINING_TIME_W = 49;\r
+static constexpr uint16_t BREATH_TRAINING_TIME_H = 49;\r
+static constexpr uint16_t BREATH_TRAINING_FONT_MAX_SIZE = 40;\r
+static constexpr uint16_t BREATH_TRAINING_SCOUR_X = 236;\r
+static constexpr uint16_t BREATH_TRAINING_SCOUR_Y = 303;\r
+static constexpr uint16_t BREATH_TRAINING_SCOUR_W = 49;\r
+static constexpr uint16_t BREATH_TRAINING_SCOUR_H = 49;\r
+static constexpr uint16_t BREATH_TRAINING_SIZE = 454;\r
+static constexpr uint16_t BREATH_TRAINING_BACKGROUND2_X = 65;\r
+static constexpr uint16_t BREATH_TRAINING_BACKGROUND2_Y = 174;\r
+static constexpr uint16_t BREATH_TRAINING_BACKGROUND2_W = 119;\r
+static constexpr uint16_t BREATH_TRAINING_BACKGROUND2_H = 120;\r
+static constexpr uint16_t BREATH_TRAINING_BACKGROUND3_X = 215;\r
+static constexpr uint16_t BREATH_TRAINING_BACKGROUND3_Y = 123;\r
+static constexpr uint16_t BREATH_TRAINING_BACKGROUND3_W = 171;\r
+static constexpr uint16_t BREATH_TRAINING_BACKGROUND3_H = 108;\r
+static constexpr uint16_t BREATH_TRAINING_BACKGROUND4_X = 215;\r
+static constexpr uint16_t BREATH_TRAINING_BACKGROUND4_Y = 252;\r
+static constexpr uint16_t TEXT_OPACITY = 147;\r
+static constexpr uint16_t TEXT_OPACITY_BACK = 27;\r
+static constexpr uint16_t Y_OFFSET = 50;\r
+\r
+REGIST_SLICE_PAGE(VIEW_BREATH, BREATH_PAGE::BREATH_TRAINING_VIEW, BreathTrainingRecordsPage, false);\r
+\r
+BreathTrainingRecordsPage::BreathTrainingRecordsPage()\r
+{\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BreathTrainingRecordsPage::BreathTrainingRecordsPage");\r
+}\r
+\r
+BreathTrainingRecordsPage::~BreathTrainingRecordsPage()\r
+{\r
+    if (group_ != nullptr) {\r
+        group_->RemoveAll();\r
+        delete group_;\r
+        group_ = nullptr;\r
+    }\r
+    if (labelTimeDes_ != nullptr) {\r
+        delete labelTimeDes_;\r
+        labelTimeDes_ = nullptr;\r
+    }\r
+    if (labelTimeUnit_ != nullptr) {\r
+        delete labelTimeUnit_;\r
+        labelTimeUnit_ = nullptr;\r
+    }\r
+    if (labelCountDes_ != nullptr) {\r
+        delete labelCountDes_;\r
+        labelCountDes_ = nullptr;\r
+    }\r
+    if (labelCountUnit_ != nullptr) {\r
+        delete labelCountUnit_;\r
+        labelCountUnit_ = nullptr;\r
+    }\r
+    if (labelTitle_ != nullptr) {\r
+        delete labelTitle_;\r
+        labelTitle_ = nullptr;\r
+    }\r
+    if (labelTimeValue_ != nullptr) {\r
+        delete labelTimeValue_;\r
+        labelTimeValue_ = nullptr;\r
+    }\r
+    if (labelCountValue_ != nullptr) {\r
+        delete labelCountValue_;\r
+        labelCountValue_ = nullptr;\r
+    }\r
+    if (bgImg1_ != nullptr) {\r
+        delete bgImg1_;\r
+        bgImg1_ = nullptr;\r
+    }\r
+    if (bgImg2_ != nullptr) {\r
+        delete bgImg2_;\r
+        bgImg2_ = nullptr;\r
+    }\r
+    if (bgImg3_ != nullptr) {\r
+        delete bgImg3_;\r
+        bgImg3_ = nullptr;\r
+    }\r
+    if (bgImg4_ != nullptr) {\r
+        delete bgImg4_;\r
+        bgImg4_ = nullptr;\r
+    }\r
+    ImageCacheManager::GetInstance().UnloadAllInMultiRes(BREATH_IMAGE);\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BreathTrainingRecordsPage::~BreathTrainingRecordsPage");\r
+}\r
+\r
+void BreathTrainingRecordsPage::OnStart(void *data)\r
+{\r
+    group_ = new UIViewGroup();\r
+    if (group_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new group_ ERROR");\r
+        return;\r
+    }\r
+    group_->SetPosition(0, 0);\r
+    group_->Resize(HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);\r
+    group_->SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
+    group_->SetTouchable(true);\r
+    group_->SetDraggable(true);\r
+    group_->SetOnDragListener(this);\r
+\r
+    bgImg1_ = new UIImageView();\r
+    if (bgImg1_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new bgImg1_ ERROR");\r
+        return;\r
+    }\r
+    bgImg1_->SetPosition(0, 0);\r
+    bgImg1_->Resize(BREATH_TRAINING_SIZE, BREATH_TRAINING_SIZE);\r
+    LOADIMG::LoadImageViewImg(bgImg1_, BREATH_IMAGE, IMAGE_BREATH_BG3);\r
+    group_->Add(bgImg1_);\r
+\r
+    bgImg2_ = new UIImageView();\r
+    if (bgImg2_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new bgImg2_ ERROR");\r
+        return;\r
+    }\r
+    bgImg2_->SetPosition(BREATH_TRAINING_BACKGROUND2_X, BREATH_TRAINING_BACKGROUND2_Y);\r
+    bgImg2_->Resize(BREATH_TRAINING_BACKGROUND2_W, BREATH_TRAINING_BACKGROUND2_H);\r
+    LOADIMG::LoadImageViewImg(bgImg2_, BREATH_IMAGE, IMAGE_BREATH_RESULT);\r
+    group_->Add(bgImg2_);\r
+\r
+    bgImg3_ = new UIImageView();\r
+    if (bgImg3_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new bgImg3_ ERROR");\r
+        return;\r
+    }\r
+    bgImg3_->SetPosition(BREATH_TRAINING_BACKGROUND3_X, BREATH_TRAINING_BACKGROUND3_Y);\r
+    bgImg3_->Resize(BREATH_TRAINING_BACKGROUND3_W, BREATH_TRAINING_BACKGROUND3_H);\r
+    LOADIMG::LoadImageViewImg(bgImg3_, BREATH_IMAGE, IMAGE_BREATH_BG4);\r
+    bgImg3_->SetStyle(STYLE_BACKGROUND_OPA, TEXT_OPACITY_BACK);\r
+    group_->Add(bgImg3_);\r
+\r
+    bgImg4_ = new UIImageView();\r
+    if (bgImg4_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new bgImg4_ ERROR");\r
+        return;\r
+    }\r
+    bgImg4_->SetPosition(BREATH_TRAINING_BACKGROUND4_X, BREATH_TRAINING_BACKGROUND4_Y);\r
+    bgImg4_->Resize(BREATH_TRAINING_BACKGROUND3_W, BREATH_TRAINING_BACKGROUND3_H);\r
+    LOADIMG::LoadImageViewImg(bgImg4_, BREATH_IMAGE, IMAGE_BREATH_BG4);\r
+    bgImg4_->SetStyle(STYLE_BACKGROUND_OPA, TEXT_OPACITY_BACK);\r
+    group_->Add(bgImg4_);\r
+\r
+    labelTitle_ = new UILabel();\r
+    if (labelTitle_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new labelTitle_ ERROR");\r
+        return;\r
+    }\r
+    labelTitle_->SetPosition(BREATH_TRAINING_RECORDS_X, BREATH_TRAINING_RECORDS_Y);\r
+    labelTitle_->Resize(BREATH_TRAINING_RECORDS_W, BREATH_TRAINING_RECORDS_H);\r
+    labelTitle_->SetText("训练记录");\r
+    labelTitle_->SetTextColor(Color::White());\r
+    labelTitle_->SetFont(BOLD_VECTOR_FONT_FILENAME, BREATH_TRAINING_RECORDS_FONT_SIZE);\r
+    labelTitle_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+    group_->Add(labelTitle_);\r
+\r
+    labelTimeDes_ = new UILabel();\r
+    if (labelTimeDes_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new labelTimeDes_ ERROR");\r
+        return;\r
+    }\r
+    labelTimeDes_->SetPosition(BREATH_TRAINING_TOTALDURATION_X, BREATH_TRAINING_TOTALDURATION_Y);\r
+    labelTimeDes_->Resize(BREATH_TRAINING_TOTALDURATION_W, BREATH_TRAINING_TOTALDURATION_H);\r
+    labelTimeDes_->SetText("累计时长");\r
+    labelTimeDes_->SetTextColor(Color::White());\r
+    labelTimeDes_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, BREATH_TRAINING_FONT_SIZE);\r
+    labelTimeDes_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+    labelTimeDes_->SetStyle(STYLE_TEXT_OPA, TEXT_OPACITY);\r
+    group_->Add(labelTimeDes_);\r
+\r
+    labelTimeUnit_ = new UILabel();\r
+    if (labelTimeUnit_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new labelTimeUnit_ ERROR");\r
+        return;\r
+    }\r
+    labelTimeUnit_->SetPosition(BREATH_TRAINING_DURATION_MINUTE_X, BREATH_TRAINING_DURATION_MINUTE_Y);\r
+    labelTimeUnit_->Resize(BREATH_TRAINING_DURATION_MINUTE_W, BREATH_TRAINING_DURATION_MINUTE_H);\r
+    labelTimeUnit_->SetText("分钟");\r
+    labelTimeUnit_->SetTextColor(Color::White());\r
+    labelTimeUnit_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, BREATH_TRAINING_FONT_SIZE);\r
+    labelTimeUnit_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+    labelTimeUnit_->SetStyle(STYLE_TEXT_OPA, TEXT_OPACITY);\r
+    group_->Add(labelTimeUnit_);\r
+\r
+    labelCountDes_ = new UILabel();\r
+    if (labelCountDes_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new labelCountDes_ ERROR");\r
+        return;\r
+    }\r
+    labelCountDes_->SetPosition(BREATH_TRAINING_TOTAL_NUMBLE_OF_TIMES_X, BREATH_TRAINING_TOTAL_NUMBLE_OF_TIMES_Y);\r
+    labelCountDes_->Resize(BREATH_TRAINING_TOTAL_NUMBLE_OF_TIMES_W, BREATH_TRAINING_TOTAL_NUMBLE_OF_TIMES_H);\r
+    labelCountDes_->SetText("累计次数");\r
+    labelCountDes_->SetTextColor(Color::White());\r
+    labelCountDes_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, BREATH_TRAINING_FONT_SIZE);\r
+    labelCountDes_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+    labelCountDes_->SetStyle(STYLE_TEXT_OPA, TEXT_OPACITY);\r
+    group_->Add(labelCountDes_);\r
+\r
+    labelCountUnit_ = new UILabel();\r
+    if (labelCountUnit_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new labelCountUnit_ ERROR");\r
+        return;\r
+    }\r
+    labelCountUnit_->SetPosition(BREATH_TRAINING_NUMBER_OF_TIMES_X, BREATH_TRAINING_NUMBER_OF_TIMES_Y);\r
+    labelCountUnit_->Resize(BREATH_TRAINING_NUMBER_OF_TIMES_W, BREATH_TRAINING_NUMBER_OF_TIMES_H);\r
+    labelCountUnit_->SetText("次");\r
+    labelCountUnit_->SetTextColor(Color::White());\r
+    labelCountUnit_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, BREATH_TRAINING_FONT_SIZE);\r
+    labelCountUnit_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+    labelCountUnit_->SetStyle(STYLE_TEXT_OPA, TEXT_OPACITY);\r
+    group_->Add(labelCountUnit_);\r
+\r
+    labelTimeValue_ = new UILabel();\r
+    if (labelTimeValue_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new labelTimeValue_ ERROR");\r
+        return;\r
+    }\r
+    labelTimeValue_->SetPosition(BREATH_TRAINING_TIME_X, BREATH_TRAINING_TIME_Y);\r
+    labelTimeValue_->Resize(BREATH_TRAINING_TIME_W, BREATH_TRAINING_TIME_H);\r
+    labelTimeValue_->SetTextColor(Color::White());\r
+    labelTimeValue_->SetFont(BOLD_VECTOR_FONT_FILENAME, BREATH_TRAINING_FONT_MAX_SIZE);\r
+    labelTimeValue_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+    labelTimeValue_->SetStyle(STYLE_TEXT_OPA, OPA_OPAQUE);\r
+    group_->Add(labelTimeValue_);\r
+\r
+    labelCountValue_ = new UILabel();\r
+    if (labelCountValue_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new labelCountValue_ ERROR");\r
+        return;\r
+    }\r
+    labelCountValue_->SetPosition(BREATH_TRAINING_SCOUR_X, BREATH_TRAINING_SCOUR_Y);\r
+    labelCountValue_->Resize(BREATH_TRAINING_SCOUR_W, BREATH_TRAINING_SCOUR_H);\r
+    labelCountValue_->SetTextColor(Color::White());\r
+    labelCountValue_->SetFont(BOLD_VECTOR_FONT_FILENAME, BREATH_TRAINING_FONT_MAX_SIZE);\r
+    labelCountValue_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+    labelCountValue_->SetStyle(STYLE_TEXT_OPA, OPA_OPAQUE);\r
+    group_->Add(labelCountValue_);\r
+\r
+    AddViewToPageContainer(group_);\r
+}\r
+\r
+void BreathTrainingRecordsPage::OnResume()\r
+{\r
+    labelTimeValue_->SetText((BreathModel::GetInstance().GetTrainingDurationTime().c_str()));\r
+    labelCountValue_->SetText((BreathModel::GetInstance().GetTrainingCount().c_str()));\r
+}\r
+\r
+bool BreathTrainingRecordsPage::OnDrag(UIView &view, const DragEvent &event)\r
+{\r
+    UNUSED(view);\r
+    if ((event.GetDragDirection() == DragEvent::DIRECTION_TOP_TO_BOTTOM) && (event.GetStartPoint().y > Y_OFFSET)) {\r
+        NativeAbility::GetInstance().SwitchPageInSlice(BREATH_PAGE::BREATH_MAIN_VIEW,\r
+            TransitionType::TRANSITION_INVALID, false);\r
+    } else if (event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT) {\r
+        NativeAbility::GetInstance().SwitchPageInSlice(BREATH_PAGE::BREATH_MAIN_VIEW,\r
+            TransitionType::TRANSITION_INVALID, false);\r
+    }\r
+    return true;\r
+}\r
+}
\ No newline at end of file
index 6aca116..aea7204 100644 (file)
 #include "bts_spp.h"\r
 #include "ui_resource_camera.h"\r
 #include "camera/CameraView.h"\r
-#include "camera/CameraMainPage.h"\r
 #include "camera/CameraPresenter.h"\r
+#include "camera/CameraMainPage.h"\r
 \r
 namespace OHOS {\r
 static CameraMainPage *g_pCameraMainPage = nullptr;\r
-\r
 static constexpr uint16_t BLUETOOTH_XPOS = 158;\r
 static constexpr uint16_t BLUETOOTH_XPOY = 154;\r
 static constexpr uint16_t TITLE_XPOS = 15;\r
@@ -33,19 +32,19 @@ static constexpr uint16_t CAMERATITLE_XPOY = 37;
 static constexpr uint16_t CAMERATITLE_WIDTH = 260;\r
 static constexpr uint16_t CAMERATITLE_HIGHT = 53;\r
 static constexpr uint16_t CAMERAFIND_XPOS = 123;\r
-static constexpr uint16_t CAMERAFIND_XPOY = 200;\r
+static constexpr uint16_t CAMERAFIND_XPOY = 192;\r
 static constexpr uint16_t CAMERAFIND_WIDTH = 250;\r
 static constexpr uint16_t CAMERAFIND_HIGHT = 42;\r
-static constexpr uint16_t CAMERATIME_XPOS = 200;\r
+static constexpr uint16_t CAMERATIME_XPOS = 102;\r
 static constexpr uint16_t BUTTON_WIDTH = 171;\r
 static constexpr uint16_t BUTTON_HIGHT = 171;\r
 static constexpr uint16_t COUNTDOWN_TIME = 5;\r
 static constexpr uint16_t CAMERA_SIZE = 466;\r
 static constexpr uint16_t CAMERA_BUTTON_POSITION_X = 144;\r
 static constexpr uint16_t CAMERA_BUTTON_POSITION_Y = 154;\r
-static constexpr uint16_t TIME_FONT_SIZE = 50;\r
-static constexpr uint16_t CAMERATIME_HIGHT = 55;\r
-static constexpr uint16_t ERROR_NUM = 2;\r
+static constexpr uint16_t TIME_FONT_SIZE = 72;\r
+static constexpr uint16_t CAMERATIME_HIGHT = 70;\r
+static constexpr char *TAKEPHOTO_BUTTON = "takePhotoButton";\r
 \r
 REGIST_SLICE_PAGE(VIEW_CAMERA, CAMERA_PAGES::CAMERA_MAIN_PAGE, CameraMainPage, true);\r
 \r
@@ -65,45 +64,45 @@ CameraMainPage::~CameraMainPage()
         container_ = nullptr;\r
     }\r
 \r
-    if (title != nullptr) {\r
-        delete title;\r
-        title = nullptr;\r
+    if (disconnectTitle_ != nullptr) {\r
+        delete disconnectTitle_;\r
+        disconnectTitle_ = nullptr;\r
     }\r
 \r
-    if (bluetoothDisconnected != nullptr) {\r
-        delete bluetoothDisconnected;\r
-        bluetoothDisconnected = nullptr;\r
+    if (btDisconnected_ != nullptr) {\r
+        delete btDisconnected_;\r
+        btDisconnected_ = nullptr;\r
     }\r
 \r
-    if (cameraFind != nullptr) {\r
-        delete cameraFind;\r
-        cameraFind = nullptr;\r
+    if (cameraFind_ != nullptr) {\r
+        delete cameraFind_;\r
+        cameraFind_ = nullptr;\r
     }\r
 \r
-    if (cameraTitle != nullptr) {\r
-        delete cameraTitle;\r
-        cameraTitle = nullptr;\r
+    if (cameraTitle_ != nullptr) {\r
+        delete cameraTitle_;\r
+        cameraTitle_ = nullptr;\r
     }\r
 \r
-    if (cameraTime != nullptr) {\r
-        delete cameraTime;\r
-        cameraTime = nullptr;\r
+    if (cameraTime_ != nullptr) {\r
+        delete cameraTime_;\r
+        cameraTime_ = nullptr;\r
     }\r
 \r
-    if (button != nullptr) {\r
-        delete button;\r
-        button = nullptr;\r
-    }\r
-\r
-    if (animator_ != nullptr) {\r
-        delete animator_;\r
-        animator_ = nullptr;\r
+    if (takePhotoButton_ != nullptr) {\r
+        delete takePhotoButton_;\r
+        takePhotoButton_ = nullptr;\r
     }\r
 \r
     if (callBack_ != nullptr) {\r
         delete callBack_;\r
         callBack_ = nullptr;\r
     }\r
+\r
+    if (animator_ != nullptr) {\r
+        delete animator_;\r
+        animator_ = nullptr;\r
+    }\r
     ImageCacheManager::GetInstance().UnloadAllInMultiRes(CAMERA_IMAGE);\r
     WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "CameraMainPage::~CameraMainPage");\r
 }\r
@@ -115,76 +114,85 @@ CameraMainPage *CameraMainPage::GetInstance()
 \r
 void CameraMainPage::OnStart(void *data)\r
 {\r
+    container_ = new UIScrollView();\r
     if (container_ == nullptr) {\r
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "CameraMainPage::new container fail");\r
-        container_ = new UIScrollView();\r
-        container_->SetPosition(0, 0, CAMERA_SIZE, CAMERA_SIZE);\r
-        container_->SetStyle(STYLE_BACKGROUND_OPA, 0);\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "container_ is nullptr");\r
+        return;\r
     }\r
+    container_->SetPosition(0, 0, CAMERA_SIZE, CAMERA_SIZE);\r
+    container_->SetStyle(STYLE_BACKGROUND_OPA, 0);\r
     container_->SetTouchable(true);\r
     container_->SetDraggable(true);\r
     container_->SetOnDragListener(this);\r
 \r
-    bluetoothDisconnected = new UIImageView();\r
-    if (bluetoothDisconnected == nullptr) {\r
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "bluetoothDisconnected is nullptr");\r
+    btDisconnected_ = new UIImageView();\r
+    if (btDisconnected_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "btDisconnected_ is nullptr");\r
         return;\r
     }\r
-    LOADIMG::LoadImageViewImg(bluetoothDisconnected, CAMERA_IMAGE, IMAGE_CONVERTER_TOOL_CAMERA_2);\r
-    bluetoothDisconnected->SetPosition(BLUETOOTH_XPOS, BLUETOOTH_XPOY);\r
-    bluetoothDisconnected->SetStyle(STYLE_BACKGROUND_OPA, OPA_OPAQUE);\r
-    bluetoothDisconnected->SetVisible(false);\r
-    container_->Add(bluetoothDisconnected);\r
-\r
-    title = new UILabel();\r
-    if (title == nullptr) {\r
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "title is nullptr");\r
+    LOADIMG::LoadImageViewImg(btDisconnected_, CAMERA_IMAGE, IMAGE_CAMERA_DISCONNECT);\r
+    btDisconnected_->SetPosition(BLUETOOTH_XPOS, BLUETOOTH_XPOY);\r
+    btDisconnected_->SetStyle(STYLE_BACKGROUND_OPA, OPA_OPAQUE);\r
+    btDisconnected_->SetVisible(false);\r
+    container_->Add(btDisconnected_);\r
+\r
+    disconnectTitle_ = new UILabel();\r
+    if (disconnectTitle_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "disconnectTitle_ is nullptr");\r
         return;\r
     }\r
-    title->SetText("蓝牙已断开");\r
-    title->SetFont(DEFAULT_VECTOR_FONT_FILENAME, TITLE_FONT_SIZE);\r
-    title->SetPosition(TITLE_XPOS, TITLE_XPOY, TITLE_WIDTH, TITLE_HIGHT);\r
-    title->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
-    title->SetVisible(false);\r
-    container_->Add(title);\r
-\r
-    cameraTitle = new UILabel();\r
-    if (cameraTitle == nullptr) {\r
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "cameraTitle is nullptr");\r
+    disconnectTitle_->SetText("蓝牙已断开");\r
+    disconnectTitle_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, TITLE_FONT_SIZE);\r
+    disconnectTitle_->SetPosition(TITLE_XPOS, TITLE_XPOY, TITLE_WIDTH, TITLE_HIGHT);\r
+    disconnectTitle_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+    disconnectTitle_->SetVisible(false);\r
+    container_->Add(disconnectTitle_);\r
+\r
+    cameraTitle_ = new UILabel();\r
+    if (cameraTitle_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "cameraTitle_ is nullptr");\r
         return;\r
     }\r
-    cameraTitle->SetText("相机");\r
-    cameraTitle->SetFont(DEFAULT_VECTOR_FONT_FILENAME, CAMERATITLE_FONT_SIZE);\r
-    cameraTitle->SetPosition(CAMERATITLE_XPOS, CAMERATITLE_XPOY, CAMERATITLE_WIDTH, CAMERATITLE_HIGHT);\r
-    cameraTitle->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
-    cameraTitle->SetVisible(false);\r
-    container_->Add(cameraTitle);\r
-\r
-    cameraFind = new UILabel();\r
-    if (cameraFind == nullptr) {\r
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "cameraFind is nullptr");\r
+    cameraTitle_->SetText("相机");\r
+    cameraTitle_->SetFont(BOLD_VECTOR_FONT_FILENAME, CAMERATITLE_FONT_SIZE);\r
+    cameraTitle_->SetPosition(CAMERATITLE_XPOS, CAMERATITLE_XPOY, CAMERATITLE_WIDTH, CAMERATITLE_HIGHT);\r
+    cameraTitle_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+    cameraTitle_->SetVisible(false);\r
+    container_->Add(cameraTitle_);\r
+\r
+    cameraFind_ = new UILabel();\r
+    if (cameraFind_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "cameraFind_ is nullptr");\r
         return;\r
     }\r
-    cameraFind->SetText("正在连接手机...");\r
-    cameraFind->SetFont(DEFAULT_VECTOR_FONT_FILENAME, TITLE_FONT_SIZE);\r
-    cameraFind->SetPosition(CAMERAFIND_XPOS, CAMERAFIND_XPOY, CAMERAFIND_WIDTH, CAMERAFIND_HIGHT);\r
-    cameraFind->SetVisible(false);\r
-    container_->Add(cameraFind);\r
-\r
-    cameraTime = new UILabel();\r
-    if (cameraTime == nullptr) {\r
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "cameraTime is nullptr");\r
+    cameraFind_->SetText("正在连接手机...");\r
+    cameraFind_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, TITLE_FONT_SIZE);\r
+    cameraFind_->SetPosition(CAMERAFIND_XPOS, CAMERAFIND_XPOY, CAMERAFIND_WIDTH, CAMERAFIND_HIGHT);\r
+    cameraFind_->SetVisible(false);\r
+    container_->Add(cameraFind_);\r
+\r
+    cameraTime_ = new UILabel();\r
+    if (cameraTime_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "cameraTime_ is nullptr");\r
         return;\r
     }\r
-    cameraTime->SetText("5s");\r
-    cameraTime->SetFont(DEFAULT_VECTOR_FONT_FILENAME, TIME_FONT_SIZE);\r
-    cameraTime->SetPosition(CAMERATIME_XPOS, CAMERAFIND_XPOY, CAMERAFIND_WIDTH, CAMERATIME_HIGHT);\r
-    cameraTime->SetVisible(false);\r
-    container_->Add(cameraTime);\r
+    cameraTime_->SetText("5s");\r
+    cameraTime_->SetFont(BOLD_VECTOR_FONT_FILENAME, TIME_FONT_SIZE);\r
+    cameraTime_->SetPosition(CAMERATIME_XPOS, CAMERAFIND_XPOY, CAMERAFIND_WIDTH, CAMERATIME_HIGHT);\r
+    cameraTime_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+    cameraTime_->SetVisible(false);\r
+    container_->Add(cameraTime_);\r
     SetUpButton();\r
     callBack_ = new CameraAnimatorCallback(this);\r
+    if (callBack_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "callBack_ is nullptr");\r
+        return;\r
+    }\r
     animator_ = new Animator(callBack_, nullptr, 0, true);\r
-\r
+    if (animator_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "animator_ is nullptr");\r
+        return;\r
+    }\r
     AddViewToPageContainer(container_);\r
     InitCameraView();\r
 }\r
@@ -208,13 +216,14 @@ uint8_t CameraMainPage::GetConnectStatus()
 void CameraMainPage::InitCameraView()\r
 {\r
     if (GetConnectStatus() == 1) {\r
-        cameraTitle->SetVisible(true);\r
-        cameraFind->SetVisible(true);\r
-        title->SetVisible(false);\r
-        bluetoothDisconnected->SetVisible(false);\r
-        cameraTime->SetVisible(false);\r
-        button->SetVisible(false);\r
-        button->SetTouchable(false);\r
+        cameraTitle_->SetVisible(true);\r
+        cameraFind_->SetVisible(true);\r
+        disconnectTitle_->SetVisible(false);\r
+        btDisconnected_->SetVisible(false);\r
+        cameraTime_->SetVisible(false);\r
+        takePhotoButton_->SetVisible(false);\r
+        takePhotoButton_->Disable();\r
+        takePhotoButton_->SetTouchable(false);\r
         container_->Invalidate();\r
         uint8_t value = 1;\r
         errcode_t ret;\r
@@ -222,52 +231,55 @@ void CameraMainPage::InitCameraView()
         ret = 0;\r
 #else\r
         ret = msg_center_send_data(MSGCENTER_CMD_DEVICE,\r
-            MSGCENTER_TYPE_ID_CAMERA_CONNECT_PHONE, &value, sizeof(value));\r
-        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MSGCENTER_TYPE_ID_CAMERA_CONNECT_PHONE ret = %d", ret);\r
+                                   MSGCENTER_TYPE_ID_CAMERA_CONNECTING_PHONE, &value, sizeof(value));\r
+        WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "connecting phoneCamera ret = %d", ret);\r
 #endif\r
     } else {\r
-        title->SetVisible(true);\r
-        bluetoothDisconnected->SetVisible(true);\r
-        cameraTitle->SetVisible(false);\r
-        cameraFind->SetVisible(false);\r
-        cameraTime->SetVisible(false);\r
-        button->SetVisible(false);\r
-        button->SetTouchable(false);\r
+        disconnectTitle_->SetVisible(true);\r
+        btDisconnected_->SetVisible(true);\r
+        cameraTitle_->SetVisible(false);\r
+        cameraFind_->SetVisible(false);\r
+        cameraTime_->SetVisible(false);\r
+        takePhotoButton_->SetVisible(false);\r
+        takePhotoButton_->Disable();\r
+        takePhotoButton_->SetTouchable(false);\r
         container_->Invalidate();\r
     }\r
 }\r
 \r
 void CameraMainPage::Refresh_page()\r
 {\r
-    cameraTitle->SetVisible(true);\r
-    button->SetVisible(true);\r
-    button->SetTouchable(true);\r
-    cameraFind->SetVisible(false);\r
-    title->SetVisible(false);\r
-    bluetoothDisconnected->SetVisible(false);\r
-    cameraTime->SetVisible(false);\r
+    cameraTitle_->SetVisible(true);\r
+    takePhotoButton_->SetVisible(true);\r
+    takePhotoButton_->Enable();\r
+    takePhotoButton_->SetTouchable(true);\r
+    cameraFind_->SetVisible(false);\r
+    disconnectTitle_->SetVisible(false);\r
+    btDisconnected_->SetVisible(false);\r
+    cameraTime_->SetVisible(false);\r
     container_->Invalidate();\r
 }\r
 \r
 void CameraMainPage::SetUpButton()\r
 {\r
-    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "CameraMainPage::SetupButton new Label");\r
-    if (button == nullptr) {\r
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "button is nullptr");\r
-        button = new UILabelButton();\r
+    takePhotoButton_ = new UILabelButton();\r
+    if (takePhotoButton_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "takePhotoButton_ is nullptr");\r
+        return;\r
     }\r
 \r
-    button->SetPosition(CAMERA_BUTTON_POSITION_X, CAMERA_BUTTON_POSITION_Y);\r
-    button->Resize(BUTTON_WIDTH, BUTTON_HIGHT);\r
-    button->SetViewId("button1");\r
-    button->SetOnClickListener(this);\r
-    button->SetStyle(STYLE_BACKGROUND_OPA, OPA_OPAQUE);\r
-    button->SetStyleForState(STYLE_BACKGROUND_COLOR, Color::Black().full, UIButton::PRESSED);\r
-    button->SetStyleForState(STYLE_BACKGROUND_COLOR, Color::Black().full, UIButton::RELEASED);\r
-    button->SetVisible(false);\r
-    button->SetTouchable(false);\r
-    LOADIMG::LoadBtnImage(button, CAMERA_IMAGE, IMAGE_CONVERTER_TOOL_CAMERA_1, IMAGE_CONVERTER_TOOL_CAMERA_1);\r
-    container_->Add(button);\r
+    takePhotoButton_->SetPosition(CAMERA_BUTTON_POSITION_X, CAMERA_BUTTON_POSITION_Y);\r
+    takePhotoButton_->Resize(BUTTON_WIDTH, BUTTON_HIGHT);\r
+    takePhotoButton_->SetViewId(TAKEPHOTO_BUTTON);\r
+    takePhotoButton_->SetOnClickListener(this);\r
+    takePhotoButton_->SetStyle(STYLE_BACKGROUND_OPA, OPA_OPAQUE);\r
+    takePhotoButton_->SetStyleForState(STYLE_BACKGROUND_COLOR, Color::Black().full, UIButton::PRESSED);\r
+    takePhotoButton_->SetStyleForState(STYLE_BACKGROUND_COLOR, Color::Black().full, UIButton::RELEASED);\r
+    takePhotoButton_->SetVisible(false);\r
+    takePhotoButton_->Disable();\r
+    takePhotoButton_->SetTouchable(false);\r
+    LOADIMG::LoadBtnImage(takePhotoButton_, CAMERA_IMAGE, IMAGE_CAMERA_TAKEPHOTO, IMAGE_CAMERA_TAKEPHOTO);\r
+    container_->Add(takePhotoButton_);\r
 }\r
 \r
 void CameraMainPage::OnPause()\r
@@ -278,20 +290,22 @@ void CameraMainPage::OnPause()
 bool CameraMainPage::OnClick(UIView &view, const ClickEvent &event)\r
 {\r
     UNUSED(event);\r
-    if (view.GetViewId() == "button1") {\r
+    if (strcmp(view.GetViewId(), TAKEPHOTO_BUTTON) == 0) {\r
         if (GetConnectStatus() == 1) {\r
-            button->SetVisible(false);\r
-            cameraTime->SetVisible(true);\r
-            SetFirstFlag(true);\r
+            takePhotoButton_->SetVisible(false);\r
+            takePhotoButton_->Disable();\r
+            cameraTime_->SetVisible(true);\r
+            SetFirstClickFlag(true);\r
             animator_->Start();\r
         } else {\r
-            title->SetVisible(true);\r
-            bluetoothDisconnected->SetVisible(true);\r
-            cameraTitle->SetVisible(false);\r
-            cameraFind->SetVisible(false);\r
-            cameraTime->SetVisible(false);\r
-            button->SetVisible(false);\r
-            button->SetTouchable(false);\r
+            disconnectTitle_->SetVisible(true);\r
+            btDisconnected_->SetVisible(true);\r
+            cameraTitle_->SetVisible(false);\r
+            cameraFind_->SetVisible(false);\r
+            cameraTime_->SetVisible(false);\r
+            takePhotoButton_->SetVisible(false);\r
+            takePhotoButton_->Disable();\r
+            takePhotoButton_->SetTouchable(false);\r
             container_->Invalidate();\r
         }\r
     }\r
@@ -300,21 +314,19 @@ bool CameraMainPage::OnClick(UIView &view, const ClickEvent &event)
 \r
 bool CameraMainPage::OnDrag(UIView &view, const DragEvent &event)\r
 {\r
-    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "CameraPresenter::OnDrag");\r
     UNUSED(view);\r
     if ((event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT) && (event.GetDeltaX() > X_DRAG_OFFSET) &&\r
         (event.GetDeltaX() > (DOUBLES * MATH_ABS(event.GetDeltaY())))) {\r
-        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "CameraOnDragListener::OnDrag ChangeSlice(VIEW_APPLIST)");\r
         uint8_t value = 1;\r
         errcode_t ret;\r
 #ifdef _WIN32\r
         ret = 0;\r
 #else\r
         ret = msg_center_send_data(MSGCENTER_CMD_DEVICE,\r
-            MSGCENTER_TYPE_ID_CAMERA_PHONE_EXIT, &value, sizeof(value));\r
-        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MSGCENTER_TYPE_ID_CAMERA_PHONE_EXIT ret = %d", ret);\r
+                                   MSGCENTER_TYPE_ID_PHONE_EXIT_CAMERA, &value, sizeof(value));\r
+        WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "notify phone exit camera, ret = %d", ret);\r
 #endif\r
-        NativeAbility::GetInstance().ChangeSlice(VIEW_APPLIST);\r
+        NativeAbility::GetInstance().ChangeSliceToApplist();\r
     }\r
     return true;\r
 }\r
@@ -325,13 +337,12 @@ void CameraMainPage::CameraAnimatorCallback::Callback(UIView *view)
     static int count = 0;\r
     static struct timeval start_time;\r
     struct timeval current_time;\r
-    if (page_->GetFirstFlag()) {\r
+    if (page_->GetFirstClickFlag()) {\r
         gettimeofday(&start_time, nullptr);\r
-        page_->SetFirstFlag(false);\r
+        page_->SetFirstClickFlag(false);\r
     }\r
     gettimeofday(&current_time, nullptr);\r
     int time = current_time.tv_sec - start_time.tv_sec;\r
-    std::string strTime1 = std::to_string(COUNTDOWN_TIME - time) + "s";\r
     page_->SetCameraTime(time);\r
     if (time == COUNTDOWN_TIME) {\r
         page_->StopAnimator();\r
@@ -341,18 +352,18 @@ void CameraMainPage::CameraAnimatorCallback::Callback(UIView *view)
 void CameraMainPage::StopAnimator()\r
 {\r
     animator_->Stop();\r
-    button->SetVisible(true);\r
-    cameraTime->SetVisible(false);\r
-    cameraTime->SetText("5s");\r
-    SetFirstFlag(false);\r
+    takePhotoButton_->SetVisible(true);\r
+    takePhotoButton_->Enable();\r
+    cameraTime_->SetVisible(false);\r
+    cameraTime_->SetText("5s");\r
+    SetFirstClickFlag(false);\r
     uint8_t value = 1;\r
     errcode_t ret;\r
 #ifdef _WIN32\r
-        ret = 0;\r
+    ret = 0;\r
 #else\r
-        ret = msg_center_send_data(MSGCENTER_CMD_DEVICE,\r
-        MSGCENTER_TYPE_ID_ON_CAMERA, &value, sizeof(value));\r
-    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MSGCENTER_TYPE_ID_ON_CAMERA ret = %d", ret);\r
+    ret = msg_center_send_data(MSGCENTER_CMD_DEVICE, MSGCENTER_TYPE_ID_ON_CAMERA, &value, sizeof(value));\r
+    WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "notify phone take photo ret = %d", ret);\r
 #endif\r
 }\r
 \r
@@ -361,16 +372,16 @@ void CameraMainPage::SetCameraTime(int time)
     int progressTime = COUNTDOWN_TIME - time;\r
     int progressValue = 0;\r
     std::string strTime = std::to_string(COUNTDOWN_TIME - time) + "s";\r
-    cameraTime->SetText(strTime.c_str());\r
+    cameraTime_->SetText(strTime.c_str());\r
 }\r
 \r
-bool CameraMainPage::GetFirstFlag()\r
+bool CameraMainPage::GetFirstClickFlag()\r
 {\r
-    return isFirst;\r
+    return isFirstClick_;\r
 }\r
 \r
-void CameraMainPage::SetFirstFlag(bool value)\r
+void CameraMainPage::SetFirstClickFlag(bool value)\r
 {\r
-    isFirst = value;\r
+    isFirstClick_ = value;\r
 }\r
 }
\ No newline at end of file
index 669c55b..bc0796f 100644 (file)
@@ -7,11 +7,10 @@
 #include <sys/time.h>\r
 #include "ohos_timer.h"\r
 #include "wearable_log.h"\r
-#include "camera/CameraModel.h"\r
 #include "camera/CameraView.h"\r
+#include "camera/CameraModel.h"\r
 \r
 namespace OHOS {\r
-\r
 CameraModel::CameraModel() {}\r
 \r
 CameraModel::~CameraModel() {}\r
index 4d94013..78a576f 100644 (file)
@@ -11,5 +11,5 @@
 #include "camera/CameraPresenter.h"\r
 \r
 namespace OHOS {\r
-REGIST_MENU(VIEW_CAMERA, CameraView, CameraPresenter, CAMERA_MAIN_ICON, PNG_APPLIST_SETTING_IMAGE, "相机");\r
+REGIST_MENU(VIEW_CAMERA, CameraView, CameraPresenter, CAMERA_ICON, CAMERA_ICON, "相机");\r
 }\r
index c0e5076..21f6151 100644 (file)
 #include "wearable_log.h"
 #include "ui_resource_image.h"
 #include "common/image_cache_manager.h"
-#include "UICardPageFactory.h"
+#include "UIWatchDialFactory.h"
+#ifdef BUILD_IN_LINUX
+#include "localtime.h"
+#endif
 
 namespace OHOS {
 
-REGIST_WATCH_DIAL(DIAL_DISPLAY_MODE_AOD, DIAL_CLOCK, AmbientClockView);
+REGIST_WATCH_DIAL(DIAL_DISPLAY_SUPPORT_AOD, DIAL_CLOCK, AmbientClockView, nullptr);
 
 static constexpr uint16_t POINT_POSITION_X = 202;
 static constexpr uint16_t POINT_POSITION_Y = 16;
@@ -36,33 +39,11 @@ static constexpr int16_t HOURLY_SYSTEM = 24;
 AmbientClockView::AmbientClockView()
 {
     WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "AmbientClockView::AmbientClockView");
-    SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);
-    PreLoad();
 }
 
 AmbientClockView::~AmbientClockView()
 {
     WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "AmbientClockView::~AmbientClockView");
-    if (viewiInitStatus_) {
-        mainSweepClock_->RemoveAll();
-        delete secondHand_;
-        secondHand_ = nullptr;
-        delete minuteHand_;
-        minuteHand_ = nullptr;
-        delete hourHand_;
-        hourHand_ = nullptr;
-        delete hand24Hour_;
-        hand24Hour_ = nullptr;
-        delete bigCircle_;
-        bigCircle_ = nullptr;
-        delete medCircle_;
-        medCircle_ = nullptr;
-        delete smallCircle_;
-        smallCircle_ = nullptr;
-        Remove(mainSweepClock_);
-        delete mainSweepClock_;
-        mainSweepClock_ = nullptr;
-    }
 }
 
 bool AmbientClockView::InitCenterCircleView(void)
@@ -162,28 +143,45 @@ bool AmbientClockView::InitSweepClock(void)
     return true;
 }
 
-void AmbientClockView::PreLoad(void)
+void AmbientClockView::InitDateTime(void)
 {
-    if (!viewiInitStatus_) {
-        InitView();
-        viewiInitStatus_ = true;
-    }
+    struct tm pTM;
+    time_t seconds;
+    time(&seconds);
+    localtime_r(&seconds, &pTM);
+    mainSweepClock_->SetTime24Hour(pTM.tm_hour, pTM.tm_min, pTM.tm_sec);
+}
+
+void AmbientClockView::Update(void)
+{
+    struct timeval tv;
+    gettimeofday(&tv, nullptr);
+    uint64_t second = tv.tv_sec;
+    uint64_t uSecond = tv.tv_usec;
+    uint64_t minute = second / MIN_TO_HOUR;
+    uint64_t hour = minute / MIN_TO_HOUR + timezone / (MIN_TO_HOUR * MIN_TO_HOUR);
+    uint8_t realHour = static_cast<uint8_t>(hour % HOURLY_SYSTEM);
+    uint8_t realMinute = static_cast<uint8_t>(minute % MIN_TO_HOUR);
+    uint16_t realMilliSecond = static_cast<uint16_t>((second % MIN_TO_HOUR) *
+        SEC_TO_MILLI + uSecond / USEC_TO_MILLI);
+    mainSweepClock_->SetSweepTime12Hour(realHour, realMinute, realMilliSecond, 1);
 }
 
-bool AmbientClockView::InitView(void)
+void AmbientClockView::OnCreateView(void* data)
 {
+    fragmentView_.SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);
     WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "AmbientClockView::InitView");
 
     mainSweepClock_ = new UISweepClock();
     if (mainSweepClock_ == nullptr) {
         WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "mainSweepClock new fail");
-        return false;
+        return;
     }
     if (!InitSweepClock()) {
-        return false;
+        return;
     }
 
-    Add(mainSweepClock_);
+    fragmentView_.Add(mainSweepClock_);
 
     mainSweepClock_->SetDragParentInstead(true);
     mainSweepClock_->SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);
@@ -205,32 +203,31 @@ bool AmbientClockView::InitView(void)
     mainSweepClock_->SetInitTime24Hour(0, 0, 0);
     mainSweepClock_->SetWorkMode(UISweepClock::WorkMode::NORMAL);
     InitDateTime();
-    SetCoverable(true);
-    return true;
-}
-
-void AmbientClockView::InitDateTime(void)
-{
-    struct tm pTM;
-    time_t seconds;
-    time(&seconds);
-    localtime_r(&seconds, &pTM);
-    mainSweepClock_->SetTime24Hour(pTM.tm_hour, pTM.tm_min, pTM.tm_sec);
 }
 
-void AmbientClockView::UpdateTime(void)
+void AmbientClockView::OnDestroyView()
 {
-    struct timeval tv;
-    gettimeofday(&tv, nullptr);
-    uint64_t second = tv.tv_sec;
-    uint64_t uSecond = tv.tv_usec;
-    uint64_t minute = second / MIN_TO_HOUR;
-    uint64_t hour = minute / MIN_TO_HOUR + timezone / (MIN_TO_HOUR * MIN_TO_HOUR);
-    uint8_t realHour = static_cast<uint8_t>(hour % HOURLY_SYSTEM);
-    uint8_t realMinute = static_cast<uint8_t>(minute % MIN_TO_HOUR);
-    uint16_t realMilliSecond = static_cast<uint16_t>((second % MIN_TO_HOUR) *
-        SEC_TO_MILLI + uSecond / USEC_TO_MILLI);
-    mainSweepClock_->SetSweepTime12Hour(realHour, realMinute, realMilliSecond, 1);
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "AmbientClockView::OnDestroyView");
+    if (mainSweepClock_ != nullptr) {
+        mainSweepClock_->RemoveAll();
+        delete secondHand_;
+        secondHand_ = nullptr;
+        delete minuteHand_;
+        minuteHand_ = nullptr;
+        delete hourHand_;
+        hourHand_ = nullptr;
+        delete hand24Hour_;
+        hand24Hour_ = nullptr;
+        delete bigCircle_;
+        bigCircle_ = nullptr;
+        delete medCircle_;
+        medCircle_ = nullptr;
+        delete smallCircle_;
+        smallCircle_ = nullptr;
+        fragmentView_.Remove(mainSweepClock_);
+        delete mainSweepClock_;
+        mainSweepClock_ = nullptr;
+    }
 }
 }
 
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/clock/src/GradientAodView.cpp b/code/sdk/application/wearable/evb/nativeapp/nativeui/clock/src/GradientAodView.cpp
new file mode 100644 (file)
index 0000000..db6da99
--- /dev/null
@@ -0,0 +1,64 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: GradientAodView\r
+ * Create: 2025-04\r
+ */\r
+\r
+#include "clock/GradientAodView.h"\r
+#include "wearable_log.h"\r
+#include "UIWatchDialFactory.h"\r
+\r
+namespace OHOS {\r
+\r
+REGIST_WATCH_DIAL(DIAL_DISPLAY_SUPPORT_AOD, GRADIENT_CLOCK, GradientAodView, nullptr);\r
+\r
+static GradientAodView* g_pGradientAodView = nullptr;\r
+\r
+GradientAodView::GradientAodView()\r
+{\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "GradientAodView::GradientAodView");\r
+    g_pGradientAodView = this;\r
+}\r
+\r
+GradientAodView::~GradientAodView()\r
+{\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "GradientAodView::~GradientAodView");\r
+}\r
+\r
+GradientAodView *GradientAodView::GetInstance(void)\r
+{\r
+    return g_pGradientAodView;\r
+}\r
+\r
+void GradientAodView::Update(void)\r
+{\r
+    if (gradientDateView_ != nullptr) {\r
+        gradientDateView_->UpdateTime();\r
+    }\r
+}\r
+\r
+void GradientAodView::OnCreateView(void* data)\r
+{\r
+    fragmentView_.SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "GradientAodView::OnCreateView");\r
+    gradientDateView_ = new GradientDateView();\r
+    if (!gradientDateView_) {\r
+        GRAPHIC_LOGE("gradientDateView_ malloc memory Failed\n");\r
+        return;\r
+    }\r
+    fragmentView_.Add(gradientDateView_);\r
+    gradientDateView_->InitView();\r
+    Update();\r
+}\r
+\r
+void GradientAodView::OnDestroyView()\r
+{\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "GradientAodView::OnDestroyView");\r
+    if (gradientDateView_) {\r
+        gradientDateView_->RemoveAll();\r
+        fragmentView_.Remove(gradientDateView_);\r
+        delete gradientDateView_;\r
+        gradientDateView_ = nullptr;\r
+    }\r
+}\r
+}
\ No newline at end of file
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/clock/src/GradientClockView.cpp b/code/sdk/application/wearable/evb/nativeapp/nativeui/clock/src/GradientClockView.cpp
new file mode 100644 (file)
index 0000000..31fdb20
--- /dev/null
@@ -0,0 +1,203 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: GradientClockView\r
+ * Create: 2025-04\r
+ */\r
+\r
+#include "clock/GradientClockView.h"\r
+#include "wearable_log.h"\r
+#include "clock/ClockResourceImage.h"\r
+#include "common/screen.h"\r
+#include "sys/time.h"\r
+#include "UIWatchDialFactory.h"\r
+#include "main/DialBinTypesV2.h"\r
+\r
+namespace OHOS {\r
+\r
+const DialInfo dialInfoConfig = {\r
+        GRADIENT_CLOCK, "½¥±ä±íÅÌ", PNG_SET_GRADIENT_CLOCK, DEFAULT_TASK_PERIOD, DIAL_DISPLAY_CAPABILITY_NORMAL_ONLY\r
+    };\r
+\r
+REGIST_WATCH_DIAL(DIAL_DISPLAY_SUPPORT_NORMAL, GRADIENT_CLOCK, GradientClockView, &dialInfoConfig);\r
+static GradientClockView *g_pGradientClockView = nullptr;\r
+\r
+static constexpr float SEC_TO_MILLI = 1000.0f;\r
+static constexpr int16_t USEC_TO_MILLI = 1000;\r
+static constexpr int16_t MIN_TO_HOUR = 60;\r
+static constexpr float SEC_TO_MIN = 60.0f;\r
+static constexpr float SECOND_HAND_RANGE = 160.0f;\r
+static constexpr float MINUTE_HAND_RANGE = 120.0f;\r
+static constexpr float SECOND_START_ANGLE = 200.0f;\r
+static constexpr float MINUTE_START_ANGLE = 240.0f;\r
+static constexpr int16_t ANGLE_DETAL = 3;\r
+static constexpr int16_t USEC_TO_SEC = 60;\r
+static constexpr float ANGEL_MINUTE_STEPS = 6.0f;\r
+static constexpr int16_t CLOCK_RADIUS = HORIZONTAL_RESOLUTION / 2;\r
+static constexpr int16_t CLOCK_RADIUS_RECTANGLE = (VERTICAL_RESOLUTION > HORIZONTAL_RESOLUTION) ?\\r
+                                                    VERTICAL_RESOLUTION / 2 + 75 : HORIZONTAL_RESOLUTION / 2;\r
+static constexpr int16_t MINUTE_RADIUS = CLOCK_RADIUS - static_cast<int16_t>(0.103524 * HORIZONTAL_RESOLUTION);\r
+static constexpr int16_t MINUTE_RADIUS_RECTANGLE = CLOCK_RADIUS_RECTANGLE;\r
+static constexpr int16_t MARGIN_BG = 10;\r
+static constexpr int16_t CENTER_X = HORIZONTAL_RESOLUTION / 2;\r
+static constexpr int16_t CENTER_Y = VERTICAL_RESOLUTION/ 2;\r
+static constexpr int16_t MINUTE_COUNT = 2;\r
+static ColorStop minutestops[MINUTE_COUNT] = {{0, 0x00FFFAEF}, {0.333, 0xFFFFD383}}; // Alaph 00~FF\r
+static constexpr int16_t SECOND_COUNT = 2;\r
+static ColorStop secondstops[SECOND_COUNT] = {{0, 0x0AF8F5FD}, {0.444, 0xFF7948EA}}; // Alaph 0A~FF\r
+static constexpr int16_t BACKGROUD_COUNT = 3;\r
+ColorStop backgroudstops[BACKGROUD_COUNT] = {{0, 0xFF994EDE}, {0.50974, 0xFFFC62BA}, {1, 0xFFFEC45E}};\r
+\r
+void GradientClockView::SafeDelete(UIView* ptr)\r
+{\r
+    if (ptr != nullptr) {\r
+        Remove(ptr);\r
+        delete ptr;\r
+        ptr = nullptr;\r
+    }\r
+}\r
+\r
+GradientClockView *GradientClockView::GetInstance(void)\r
+{\r
+    return g_pGradientClockView;\r
+}\r
+\r
+GradientClockView::GradientClockView()\r
+{\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "GradientClockView::GradientClockView");\r
+    SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);\r
+    secondAngle_ = SECOND_START_ANGLE;\r
+    PreLoad();\r
+    g_pGradientClockView = this;\r
+}\r
+\r
+GradientClockView::~GradientClockView()\r
+{\r
+    if (!viewiInitStatus_) {\r
+        return;\r
+    }\r
+    SafeDelete(backgroudCanvas_);\r
+    SafeDelete(secondHandCanvas_);\r
+    SafeDelete(minuteHandCanvas_);\r
+    if (gradientDateView_) {\r
+        gradientDateView_->RemoveAll();\r
+        Remove(gradientDateView_);\r
+        delete gradientDateView_;\r
+        gradientDateView_ = nullptr;\r
+    }\r
+    g_pGradientClockView = nullptr;\r
+}\r
+\r
+bool GradientClockView::InitView(void)\r
+{\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "GradientClockView::InitView");\r
+\r
+    backgroudCanvas_ = new UICanvasExt();\r
+    if (backgroudCanvas_ != nullptr) {\r
+        PaintExt backPaint;\r
+        backPaint.SetStyle(Paint::PaintStyle::FILL_STYLE);\r
+        backPaint.SetLinearGradient({-MARGIN_BG, VERTICAL_RESOLUTION, HORIZONTAL_RESOLUTION + MARGIN_BG,\r
+                                    VERTICAL_RESOLUTION}, backgroudstops, BACKGROUD_COUNT);\r
+        backPaint.SetAntialiased(true);\r
+        backgroudCanvas_->SetStyle(STYLE_BACKGROUND_OPA, 0);\r
+        backgroudCanvas_->SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);\r
+        uint16_t radius = (Screen::GetInstance().GetScreenShape() == ScreenShape::RECTANGLE) ?\\r
+                            CLOCK_RADIUS_RECTANGLE : CLOCK_RADIUS;\r
+        backgroudCanvas_->DrawCircle({CENTER_X, CENTER_Y}, radius, backPaint);\r
+        Add(backgroudCanvas_);\r
+    }\r
+\r
+    secondHandCanvas_ = new UICanvasExt();\r
+    if (secondHandCanvas_ != nullptr) {\r
+        Add(secondHandCanvas_);\r
+    }\r
+\r
+    minuteHandCanvas_ = new UICanvasExt();\r
+    if (minuteHandCanvas_ != nullptr) {\r
+        Add(minuteHandCanvas_);\r
+    }\r
+\r
+    gradientDateView_ = new GradientDateView();\r
+    if (gradientDateView_ != nullptr) {\r
+        Add(gradientDateView_);\r
+        gradientDateView_->InitView();\r
+    }\r
+\r
+    SetCoverable(true);\r
+    Update();\r
+    viewiInitStatus_ = true;\r
+    return true;\r
+}\r
+\r
+void GradientClockView::PreLoad(void)\r
+{\r
+    if (!viewiInitStatus_) {\r
+        InitView();\r
+        viewiInitStatus_ = true;\r
+    }\r
+}\r
+\r
+void GradientClockView::Update(void)\r
+{\r
+    struct timeval tv;\r
+    gettimeofday(&tv, nullptr);\r
+    uint64_t second = tv.tv_sec;\r
+    uint64_t uSecond = tv.tv_usec;\r
+    uint64_t minute = second / MIN_TO_HOUR;\r
+    uint8_t realMinute = static_cast<uint8_t>(minute % MIN_TO_HOUR);\r
+    uint64_t realMilliSecond = static_cast<uint64_t>(uSecond / USEC_TO_MILLI);\r
+    uint8_t realSecond = second % USEC_TO_SEC;\r
+\r
+    if (gradientDateView_ != nullptr) {\r
+        gradientDateView_->UpdateTime();\r
+    }\r
+\r
+    // update all canvas\r
+    UpdateHands(realMinute, realSecond, realMilliSecond);\r
+}\r
+\r
+void GradientClockView::UpdateHands(uint8_t minute, uint8_t second, uint64_t milliSecond)\r
+{\r
+    if (second !=second_) {\r
+        secondAngle_ = second % USEC_TO_SEC * ANGEL_MINUTE_STEPS;\r
+        second_ = second;\r
+    }\r
+\r
+    // update second hand\r
+    float secondAngle =  SECOND_START_ANGLE + secondAngle_ + milliSecond / SEC_TO_MILLI * ANGEL_MINUTE_STEPS;\r
+    uint16_t colckRadius = (Screen::GetInstance().GetScreenShape() == ScreenShape::RECTANGLE) ?\\r
+                            CLOCK_RADIUS_RECTANGLE :CLOCK_RADIUS;\r
+    sectorInfo sectorStru(secondAngle, SECOND_HAND_RANGE, colckRadius, SECOND_COUNT, secondstops);\r
+    UpdateCanvas(secondHandCanvas_, sectorStru);\r
+\r
+    // update minute hand\r
+    float minuteAngle = MINUTE_START_ANGLE + minute % USEC_TO_SEC * ANGEL_MINUTE_STEPS +\r
+                        second / SEC_TO_MIN * ANGEL_MINUTE_STEPS;\r
+    uint16_t minuteRadius = (Screen::GetInstance().GetScreenShape() == ScreenShape::RECTANGLE) ?\\r
+                                MINUTE_RADIUS_RECTANGLE : MINUTE_RADIUS;\r
+    sectorInfo minuteStru(minuteAngle, MINUTE_HAND_RANGE, minuteRadius, MINUTE_COUNT, minutestops);\r
+    UpdateCanvas(minuteHandCanvas_, minuteStru);\r
+}\r
+\r
+void GradientClockView::UpdateCanvas(UICanvasExt *canvas, const sectorInfo& sectorInfo)\r
+{\r
+    if (canvas == nullptr) {\r
+        GRAPHIC_LOGE("callback view is not UICanvasExt");\r
+        return;\r
+    }\r
+\r
+    canvas->Clear();\r
+    float sectorEnd = sectorInfo.startAngle + sectorInfo.angleRange;\r
+    PaintExt secPaint;\r
+    secPaint.SetStyle(Paint::PaintStyle::FILL_STYLE);\r
+    secPaint.SetStrokeWidth(1);\r
+    SweepGradient sweep = {CENTER_X, CENTER_Y, sectorInfo.startAngle};\r
+    secPaint.SetSweepGradient(sweep, sectorInfo.colorStop, sectorInfo.stopCount);\r
+    secPaint.SetOpacity(OPA_OPAQUE);\r
+    secPaint.SetAntialiased(true);\r
+    canvas->SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);\r
+    canvas->DrawSector({CENTER_X, CENTER_Y}, sectorInfo.sectorRadius,  sectorInfo.startAngle + ANGLE_DETAL,\r
+        sectorEnd, secPaint);\r
+    canvas->SetStyle(STYLE_BACKGROUND_OPA, 0);\r
+}\r
+\r
+}
\ No newline at end of file
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/clock/src/GradientDateView.cpp b/code/sdk/application/wearable/evb/nativeapp/nativeui/clock/src/GradientDateView.cpp
new file mode 100644 (file)
index 0000000..09adb42
--- /dev/null
@@ -0,0 +1,310 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: GradientDateView\r
+ * Create: 2025-04\r
+ */\r
+\r
+#include <vector>\r
+#include "sys/time.h"\r
+#include "clock/GradientDateView.h"\r
+#include "wearable_log.h"\r
+#include "common/image_cache_manager.h"\r
+#include "common/screen.h"\r
+#include "clock/ClockResourceImage.h"\r
+\r
+namespace OHOS {\r
+static constexpr int16_t MIN_TO_HOUR = 60;\r
+static constexpr int16_t HOURLY_SYSTEM = 24;\r
+static constexpr int16_t NUM2 = 2;\r
+static constexpr int16_t SCREEN_HALF_W = HORIZONTAL_RESOLUTION / NUM2;\r
+static constexpr int16_t SCREEN_HALF_H = VERTICAL_RESOLUTION / NUM2;\r
+static constexpr int16_t TIME_SPLIT_X_DANCE = static_cast<int16_t>(0.015419 * HORIZONTAL_RESOLUTION);\r
+static constexpr int16_t TIME_SPLIT_Y_DANCE = static_cast<int16_t>(0.096916 * VERTICAL_RESOLUTION);\r
+static constexpr int16_t TIME_SPLIT_X = SCREEN_HALF_W - TIME_SPLIT_X_DANCE;\r
+static constexpr int16_t TIME_SPLIT_Y = SCREEN_HALF_H - TIME_SPLIT_Y_DANCE;\r
+static constexpr int16_t TIME_X_DANCE = static_cast<int16_t>(0.145374 * HORIZONTAL_RESOLUTION);\r
+static constexpr int16_t TIME_Y_DANCE = static_cast<int16_t>(0.132159 * VERTICAL_RESOLUTION);\r
+static constexpr int16_t TIME_POINT_Y = SCREEN_HALF_H - TIME_Y_DANCE;\r
+static constexpr int16_t HOUR_POINT_X = SCREEN_HALF_W - TIME_X_DANCE;\r
+static constexpr int16_t MINUTE_POINT_X = SCREEN_HALF_W + TIME_X_DANCE;\r
+static constexpr int16_t WEEK_POINT_X_DANCE = static_cast<int16_t>(0.066079 * HORIZONTAL_RESOLUTION);\r
+static constexpr int16_t WEEK_POINT_Y_DANCE = static_cast<int16_t>(0.127753 * VERTICAL_RESOLUTION);\r
+static constexpr int16_t WEEK_POINT_X = SCREEN_HALF_W - WEEK_POINT_X_DANCE;\r
+static constexpr int16_t WEEK_POINT_Y = SCREEN_HALF_H + WEEK_POINT_Y_DANCE;\r
+static constexpr int16_t WEEK_POINT_Y_RECTANGLE = SCREEN_HALF_H + WEEK_POINT_Y_DANCE\\r
+                                                    - static_cast<int16_t>(0.025974 * VERTICAL_RESOLUTION);\r
+static constexpr int16_t DATE_POINT_Y_DANCE = WEEK_POINT_X_DANCE;\r
+static constexpr int16_t DATE_POINT_Y = SCREEN_HALF_H + DATE_POINT_Y_DANCE;\r
+static constexpr int16_t YEAR_POINT_X = SCREEN_HALF_W - static_cast<int16_t>(0.07489 * HORIZONTAL_RESOLUTION);\r
+static constexpr int16_t MONTH_POINT_X = SCREEN_HALF_W + static_cast<int16_t>(0.024229 * HORIZONTAL_RESOLUTION);\r
+static constexpr int16_t DAY_POINT_X =  SCREEN_HALF_W + static_cast<int16_t>(0.101322 * HORIZONTAL_RESOLUTION);\r
+static constexpr int16_t DATE_LEFT_SPLIT_X = SCREEN_HALF_W - static_cast<int16_t>(0.028634 * HORIZONTAL_RESOLUTION);\r
+static constexpr int16_t DATE_RIGHT_SPLIT_X = SCREEN_HALF_W + static_cast<int16_t>(0.048458 * HORIZONTAL_RESOLUTION);\r
+static constexpr int16_t NUM4 = 4;\r
+static constexpr int16_t SPACE = 0;\r
+\r
+template <typename T>\r
+void SafeDelete(T*& ptr)\r
+{\r
+    if (ptr != nullptr) {\r
+        delete ptr;\r
+        ptr = nullptr;\r
+    }\r
+}\r
+\r
+static const std::vector<int> g_weekVector = {\r
+    PNG_WEEK_SUN,\r
+    PNG_WEEK_MON,\r
+    PNG_WEEK_TUE,\r
+    PNG_WEEK_WED,\r
+    PNG_WEEK_THU,\r
+    PNG_WEEK_FRI,\r
+    PNG_WEEK_SAT,\r
+};\r
+\r
+static const std::vector<int> g_dateVector = {\r
+    PNG_DATA_0,\r
+    PNG_DATA_1,\r
+    PNG_DATA_2,\r
+    PNG_DATA_3,\r
+    PNG_DATA_4,\r
+    PNG_DATA_5,\r
+    PNG_DATA_6,\r
+    PNG_DATA_7,\r
+    PNG_DATA_8,\r
+    PNG_DATA_9,\r
+};\r
+\r
+static const std::vector<int> g_timeVector = {\r
+    PNG_TIME_0,\r
+    PNG_TIME_1,\r
+    PNG_TIME_2,\r
+    PNG_TIME_3,\r
+    PNG_TIME_4,\r
+    PNG_TIME_5,\r
+    PNG_TIME_6,\r
+    PNG_TIME_7,\r
+    PNG_TIME_8,\r
+    PNG_TIME_9,\r
+};\r
+\r
+GradientDateView::GradientDateView()\r
+{\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "GradientDateView::GradientDateView");\r
+    SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);\r
+    SetStyle(STYLE_BACKGROUND_OPA, 0);\r
+}\r
+\r
+GradientDateView::~GradientDateView()\r
+{\r
+    if (!viewiInitStatus_) {\r
+        return;\r
+    }\r
+\r
+    RemoveAll();\r
+    SafeDelete(yearImgView_);\r
+    SafeDelete(monthImgView_);\r
+    SafeDelete(dayImgView_);\r
+    SafeDelete(hourImgView_);\r
+    SafeDelete(minuteImgView_);\r
+    SafeDelete(backgroudImage_);\r
+    ImageCacheManager::GetInstance().UnloadSingleRes(PNG_GRADIENT_CLOCK_RESOURCE);\r
+    for (auto weekImg : weekInfo_) {\r
+        if (weekImg != nullptr) {\r
+            ImageCacheFree(*weekImg);\r
+            delete weekImg;\r
+            weekImg = nullptr;\r
+        }\r
+    }\r
+    for (auto dateImg : dateNumImgInfo_) {\r
+        if (dateImg != nullptr) {\r
+            ImageCacheFree(*dateImg);\r
+            delete dateImg;\r
+            dateImg = nullptr;\r
+        }\r
+    }\r
+}\r
+\r
+bool GradientDateView::InitView(void)\r
+{\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "GradientDateView::InitView");\r
+    backgroudImage_ = new UIImageView();\r
+    if (backgroudImage_) {\r
+        backgroudImage_->SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);\r
+        backgroudImage_->SetResizeMode(UIImageView::FILL);\r
+        LoadClockImageById(backgroudImage_, PNG_TIME_SCALE);\r
+        Add(backgroudImage_);\r
+    }\r
+    InitWeekImgView();\r
+    InitDateImgViews();\r
+    InitTimeImgViews();\r
+    viewiInitStatus_ = true;\r
+    return true;\r
+}\r
+\r
+void GradientDateView::InitWeekImgView(void)\r
+{\r
+    uint16_t length = g_weekVector.size();\r
+    int16_t y = (Screen::GetInstance().GetScreenShape() == ScreenShape::RECTANGLE) ?\\r
+                                                            WEEK_POINT_Y_RECTANGLE : WEEK_POINT_Y;\r
+    weekImgView_.SetPosition(WEEK_POINT_X, y);\r
+    if (!LoadGradientDateImages(weekInfo_, g_weekVector, length)) {\r
+        return;\r
+    }\r
+    Add(&weekImgView_);\r
+}\r
+\r
+void GradientDateView::InitDateImgViews(void)\r
+{\r
+    uint16_t length = g_dateVector.size();\r
+    if (!LoadGradientDateImages(dateNumImgInfo_, g_dateVector, length)) {\r
+        return;\r
+    }\r
+    InitDigitalImgView(yearImgView_, {YEAR_POINT_X, DATE_POINT_Y}, NUM4, dateNumImgInfo_);\r
+    InitDigitalImgView(monthImgView_, {MONTH_POINT_X, DATE_POINT_Y}, NUM2, dateNumImgInfo_);\r
+    InitDigitalImgView(dayImgView_, {DAY_POINT_X, DATE_POINT_Y}, NUM2, dateNumImgInfo_);\r
+\r
+    if (LoadClockImageById(&dateSplitLeft_, PNG_DATA_SPLIT)) {\r
+        dateSplitLeft_.SetPosition(DATE_LEFT_SPLIT_X, DATE_POINT_Y);\r
+        Add(&dateSplitLeft_);\r
+    }\r
+\r
+    if (LoadClockImageById(&dateSplitRight_, PNG_DATA_SPLIT)) {\r
+        dateSplitRight_.SetPosition(DATE_RIGHT_SPLIT_X, DATE_POINT_Y);\r
+        Add(&dateSplitRight_);\r
+    }\r
+}\r
+\r
+void GradientDateView::InitTimeImgViews(void)\r
+{\r
+    uint16_t length = g_timeVector.size();\r
+    if (!LoadGradientDateImages(timeNumImgInfo_, g_timeVector, length)) {\r
+        return;\r
+    }\r
+    InitDigitalImgView(hourImgView_, {HOUR_POINT_X, TIME_POINT_Y}, NUM2, timeNumImgInfo_);\r
+    InitDigitalImgView(minuteImgView_, {MINUTE_POINT_X, TIME_POINT_Y}, NUM2, timeNumImgInfo_);\r
+    if (LoadClockImageById(&timeSplit_, PNG_TIME_SPLIT)) {\r
+        timeSplit_.SetPosition(TIME_SPLIT_X, TIME_SPLIT_Y);\r
+        Add(&timeSplit_);\r
+    }\r
+}\r
+\r
+void GradientDateView::InitDigitalImgView(DialDigitalImgView* &dialView, Point pos,\r
+    uint16_t integerLength, std::vector<ImageInfo*> &numImgInfo)\r
+{\r
+    if (dialView != nullptr) {\r
+        delete dialView;\r
+        dialView = nullptr;\r
+    }\r
+    uint16_t numImgLength = numImgInfo.size();\r
+    if (numImgLength == 0) {\r
+        return;\r
+    }\r
+    dialView = new DialDigitalImgView();\r
+    if (!dialView) {\r
+        GRAPHIC_LOGE("dialView malloc memory Failed\n");\r
+        return;\r
+    }\r
+\r
+    const OHOS::ImageInfo **dataArray = new const OHOS::ImageInfo *[numImgLength];\r
+    if (!dataArray) {\r
+        GRAPHIC_LOGE("dataArray malloc memory Failed\n");\r
+        return;\r
+    }\r
+\r
+    for (size_t i = 0; i < numImgLength; ++i) {\r
+        dataArray[i] = numImgInfo[i];\r
+    }\r
+\r
+    dialView->SetNumRes(dataArray, numImgLength);\r
+\r
+    delete[] dataArray;\r
+    dialView->SetIntegerLength(integerLength);\r
+    dialView->SetParent(this);\r
+    dialView->SetAlignPos(pos);\r
+    dialView->SetAlign(ImgAlign::CENTER);\r
+    dialView->SetSpace(SPACE);\r
+    Add(dialView);\r
+}\r
+\r
+void GradientDateView::UpdateTime(void)\r
+{\r
+    struct timeval tv;\r
+    gettimeofday(&tv, nullptr);\r
+    uint64_t second = tv.tv_sec;\r
+    uint64_t uSecond = tv.tv_usec;\r
+    uint64_t minute = second / MIN_TO_HOUR;\r
+    uint64_t hour = minute / MIN_TO_HOUR + timezone / (MIN_TO_HOUR * MIN_TO_HOUR);\r
+    uint8_t realHour = static_cast<uint8_t>(hour % HOURLY_SYSTEM);\r
+    uint8_t realMinute = static_cast<uint8_t>(minute % MIN_TO_HOUR);\r
+\r
+    time_t time_struct = second;\r
+    struct tm *local_time = localtime(&time_struct);\r
+    uint16_t year = local_time->tm_year + 1900;    // tm_year begin 1900\r
+    uint16_t month = local_time->tm_mon + 1;       // tm_mon is 0-11, need + 1\r
+    uint16_t day = local_time->tm_mday;\r
+    uint16_t weekDay = local_time->tm_wday;\r
+    realHour = local_time->tm_hour;\r
+    realMinute = local_time->tm_min;\r
+\r
+    if (weekInfo_.size() > 0) {\r
+        weekImgView_.SetSrc(weekInfo_.at(weekDay));\r
+    }\r
+\r
+    HandleDigitalData(yearImgView_, static_cast<float>(year));\r
+    HandleDigitalData(monthImgView_, static_cast<float>(month));\r
+    HandleDigitalData(dayImgView_, static_cast<float>(day));\r
+    HandleDigitalData(hourImgView_, static_cast<float>(realHour));\r
+    HandleDigitalData(minuteImgView_, static_cast<float>(realMinute));\r
+}\r
+\r
+void GradientDateView::HandleDigitalData(DialDigitalImgView* digitalView, float data)\r
+{\r
+    if (digitalView != nullptr) {\r
+        digitalView->HandleFloatData(data);\r
+    }\r
+}\r
+\r
+bool GradientDateView::LoadClockImageById(UIImageView* view, uint32_t resId)\r
+{\r
+    if (view == nullptr) {\r
+        GRAPHIC_LOGE("view == nullptr, Please check!");\r
+        return false;\r
+    }\r
+    FILE* fp = fopen(PNG_GRADIENT_CLOCK_RESOURCE, "rb");\r
+    if (fp == nullptr) {\r
+        GRAPHIC_LOGE("cannot open file: %s", PNG_GRADIENT_CLOCK_RESOURCE);\r
+        return false;\r
+    }\r
+    ImageInfo* imgInfo = ImageCacheManager::GetInstance().\r
+            LoadOneInMultiRes(resId, PNG_GRADIENT_CLOCK_RESOURCE, fp);\r
+    view->SetSrc(imgInfo);\r
+    fclose(fp);\r
+    return true;\r
+}\r
+\r
+bool GradientDateView::LoadGradientDateImages(std::vector<ImageInfo*> &imgInfos,\r
+    std::vector<int> resIds, uint16_t length)\r
+{\r
+    FILE* fp = fopen(PNG_GRADIENT_CLOCK_RESOURCE, "rb");\r
+    if (fp == nullptr) {\r
+        GRAPHIC_LOGE("cannot open file: %s", PNG_GRADIENT_CLOCK_RESOURCE);\r
+        return false;\r
+    }\r
+\r
+    uint32_t imgSize = sizeof(ImageInfo);\r
+    for (uint16_t i = 0; i < length; i++) {\r
+        ImageInfo* imgInfo =\r
+            ImageCacheManager::GetInstance().LoadOneInMultiRes(resIds[i], PNG_GRADIENT_CLOCK_RESOURCE, fp);\r
+        if (!imgInfo) {\r
+            GRAPHIC_LOGE("LoadOneInMultiRes Failed: resId = %d\n", resIds[i]);\r
+            imgInfos.clear();\r
+            break;\r
+        }\r
+        imgInfos.push_back(imgInfo);\r
+    }\r
+    fclose(fp);\r
+    return true;\r
+}\r
+\r
+}
\ No newline at end of file
index 1fdfcf4..d6c405e 100644 (file)
 #include "wearable_log.h"
 #include "ui_resource_image.h"
 #include "common/image_cache_manager.h"
-#include "UICardPageFactory.h"
+#include "UIWatchDialFactory.h"
+#include "main/DialBinTypesV2.h"
 #include <ctime>
 
 namespace OHOS {
 
-REGIST_WATCH_DIAL(DIAL_DISPLAY_MODE_MAIN, DIAL_CLOCK, MainClockView);
+const DialInfo dialInfoConfig = {
+        DIAL_CLOCK, "ɨÃë±íÅÌ", PNG_SET_DIAL_CLOCK, DEFAULT_TASK_PERIOD, DIAL_DISPLAY_CAPABILITY_NORMAL_ONLY
+    };
+
+REGIST_WATCH_DIAL(DIAL_DISPLAY_SUPPORT_NORMAL, DIAL_CLOCK, MainClockView, &dialInfoConfig);
 
 static MainClockView *g_pMainClockView = nullptr;
 
@@ -418,10 +423,10 @@ void MainClockView::RefreshHeartRate(int value)
 
 void MainClockView::InitDateTime(void)
 {
-    UpdateTime();
+    Update();
 }
 
-void MainClockView::UpdateTime(void)
+void MainClockView::Update(void)
 {
     struct timeval tv;
     gettimeofday(&tv, nullptr);
index d4139a5..6708d71 100644 (file)
@@ -13,6 +13,11 @@ CompassControlView::CompassControlView()
     SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);
 }
 
+CompassControlView::~CompassControlView()
+{
+    UnLoad();
+}
+
 void CompassControlView::PreLoad(void)
 {
     if (compassFragment_ == nullptr) {
@@ -64,4 +69,11 @@ void CompassControlView::ScrollEnd(bool isActive)
         compassFragment_->ResumeView();
     }
 }
+
+void CompassControlView::Update(void)
+{
+    if (compassFragment_ != nullptr) {
+        compassFragment_->Update();
+    }
+}
 }
index cca744b..0ef34a9 100644 (file)
@@ -55,7 +55,7 @@ const CompassItem g_compassList[] = {
     {RIGHT_WEST_UP_293, RIGHT_WESTNORTH_UP_338, "西北"}
 };
 
-void CompassFragment::Callback(void)
+void CompassFragment::Update(void)
 {
     if (!initialized_) {
         return;
@@ -177,17 +177,14 @@ void CompassFragment::OnCreateView(void* data)
 
 void CompassFragment::OnPauseView()
 {
-    Deinit();
 }
 
 void CompassFragment::OnResumeView()
 {
-    Init();
 }
 
 void CompassFragment::OnDestroyView()
 {
-    Deinit();
     fragmentView_.RemoveAll();
     if (directionLabel_ != nullptr) {
         delete directionLabel_;
index 11a3b45..46229bb 100644 (file)
@@ -18,13 +18,14 @@ bool MainCompassPresenter::OnDrag(UIView& view, const DragEvent& event)
     UNUSED(view);
     if ((event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT) &&
         (event.GetDeltaX() > X_DRAG_OFFSET) && (event.GetDeltaX() > (DOUBLES * MATH_ABS(event.GetDeltaY())))) {
-        NativeAbility::GetInstance().ChangeSlice(VIEW_APPLIST);
+        NativeAbility::GetInstance().ChangeSliceToApplist();
     }
     return true;
 }
 
 void MainCompassPresenter::OnResume()
 {
+    Init();
     if ((view_ != nullptr) && (view_->compassFragment_ != nullptr)) {
         view_->compassFragment_->ResumeView();
     }
@@ -32,8 +33,16 @@ void MainCompassPresenter::OnResume()
 
 void MainCompassPresenter::OnPause()
 {
+    Deinit();
     if ((view_ != nullptr) && (view_->compassFragment_ != nullptr)) {
         view_->compassFragment_->PauseView();
     }
 }
+
+void MainCompassPresenter::Callback()
+{
+    if ((view_ != nullptr) && (view_->compassFragment_ != nullptr)) {
+        view_->compassFragment_->Update();
+    }
+}
 }
index 210f188..2039c7c 100644 (file)
@@ -1,96 +1,68 @@
 /*\r
- * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
  * Description: DateButtonItemView\r
  * Create: 2025-03-23\r
  */\r
 \r
-#include "date/DateButtonItemView.h"\r
 #include "UiConfig.h"\r
 #include "common/image_cache_manager.h"\r
 #include "ui_resource_date.h"\r
 #include "wearable_log.h"\r
+#include "date/DateButtonItemView.h"\r
 \r
 namespace OHOS {\r
 static constexpr int16_t DATE_ITEM_BUTTON_POSITION_X = 0;\r
-static constexpr int16_t DATE_ITEM_BUTTON_POSITION_Y = 20;\r
+static constexpr int16_t DATE_ITEM_BUTTON_POSITION_Y = 0;\r
 static constexpr int16_t DATE_ITEM_BUTTON_WIDTH = 80;\r
 static constexpr int16_t DATE_ITEM_BUTTON_HEIGHT = 55;\r
 static constexpr int16 DATE_ITEM_FONT_SIZE = 36;\r
-static constexpr int16_t DATE_ITEM_WIDTH = 95;\r
-static constexpr int16_t DATE_ITEM_HEIGHT = 60;\r
 \r
 DateButtonItemView::DateButtonItemView()\r
 {\r
-    SetPosition(0, 0, DATE_ITEM_WIDTH, DATE_ITEM_HEIGHT);\r
-    SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
-    SetTouchable(true);\r
-    SetUpChild();\r
-\r
-    Add(&sLabelButton);\r
+    labelButton_.SetPosition(DATE_ITEM_BUTTON_POSITION_X, DATE_ITEM_BUTTON_POSITION_Y);\r
+    labelButton_.Resize(DATE_ITEM_BUTTON_WIDTH, DATE_ITEM_BUTTON_HEIGHT);\r
+    labelButton_.SetFont(DEFAULT_VECTOR_FONT_FILENAME, DATE_ITEM_FONT_SIZE);\r
+    labelButton_.SetAlign(TEXT_ALIGNMENT_CENTER);\r
+    labelButton_.SetStyle(STYLE_TEXT_OPA, OPA_OPAQUE);\r
+    labelButton_.SetStyle(STYLE_BACKGROUND_COLOR, Color::Gray().full);\r
+    labelButton_.SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+    Add(&labelButton_);\r
 }\r
 \r
 DateButtonItemView::~DateButtonItemView()\r
 {\r
-    Remove(&sLabelButton);\r
+    Remove(&labelButton_);\r
 }\r
 \r
 void DateButtonItemView::SetItemInfo(const DateButtonItem itemInfo)\r
 {\r
-    sItemInfo = itemInfo;\r
-    sLabelButton.SetText(sItemInfo.button_day);\r
-    ImageInfo *image1;\r
-    ImageInfo *image2;\r
-    if (sItemInfo.isFirst) {\r
-        if (sItemInfo.isSelect) {\r
-            image1 = ImageCacheManager::GetInstance().LoadOneInMultiRes(IMAGE_CONVERTER_TOOL_DATE6, DATE_IMAGE);\r
-            sLabelButton.SetTextColor(Color::White());\r
+    itemInfo_ = itemInfo;\r
+    labelButton_.SetText(itemInfo_.buttonDay);\r
+    int imageSrc1;\r
+    int imageSrc2;\r
+    if (itemInfo_.isFirst) {\r
+        if (itemInfo_.isSelect) {\r
+            imageSrc1 = IMAGE_DATE_RED;\r
+            labelButton_.SetTextColor(Color::White());\r
         } else {\r
-            sLabelButton.SetTextColor(Color::GetColorFromRGBA(0xe0, 0x2d, 0x2f, 0xff));\r
-            image1 = ImageCacheManager::GetInstance().LoadOneInMultiRes(IMAGE_CONVERTER_TOOL_DATE3, DATE_IMAGE);\r
-        }\r
-        if (image1 == nullptr) {\r
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "LoadBtnImage resId1 fail");\r
-            return;\r
-        }\r
-        image2 = ImageCacheManager::GetInstance().LoadOneInMultiRes(IMAGE_CONVERTER_TOOL_DATE6, DATE_IMAGE);\r
-        if (image2 == nullptr) {\r
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "LoadBtnImage resId2 fail");\r
-            return;\r
+            imageSrc1 = IMAGE_DATE_WHITE;\r
+            labelButton_.SetTextColor(Color::GetColorFromRGBA(0xe0, 0x2d, 0x2f, 0xff));\r
         }\r
+        imageSrc2 = IMAGE_DATE_RED;\r
     } else {\r
-        if (sItemInfo.isSelect) {\r
-            image1 = ImageCacheManager::GetInstance().LoadOneInMultiRes(IMAGE_CONVERTER_TOOL_DATE4, DATE_IMAGE);\r
+        if (itemInfo_.isSelect) {\r
+            imageSrc1 = IMAGE_DATE_SELECT;\r
         } else {\r
-            image1 = ImageCacheManager::GetInstance().LoadOneInMultiRes(IMAGE_CONVERTER_TOOL_DATE2, DATE_IMAGE);\r
-        }\r
-        if (image1 == nullptr) {\r
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "LoadBtnImage resId1 fail");\r
-            return;\r
+            imageSrc1 = IMAGE_DATE_GRAY;\r
         }\r
-        image2 = ImageCacheManager::GetInstance().LoadOneInMultiRes(IMAGE_CONVERTER_TOOL_DATE4, DATE_IMAGE);\r
-        if (image2 == nullptr) {\r
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "LoadBtnImage resId2 fail");\r
-            return;\r
-        }\r
-        sLabelButton.SetTextColor(Color::White());\r
+        imageSrc2 = IMAGE_DATE_SELECT;\r
+        labelButton_.SetTextColor(Color::White());\r
     }\r
-    sLabelButton.SetImageSrc(image1, image2);\r
+    LOADIMG::LoadBtnImage(&labelButton_, DATE_IMAGE, imageSrc1, imageSrc2);\r
 }\r
 \r
-void DateButtonItemView::SetUpChild()\r
+DateButtonItem DateButtonItemView::GetItem()\r
 {\r
-    sLabelButton.SetPosition(DATE_ITEM_BUTTON_POSITION_X, 0);\r
-    sLabelButton.Resize(DATE_ITEM_BUTTON_WIDTH, DATE_ITEM_BUTTON_HEIGHT);\r
-    sLabelButton.SetFont(DEFAULT_VECTOR_FONT_FILENAME, DATE_ITEM_FONT_SIZE);\r
-    sLabelButton.SetAlign(TEXT_ALIGNMENT_CENTER);\r
-    sLabelButton.SetStyle(STYLE_TEXT_OPA, OPA_OPAQUE);\r
-    sLabelButton.SetStyle(STYLE_BACKGROUND_COLOR, Color::Gray().full);\r
-    sLabelButton.SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+    return itemInfo_;\r
 }\r
-\r
-DateButtonItem DateButtonItemView ::GetItem()\r
-{\r
-    return sItemInfo;\r
-}\r
-\r
 }
\ No newline at end of file
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/date/src/DateContentItemView.cpp b/code/sdk/application/wearable/evb/nativeapp/nativeui/date/src/DateContentItemView.cpp
new file mode 100644 (file)
index 0000000..683d79f
--- /dev/null
@@ -0,0 +1,133 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: DateItemView\r
+ * Create: 2025-03-23\r
+ */\r
+\r
+#include "UiConfig.h"\r
+#include "common/image_cache_manager.h"\r
+#include "ui_resource_date.h"\r
+#include "wearable_log.h"\r
+#include "date/DateContentItemView.h"\r
+\r
+namespace OHOS {\r
+static constexpr int16_t DATE_ITEM_LABEL_POSITION_X = 43;\r
+static constexpr int16_t DATE_ITEM_LABEL_POSITION_Y = 22;\r
+static constexpr int16_t DATE_ITEM_LABEL_DES_POSITION_X = 23;\r
+static constexpr int16_t DATE_ITEM_LABEL_DES_POSITION_Y = 60;\r
+static constexpr int16_t DATE_ITEM_LABEL_ADDRESS_POSITION_X = 23;\r
+static constexpr int16_t DATE_ITEM_LABEL_ADDRESS_POSITION_Y = 110;\r
+static constexpr int16_t DATE_ITEM_LABEL_WIDTH = 200;\r
+static constexpr int16_t DATE_ITEM_LABEL_HEIGHT = 40;\r
+static constexpr int16_t DATE_ITEM_LABEL_DES_WIDTH = 314;\r
+static constexpr int16_t DATE_ITEM_LABEL_DES_HEIGHT = 40;\r
+static constexpr int16_t DATE_ITEM_LABEL_ADDRESS_WIDTH = 314;\r
+static constexpr int16_t DATE_ITEM_LABEL_ADDRESS_HEIGHT = 40;\r
+static constexpr int16_t DATE_ITEM_FONT_SIZE = 24;\r
+static constexpr int16_t DATE_ITEM_FONT2_SIZE = 32;\r
+static constexpr int16_t DATE_ITEM_WIDTH = 376;\r
+static constexpr int16_t DATE_ITEM_HEIGHT = 170;\r
+static constexpr int16_t DATE_ITEM_HEIGHT_BORDER = 10;\r
+static constexpr int16_t DATE_ITEM_BORDER_RADIUS = 15;\r
+\r
+DateContentItemView::DateContentItemView()\r
+{\r
+    labelTitle_.Resize(DATE_ITEM_LABEL_WIDTH, DATE_ITEM_LABEL_HEIGHT);\r
+    labelTitle_.SetAlign(TEXT_ALIGNMENT_LEFT, TEXT_ALIGNMENT_LEFT);\r
+    labelTitle_.SetStyle(STYLE_TEXT_OPA, OPA_OPAQUE);\r
+    labelTitle_.SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
+    labelTitle_.SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+\r
+    labelDes_.Resize(DATE_ITEM_LABEL_DES_WIDTH, DATE_ITEM_LABEL_DES_POSITION_Y);\r
+    labelDes_.SetAlign(TEXT_ALIGNMENT_LEFT, TEXT_ALIGNMENT_LEFT);\r
+    labelDes_.SetStyle(STYLE_TEXT_OPA, OPA_OPAQUE);\r
+    labelDes_.SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
+    labelDes_.SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+\r
+    labelAddress_.Resize(DATE_ITEM_LABEL_ADDRESS_WIDTH, DATE_ITEM_LABEL_ADDRESS_HEIGHT);\r
+    labelAddress_.SetAlign(TEXT_ALIGNMENT_LEFT, TEXT_ALIGNMENT_LEFT);\r
+    labelAddress_.SetStyle(STYLE_TEXT_OPA, OPA_OPAQUE);\r
+    labelAddress_.SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
+    labelAddress_.SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+    signs_.SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+    LOADIMG::LoadImageViewImg(&signs_, DATE_IMAGE, IMAGE_DATE_SIGNS);\r
+\r
+    backGround_.Disable();\r
+    backGround_.SetPosition(0, 0, DATE_ITEM_WIDTH, DATE_ITEM_HEIGHT - DATE_ITEM_HEIGHT_BORDER);\r
+    backGround_.SetStyleForState(STYLE_BACKGROUND_COLOR, 0X36FFFFFF, UIButton::PRESSED);\r
+    backGround_.SetStyleForState(STYLE_BACKGROUND_COLOR, 0X36FFFFFF, UIButton::INACTIVE);\r
+    backGround_.SetStyleForState(STYLE_BACKGROUND_COLOR, 0X36FFFFFF, UIButton::RELEASED);\r
+    backGround_.SetStyleForState(STYLE_BORDER_RADIUS, DATE_ITEM_BORDER_RADIUS, UIButton::PRESSED);\r
+    backGround_.SetStyleForState(STYLE_BORDER_RADIUS, DATE_ITEM_BORDER_RADIUS, UIButton::INACTIVE);\r
+    backGround_.SetStyleForState(STYLE_BORDER_RADIUS, DATE_ITEM_BORDER_RADIUS, UIButton::RELEASED);\r
+\r
+    Add(&backGround_);\r
+    Add(&labelTitle_);\r
+    Add(&labelDes_);\r
+    Add(&labelAddress_);\r
+    Add(&signs_);\r
+}\r
+\r
+DateContentItemView::~DateContentItemView()\r
+{\r
+    Remove(&backGround_);\r
+    Remove(&labelTitle_);\r
+    Remove(&labelDes_);\r
+    Remove(&labelAddress_);\r
+    Remove(&signs_);\r
+}\r
+\r
+void DateContentItemView::SetItemInfo(const DateItem itemInfo)\r
+{\r
+    itemInfo_ = itemInfo;\r
+    int offsetX1 = 95;\r
+    int offsetY1 = 10;\r
+    int offsetX2 = 30;\r
+    int offsetY2 = 40;\r
+    labelTitle_.SetText(itemInfo.title);\r
+    labelDes_.SetText(itemInfo.describetion);\r
+\r
+    if (!strcmp(itemInfo.address, "no location")) {\r
+        labelAddress_.SetVisible(false);\r
+        backGround_.SetHeight(DATE_ITEM_HEIGHT - offsetY2 - offsetY1);\r
+        SetHeight(DATE_ITEM_HEIGHT - offsetY2);\r
+    } else {\r
+        labelAddress_.SetVisible(true);\r
+        labelAddress_.SetText(itemInfo.address);\r
+        backGround_.SetHeight(DATE_ITEM_HEIGHT - offsetY1);\r
+        SetHeight(DATE_ITEM_HEIGHT);\r
+    }\r
+\r
+    if (itemInfo.visiable) {\r
+        labelTitle_.SetPosition(DATE_ITEM_LABEL_POSITION_X + offsetX1, DATE_ITEM_LABEL_POSITION_Y + offsetY1);\r
+        labelTitle_.SetStyle(STYLE_TEXT_COLOR, Color::White().full);\r
+        labelTitle_.SetFont(DEFAULT_VECTOR_FONT_FILENAME, DATE_ITEM_FONT2_SIZE);\r
+        labelDes_.SetPosition(DATE_ITEM_LABEL_DES_POSITION_X + offsetX2, DATE_ITEM_LABEL_DES_POSITION_Y + offsetY2);\r
+        labelDes_.SetStyle(STYLE_TEXT_COLOR, Color::Gray().full);\r
+        labelDes_.SetFont(DEFAULT_VECTOR_FONT_FILENAME, DATE_ITEM_FONT_SIZE);\r
+        labelAddress_.SetVisible(false);\r
+    } else {\r
+        labelTitle_.SetPosition(DATE_ITEM_LABEL_POSITION_X, DATE_ITEM_LABEL_POSITION_Y);\r
+        labelTitle_.SetStyle(STYLE_TEXT_COLOR, Color::Gray().full);\r
+        labelTitle_.SetFont(DEFAULT_VECTOR_FONT_FILENAME, DATE_ITEM_FONT_SIZE);\r
+        labelDes_.SetPosition(DATE_ITEM_LABEL_DES_POSITION_X, DATE_ITEM_LABEL_DES_POSITION_Y);\r
+        labelDes_.SetStyle(STYLE_TEXT_COLOR, Color::White().full);\r
+        labelDes_.SetFont(DEFAULT_VECTOR_FONT_FILENAME, DATE_ITEM_FONT2_SIZE);\r
+        labelAddress_.SetPosition(DATE_ITEM_LABEL_DES_POSITION_X, DATE_ITEM_LABEL_ADDRESS_POSITION_Y);\r
+        labelAddress_.SetStyle(STYLE_TEXT_COLOR, Color::Gray().full);\r
+        labelAddress_.SetFont(DEFAULT_VECTOR_FONT_FILENAME, DATE_ITEM_FONT_SIZE);\r
+        signs_.SetPosition(DATE_ITEM_LABEL_DES_POSITION_X, DATE_ITEM_FONT_SIZE);\r
+    }\r
+    signs_.SetVisible(!itemInfo.visiable);\r
+}\r
+\r
+const char *DateContentItemView ::GetViewId()\r
+{\r
+    return itemInfo_.index;\r
+}\r
+bool DateContentItemView::GetVisiable()\r
+{\r
+    return itemInfo_.visiable;\r
+}\r
+\r
+}
\ No newline at end of file
index 5072468..9ca3042 100644 (file)
@@ -1,12 +1,9 @@
 /*\r
- * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
  * Description: DateMainPage\r
  * Created: 2025-4\r
  */\r
 \r
-#include "date/DateMainPage.h"\r
-#include "date/DateModel.h"\r
-#include "date/DatePresenter.h"\r
 #include "NativeAbility.h"\r
 #include "SlicePageFactory.h"\r
 #include "UiConfig.h"\r
 #include "components/ui_list_nested.h"\r
 #include "components/ui_scroll_view_nested.h"\r
 #include "ui_resource_date.h"\r
+#include "bts_br_gap.h"\r
+#include "bts_spp.h"\r
+#include "msg_center_device.h"\r
+#include "date/DateModel.h"\r
+#include "date/DatePresenter.h"\r
+#include "date/DateMainPage.h"\r
 \r
 static constexpr int16_t DOWNSELECTPOSITION = 100;\r
 static constexpr int16_t DOWNCONTENTLIST_POSITION_X = 39;\r
@@ -27,232 +30,338 @@ static constexpr int16_t BUTTONCONTENTLIST_WIDTH = 410;
 static constexpr int16_t BUTTONCONTENTLIST_HEIGHT = 55;\r
 static constexpr int16_t BUTTONCONTENTLIST_SELECT_POSITON = 90;\r
 static constexpr uint16_t DATE_MONTH_FONT = 25;\r
-static constexpr uint16_t DATE_MONTH_POS_X = 129;\r
-static constexpr uint16_t DATE_MONTH_POS_Y = 31;\r
+static constexpr uint16_t DATE_MONTH_POS_X = 117;\r
+static constexpr uint16_t DATE_MONTH_POS_Y = 30;\r
 static constexpr uint16_t DATE_MONTH_WIDTH = 196;\r
 static constexpr uint16_t LIST_POSITION_Y = 155;\r
+static constexpr uint16_t LIST_BLANK_SIZE = 60;\r
 static constexpr uint16_t DATE_MONTH_HEIGHT = 50;\r
 static constexpr uint8_t FONT_FORTY_SIZE = 36;\r
+static constexpr uint8_t MONTH_ADJUST_THRESHOLD = 3;\r
+static constexpr uint8_t MONTHS_IN_YEAR = 12;\r
+static constexpr uint8_t CENTURY = 100;\r
+static constexpr uint8_t ZELLER_MONTH_FACTOR = 13;\r
+static constexpr uint8_t ZELLER_DIVISOR = 5;\r
+static constexpr uint8_t LEAP_YEAR_INTERVAL = 4;\r
+static constexpr uint8_t DAYS_IN_WEEK = 7;\r
+static constexpr uint8_t CENTURY_OFFSET = 5;\r
+static constexpr int16 INDEX_0 = 0;\r
+static constexpr int16 INDEX_1 = 1;\r
+static constexpr int16 INDEX_2 = 2;\r
+static constexpr int16 INDEX_3 = 3;\r
+static constexpr int16 INDEX_4 = 4;\r
+static constexpr int16 INDEX_5 = 5;\r
+static constexpr int16_t DATE_ITEM_WIDTH = 95;\r
+static constexpr int16_t DATE_ITEM_HEIGHT = 60;\r
+static constexpr int16_t DATE_DOWN_LIST_ITEM_WIDTH = 376;\r
+static constexpr int16_t DATE_DOWN_LIST_ITEM_HEIGHT = 170;\r
+static constexpr char *DATE_LIST = "dateList";\r
+static constexpr char *DETAIL_LIST = "detailList";\r
 \r
 namespace OHOS {\r
 REGIST_SLICE_PAGE(VIEW_DATE, DATE_PAGES::DATE_MAIN_PAGE, DateMainPage, true);\r
+static DateMainPage *g_pDateMainPage = nullptr;\r
 \r
 DateMainPage::DateMainPage()\r
 {\r
+    g_pDateMainPage = this;\r
     WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "DateMainPage::DateMainPage");\r
 }\r
 \r
 DateMainPage::~DateMainPage()\r
 {\r
-    if (uiScrollView != nullptr) {\r
-        uiScrollView->RemoveAll();\r
-        delete uiScrollView;\r
-        uiScrollView = nullptr;\r
+    g_pDateMainPage = nullptr;\r
+    if (uiScrollView_ != nullptr) {\r
+        uiScrollView_->RemoveAll();\r
+        delete uiScrollView_;\r
+        uiScrollView_ = nullptr;\r
     }\r
 \r
-    if (listAdapter != nullptr) {\r
-        delete listAdapter;\r
-        listAdapter = nullptr;\r
+    dateList_->ClearAll();\r
+    if (dateList_ != nullptr) {\r
+        delete dateList_;\r
+        dateList_ = nullptr;\r
     }\r
 \r
-    if (buttonAdapter != nullptr) {\r
-        delete buttonAdapter;\r
-        buttonAdapter = nullptr;\r
+    detailList_->ClearAll();\r
+    if (detailList_ != nullptr) {\r
+        delete detailList_;\r
+        detailList_ = nullptr;\r
     }\r
 \r
-    if (buttonContentList != nullptr) {\r
-        delete buttonContentList;\r
-        buttonContentList = nullptr;\r
+    if (titlLabel_ != nullptr) {\r
+        delete titlLabel_;\r
+        titlLabel_ = nullptr;\r
     }\r
 \r
-    if (downContentList != nullptr) {\r
-        delete downContentList;\r
-        downContentList = nullptr;\r
+    if (bgImage_ != nullptr) {\r
+        delete bgImage_;\r
+        bgImage_ = nullptr;\r
     }\r
 \r
-    if (title != nullptr) {\r
-        delete title;\r
-        title = nullptr;\r
-    }\r
-\r
-    if (image1 != nullptr) {\r
-        delete image1;\r
-        image1 = nullptr;\r
+    int reset = DateModel::GetInstance().resetPage_;\r
+    if (reset == PAGE_STATUS_0 || reset == PAGE_STATUS_2) {\r
+        DateModel::GetInstance().selectButton_ = "";\r
     }\r
+    ImageCacheManager::GetInstance().UnloadAllInMultiRes(DATE_IMAGE);\r
     WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "DateMainPage::~DateMainPage");\r
 }\r
 \r
+DateMainPage *DateMainPage::GetInstance()\r
+{\r
+    return g_pDateMainPage;\r
+}\r
+\r
 void DateMainPage::OnStart(void *data)\r
 {\r
-    uiScrollView = new UIScrollView();\r
-    if (uiScrollView == nullptr) {\r
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "DateView::OnStart::scrollView is nullptr");\r
-        return;\r
-    }\r
-    uiScrollView->Resize(HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);\r
-    uiScrollView->SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
-    uiScrollView->SetStyle(STYLE_BACKGROUND_OPA, UN_OPACITY);\r
-    uiScrollView->SetThrowDrag(true);\r
-    uiScrollView->SetOnDragListener(this);\r
-    uiScrollView->SetThrowDrag(true);\r
-    image1 = new UIImageView();\r
-    if (image1 == nullptr) {\r
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "DateView::OnStart::image1 is nullptr");\r
+    uiScrollView_ = new UIScrollView();\r
+    if (uiScrollView_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "scrollView is nullptr");\r
         return;\r
     }\r
-    image1->SetPosition(0, 0);\r
-    image1->SetStyle(STYLE_BACKGROUND_OPA, OPA_OPAQUE);\r
-    ImageInfo *imgSrc = ImageCacheManager::GetInstance().LoadOneInMultiRes(IMAGE_CONVERTER_TOOL_DATE7, DATE_IMAGE);\r
-    if (imgSrc == nullptr) {\r
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,\r
-                      "DateMainPage::OnStart LoadOneInMultiRes IMAGE_CONVERTER_TOOL_DATE8 fail");\r
+    uiScrollView_->Resize(HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);\r
+    uiScrollView_->SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
+    uiScrollView_->SetStyle(STYLE_BACKGROUND_OPA, UN_OPACITY);\r
+    uiScrollView_->SetThrowDrag(true);\r
+    uiScrollView_->SetOnDragListener(this);\r
+    uiScrollView_->SetThrowDrag(true);\r
+    bgImage_ = new UIImageView();\r
+    if (bgImage_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "bgImage_ is nullptr");\r
         return;\r
     }\r
-    image1->SetSrc(imgSrc);\r
-    uiScrollView->Add(image1);\r
+    bgImage_->SetPosition(0, 0);\r
+    bgImage_->SetStyle(STYLE_BACKGROUND_OPA, OPA_OPAQUE);\r
+    LOADIMG::LoadImageViewImg(bgImage_, DATE_IMAGE, IMAGE_DATE_BG1);\r
+    uiScrollView_->Add(bgImage_);\r
 \r
     DateModel::GetInstance().InitDate();\r
-    title = new UILabel();\r
-    if (title == nullptr) {\r
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "DateView::OnStart::title is nullptr");\r
+    titlLabel_ = new UILabel();\r
+    if (titlLabel_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "titlLabel_ is nullptr");\r
         return;\r
     }\r
-    title->SetFont(DEFAULT_VECTOR_FONT_FILENAME, DATE_MONTH_FONT);\r
     std::stringstream ss;\r
-    title->SetAlign(UITextLanguageAlignment::TEXT_ALIGNMENT_RIGHT, UITextLanguageAlignment::TEXT_ALIGNMENT_RIGHT);\r
-    title->SetFont(DEFAULT_VECTOR_FONT_FILENAME, FONT_FORTY_SIZE);\r
-    title->SetPosition(DATE_MONTH_POS_X, DATE_MONTH_POS_Y, DATE_MONTH_WIDTH, DATE_MONTH_HEIGHT);\r
-    uiScrollView->Add(title);\r
-    InitDownList();\r
-    AddViewToPageContainer(uiScrollView);\r
+    titlLabel_->SetAlign(UITextLanguageAlignment::TEXT_ALIGNMENT_RIGHT, UITextLanguageAlignment::TEXT_ALIGNMENT_RIGHT);\r
+    titlLabel_->SetFont(BOLD_VECTOR_FONT_FILENAME, FONT_FORTY_SIZE);\r
+    titlLabel_->SetPosition(DATE_MONTH_POS_X, DATE_MONTH_POS_Y, DATE_MONTH_WIDTH, DATE_MONTH_HEIGHT);\r
+    uiScrollView_->Add(titlLabel_);\r
+    InitList();\r
+    if (DateModel::GetInstance().GetConnectStatus()) {\r
+        errcode_t result;\r
+        uint8_t value = 1;\r
+#ifdef _WIN32\r
+        result = 0;\r
+#else\r
+        result = msg_center_send_data(MSGCENTER_CMD_DEVICE, MSGCENTER_TYPE_ID_SYNC_DATE_REQ, &value, sizeof(value));\r
+        WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "sync data request result:%d ", result);\r
+#endif\r
+    }\r
+    AddViewToPageContainer(uiScrollView_);\r
+}\r
+\r
+void DateMainPage::ReloadPage()\r
+{\r
+    DateModel::GetInstance().InitDate();\r
+    RefreshListData();\r
 }\r
 \r
-void DateMainPage::InitDownList()\r
+void DateMainPage::RefreshListData()\r
 {\r
-    if (buttonContentList == nullptr) {\r
-        buttonContentList = new UIList(0);\r
+    std::string strSelect = DateModel::GetInstance().selectButton_;\r
+    if (strSelect == "") {\r
+        SetDateButtonList(listTop_[0].buttonViewId);\r
+        RefreshDateMsg(listTop_[0].buttonViewId);\r
+    } else {\r
+        for (int i = 0; i < listTop_.Size(); i++) {\r
+            if (listTop_[i].buttonViewId == strSelect) {\r
+                SetDateButtonList(listTop_[i].buttonViewId);\r
+                RefreshDateMsg(listTop_[i].buttonViewId);\r
+                break;\r
+            }\r
+        }\r
     }\r
-    buttonAdapter = new DateButtonAdapter();\r
-    if (buttonAdapter == nullptr) {\r
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "DateView::OnStart::listAdapter is nullptr");\r
+}\r
+\r
+void DateMainPage::InitList()\r
+{\r
+    dateList_ = new UISimpleList();\r
+    if (dateList_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "dateList_ is nullptr");\r
         return;\r
     }\r
-    buttonAdapter->SetItemClickListener(this);\r
-    buttonContentList->SetViewId("buttonList");\r
-    buttonContentList->SetPosition(BUTTONCONTENTLIST_POSITION_X, BUTTONCONTENTLIST_POSITION_Y, BUTTONCONTENTLIST_WIDTH,\r
+    dateList_->SetViewId(DATE_LIST);\r
+    dateList_->SetPosition(BUTTONCONTENTLIST_POSITION_X, BUTTONCONTENTLIST_POSITION_Y, BUTTONCONTENTLIST_WIDTH,\r
                                    BUTTONCONTENTLIST_HEIGHT);\r
-    buttonContentList->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
-    buttonContentList->SetSelectPosition(BUTTONCONTENTLIST_SELECT_POSITON);\r
-    buttonContentList->SetDraggable(true);\r
-    buttonContentList->SetThrowDrag(true);\r
-    buttonContentList->EnableAutoAlign(true);\r
-    buttonContentList->ScrollTo(0);\r
-    buttonContentList->SetAdapter(buttonAdapter);\r
-    buttonContentList->SetStyle(STYLE_BACKGROUND_COLOR, Color::White().full);\r
-    InitDateTop();\r
-    RefreshButtonListDate(0);\r
-    if (downContentList == nullptr) {\r
-        downContentList = new UIList();\r
-    }\r
+    dateList_->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+    dateList_->SetSelectPosition(BUTTONCONTENTLIST_SELECT_POSITON);\r
+    dateList_->SetDraggable(true);\r
+    dateList_->SetThrowDrag(true);\r
+    dateList_->EnableAutoAlign(true);\r
+    dateList_->SetIntercept(true);\r
+    dateList_->ScrollTo(0);\r
+    dateList_->SetStyle(STYLE_BACKGROUND_COLOR, Color::White().full);\r
+    dateList_->SetDirection(0);\r
+    InitListTopDate();\r
 \r
-    listAdapter = new DateAdapter();\r
-    if (listAdapter == nullptr) {\r
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "DateView::OnStart::listAdapter is nullptr");\r
+    detailList_ = new UISimpleList();\r
+    if (detailList_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "detailList_ is nullptr");\r
         return;\r
     }\r
-    listAdapter->SetItemClickListener(this);\r
-    SetDownListAdapter();\r
-    downContentList->SetViewId("downList");\r
-    downContentList->SetPosition(DOWNCONTENTLIST_POSITION_X, DOWNCONTENTLIST_POSITION_Y);\r
-    downContentList->Resize(DOWNCONTENTLIST_WIDTH, DOWNCONTENTLIST_HEIGHT);  // 364: height\r
-    downContentList->SetSelectPosition(DOWNSELECTPOSITION);\r
-    downContentList->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
-    downContentList->SetDraggable(true);\r
-    downContentList->SetThrowDrag(true);\r
-    downContentList->EnableAutoAlign(true);\r
-    downContentList->SetElastic(true);\r
-    downContentList->ScrollTo(0);\r
-    downContentList->SetAdapter(listAdapter);\r
-    UpdateMsg(listTop.front().button_viewId);\r
-    uiScrollView->Add(downContentList);\r
-    uiScrollView->Add(buttonContentList);\r
+\r
+    detailList_->SetViewId(DETAIL_LIST);\r
+    detailList_->SetPosition(DOWNCONTENTLIST_POSITION_X, DOWNCONTENTLIST_POSITION_Y);\r
+    detailList_->Resize(DOWNCONTENTLIST_WIDTH, DOWNCONTENTLIST_HEIGHT);\r
+    detailList_->SetSelectPosition(DOWNSELECTPOSITION);\r
+    detailList_->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+    detailList_->SetDraggable(true);\r
+    detailList_->SetThrowDrag(true);\r
+    detailList_->EnableAutoAlign(true);\r
+    detailList_->SetElastic(true);\r
+    detailList_->ScrollTo(0);\r
+    detailList_->SetScrollBlankSize(LIST_BLANK_SIZE);\r
+    SetContentListDate();\r
+    RefreshListData();\r
+    uiScrollView_->Add(detailList_);\r
+    uiScrollView_->Add(dateList_);\r
 }\r
 \r
-int calculateWeekday(int year, int month, int day)\r
+int CalculateWeekday(int year, int month, int day)\r
 {\r
-    if (month < SET_THREE) {\r
-        month += SET_TWELVE;\r
+    if (month < MONTH_ADJUST_THRESHOLD) {\r
+        month += MONTHS_IN_YEAR;\r
         year--;\r
     }\r
-    int K = year % SET_HUNDRED;\r
-    int J = year / SET_HUNDRED;\r
-    int h = (day + SET_THIRTEEN * (month + SET_ONE) / SET_FIVE + K + K / SET_FOUR + J / SET_FOUR + SET_FIVE * J) %\r
-            SET_SEVEN;\r
-    return h;\r
+    int lastTwoDigitsOfYear = year % CENTURY;\r
+    int century = year / CENTURY;\r
+    int dayOfWeek =\r
+        (day + ZELLER_MONTH_FACTOR * (month + 1) / ZELLER_DIVISOR + lastTwoDigitsOfYear +\r
+         lastTwoDigitsOfYear / LEAP_YEAR_INTERVAL + century / LEAP_YEAR_INTERVAL + CENTURY_OFFSET * century) %\r
+        DAYS_IN_WEEK;\r
+    return dayOfWeek;\r
 }\r
 \r
 // 刷新List数据\r
-void DateMainPage::UpdateMsg(std::string dateMsg)\r
+void DateMainPage::RefreshDateMsg(std::string dateMsg)\r
 {\r
-    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "DateView::UpdateMsg:%s", dateMsg.c_str());\r
-    listAdapter->ClearListItem();  // 清空list数据\r
     DateModel::GetInstance().InitDateVec(dateMsg);\r
-    SetDownListAdapter();  // 将设置的数据写入list\r
+    SetContentListDate();  // 将设置的数据写入list\r
     int year;\r
     int month;\r
     int day;\r
     int ret = sscanf_s(dateMsg.c_str(), "%d-%d-%d", &year, &month, &day);\r
-    if (ret != SET_THREE) {\r
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "DateMainPage::OnStart strDate");\r
+    if (ret != DATE_UNIT_COUNT) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "DateMainPage strDate_ error");\r
         return;\r
     }\r
     std::string weekDay[] = {"星期六", "星期日", "星期一", "星期二", "星期三", "星期四", "星期五"};\r
-    int today = calculateWeekday(year, month, day);\r
+    int today = CalculateWeekday(year, month, day);\r
     std::string titleDay;\r
-    if (dateMsg == listTop.front().button_viewId) {\r
+    if (dateMsg == listTop_.Front().buttonViewId) {\r
         titleDay = "今天 ";\r
     } else {\r
         titleDay = std::to_string(month) + "月 ";\r
     }\r
     titleDay += weekDay[today];\r
-    DateModel::GetInstance().titleName = titleDay;\r
-    title->SetText(titleDay.c_str());\r
-    downContentList->ScrollTo(SET_ZERO);\r
-    downContentList->RefreshList();\r
+    DateModel::GetInstance().titleName_ = titleDay;\r
+    titlLabel_->SetText(titleDay.c_str());\r
+    detailList_->ScrollTo(0);\r
+    detailList_->RefreshList();\r
+}\r
+\r
+static UIView* CreateContetListViewCb(uint8_t type)\r
+{\r
+    DateContentItemView* item = new DateContentItemView();\r
+    if (item == nullptr) {\r
+        return nullptr;\r
+    }\r
+    item->SetPosition(0, 0, DATE_DOWN_LIST_ITEM_WIDTH, DATE_DOWN_LIST_ITEM_HEIGHT);\r
+    item->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+    item->SetTouchable(true);\r
+    item->SetOnClickListener(g_pDateMainPage);\r
+    return item;\r
+}\r
+\r
+static void UpdateContentListViewCb(UIView* view, void* data, uint8_t type)\r
+{\r
+    DateContentItemView* item = dynamic_cast<DateContentItemView*>(view);\r
+    if (view == nullptr || data == nullptr || item == nullptr) {\r
+        return;\r
+    }\r
+    DateItem* content = static_cast<DateItem *>(data);\r
+    item->SetItemInfo(*content);\r
 }\r
 \r
-void DateMainPage::SetDownListAdapter()\r
+void DateMainPage::SetContentListDate()\r
 {\r
-    for (const auto &item : DateModel::GetInstance().listDate) {\r
-        listAdapter->AddListItem(item);\r
+    detailList_->ClearAll();\r
+    int count = DateModel::GetInstance().listDate_.size();\r
+    for (int i = 0; i < count; i++) {\r
+        Contents content;\r
+        content.createFunc = CreateContetListViewCb;\r
+        content.updateFunc = UpdateContentListViewCb;\r
+        content.type = 0;\r
+        content.data = reinterpret_cast<void *>(&DateModel::GetInstance().listDate_[i]);\r
+        detailList_->AddContent(content);\r
     }\r
+    detailList_->RefreshList();\r
 }\r
 \r
-void DateMainPage::RefreshButtonListDate(int value)\r
+static UIView* CreateViewCb(uint8_t type)\r
 {\r
-    buttonAdapter->ClearListItem();\r
-    for (auto &item : listTop) {\r
-        if (item.index == value) {\r
-            item.isSelect = true;\r
+    DateButtonItemView* item = new DateButtonItemView();\r
+    if (item == nullptr) {\r
+        return nullptr;\r
+    }\r
+\r
+    item->SetPosition(0, 0, DATE_ITEM_WIDTH, DATE_ITEM_HEIGHT);\r
+    item->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+    item->SetTouchable(true);\r
+    item->SetOnClickListener(g_pDateMainPage);\r
+    return item;\r
+}\r
+\r
+static void UpdateViewCb(UIView* view, void* data, uint8_t type)\r
+{\r
+    DateButtonItemView* item = dynamic_cast<DateButtonItemView*>(view);\r
+    if (view == nullptr || data == nullptr || item == nullptr) {\r
+        return;\r
+    }\r
+    DateButtonItem* content = static_cast<DateButtonItem *>(data);\r
+    item->SetItemInfo(*content);\r
+}\r
+\r
+void DateMainPage::SetDateButtonList(std::string viewId)\r
+{\r
+    dateList_->ClearAll();\r
+    int count = listTop_.Size();\r
+    for (int i = 0;i < count; i++) {\r
+        if (listTop_[i].buttonViewId == viewId) {\r
+            listTop_[i].isSelect = true;\r
         } else {\r
-            item.isSelect = false;\r
+            listTop_[i].isSelect = false;\r
         }\r
-        buttonAdapter->AddListItem(item);\r
+        Contents content;\r
+        content.createFunc = CreateViewCb;\r
+        content.updateFunc = UpdateViewCb;\r
+        content.type = 0;\r
+        content.data = reinterpret_cast<void *>(&listTop_[i]);\r
+        dateList_->AddContent(content);\r
     }\r
-    buttonContentList->RefreshList();\r
+    dateList_->RefreshList();\r
 }\r
 \r
-bool DateMainPage::InitDateTop()\r
+bool DateMainPage::InitListTopDate()\r
 {\r
-    listTop.clear();\r
-    for (int i = 0; i < SET_SEVEN; ++i) {\r
-        strDate[i] = GetFutureDate(i);\r
-        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "DateMainPage::OnStart strDate[%d]:%s", i, strDate[i].c_str());\r
-        strDay[i] = strDate[i].substr(strDate[i].length() - SET_TWO);\r
+    listTop_.Clear();\r
+    for (int i = 0; i < WEEK_DYAS; ++i) {\r
+        strDate_[i] = GetFutureDate(i);\r
+        strDay_[i] = strDate_[i].substr(strDate_[i].length() - INDEX_2);\r
         if (i == 0) {\r
-            listTop.push_back({strDate[i].c_str(), strDay[i].c_str(), i, true, true});\r
+            listTop_.PushBack({strDate_[i].c_str(), strDay_[i].c_str(), true, true});\r
         } else {\r
-            listTop.push_back({strDate[i].c_str(), strDay[i].c_str(), i, false, false});\r
+            listTop_.PushBack({strDate_[i].c_str(), strDay_[i].c_str(), false, false});\r
         }\r
     }\r
     return true;\r
@@ -262,8 +371,8 @@ std::string DateMainPage::GetFutureDate(int days_ahead)
 {\r
     time_t now = time(nullptr);\r
     time_t future_time = now + (days_ahead * HOUR_COUNT * NUM_TIME_MIN * NUM_TIME_MIN);\r
-    tm *tm = localtime(&future_time);\r
-    char buffer[80];  // 存储格式化后的日期字符串\r
+    tm *tm = localtime(&future_time); // 检查返回值长度\r
+    char buffer[11];  // 11:2025-08-14字符串长度\r
     strftime(buffer, sizeof(buffer), "%Y-%m-%d", tm);\r
     return std::string(buffer);\r
 }\r
@@ -273,29 +382,30 @@ bool DateMainPage::OnDrag(UIView &view, const DragEvent &event)
     UNUSED(view);\r
     if ((event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT) && (event.GetDeltaX() > X_DRAG_OFFSET) &&\r
         (event.GetDeltaX() > (DOUBLES * MATH_ABS(event.GetDeltaY())))) {\r
-        NativeAbility::GetInstance().ChangeSlice(VIEW_APPLIST);\r
+        DateModel::GetInstance().resetPage_ = PAGE_STATUS_0;\r
+        NativeAbility::GetInstance().ChangeSliceToApplist();\r
     }\r
     return true;\r
 }\r
 \r
 bool DateMainPage::OnClick(UIView &view, const ClickEvent &event)\r
 {\r
-    int posY = event.GetCurrentPos().y;\r
-    if (posY > LIST_POSITION_Y) {\r
-        DateItemView *dateItemView = static_cast<DateItemView *>(&view);\r
-        std::string view_id = dateItemView->GetViewId();\r
+    if(strcmp(view.GetParent()->GetViewId(), DATE_LIST) == 0) {\r
+        DateButtonItemView *dateButtonItemView = dynamic_cast<DateButtonItemView *>(&view);\r
+        DateButtonItem item = dateButtonItemView->GetItem();\r
+        DateModel::GetInstance().selectButton_ = item.buttonViewId;\r
+        SetDateButtonList(item.buttonViewId);\r
+        RefreshDateMsg(item.buttonViewId);\r
+    } else if (strcmp(view.GetParent()->GetViewId(), DETAIL_LIST) == 0) {\r
+        DateContentItemView *dateItemView = dynamic_cast<DateContentItemView *>(&view);\r
         bool visiable = dateItemView->GetVisiable();\r
         if (visiable) {\r
             return false;\r
         }\r
-        DateModel::GetInstance().messageIndex = view_id;\r
-        NativeAbility::GetInstance().SwitchPageInSlice(DATE_PAGES::DATE_MESSAGE_PAGE, nullptr,\r
-                                                       TransitionType::TRANSITION_INVALID, true);\r
-    } else {\r
-        DateButtonItemView *dateButtonItemView = static_cast<DateButtonItemView *>(&view);\r
-        DateButtonItem item = dateButtonItemView->GetItem();\r
-        RefreshButtonListDate(item.index);\r
-        UpdateMsg(item.button_viewId);\r
+        DateModel::GetInstance().messageIndex_ = dateItemView->GetViewId();\r
+        DateModel::GetInstance().resetPage_ = PAGE_STATUS_1;\r
+        NativeAbility::GetInstance().SwitchPageInSlice(DATE_PAGES::DATE_MESSAGE_PAGE,\r
+            TransitionType::TRANSITION_INVALID, false);\r
     }\r
     UNUSED(event);\r
     return true;\r
index 277e655..2f4085c 100644 (file)
@@ -1,13 +1,9 @@
 /*\r
- * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
  * Description: DateMessagePage\r
  * Create: 2025-03-15\r
  */\r
 \r
-#include "date/DateMessagePage.h"\r
-#include "date/DateModel.h"\r
-#include "date/DatePresenter.h"\r
-#include "date/DateView.h"\r
 #include "NativeAbility.h"\r
 #include "SlicePageFactory.h"\r
 #include "UiConfig.h"\r
 #include "components/ui_list_nested.h"\r
 #include "components/ui_scroll_view_nested.h"\r
 #include "ui_resource_date.h"\r
+#include "date/DateModel.h"\r
+#include "date/DatePresenter.h"\r
+#include "date/DateView.h"\r
+#include "date/DateMessagePage.h"\r
 \r
 namespace OHOS {\r
 static constexpr uint16_t DATE_MONTH_WIDTH = 221;\r
 static constexpr uint16_t DATE_MESSAGE_WIDTH = 180;\r
 static constexpr uint16_t DATE_MESSAGE_HEIGHT = 50;\r
 static constexpr uint16_t DATE_MESSAGE_POSITON_X = 117;\r
-static constexpr uint16_t DATE_MESSAGE_POSITON_Y = 20;\r
+static constexpr uint16_t DATE_MESSAGE_POSITON_Y = 30;\r
 static constexpr uint16_t DATE_MESSAGE_POSITON_X1 = 137;\r
 static constexpr uint16_t DATE_MESSAGE_FRONT_SIZE_ONE = 36;\r
 static constexpr uint16_t DATE_MESSAGE_FRONT_SIZE_TWO = 32;\r
 static constexpr uint16_t DATE_MESSAGE_TWO_POSITION_X = 31;\r
-static constexpr uint16_t DATE_MESSAGE_TWO_POSITION_Y = 100;\r
+static constexpr uint16_t DATE_MESSAGE_TWO_POSITION_Y = 120;\r
 static constexpr uint16_t DATE_MESSAGE_TWO_WIDTH = 392;\r
 static constexpr uint16_t DATE_MESSAGE_TWO_HEIGHT = 120;\r
 static constexpr uint16_t DATE_MESSAGE_MAX_LINE_HEIGHT = 140;\r
+static constexpr uint16_t DATE_MESSAGE_ADDRESS_WIDTH = 392;\r
+static constexpr uint16_t DATE_MESSAGE_ADDRESS_HEIGHT = 120;\r
+static constexpr uint16_t DATE_MESSAGE_TIME_POS_Y = 400;\r
+static constexpr uint16_t DATE_MESSAGE_BLANK_SIZE = 30;\r
 \r
 REGIST_SLICE_PAGE(VIEW_DATE, DATE_PAGES::DATE_MESSAGE_PAGE, DateMessagePage, false);\r
 \r
@@ -40,119 +44,170 @@ DateMessagePage::DateMessagePage()
 \r
 DateMessagePage::~DateMessagePage()\r
 {\r
-    if (group != nullptr) {\r
-        group->RemoveAll();\r
-        delete group;\r
-        group = nullptr;\r
+    if (group_ != nullptr) {\r
+        group_->RemoveAll();\r
+        delete group_;\r
+        group_ = nullptr;\r
+    }\r
+\r
+    if (bgImage_ != nullptr) {\r
+        delete bgImage_;\r
+        bgImage_ = nullptr;\r
     }\r
 \r
-    if (image1 != nullptr) {\r
-        delete image1;\r
-        image1 = nullptr;\r
+    if (labelTitle_ != nullptr) {\r
+        delete labelTitle_;\r
+        labelTitle_ = nullptr;\r
     }\r
 \r
-    if (labelTitle != nullptr) {\r
-        delete labelTitle;\r
-        labelTitle = nullptr;\r
+    if (labelMessage_ != nullptr) {\r
+        delete labelMessage_;\r
+        labelMessage_ = nullptr;\r
     }\r
 \r
-    if (labelMessage != nullptr) {\r
-        delete labelMessage;\r
-        labelMessage = nullptr;\r
+    if (labelTime_ != nullptr) {\r
+        delete labelTime_;\r
+        labelTime_ = nullptr;\r
     }\r
 \r
-    if (labelTime != nullptr) {\r
-        delete labelTime;\r
-        labelTime = nullptr;\r
+    if (labelAddress_ != nullptr) {\r
+        delete labelAddress_;\r
+        labelAddress_ = nullptr;\r
     }\r
+\r
+    if (DateModel::GetInstance().resetPage_ == PAGE_STATUS_0) {\r
+        DateModel::GetInstance().selectButton_ = "";\r
+    }\r
+    ImageCacheManager::GetInstance().UnloadAllInMultiRes(DATE_IMAGE);\r
     WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "DateMessagePage::~DateMessagePage");\r
 }\r
 \r
 void DateMessagePage::OnStart(void *data)\r
 {\r
-    group = new UIViewGroup();\r
-    group->SetPosition(0, 0);\r
-    group->Resize(VERTICAL_RESOLUTION, HORIZONTAL_RESOLUTION);\r
-    image1 = new UIImageView;\r
-    if (image1 == nullptr) {\r
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "WeatherView::OnStart::title is nullptr");\r
+    DateModel::GetInstance().resetPage_ = PAGE_STATUS_0;\r
+    group_ = new UIScrollView();\r
+    group_->SetPosition(0, 0);\r
+    group_->Resize(HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);\r
+    group_->SetThrowDrag(true);\r
+    group_->SetScrollBlankSize(DATE_MESSAGE_BLANK_SIZE);\r
+    group_->SetOnDragListener(this);\r
+    group_->SetDraggable(true);\r
+    group_->SetTouchable(true);\r
+    group_->SetStyle(STYLE_BACKGROUND_OPA, 0);\r
+    bgImage_ = new UIImageView;\r
+    if (bgImage_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "bgImage_ is nullptr");\r
         return;\r
     }\r
-    image1->SetPosition(0, 0);\r
-    image1->SetStyle(STYLE_BACKGROUND_OPA, OPA_OPAQUE);\r
-    ImageInfo *imgSrc = ImageCacheManager::GetInstance().LoadOneInMultiRes(IMAGE_CONVERTER_TOOL_DATE8, DATE_IMAGE);\r
+    bgImage_->SetPosition(0, 0);\r
+    bgImage_->SetStyle(STYLE_BACKGROUND_OPA, OPA_OPAQUE);\r
+    ImageInfo *imgSrc = ImageCacheManager::GetInstance().LoadOneInMultiRes(IMAGE_DATE_BG2, DATE_IMAGE);\r
     if (imgSrc == nullptr) {\r
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "WeatherMainPage::LoadOneInMultiRes fail");\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "imgSrc fail");\r
+        return;\r
     }\r
-    image1->SetSrc(imgSrc);\r
-    group->Add(image1);\r
+    bgImage_->SetSrc(imgSrc);\r
+    InitLabel();\r
+    AddViewToPageContainer(bgImage_);\r
+    AddViewToPageContainer(group_);\r
+}\r
 \r
-    labelTitle = new UILabel();\r
-    if (labelTitle == nullptr) {\r
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "WeatherView::OnStart::title is nullptr");\r
+void DateMessagePage::InitLabel()\r
+{\r
+    labelTitle_ = new UILabel();\r
+    if (labelTitle_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "title is nullptr");\r
         return;\r
     }\r
-    labelTitle->SetPosition(DATE_MESSAGE_POSITON_X, DATE_MESSAGE_POSITON_Y, DATE_MONTH_WIDTH, DATE_MESSAGE_HEIGHT);\r
-    labelTitle->SetStyle(STYLE_TEXT_COLOR, Color::Purple().full);\r
-    labelTitle->SetFont(DEFAULT_VECTOR_FONT_FILENAME, DATE_MESSAGE_FRONT_SIZE_ONE);\r
-    labelTitle->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
-    labelTitle->SetStyle(STYLE_TEXT_OPA, OPA_OPAQUE);\r
-    labelTitle->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
-    group->Add(labelTitle);\r
-\r
-    labelMessage = new UILabel();\r
-    if (labelMessage == nullptr) {\r
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "WeatherView::OnStart::title is nullptr");\r
+    labelTitle_->SetPosition(DATE_MESSAGE_POSITON_X, DATE_MESSAGE_POSITON_Y, DATE_MONTH_WIDTH, DATE_MESSAGE_HEIGHT);\r
+    labelTitle_->SetStyle(STYLE_TEXT_COLOR, Color::Purple().full);\r
+    labelTitle_->SetFont(BOLD_VECTOR_FONT_FILENAME, DATE_MESSAGE_FRONT_SIZE_ONE);\r
+    labelTitle_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+    labelTitle_->SetStyle(STYLE_TEXT_OPA, OPA_OPAQUE);\r
+    labelTitle_->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+    std::string strTitle = DateModel::GetInstance().titleName_;\r
+    labelTitle_->SetText(strTitle.c_str());\r
+    group_->Add(labelTitle_);\r
+\r
+    labelMessage_ = new UILabel();\r
+    if (labelMessage_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "labelMessage_ is nullptr");\r
         return;\r
     }\r
-    labelMessage->SetPosition(DATE_MESSAGE_TWO_POSITION_X, DATE_MESSAGE_TWO_POSITION_Y, DATE_MESSAGE_TWO_WIDTH,\r
+    labelMessage_->SetPosition(DATE_MESSAGE_TWO_POSITION_X, DATE_MESSAGE_TWO_POSITION_Y, DATE_MESSAGE_TWO_WIDTH,\r
                               DATE_MESSAGE_TWO_HEIGHT);\r
-    labelMessage->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
-    labelMessage->SetStyle(STYLE_TEXT_OPA, OPA_OPAQUE);\r
-    labelMessage->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
-    labelMessage->SetStyle(STYLE_TEXT_COLOR, Color::White().full);\r
-    labelMessage->SetFont(DEFAULT_VECTOR_FONT_FILENAME, DATE_MESSAGE_FRONT_SIZE_ONE);\r
-    labelMessage->SetLineBreakMode(UILabel::LINE_BREAK_ELLIPSIS);\r
-    labelMessage->SetRollSpeed(0);\r
-    group->Add(labelMessage);\r
-\r
-    labelTime = new UILabel();\r
-    if (labelTime == nullptr) {\r
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "WeatherView::OnStart::title is nullptr");\r
+    labelMessage_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+    labelMessage_->SetStyle(STYLE_TEXT_OPA, OPA_OPAQUE);\r
+    labelMessage_->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+    labelMessage_->SetStyle(STYLE_TEXT_COLOR, Color::White().full);\r
+    labelMessage_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, DATE_MESSAGE_FRONT_SIZE_ONE);\r
+    labelMessage_->SetLineBreakMode(UILabel::LINE_BREAK_ELLIPSIS);\r
+    labelMessage_->SetRollSpeed(0);\r
+    group_->Add(labelMessage_);\r
+\r
+    labelTime_ = new UILabel();\r
+    if (labelTime_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "labelTime_ is nullptr");\r
         return;\r
     }\r
-    labelTime->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
-    labelTime->SetStyle(STYLE_TEXT_OPA, OPA_OPAQUE);\r
-    labelTime->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
-    labelTime->SetStyle(STYLE_TEXT_COLOR, Color::Gray().full);\r
-    labelTime->SetFont(DEFAULT_VECTOR_FONT_FILENAME, DATE_MESSAGE_FRONT_SIZE_TWO);\r
-    group->Add(labelTime);\r
-\r
-    std::string strTitle = DateModel::GetInstance().titleName;\r
-    labelTitle->SetText(strTitle.c_str());\r
-    for (const auto &item : DateModel::GetInstance().listDate) {\r
-        std::string strIndex = DateModel::GetInstance().messageIndex;\r
-        if (strIndex == item.index) {\r
-            labelTime->SetText(item.label_1);\r
-            labelMessage->SetText(item.label_2);\r
+    labelTime_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+    labelTime_->SetStyle(STYLE_TEXT_OPA, OPA_OPAQUE);\r
+    labelTime_->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+    labelTime_->SetStyle(STYLE_TEXT_COLOR, Color::Gray().full);\r
+    labelTime_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, DATE_MESSAGE_FRONT_SIZE_TWO);\r
+    group_->Add(labelTime_);\r
+\r
+    labelAddress_ = new UILabel();\r
+    if (labelAddress_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "labelTime_ is nullptr");\r
+        return;\r
+    }\r
+    labelAddress_->SetPosition(DATE_MESSAGE_TWO_POSITION_X, DATE_MESSAGE_TWO_POSITION_Y, DATE_MESSAGE_ADDRESS_WIDTH,\r
+                              DATE_MESSAGE_ADDRESS_HEIGHT);\r
+    labelAddress_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+    labelAddress_->SetStyle(STYLE_TEXT_OPA, OPA_OPAQUE);\r
+    labelAddress_->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+    labelAddress_->SetStyle(STYLE_TEXT_COLOR, Color::Gray().full);\r
+    labelAddress_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, DATE_MESSAGE_FRONT_SIZE_TWO);\r
+    group_->Add(labelAddress_);\r
+\r
+    for (const auto &item : DateModel::GetInstance().listDate_) {\r
+        std::string index = DateModel::GetInstance().messageIndex_;\r
+        if (!strcmp(index.c_str(), item.index)) {\r
+            labelTime_->SetText(item.title);\r
+            labelMessage_->SetText(item.describetion);\r
+            labelAddress_->SetText(item.address);\r
+            break;\r
         }\r
     }\r
-    int posTextHeight = labelMessage->GetTextHeight();\r
+    int posTextHeight = labelMessage_->GetTextHeight();\r
     int posHeight = DATE_MESSAGE_TWO_POSITION_Y;\r
+    labelMessage_->SetY(DATE_MESSAGE_TWO_POSITION_Y);\r
+    labelMessage_->SetHeight(posTextHeight);\r
     int pos = 0;\r
-    if (posTextHeight < DATE_MESSAGE_MAX_LINE_HEIGHT) {\r
-        int offsetY = 50;\r
-        pos = DATE_MESSAGE_TWO_POSITION_Y + posTextHeight + offsetY;\r
-        labelMessage->SetY(DATE_MESSAGE_TWO_POSITION_Y + offsetY);\r
+    int offset = 10;\r
+    int pageHeight;\r
+    pos = DATE_MESSAGE_TWO_POSITION_Y + posTextHeight + offset;\r
+    if (labelAddress_->GetText() != nullptr && (!strcmp(labelAddress_->GetText(), "no location"))) {\r
+        labelAddress_->SetVisible(false);\r
+        int pageH = 454;\r
+        int half = 2;\r
+        int posY = (pageH - posTextHeight) / half;\r
+        labelMessage_->SetY(posY);\r
+        labelTime_->SetPosition(DATE_MESSAGE_POSITON_X1, pos, DATE_MESSAGE_WIDTH, DATE_MESSAGE_HEIGHT);\r
+        pageHeight = labelMessage_->GetY() + labelMessage_->GetHeight();\r
     } else {\r
-        pos = DATE_MESSAGE_TWO_POSITION_Y + posTextHeight;\r
-        labelMessage->SetY(DATE_MESSAGE_TWO_POSITION_Y);\r
-    }\r
-    labelMessage->SetHeight(posTextHeight);\r
-    labelTime->SetPosition(DATE_MESSAGE_POSITON_X1, pos, DATE_MESSAGE_WIDTH, DATE_MESSAGE_HEIGHT);\r
-    group->SetOnDragListener(this);\r
-    group->SetDraggable(true);\r
-    AddViewToPageContainer(group);\r
+        int addressHeight = labelAddress_->GetTextHeight();\r
+        labelAddress_->SetY(pos);\r
+        labelAddress_->SetHeight(labelAddress_->GetTextHeight());\r
+        pos = labelAddress_->GetY() + labelAddress_->GetHeight() + offset;\r
+        labelTime_->SetPosition(DATE_MESSAGE_POSITON_X1, pos, DATE_MESSAGE_WIDTH, DATE_MESSAGE_HEIGHT);\r
+        pageHeight = labelAddress_->GetY() + labelAddress_->GetHeight();\r
+    }\r
+    if (pageHeight <= DATE_MESSAGE_TIME_POS_Y) {\r
+        int timeOffsetY = 364;\r
+        labelTime_->SetY(timeOffsetY);\r
+    }\r
 }\r
 \r
 bool DateMessagePage::OnDrag(UIView &view, const DragEvent &event)\r
@@ -160,7 +215,9 @@ bool DateMessagePage::OnDrag(UIView &view, const DragEvent &event)
     UNUSED(view);\r
     if ((event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT) && (event.GetDeltaX() > X_DRAG_OFFSET) &&\r
         (event.GetDeltaX() > (DOUBLES * MATH_ABS(event.GetDeltaY())))) {\r
-        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "DatePresenter::OnDrag ChangeSlice(VIEW_APPLIST)");\r
+        DateModel::GetInstance().resetPage_ = PAGE_STATUS_2;\r
+        NativeAbility::GetInstance().SwitchPageInSlice(DATE_PAGES::DATE_MAIN_PAGE,\r
+            TransitionType::TRANSITION_INVALID, false);\r
     }\r
     return true;\r
 }\r
index 4792289..f5e8c58 100644 (file)
@@ -1,18 +1,26 @@
 /*\r
- * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
  * Description: DateModel\r
  * Create: 2025-03-23\r
  */\r
 \r
-#include "date/DateModel.h"\r
-#include "date/DatePresenter.h"\r
-#include "phoneservice/PhoneService.h"\r
+#include "bts_br_gap.h"\r
+#include "bts_spp.h"\r
+#include "msg_center_customer.h"\r
+#include "msg_center_device.h"\r
 #include "ohos_timer.h"\r
-#include "wearable_log.h"\r
+#include "phone_msg_notification.h"\r
+#include "date/DatePresenter.h"\r
+#include "date/DateModel.h"\r
 \r
 namespace OHOS {\r
-static constexpr int16 DATE_COUNT = 24;\r
-static constexpr int16 DATE_HOUR = 12;\r
+static constexpr int16 INDEX_0 = 0;\r
+static constexpr int16 INDEX_1 = 1;\r
+static constexpr int16 INDEX_2 = 2;\r
+static constexpr int16 INDEX_3 = 3;\r
+static constexpr int16 INDEX_4 = 4;\r
+static constexpr int16 INDEX_5 = 5;\r
+static const char *DATE_FILE = DATE_PATH "/calendar.json";\r
 \r
 DateModel::DateModel() {}\r
 \r
@@ -27,30 +35,47 @@ DateModel &DateModel::GetInstance()
 bool DateModel::InitDateVec(std::string dateStr)\r
 {\r
     int index = 0;\r
-    listDate.clear();\r
-    if (GetBtConnectStatus() != PROFILE_STATE_CONNECTED) {\r
-        listDate.push_back({"无日程", "请连接手机,同步日程信息", "0", true});\r
+    listDate_.clear();\r
+    if (GetConnectStatus() == 0) {\r
+        listDate_.push_back({"无日程", "请连接手机,同步日程信息", "0", "0", true});\r
     } else {\r
-        for (const auto &msg : keyValues) {\r
+        for (const auto &msg : keyValues_) {\r
+            if (msg.first != dateStr) {\r
+                continue;\r
+            }\r
             for (const auto &item : msg.second) {\r
-                if (msg.first == dateStr) {\r
-                    index++;\r
-                    strIndex = std::to_string(index);\r
-                    listDate.push_back({item.hour.c_str(), item.eventTitle.c_str(), strIndex.c_str(), false});\r
-                }\r
+                listDate_.push_back(\r
+                    {item.hour.c_str(), item.eventTitle.c_str(), item.address.c_str(), item.index.c_str(), false});\r
             }\r
         }\r
-        if (listDate.size() == 0) {\r
-            listDate.push_back({"无日程", "请前往手机日历创建日程", "0", true});\r
+        \r
+        if (listDate_.size() == 0) {\r
+            listDate_.push_back({"无日程", "请前往手机日历创建日程", "0", "0", true});\r
         }\r
     }\r
     return true;\r
 }\r
 \r
+uint8_t DateModel::GetConnectStatus()\r
+{\r
+    uint8_t conn_status = 0;\r
+#ifdef _WIN32\r
+    conn_status = 1;\r
+#else\r
+    if (msg_center_get_trans_channel() == DIAG_FRAME_FID_PHONE) {\r
+        conn_status = is_spp_connected(0) == true ? 1 : 0;\r
+    } else if (msg_center_get_trans_channel() == DIAG_FRAME_FID_BT) {\r
+        conn_status = msg_center_get_ble_conn_state();\r
+    }\r
+#endif\r
+    return conn_status;\r
+}\r
+\r
 bool DateModel::InitDate()\r
 {\r
-    keyValues.clear();\r
-    std::ifstream file("/user/app/user/ace/data/com.vendor.Weather/calendar.json");\r
+    keyValues_.clear();\r
+    dateClockVec_.clear();\r
+    std::ifstream file(DATE_FILE);\r
     if (!file.is_open()) {\r
         WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "cannot open file");\r
         return false;\r
@@ -78,16 +103,219 @@ bool DateModel::InitDate()
         cJSON *date = cJSON_GetObjectItemCaseSensitive(dateSum, std::to_string(i).c_str());\r
         if (!cJSON_IsObject(date)) {\r
             cJSON_Delete(root);\r
-            continue;\r
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Error date");\r
+            return false;\r
         }\r
-        std::string hour = cJSON_GetObjectItemCaseSensitive(date, "hour")->valuestring;\r
-        std::string eventTitle = cJSON_GetObjectItemCaseSensitive(date, "eventTitle")->valuestring;\r
-        std::string startTime = cJSON_GetObjectItemCaseSensitive(date, "startTime")->valuestring;\r
-        std::string time = cJSON_GetObjectItemCaseSensitive(date, "time")->valuestring;\r
-        std::string week = cJSON_GetObjectItemCaseSensitive(date, "week")->valuestring;\r
-        DateMsg item = {hour, eventTitle, startTime, week};\r
-        keyValues[time].push_back(item);\r
+\r
+        std::string time = "测试time";\r
+        if (!cJSON_GetObjectItemCaseSensitive(date, "time")) {\r
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Error time:");\r
+        } else {\r
+            time = cJSON_GetObjectItemCaseSensitive(date, "time")->valuestring;\r
+        }\r
+\r
+        std::string hour = "测试hour";\r
+        if (!cJSON_GetObjectItemCaseSensitive(date, "hour")) {\r
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Error hour:");\r
+        } else {\r
+            hour = cJSON_GetObjectItemCaseSensitive(date, "hour")->valuestring;\r
+        }\r
+\r
+        std::string eventTitle = "测试eventTitle";\r
+        if (!cJSON_GetObjectItemCaseSensitive(date, "eventTitle")) {\r
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Error eventTitle:");\r
+        } else {\r
+            eventTitle = cJSON_GetObjectItemCaseSensitive(date, "eventTitle")->valuestring;\r
+        }\r
+\r
+        std::string address = "no location";\r
+        if (!cJSON_GetObjectItemCaseSensitive(date, "location")) {\r
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Error location:");\r
+        } else {\r
+            address = cJSON_GetObjectItemCaseSensitive(date, "location")->valuestring;\r
+        }\r
+        std::string index = std::to_string(i);\r
+        DateMsg item = {hour, eventTitle, address, index};\r
+        keyValues_[time].push_back(item);\r
+        std::string start_time = hour.substr(0, INDEX_5);\r
+        std::string result_time = time + " " + start_time;\r
+        eventTitle = hour + "\r\n" + eventTitle;\r
+        CalcClockTime(result_time, eventTitle);\r
+    }\r
+    cJSON_Delete(root);\r
+    return true;\r
+}\r
+\r
+void DateModel::CalcClockTime(std::string result_time, std::string eventTitle)\r
+{\r
+    std::tm tm = {};\r
+    std::istringstream ss("2025-06-18 15:20");\r
+    ss >> std::get_time(&tm, "%Y-%m-%d %H:%M");\r
+    if (ss.fail()) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "CalcClockTime cannot open file");\r
+        return;\r
+    }\r
+    DateToMessage item;\r
+    item.time = result_time;\r
+    item.eventTitle = eventTitle;\r
+    dateClockVec_.push_back(item);\r
+}\r
+\r
+void DateModel::Init()\r
+{\r
+    InitDateTimer();\r
+}\r
+\r
+bool HasFileChanged(const std::string &filePath, time_t &lastModTime, std::string &lastContent)\r
+{\r
+    struct stat fileStat;\r
+    if (stat(filePath.c_str(), &fileStat) != 0) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "cat file fail");\r
+        return false;\r
+    }\r
+\r
+    if (fileStat.st_mtime == lastModTime) {\r
+        return false;\r
+    }\r
+\r
+    std::ifstream file(filePath);\r
+    if (!file.is_open()) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "cannot open file");\r
+        return false;\r
+    }\r
+\r
+    std::string currentContent((std::istreambuf_iterator<char>(file)), std::istreambuf_iterator<char>());\r
+    if (currentContent == lastContent) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "updateLastModTime");\r
+        lastModTime = fileStat.st_mtime;\r
+        return false;\r
     }\r
+\r
+    lastModTime = fileStat.st_mtime;\r
+    lastContent = currentContent;\r
     return true;\r
 }\r
+\r
+std::vector<int> parseTime(const std::string &s)\r
+{\r
+    int year = 0;\r
+    int month = 0;\r
+    int day = 0;\r
+    int hour = 0;\r
+    int minute = 0;\r
+    int second = 0;\r
+    char sep;\r
+    std::istringstream ss(s);\r
+    ss >> year >> sep >> month >> sep >> day >> hour >> sep >> minute;\r
+    if (s.size() > TIME_END) {\r
+        ss >> sep >> second;\r
+    }\r
+    return {year, month, day, hour, minute, second};\r
+}\r
+\r
+void CmpClock()\r
+{\r
+    std::time_t now = std::time(nullptr);\r
+    std::tm *local = std::localtime(&now);\r
+    char buffer[20];\r
+    std::strftime(buffer, sizeof(buffer), "%Y-%m-%d %H:%M:%S", local);\r
+    std::string time_str(buffer);\r
+    for (auto item = DateModel::GetInstance().dateClockVec_.begin();\r
+         item != DateModel::GetInstance().dateClockVec_.end();) {\r
+        auto vsec = parseTime(item->time);\r
+        auto localtime = parseTime(time_str);\r
+        if (vsec[INDEX_0] < localtime[INDEX_0]) {\r
+            item = DateModel::GetInstance().dateClockVec_.erase(item);\r
+            continue;\r
+        } else if (vsec[INDEX_0] > localtime[INDEX_0]) {\r
+            ++item;\r
+            continue;\r
+        }\r
+\r
+        if (vsec[INDEX_1] < localtime[INDEX_1]) {\r
+            item = DateModel::GetInstance().dateClockVec_.erase(item);\r
+            continue;\r
+        } else if (vsec[INDEX_1] > localtime[INDEX_1]) {\r
+            ++item;\r
+            continue;\r
+        }\r
+\r
+        if (vsec[INDEX_2] < localtime[INDEX_2]) {\r
+            item = DateModel::GetInstance().dateClockVec_.erase(item);\r
+            continue;\r
+        } else if (vsec[INDEX_2] > localtime[INDEX_2]) {\r
+            ++item;\r
+            continue;\r
+        }\r
+        auto diff = (vsec[INDEX_3] - localtime[INDEX_3]) * NUM_TIME_HOUR +\r
+                    (vsec[INDEX_4] - localtime[INDEX_4]) * NUM_TIME_MIN + (vsec[INDEX_5] - localtime[INDEX_5]);\r
+        if (diff <= NUM_TIME_MIN && diff > 0) {\r
+#ifdef _WIN32\r
+            WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "PostGraphicEvent date msg");\r
+#else\r
+            GraphicService::GetInstance()->PostGraphicEvent(\r
+                std::bind(&PhoneMsgView::ShowDateMsg, "日历", "日历通知", item->eventTitle));\r
+            item = DateModel::GetInstance().dateClockVec_.erase(item);\r
+#endif\r
+        } else if (diff < 0) {\r
+            item = DateModel::GetInstance().dateClockVec_.erase(item);\r
+        } else {\r
+            ++item;\r
+        }\r
+    }\r
+}\r
+\r
+void DateModel::ClearData()\r
+{\r
+    std::remove(DATE_FILE);\r
+}\r
+\r
+/* 定时器回调函数 */\r
+void DateTimerCallback(void *data)\r
+{\r
+    (void)data;\r
+    static time_t lastModTime = 0;\r
+    static std::string lastContent;\r
+    bool change = HasFileChanged(DATE_FILE, lastModTime, lastContent);\r
+    if (change) {\r
+        DateModel::GetInstance().InitDate();\r
+    }\r
+    if (DateModel::GetInstance().dateClockVec_.size() > 0) {\r
+        CmpClock();\r
+    }\r
+}\r
+\r
+/* 开启定时器 */\r
+void DateModel::InitDateTimer()\r
+{\r
+    if (startCount_ != nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "DatePhoneMenuPhoneMainPage already exists!!");\r
+        return;\r
+    }\r
+    uint32 tick = GetOSTick(NUM_THIRTY * MS_ONE_SECONDS);\r
+    startCount_ = new GraphicTimer(tick, DateTimerCallback, nullptr, true);\r
+    if (startCount_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "DatePhoneMenuPhoneMainPage new GraphicTimer failed!!");\r
+        return;\r
+    }\r
+    bool retTimer = startCount_->Start();\r
+    if (!retTimer) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "DatePhoneMenuPhoneMainPage osTimerStart failed!!");\r
+        if (startCount_ != nullptr) {\r
+            delete startCount_;\r
+            startCount_ = nullptr;\r
+        }\r
+        return;\r
+    }\r
+}\r
+\r
+/* 关闭定时器 */\r
+void DateModel::DisableDatePhoneTimer()\r
+{\r
+    if (startCount_ != nullptr) {\r
+        startCount_->Stop();\r
+        delete startCount_;\r
+        startCount_ = nullptr;\r
+    }\r
+}\r
 }\r
index 64ba20f..d6cecde 100644 (file)
@@ -1,16 +1,16 @@
 /*\r
- * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
  * Description: DatePresenter\r
  * Create: 2025-03-23\r
  */\r
 \r
-#include "date/DatePresenter.h"\r
-#include "date/DateModel.h"\r
-#include "date/DateView.h"\r
 #include "NativeRegisterManager.h"\r
 #include "uiservice/ui_service.h"\r
 #include "wearable_log.h"\r
+#include "date/DatePresenter.h"\r
+#include "date/DateModel.h"\r
+#include "date/DateView.h"\r
 \r
 namespace OHOS {\r
-REGIST_MENU(VIEW_DATE, DateView, DatePresenter, DATE_MAIN_ICON, DATE_MAIN_ICON, "日程");\r
+REGIST_MENU(VIEW_DATE, DateView, DatePresenter, DATE_ICON, DATE_ICON, "日历");\r
 }\r
index 6860eae..c43ecab 100644 (file)
 /*\r
- * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
  * Description: EmptyPage\r
- * Create: 2025-04-24\r
+ * Create: 2025-06-06\r
  */\r
 \r
-#include "emptypage/EmptyPage.h"\r
-#include "emptypage/EmptyPresenter.h"\r
+#include "UiConfig.h"\r
+#include "main/LoadImg.h"\r
+#include "ui_resource_empty.h"\r
 #include "SlicePageFactory.h"\r
-#include "flashlight/FlashLightView.h"\r
 #include "wearable_log.h"\r
 #include "AppViewIDs.h"\r
 #include "NativeAbility.h"\r
+#include "emptypage/EmptyPresenter.h"\r
+#include "emptypage/EmptyPage.h"\r
 \r
 namespace OHOS {\r
-static const uint16_t MEM_LABEL_FONT_SIZE = 40;\r
-static uint32_t EMPTY_PAGE = 1;\r
+static constexpr uint16_t EMPTY_PAGE = 1;\r
+static constexpr uint16_t MEM_LABEL_X = 121;\r
+static constexpr uint16_t MEM_LABEL_W = 193;\r
+static constexpr uint16_t MEM_LABEL_H = 40;\r
+static constexpr uint16_t MEM_LABEL_FONT = 32;\r
+static constexpr uint16_t MEM_USED_LABEL_Y = 161;\r
+static constexpr uint16_t MEM_FREE_LABEL_Y = 272;\r
+\r
 REGIST_SLICE_PAGE(VIEW_EMPTY, EMPTY_PAGE, EmptyPage, true);\r
+\r
 void EmptyPage::OnStart(void *data)\r
 {\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "EmptyPage OnStart");\r
+    bool ret = ImageCacheManager::GetInstance().LoadAllInMultiRes(EMPTY_IMAGE);\r
+    if (ret == false) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "LoadEmptyImage fail");\r
+        return;\r
+    }\r
+    container_ = new UIViewGroup();\r
     if (container_ == nullptr) {\r
-        container_ = new UIScrollView();\r
-        container_->SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);\r
-        // 设置界面组件回调函数\r
-        container_->SetOnDragListener(this);\r
-        container_->SetOnClickListener(this);\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "EmptyPage container_ new fail");\r
+        return;\r
+    }\r
+    container_->SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);\r
+    container_->SetOnDragListener(this);\r
+    container_->SetDraggable(true);\r
+    container_->SetTouchable(true);\r
+\r
+    bgImg_ = new UIImageView();\r
+    if (bgImg_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "EmptyPage bgImg_ new fail");\r
+        return;\r
     }\r
+    bgImg_->SetPosition(0, 0);\r
+    LOADIMG::LoadImageViewImg(bgImg_, EMPTY_IMAGE, IMAGE_EMPTY_BG);\r
+    container_->Add(bgImg_);\r
+\r
+    uint32_t memUsed = 0;\r
+    uint32_t memFree = 0;\r
 #if !defined(_WIN32)\r
-    test_get_mem_info(1, &used_, &free_);\r
+    test_get_mem_info(&memUsed, &memFree);\r
 #endif\r
-    // Add Label to App\r
-    if (memLabel_ == nullptr) {\r
-        memLabel_ = new UILabel();\r
+    memUsedLabel_ = new UILabel();\r
+    if (memUsedLabel_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "EmptyPage memUsedLabel_ new fail");\r
+        return;\r
+    }\r
+    memUsedLabel_->SetPosition(MEM_LABEL_X, MEM_USED_LABEL_Y, MEM_LABEL_W, MEM_LABEL_H);\r
+    memUsedLabel_->SetText(std::to_string(memUsed).c_str());\r
+    memUsedLabel_->SetAlign(TEXT_ALIGNMENT_LEFT, TEXT_ALIGNMENT_CENTER);\r
+    memUsedLabel_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, MEM_LABEL_FONT);\r
+    container_->Add(memUsedLabel_);\r
+\r
+    memFreeLabel_ = new UILabel();\r
+    if (memFreeLabel_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "EmptyPage memFreeLabel_ new fail");\r
+        return;\r
     }\r
-    memLabel_->SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);\r
-    std::string memInfo = "Used : " + std::to_string(used_) + "\n" + "Free : " + std::to_string(free_);\r
-    memLabel_->SetText(memInfo.c_str());\r
-    memLabel_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
-    memLabel_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, MEM_LABEL_FONT_SIZE);\r
-    container_->Add(memLabel_);\r
+    memFreeLabel_->SetPosition(MEM_LABEL_X, MEM_FREE_LABEL_Y, MEM_LABEL_W, MEM_LABEL_H);\r
+    memFreeLabel_->SetText(std::to_string(memFree).c_str());\r
+    memFreeLabel_->SetAlign(TEXT_ALIGNMENT_LEFT, TEXT_ALIGNMENT_CENTER);\r
+    memFreeLabel_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, MEM_LABEL_FONT);\r
+    container_->Add(memFreeLabel_);\r
     AddViewToPageContainer(container_);\r
 }\r
 \r
+EmptyPage::EmptyPage()\r
+{\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "EmptyPage::EmptyPage");\r
+}\r
+\r
 EmptyPage::~EmptyPage()\r
 {\r
-    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "EmptyPage::~EmptyPage");\r
     if (container_ != nullptr) {\r
         container_->RemoveAll();\r
         delete container_;\r
         container_ = nullptr;\r
     }\r
-    if (memLabel_ != nullptr) {\r
-        delete memLabel_;\r
-        memLabel_ = nullptr;\r
+    if (bgImg_ != nullptr) {\r
+        delete bgImg_;\r
+        bgImg_ = nullptr;\r
+    }\r
+    if (memUsedLabel_ != nullptr) {\r
+        delete memUsedLabel_;\r
+        memUsedLabel_ = nullptr;\r
+    }\r
+    if (memFreeLabel_ != nullptr) {\r
+        delete memFreeLabel_;\r
+        memFreeLabel_ = nullptr;\r
     }\r
+    ImageCacheManager::GetInstance().UnloadAllInMultiRes(EMPTY_IMAGE);\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "EmptyPage::~EmptyPage");\r
 }\r
 \r
 bool EmptyPage::OnDrag(UIView &view, const DragEvent &event)\r
 {\r
+    if ((event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT) && (event.GetDeltaX() > X_DRAG_OFFSET) &&\r
+        (event.GetDeltaX() > (DOUBLES * MATH_ABS(event.GetDeltaY())))) {\r
+        NativeAbility::GetInstance().ChangeSliceToApplist();\r
+    }\r
     return false;\r
 }\r
-\r
-bool EmptyPage::OnClick(UIView &view, const ClickEvent &event)\r
-{\r
-    return false;\r
 }\r
-}
\ No newline at end of file
index 1a429df..797a5bc 100644 (file)
@@ -1,13 +1,13 @@
 /*\r
- * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
  * Description: EmptyPresenter\r
- * Create: 2025-04-24\r
+ * Create: 2025-06-06\r
  */\r
 \r
+#include "NativeRegisterManager.h"\r
 #include "emptypage/EmptyView.h"\r
 #include "emptypage/EmptyPresenter.h"\r
-#include "NativeRegisterManager.h"\r
 \r
 namespace OHOS {\r
-REGIST_MENU(VIEW_EMPTY, EmptyView, EmptyPresenter, FLASHLIGHT_MAIN_ICON, PNG_APPLIST_DEFAULT_IMG, "空页面");\r
+REGIST_MENU(VIEW_EMPTY, EmptyView, EmptyPresenter, EMPTY_ICON, EMPTY_ICON, "空页面");\r
 }\r
index 54396d2..fefb069 100644 (file)
@@ -4,24 +4,21 @@
  * Create: 2025-03-23\r
  */\r
 \r
-#include "phoneservice/PhoneService.h"\r
 #include "UiConfig.h"\r
+#include "bts_br_gap.h"\r
 #include "bts_spp.h"\r
 #include "common/image_cache_manager.h"\r
 #include "main/LoadImg.h"\r
+#include "msg_center_device.h"\r
 #include "ui_resource_findPhone.h"\r
 #include "uiservice/ui_service.h"\r
 #include "ui_test_group.h"\r
-#include "wearable_onlinelog.h"\r
-#include "msg_center_protocol.h"\r
-#include "msg_center_device.h"\r
-#include "findphone/FindPhoneMainPage.h"\r
+#include "settings/model/SettingDisplayModel.h"\r
 #include "findphone/FindPhonePresenter.h"\r
 #include "findphone/FindPhoneView.h"\r
+#include "findphone/FindPhoneMainPage.h"\r
 \r
-static uint8_t data = 0;\r
 namespace OHOS {\r
-\r
 static FindPhoneMainPage *g_pFindPhoneMainPage = nullptr;\r
 static constexpr uint16_t FIND_PHONE_IMAGE_WIDTH = 500;\r
 static constexpr uint16_t FIND_PHONE_IMAGE_HEIGHT = 500;\r
@@ -33,57 +30,48 @@ static constexpr uint16_t FIND_PHONE_RTYBUTTON_POSITION_X = 179;
 static constexpr uint16_t FIND_PHONE_RTYBUTTON_POSITION_Y = 289;\r
 static constexpr uint16_t FIND_PHONE_RTYBUTTON = 96;\r
 static constexpr uint16_t FIND_PHONE_SIZE = 466;\r
-static constexpr uint16_t FIND_PHONE_IMAGEANIMATOR_POSITION_X = 170;\r
-static constexpr uint16_t FIND_PHONE_IMAGEANIMATOR_POSITION_Y = 170;\r
-static constexpr uint16_t FIND_PHONE_IMAGEANIMATOR_WIDTH = 100;\r
-static constexpr uint16_t FIND_PHONE_IMAGEANIMATOR_HEIGHT = 100;\r
 static constexpr uint16_t FONT_DEFAULT_SIZE_1 = 36;\r
 static constexpr uint16_t FONT_DEFAULT_SIZE_2 = 38;\r
 static constexpr uint16_t FIND_PHONE_INITIAL = 0;\r
-static constexpr uint16_t FIND_PHONE_TITLDE_X = 140;\r
-static constexpr uint16_t FIND_PHONE_TITLDE_Y = 345;\r
-static constexpr uint16_t FIND_PHONE_TITLDE_WIDTH = 314;\r
+static constexpr uint16_t FIND_PHONE_TITLE_X = 140;\r
+static constexpr uint16_t FIND_PHONE_TITLE_Y = 345;\r
+static constexpr uint16_t FIND_PHONE_TITLE_WIDTH = 314;\r
+static constexpr uint16_t FIND_PHONE_TITLE_HEIGHT = 100;\r
 static constexpr uint16_t FIND_PHONE_FINDTITLE_X = 150;\r
 static constexpr uint16_t FIND_PHONE_FINDTITLE_Y = 31;\r
 static constexpr uint16_t FIND_PHONE_FINDTITLE_WIDTH = 253;\r
 static constexpr uint16_t FIND_PHONE_FINDTITLE_HEIGHT = 53;\r
-static constexpr uint16_t FIND_PHONE_RINGING_X = 200;\r
-static constexpr uint16_t FIND_PHONE_RINGING2_X = 156;\r
 static constexpr uint16_t FIND_PHONE_RINGING_Y = 353;\r
-static constexpr uint16_t FIND_PHONE_RINGING_WIDTH = 93;\r
-static constexpr uint16_t FIND_PHONE_RINGING2_WIDTH = 144;\r
+static constexpr uint16_t FIND_PHONE_RINGING_WIDTH = 454;\r
 static constexpr uint16_t FIND_PHONE_RINGING_HEIGHT = 42;\r
 static constexpr uint16_t FIND_PHONE_SEARCHTIMEOUT_X = 50;\r
 static constexpr uint16_t FIND_PHONE_SEARCHTIMEOUT_Y = 185;\r
 static constexpr uint16_t FIND_PHONE_SEARCHTIMEOUT_WIDTH = 424;\r
 static constexpr uint16_t FIND_PHONE_SEARCHTIMEOUT_HEIGHT = 50;\r
-static constexpr uint16_t FIND_PHONE_DURATION_TIME = 60;\r
 static constexpr uint16_t IMAGE_SIZE = 500;\r
-static constexpr uint16_t IMAGEANIMATOERVIEW_SIZE = 28;\r
+static constexpr uint16_t IMAGE_OPA = 100;\r
 static constexpr uint16_t IMAGEANIMATOERVIEW_TIME = 60;\r
 static constexpr uint16_t FIND_PHONE_IMAGE_X = 5;\r
-static constexpr uint16_t FIND_PHONE_IMAGE_y = 1;\r
-static constexpr uint16_t FIND_PHONE_PIXELBYTE_SIZE = 4;\r
-static constexpr uint16_t FIND_PHONE_PIXELBYTEH = 100;\r
+static constexpr uint16_t FIND_PHONE_IMAGE_Y = 1;\r
+static constexpr uint16_t FINDPHONE_TIMEOUT = 60;\r
+static constexpr uint16_t MS_ONE_SECONDS = 1000;\r
+static constexpr char *FIND_BUTTON = "findButton";\r
+static constexpr char *RETRY_BUTTON = "retryButton";\r
+static constexpr uint32_t g_imageAnimatorInfo[FINDPHONE_IMAGE_COUNT] = {\r
+    IMAGE_FINDPHONE_FRAME01, IMAGE_FINDPHONE_FRAME02, IMAGE_FINDPHONE_FRAME03, IMAGE_FINDPHONE_FRAME04,\r
+    IMAGE_FINDPHONE_FRAME05, IMAGE_FINDPHONE_FRAME06, IMAGE_FINDPHONE_FRAME07, IMAGE_FINDPHONE_FRAME08,\r
+    IMAGE_FINDPHONE_FRAME09, IMAGE_FINDPHONE_FRAME10, IMAGE_FINDPHONE_FRAME11, IMAGE_FINDPHONE_FRAME12,\r
+    IMAGE_FINDPHONE_FRAME13, IMAGE_FINDPHONE_FRAME14, IMAGE_FINDPHONE_FRAME15, IMAGE_FINDPHONE_FRAME16,\r
+    IMAGE_FINDPHONE_FRAME17, IMAGE_FINDPHONE_FRAME18, IMAGE_FINDPHONE_FRAME19, IMAGE_FINDPHONE_FRAME20,\r
+    IMAGE_FINDPHONE_FRAME21, IMAGE_FINDPHONE_FRAME22, IMAGE_FINDPHONE_FRAME23, IMAGE_FINDPHONE_FRAME24,\r
+    IMAGE_FINDPHONE_FRAME25, IMAGE_FINDPHONE_FRAME26, IMAGE_FINDPHONE_FRAME27, IMAGE_FINDPHONE_FRAME28,\r
+};\r
 \r
 REGIST_SLICE_PAGE(VIEW_FIND_PHONE, FIND_PHONE_PAGES::FIND_PHONE_MAIN_PAGE, FindPhoneMainPage, true);\r
 \r
-const int g_imageAnimatorInfo[IMAGEANIMATOERVIEW_SIZE] = {\r
-    IMAGE_CONVERTER_TOOL_FINDPHONE001, IMAGE_CONVERTER_TOOL_FINDPHONE002, IMAGE_CONVERTER_TOOL_FINDPHONE003,\r
-    IMAGE_CONVERTER_TOOL_FINDPHONE004, IMAGE_CONVERTER_TOOL_FINDPHONE005, IMAGE_CONVERTER_TOOL_FINDPHONE006,\r
-    IMAGE_CONVERTER_TOOL_FINDPHONE007, IMAGE_CONVERTER_TOOL_FINDPHONE008, IMAGE_CONVERTER_TOOL_FINDPHONE009,\r
-    IMAGE_CONVERTER_TOOL_FINDPHONE010, IMAGE_CONVERTER_TOOL_FINDPHONE011, IMAGE_CONVERTER_TOOL_FINDPHONE012,\r
-    IMAGE_CONVERTER_TOOL_FINDPHONE013, IMAGE_CONVERTER_TOOL_FINDPHONE014, IMAGE_CONVERTER_TOOL_FINDPHONE015,\r
-    IMAGE_CONVERTER_TOOL_FINDPHONE016, IMAGE_CONVERTER_TOOL_FINDPHONE017, IMAGE_CONVERTER_TOOL_FINDPHONE018,\r
-    IMAGE_CONVERTER_TOOL_FINDPHONE019, IMAGE_CONVERTER_TOOL_FINDPHONE020, IMAGE_CONVERTER_TOOL_FINDPHONE021,\r
-    IMAGE_CONVERTER_TOOL_FINDPHONE022, IMAGE_CONVERTER_TOOL_FINDPHONE023, IMAGE_CONVERTER_TOOL_FINDPHONE024,\r
-    IMAGE_CONVERTER_TOOL_FINDPHONE025, IMAGE_CONVERTER_TOOL_FINDPHONE026, IMAGE_CONVERTER_TOOL_FINDPHONE027,\r
-    IMAGE_CONVERTER_TOOL_FINDPHONE028,\r
-};\r
-\r
 FindPhoneMainPage::FindPhoneMainPage()\r
 {\r
-    WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "FindPhoneMainPage::FindPhoneMainPage");\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "FindPhoneMainPage::FindPhoneMainPage");\r
     g_pFindPhoneMainPage = this;\r
 }\r
 \r
@@ -96,36 +84,42 @@ FindPhoneMainPage::~FindPhoneMainPage()
         container_ = nullptr;\r
     }\r
 \r
-    if (buttonFind != nullptr) {\r
-        delete buttonFind;\r
-        buttonFind = nullptr;\r
+    if (buttonFind_ != nullptr) {\r
+        delete buttonFind_;\r
+        buttonFind_ = nullptr;\r
     }\r
 \r
-    if (mainImage != nullptr) {\r
-        delete mainImage;\r
-        mainImage = nullptr;\r
+    if (labelDisconnect_ != nullptr) {\r
+        delete labelDisconnect_;\r
+        labelDisconnect_ = nullptr;\r
     }\r
 \r
-    if (labelUnder != nullptr) {\r
-        delete labelUnder;\r
-        labelUnder = nullptr;\r
+    if (labelTitle_ != nullptr) {\r
+        delete labelTitle_;\r
+        labelTitle_ = nullptr;\r
     }\r
 \r
-    if (labelFindTitle != nullptr) {\r
-        delete labelFindTitle;\r
-        labelFindTitle = nullptr;\r
+    if (labelRing_ != nullptr) {\r
+        delete labelRing_;\r
+        labelRing_ = nullptr;\r
     }\r
 \r
-    if (labelRing != nullptr) {\r
-        delete labelRing;\r
-        labelRing = nullptr;\r
+    if (buttonRetry_ != nullptr) {\r
+        delete buttonRetry_;\r
+        buttonRetry_ = nullptr;\r
     }\r
 \r
-    if (buttonRty != nullptr) {\r
-        delete buttonRty;\r
-        buttonRty = nullptr;\r
+    if (startCount_ != nullptr) {\r
+        delete startCount_;\r
+        startCount_ = nullptr;\r
     }\r
-    WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "FindPhoneMainPage::~FindPhoneMainPage");\r
+\r
+    if (imageAnimator_ != nullptr) {\r
+        delete imageAnimator_;\r
+        imageAnimator_ = nullptr;\r
+    }\r
+    ImageCacheManager::GetInstance().UnloadAllInMultiRes(FINDPHONE_IMAGE);\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "FindPhoneMainPage::~FindPhoneMainPage");\r
 }\r
 \r
 FindPhoneMainPage *FindPhoneMainPage::GetInstance()\r
@@ -137,217 +131,198 @@ void FindPhoneMainPage::OnStop()
 {\r
     if (imageAnimator_->GetState() == true) {\r
         DisableFindPhoneTimer();\r
-#ifndef _WIN32\r
-        errcode_t result =\r
-            uapi_diag_service_send_log(msg_center_get_trans_channel(), MSGCENTER_TYPE_ID_OFF_FIND_PHONE, nullptr, 0);\r
-        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "OnStop::uapi_diag_service_send_log OFF result:%d ", result);\r
+        uint8_t value = 1;\r
+        errcode_t result;\r
+#ifdef _WIN32\r
+        result = 0;\r
+#else\r
+        result = msg_center_send_data(MSGCENTER_CMD_DEVICE, MSGCENTER_TYPE_ID_STOP_FIND_PHONE, &value, sizeof(value));\r
+        WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "OnStop stop find phone result:%d ", result);\r
 #endif\r
-        ImageCacheManager::GetInstance().UnloadAllInMultiRes(FINDPHONE_IMAGE);\r
     }\r
-    data = 0;\r
 }\r
 \r
 void FindPhoneMainPage::OnStart(void *data)\r
 {\r
+    container_ = new UIViewGroup();\r
     if (container_ == nullptr) {\r
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "FindPhoneMainPage::new container_ fail");\r
-        container_ = new UIViewGroup();\r
-        container_->SetPosition(FIND_PHONE_INITIAL, FIND_PHONE_INITIAL, FIND_PHONE_SIZE, FIND_PHONE_SIZE);\r
-        container_->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new container_ fail");\r
+        return;\r
     }\r
+    container_->SetPosition(FIND_PHONE_INITIAL, FIND_PHONE_INITIAL, FIND_PHONE_SIZE, FIND_PHONE_SIZE);\r
+    container_->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
     container_->SetTouchable(true);\r
     container_->SetDraggable(true);\r
     container_->SetOnDragListener(this);\r
 \r
-    if (mainImage == nullptr) {\r
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "FindPhoneMainPage::new mainImage fail");\r
-        mainImage = new UIImageView();\r
-    }\r
-    mainImage->SetPosition(FIND_PHONE_INITIAL, FIND_PHONE_INITIAL);\r
-    LOADIMG::LoadImageViewImg(mainImage, FINDPHONE_IMAGE, IMAGE_CONVERTER_TOOL_CONNECT_PHONE_2);\r
-    container_->Add(mainImage);\r
-\r
-    SetUpImageAnimator();\r
-    SetupButton();\r
+    InitImageAnimator();\r
+    InitButton();\r
 \r
-    labelUnder = new UILabel();\r
-    if (labelUnder == nullptr) {\r
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "FindPhoneMainPage::new labelUnder fail");\r
+    labelDisconnect_ = new UILabel();\r
+    if (labelDisconnect_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new labelDisconnect_ fail");\r
         return;\r
     }\r
-    labelUnder->SetText("蓝牙已断开");\r
-    labelUnder->SetFont(DEFAULT_VECTOR_FONT_FILENAME, FONT_DEFAULT_SIZE_1);\r
-    labelUnder->SetPosition(FIND_PHONE_TITLDE_X, FIND_PHONE_TITLDE_Y, FIND_PHONE_TITLDE_WIDTH,\r
-                            FIND_PHONE_IMAGEANIMATOR_HEIGHT);\r
-    container_->Add(labelUnder);\r
-    labelFindTitle = new UILabel();\r
-    if (labelFindTitle == nullptr) {\r
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "FindPhoneMainPage::new labelFindTitle fail");\r
+    labelDisconnect_->SetText("蓝牙已断开");\r
+    labelDisconnect_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, FONT_DEFAULT_SIZE_1);\r
+    labelDisconnect_->SetPosition(FIND_PHONE_TITLE_X, FIND_PHONE_TITLE_Y, FIND_PHONE_TITLE_WIDTH,\r
+                                  FIND_PHONE_TITLE_HEIGHT);\r
+    container_->Add(labelDisconnect_);\r
+    labelTitle_ = new UILabel();\r
+    if (labelTitle_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new labelTitle_ fail");\r
         return;\r
     }\r
-    labelFindTitle->SetText("查找手机");\r
-    labelFindTitle->SetFont(DEFAULT_VECTOR_FONT_FILENAME, FONT_DEFAULT_SIZE_2);\r
-    labelFindTitle->SetPosition(FIND_PHONE_FINDTITLE_X, FIND_PHONE_FINDTITLE_Y, FIND_PHONE_FINDTITLE_WIDTH,\r
-                                FIND_PHONE_FINDTITLE_HEIGHT);\r
-    container_->Add(labelFindTitle);\r
+    labelTitle_->SetText("查找手机");\r
+    labelTitle_->SetFont(BOLD_VECTOR_FONT_FILENAME, FONT_DEFAULT_SIZE_2);\r
+    labelTitle_->SetPosition(FIND_PHONE_FINDTITLE_X, FIND_PHONE_FINDTITLE_Y, FIND_PHONE_FINDTITLE_WIDTH,\r
+                             FIND_PHONE_FINDTITLE_HEIGHT);\r
+    container_->Add(labelTitle_);\r
 \r
-    labelRing = new UILabel();\r
-    if (labelRing == nullptr) {\r
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "FindPhoneMainPage::new labelRing fail");\r
+    labelRing_ = new UILabel();\r
+    if (labelRing_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new labelRing_ fail");\r
         return;\r
     }\r
-    labelRing->SetFont(DEFAULT_VECTOR_FONT_FILENAME, FONT_DEFAULT_SIZE_1);\r
-    container_->Add(labelRing);\r
+    labelRing_->SetText("响铃");\r
+    labelRing_->SetPosition(0, FIND_PHONE_RINGING_Y, FIND_PHONE_RINGING_WIDTH, FIND_PHONE_RINGING_HEIGHT);\r
+    labelRing_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, FONT_DEFAULT_SIZE_1);\r
+    labelRing_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+    labelRing_->SetLineBreakMode(UILabel::LINE_BREAK_ELLIPSIS);\r
+    container_->Add(labelRing_);\r
     if (GetConnectStatus() == 1) {\r
-        labelRing->SetVisible(true);\r
-        labelUnder->SetVisible(false);\r
-        LOADIMG::LoadBtnImage(buttonFind, FINDPHONE_IMAGE, IMAGE_CONVERTER_TOOL_CONNECT_PHONE_5,\r
-                              IMAGE_CONVERTER_TOOL_CONNECT_PHONE_5);\r
-        buttonFind->Enable();\r
+        labelRing_->SetVisible(true);\r
+        labelDisconnect_->SetVisible(false);\r
+        LOADIMG::LoadBtnImage(buttonFind_, FINDPHONE_IMAGE, IMAGE_FINDPHONE_CONNECT, IMAGE_FINDPHONE_CONNECT);\r
+        buttonFind_->Enable();\r
     } else {\r
-        LOADIMG::LoadBtnImage(buttonFind, FINDPHONE_IMAGE, IMAGE_CONVERTER_TOOL_CONNECT_PHONE_4,\r
-                              IMAGE_CONVERTER_TOOL_CONNECT_PHONE_4);\r
-        buttonFind->Disable();\r
-        labelUnder->SetVisible(true);\r
-        labelRing->SetVisible(false);\r
+        LOADIMG::LoadBtnImage(buttonFind_, FINDPHONE_IMAGE, IMAGE_FINDPHONE_DISCONNECT, IMAGE_FINDPHONE_DISCONNECT);\r
+        buttonFind_->Disable();\r
+        labelDisconnect_->SetVisible(true);\r
+        labelRing_->SetVisible(false);\r
     }\r
     imageAnimator_->Stop();\r
     imageAnimator_->SetVisible(false);\r
     AddViewToPageContainer(container_);\r
 }\r
 \r
-void FindPhoneMainPage::SetUpImageAnimator()\r
+void FindPhoneMainPage::InitImageAnimator()\r
 {\r
     imageAnimator_ = new UIImageAnimatorView();\r
     if (imageAnimator_ == nullptr) {\r
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,\r
-                      "FindPhoneMainPage::UIImageAnimatorView new Label SetUpImageAnimator fail");\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "imageAnimator_ new fail");\r
         return;\r
     }\r
-    WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "FindPhoneMainPage::SetUpImageAnimator ");\r
-    imageAnimator_ = new UIImageAnimatorView();\r
-    for (data; data < IMAGEANIMATOERVIEW_SIZE; data++) {\r
-        searchImageInfo[data].imageInfo =\r
-            ImageCacheManager::GetInstance().LoadOneInMultiRes(g_imageAnimatorInfo[data], FINDPHONE_IMAGE);\r
-        ;\r
-        searchImageInfo[data].imageType = IMG_SRC_IMAGE_INFO;\r
-        searchImageInfo[data].pos.x = FIND_PHONE_IMAGE_X;\r
-        searchImageInfo[data].pos.y = FIND_PHONE_IMAGE_y;\r
-        searchImageInfo[data].width = IMAGE_SIZE;\r
-        searchImageInfo[data].height = IMAGE_SIZE;\r
-    }\r
-    imageAnimator_->SetPosition(FIND_PHONE_IMAGE_X, FIND_PHONE_IMAGE_y, FIND_PHONE_IMAGE_WIDTH,\r
-                                FIND_PHONE_IMAGE_HEIGHT);  // 50 : offset 50 : offset 200 : offset 200: offset\r
-    int imageNumber = IMAGEANIMATOERVIEW_SIZE;\r
-    int ImageUpdate = IMAGEANIMATOERVIEW_TIME;\r
-    imageAnimator_->SetImageAnimatorSrc(searchImageInfo, imageNumber,\r
-                                        ImageUpdate);  // 4: the number of images, 100: updating time\r
+    for (int i = 0; i < FINDPHONE_IMAGE_COUNT; i++) {\r
+        searchImageInfo_[i].imageInfo =\r
+            ImageCacheManager::GetInstance().LoadOneInMultiRes(g_imageAnimatorInfo[i], FINDPHONE_IMAGE);\r
+        searchImageInfo_[i].imageType = IMG_SRC_IMAGE_INFO;\r
+        searchImageInfo_[i].pos.x = FIND_PHONE_IMAGE_X;\r
+        searchImageInfo_[i].pos.y = FIND_PHONE_IMAGE_Y;\r
+        searchImageInfo_[i].width = IMAGE_SIZE;\r
+        searchImageInfo_[i].height = IMAGE_SIZE;\r
+    }\r
+    imageAnimator_->SetPosition(FIND_PHONE_IMAGE_X, FIND_PHONE_IMAGE_Y, FIND_PHONE_IMAGE_WIDTH,\r
+                                FIND_PHONE_IMAGE_HEIGHT);\r
+    imageAnimator_->SetImageAnimatorSrc(searchImageInfo_, FINDPHONE_IMAGE_COUNT, IMAGEANIMATOERVIEW_TIME);\r
     imageAnimator_->Stop();\r
     imageAnimator_->LayoutCenterOfParent();\r
     imageAnimator_->SetDraggable(true);\r
     imageAnimator_->SetOnDragListener(this);\r
     container_->Add(imageAnimator_);\r
-    InitImageInfo();\r
 }\r
 \r
-void FindPhoneMainPage::SetupButton()\r
+void FindPhoneMainPage::InitButton()\r
 {\r
-    // Add Button to App\r
-    WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "FindPhoneMainPage::SetupButton new Label");\r
-    if (buttonFind == nullptr) {\r
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "FindPhoneMainPage::new buttonFind fail");\r
-        buttonFind = new UIButton();\r
+    buttonFind_ = new UIButton();\r
+    if (buttonFind_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new buttonFind_ fail");\r
+        return;\r
     }\r
-    buttonFind->SetPosition(FIND_PHONE_BUTTON_POSITION_X, FIND_PHONE_BUTTON_POSITION_Y);\r
-    buttonFind->Resize(FIND_PHONE_BUTTON_WIDTH, FIND_PHONE_BUTTON_HEIGHT);\r
-    buttonFind->SetViewId("button1");\r
-    buttonFind->SetOnClickListener(this);\r
-    buttonFind->SetStyle(STYLE_BACKGROUND_COLOR, Color::White().full);\r
-    buttonFind->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
-    buttonFind->SetVisible(true);\r
-    LOADIMG::LoadBtnImage(buttonFind, FINDPHONE_IMAGE, IMAGE_CONVERTER_TOOL_CONNECT_PHONE_5,\r
-                          IMAGE_CONVERTER_TOOL_CONNECT_PHONE_5);\r
-    if (buttonRty == nullptr) {\r
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "FindPhoneMainPage::new buttonRty fail");\r
-        buttonRty = new UIButton();\r
+    buttonFind_->SetPosition(FIND_PHONE_BUTTON_POSITION_X, FIND_PHONE_BUTTON_POSITION_Y);\r
+    buttonFind_->Resize(FIND_PHONE_BUTTON_WIDTH, FIND_PHONE_BUTTON_HEIGHT);\r
+    buttonFind_->SetViewId(FIND_BUTTON);\r
+    buttonFind_->SetOnClickListener(this);\r
+    buttonFind_->SetStyleForState(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT, UIButton::RELEASED);\r
+    buttonFind_->SetStyleForState(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT, UIButton::PRESSED);\r
+    buttonFind_->SetStyleForState(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT, UIButton::INACTIVE);\r
+    buttonFind_->SetVisible(true);\r
+    LOADIMG::LoadBtnImage(buttonFind_, FINDPHONE_IMAGE, IMAGE_FINDPHONE_CONNECT, IMAGE_FINDPHONE_CONNECT);\r
+    buttonRetry_ = new UIButton();\r
+    if (buttonRetry_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new buttonRetry_ fail");\r
+        return;\r
     }\r
-    buttonRty->SetPosition(FIND_PHONE_RTYBUTTON_POSITION_X, FIND_PHONE_RTYBUTTON_POSITION_Y);\r
-    buttonRty->Resize(FIND_PHONE_RTYBUTTON, FIND_PHONE_RTYBUTTON);\r
-    buttonRty->SetViewId("buttonRty");\r
-    buttonRty->SetOnClickListener(this);\r
-    buttonRty->SetStyle(STYLE_BACKGROUND_COLOR, Color::Red().full);\r
-    buttonRty->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
-    LOADIMG::LoadBtnImage(buttonRty, FINDPHONE_IMAGE, IMAGE_CONVERTER_TOOL_CONNECT_PHONE_7,\r
-                          IMAGE_CONVERTER_TOOL_CONNECT_PHONE_7);\r
-    buttonRty->SetVisible(false);\r
-    // Add to rootView\r
-    container_->Add(buttonRty);\r
-    container_->Add(buttonFind);\r
+    buttonRetry_->SetPosition(FIND_PHONE_RTYBUTTON_POSITION_X, FIND_PHONE_RTYBUTTON_POSITION_Y);\r
+    buttonRetry_->Resize(FIND_PHONE_RTYBUTTON, FIND_PHONE_RTYBUTTON);\r
+    buttonRetry_->SetViewId(RETRY_BUTTON);\r
+    buttonRetry_->SetOnClickListener(this);\r
+    buttonRetry_->SetStyle(STYLE_BACKGROUND_COLOR, Color::Red().full);\r
+    buttonRetry_->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+    LOADIMG::LoadBtnImage(buttonRetry_, FINDPHONE_IMAGE, IMAGE_FINDPHONE_RESET, IMAGE_FINDPHONE_RESET);\r
+    buttonRetry_->SetVisible(false);\r
+    container_->Add(buttonRetry_);\r
+    container_->Add(buttonFind_);\r
 }\r
 \r
 bool FindPhoneMainPage::ClickButtonChange()\r
 {\r
-#ifndef _WIN32\r
     errcode_t result;\r
+    uint8_t value = 1;\r
     if (imageAnimator_->GetState() == true) {\r
-        // 关闭定时器\r
-        result =\r
-            uapi_diag_service_send_log(msg_center_get_trans_channel(), MSGCENTER_TYPE_ID_OFF_FIND_PHONE, nullptr, 0);\r
-        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "uapi_diag_service_send_log OFF result:%d ", result);\r
+#ifdef _WIN32\r
+        result = 0;\r
+#else\r
+        result = msg_center_send_data(MSGCENTER_CMD_DEVICE, MSGCENTER_TYPE_ID_STOP_FIND_PHONE, &value, sizeof(value));\r
+        WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "ClickButtonChange stop find phone result:%d ", result);\r
+#endif\r
         if (result == 0) {\r
             DisableFindPhoneTimer();\r
-            LOADIMG::LoadBtnImage(buttonFind, FINDPHONE_IMAGE, IMAGE_CONVERTER_TOOL_CONNECT_PHONE_5,\r
-                                  IMAGE_CONVERTER_TOOL_CONNECT_PHONE_5);\r
+            LOADIMG::LoadBtnImage(buttonFind_, FINDPHONE_IMAGE, IMAGE_FINDPHONE_CONNECT, IMAGE_FINDPHONE_CONNECT);\r
             imageAnimator_->Stop();\r
             imageAnimator_->SetVisible(false);\r
-            buttonFind->SetOpaScale(OPA_OPAQUE);\r
-            mainImage->SetVisible(true);\r
-            labelRing->SetText("响铃");\r
-            labelRing->SetPosition(FIND_PHONE_RINGING_X, FIND_PHONE_RINGING_Y, FIND_PHONE_RINGING_WIDTH,\r
-                                   FIND_PHONE_RINGING_HEIGHT);\r
+            buttonFind_->SetOpaScale(OPA_OPAQUE);\r
+            labelRing_->SetText("响铃");\r
             return true;\r
-        } else {\r
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "OFF send to phone fail:%d ", result);\r
-            return false;\r
         }\r
     } else {\r
-        // 开启定时器\r
-        result =\r
-            uapi_diag_service_send_log(msg_center_get_trans_channel(), MSGCENTER_TYPE_ID_ON_FIND_PHONE, nullptr, 0);\r
-        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "uapi_diag_service_send_log ON result:%d ", result);\r
+#ifdef _WIN32\r
+        result = 0;\r
+#else\r
+        result = msg_center_send_data(MSGCENTER_CMD_DEVICE, MSGCENTER_TYPE_ID_START_FIND_PHONE, &value, sizeof(value));\r
+        WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "ClickButtonChange start find phone result:%d ", result);\r
+#endif\r
         if (result == 0) {\r
             InitFindPhoneTimer();\r
-            g_startCount->Start();\r
             imageAnimator_->Start();\r
             imageAnimator_->SetVisible(true);\r
-            buttonFind->SetOpaScale(OPA_TRANSPARENT);\r
-            mainImage->SetVisible(false);\r
-            labelRing->SetText("停止响铃");\r
-            labelRing->SetPosition(FIND_PHONE_RINGING2_X, FIND_PHONE_RINGING_Y, FIND_PHONE_RINGING2_WIDTH,\r
-                                   FIND_PHONE_RINGING_HEIGHT);\r
+            buttonFind_->SetOpaScale(OPA_TRANSPARENT);\r
+            labelRing_->SetText("停止响铃");\r
             return true;\r
-        } else {\r
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ON send to phone fail:%d ", result);\r
-            return false;\r
         }\r
     }\r
-#endif\r
     return true;\r
 }\r
 \r
 void FindPhoneMainPage::ShowReset()\r
 {\r
     // rtybutton、title显示,findTitle、button隐藏,imageAnimator停止\r
-    labelUnder->SetText("查找手机超时,请重试");\r
-    labelUnder->SetPosition(FIND_PHONE_SEARCHTIMEOUT_X, FIND_PHONE_SEARCHTIMEOUT_Y, FIND_PHONE_SEARCHTIMEOUT_WIDTH,\r
-                            FIND_PHONE_SEARCHTIMEOUT_HEIGHT);\r
-    labelUnder->SetFont(DEFAULT_VECTOR_FONT_FILENAME, FONT_DEFAULT_SIZE_1);\r
-    labelUnder->SetVisible(true);\r
-    buttonRty->SetVisible(true);\r
-    labelFindTitle->SetVisible(false);\r
-    labelRing->SetVisible(false);\r
-    buttonFind->SetVisible(false);\r
-    mainImage->SetVisible(false);\r
+#ifdef _WIN32\r
+#else\r
+    uint8_t value = 1;\r
+    uint8_t result = 0;\r
+    result = msg_center_send_data(MSGCENTER_CMD_DEVICE, MSGCENTER_TYPE_ID_STOP_FIND_PHONE, &value, sizeof(value));\r
+    WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "ShowReset stop find phone result:%d ", result);\r
+#endif\r
+    labelDisconnect_->SetText("查找手机超时,请重试");\r
+    labelDisconnect_->SetPosition(FIND_PHONE_SEARCHTIMEOUT_X, FIND_PHONE_SEARCHTIMEOUT_Y,\r
+                                  FIND_PHONE_SEARCHTIMEOUT_WIDTH, FIND_PHONE_SEARCHTIMEOUT_HEIGHT);\r
+    labelDisconnect_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, FONT_DEFAULT_SIZE_1);\r
+    labelDisconnect_->SetVisible(true);\r
+    buttonRetry_->SetVisible(true);\r
+    labelTitle_->SetVisible(false);\r
+    labelRing_->SetVisible(false);\r
+    buttonFind_->SetVisible(false);\r
     imageAnimator_->Stop();\r
     imageAnimator_->SetVisible(false);\r
     DisableFindPhoneTimer();\r
@@ -355,88 +330,66 @@ void FindPhoneMainPage::ShowReset()
 \r
 bool FindPhoneMainPage::StopFindPhone()\r
 {\r
-#ifndef _WIN32\r
-    errcode_t result;\r
     if (imageAnimator_->GetState() == true) {\r
-        // 关闭定时器\r
-        result =\r
-            uapi_diag_service_send_log(msg_center_get_trans_channel(), MSGCENTER_TYPE_ID_OFF_FIND_PHONE, nullptr, 0);\r
-        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "uapi_diag_service_send_log OFF result:%d ", result);\r
-        if (result == 0) {\r
-            DisableFindPhoneTimer();\r
-            LOADIMG::LoadBtnImage(buttonFind, FINDPHONE_IMAGE, IMAGE_CONVERTER_TOOL_CONNECT_PHONE_5,\r
-                                  IMAGE_CONVERTER_TOOL_CONNECT_PHONE_5);\r
-            imageAnimator_->Stop();\r
-            imageAnimator_->SetVisible(false);\r
-            buttonFind->SetOpaScale(OPA_OPAQUE);\r
-            mainImage->SetVisible(true);\r
-            labelRing->SetText("响铃");\r
-            labelRing->SetPosition(FIND_PHONE_RINGING_X, FIND_PHONE_RINGING_Y, FIND_PHONE_RINGING_WIDTH,\r
-                                   FIND_PHONE_RINGING_HEIGHT);\r
-            return true;\r
-        } else {\r
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "OFF send to phone fail:%d ", result);\r
-            return false;\r
-        }\r
-    } else {\r
-        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "FindPhoneMainPage::imageAnimator is stop");\r
+        DisableFindPhoneTimer();\r
+        LOADIMG::LoadBtnImage(buttonFind_, FINDPHONE_IMAGE, IMAGE_FINDPHONE_CONNECT, IMAGE_FINDPHONE_CONNECT);\r
+        imageAnimator_->Stop();\r
+        imageAnimator_->SetVisible(false);\r
+        buttonFind_->SetOpaScale(OPA_OPAQUE);\r
+        labelRing_->SetText("响铃");\r
+        return true;\r
     }\r
-#endif\r
     return true;\r
 }\r
 \r
 bool FindPhoneMainPage::OnClick(UIView &view, const ClickEvent &event)\r
 {\r
-#ifndef _WIN32\r
     UNUSED(event);\r
-    if (view.GetViewId() == "buttonRty") {\r
+    if (strcmp(view.GetViewId(), RETRY_BUTTON) == 0) {\r
         // rtybutton、title隐藏,findTitle、button显示,imageAnimator播放\r
-        InitFindPhoneTimer();\r
-        static uint8_t buffer[1024] = {16};\r
-        errcode_t result =\r
-            uapi_diag_service_send_log(msg_center_get_trans_channel(), MSGCENTER_TYPE_ID_ON_FIND_PHONE, buffer, 16);\r
-        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "uapi_diag_service_send_log ON result:%d ", result);\r
+        uint8_t value = 1;\r
+        errcode_t result;\r
+#ifdef _WIN32\r
+        result = 0;\r
+#else\r
+        result = msg_center_send_data(MSGCENTER_CMD_DEVICE, MSGCENTER_TYPE_ID_START_FIND_PHONE, &value, sizeof(value));\r
+        WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "OnClick start find phone result:%d ", result);\r
+#endif\r
         if (result == 0) {\r
-            buttonRty->SetVisible(false);\r
-            labelUnder->SetVisible(false);\r
-            mainImage->SetVisible(false);\r
-            buttonFind->SetVisible(true);\r
-            labelFindTitle->SetVisible(true);\r
+            buttonRetry_->SetVisible(false);\r
+            labelDisconnect_->SetVisible(false);\r
+            buttonFind_->SetVisible(true);\r
+            labelTitle_->SetVisible(true);\r
+            InitFindPhoneTimer();\r
             imageAnimator_->Start();\r
             imageAnimator_->SetVisible(true);\r
-            buttonFind->SetOpaScale(OPA_TRANSPARENT);\r
-            labelRing->SetVisible(true);\r
-            labelRing->SetText("停止响铃");\r
-            labelRing->SetPosition(FIND_PHONE_RINGING2_X, FIND_PHONE_RINGING_Y, FIND_PHONE_RINGING2_WIDTH,\r
-                                   FIND_PHONE_RINGING_HEIGHT);\r
+            buttonFind_->SetOpaScale(OPA_TRANSPARENT);\r
+            labelRing_->SetVisible(true);\r
+            labelRing_->SetText("停止响铃");\r
             return true;\r
-        } else {\r
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "try send to phone fail:%d ", result);\r
-            return false;\r
         }\r
-    } else {\r
+    } else if (strcmp(view.GetViewId(), FIND_BUTTON) == 0) {\r
         ClickButtonChange();\r
     }\r
-#endif\r
     return true;\r
 }\r
 \r
 bool FindPhoneMainPage::OnDrag(UIView &view, const DragEvent &event)\r
 {\r
-    WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "FindPhonePresenter::OnDrag");\r
     UNUSED(view);\r
     if ((event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT) && (event.GetDeltaX() > X_DRAG_OFFSET) &&\r
         (event.GetDeltaX() > (DOUBLES * MATH_ABS(event.GetDeltaY())))) {\r
-        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "FindPhoneOnDragListener::OnDrag ChangeSlice(VIEW_APPLIST)");\r
-        NativeAbility::GetInstance().ChangeSlice(VIEW_APPLIST);\r
+        NativeAbility::GetInstance().ChangeSliceToApplist();\r
     }\r
-    return false;\r
+    return true;\r
 }\r
 \r
 uint8_t FindPhoneMainPage::GetConnectStatus()\r
 {\r
     uint8_t conn_status = 0;\r
-#ifndef _WIN32\r
+#ifdef _WIN32\r
+    conn_status = 1;\r
+#else\r
     if (msg_center_get_trans_channel() == DIAG_FRAME_FID_PHONE) {\r
         conn_status = is_spp_connected(0) == true ? 1 : 0;\r
     } else if (msg_center_get_trans_channel() == DIAG_FRAME_FID_BT) {\r
@@ -448,52 +401,43 @@ uint8_t FindPhoneMainPage::GetConnectStatus()
 \r
 void FindPhoneMainPage::ChangeToDisConnect()\r
 {\r
-    LOADIMG::LoadBtnImage(buttonFind, FINDPHONE_IMAGE, IMAGE_CONVERTER_TOOL_CONNECT_PHONE_4,\r
-                          IMAGE_CONVERTER_TOOL_CONNECT_PHONE_4);\r
+    LOADIMG::LoadBtnImage(buttonFind_, FINDPHONE_IMAGE, IMAGE_FINDPHONE_DISCONNECT, IMAGE_FINDPHONE_DISCONNECT);\r
+    DisableFindPhoneTimer();\r
     imageAnimator_->Stop();\r
     imageAnimator_->SetVisible(false);\r
-    buttonFind->SetOpaScale(OPA_OPAQUE);\r
-    buttonFind->Disable();\r
-    labelFindTitle->SetVisible(false);\r
-    labelUnder->SetVisible(true);\r
-    labelRing->SetVisible(false);\r
+    buttonFind_->SetOpaScale(OPA_OPAQUE);\r
+    buttonFind_->Disable();\r
+    labelDisconnect_->SetVisible(true);\r
+    labelRing_->SetVisible(false);\r
 }\r
 \r
 /* 定时器回调函数 */\r
 void FindPhoneTimerCallback(void *data)\r
 {\r
     (void)data;\r
-    timeCount++;\r
-    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "FindPhoneMainPage::timeCount:%d", timeCount);\r
-    if (timeCount == FIND_PHONE_DURATION_TIME) {\r
-        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Searching for phone timed out!!");\r
-        FindPhoneMainPage::GetInstance()->ShowReset();\r
-        timeCount = 0;\r
-    }\r
-    if (FindPhoneMainPage::GetInstance()->GetConnectStatus() != 1) {\r
-        FindPhoneMainPage::GetInstance()->ChangeToDisConnect();\r
-    }\r
+    FindPhoneMainPage::GetInstance()->ShowReset();\r
 }\r
 \r
 /* 开启定时器 */\r
 void FindPhoneMainPage::InitFindPhoneTimer()\r
 {\r
-    if (g_startCount != nullptr) {\r
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "FindPhoneMainPage already exists!!");\r
+    if (startCount_ != nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "already exists!!");\r
         return;\r
     }\r
-    uint32 tick = GetOSTick(MS_ONE_SECONDS);\r
-    g_startCount = new GraphicTimer(tick, FindPhoneTimerCallback, nullptr, true);\r
-    if (g_startCount == nullptr) {\r
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "FindPhoneMainPage new GraphicTimer failed!!");\r
+    uint32 tick = GetOSTick(FINDPHONE_TIMEOUT * MS_ONE_SECONDS);\r
+    startCount_ = new GraphicTimer(tick, FindPhoneTimerCallback, nullptr, true);\r
+    if (startCount_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new GraphicTimer failed!!");\r
         return;\r
     }\r
-    bool retTimer = g_startCount->Start();\r
+    SettingDisplayModel::GetInstance().EnableSteadyOn();\r
+    bool retTimer = startCount_->Start();\r
     if (!retTimer) {\r
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "FindPhoneMainPage osTimerStart failed!!");\r
-        if (g_startCount != nullptr) {\r
-            delete g_startCount;\r
-            g_startCount = nullptr;\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "osTimerStart failed!!");\r
+        if (startCount_ != nullptr) {\r
+            delete startCount_;\r
+            startCount_ = nullptr;\r
         }\r
         return;\r
     }\r
@@ -502,122 +446,11 @@ void FindPhoneMainPage::InitFindPhoneTimer()
 /* 关闭定时器 */\r
 void FindPhoneMainPage::DisableFindPhoneTimer()\r
 {\r
-    WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "CameraModel::DisableFindPhoneTimer!!");\r
-    if (g_startCount != nullptr) {\r
-        g_startCount->Stop();\r
-        delete g_startCount;\r
-        g_startCount = nullptr;\r
-        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "CameraModel::DisableFindPhoneTimer delete g_startCount!!");\r
-    }\r
-    timeCount = 0;\r
-}\r
-\r
-void FindPhoneMainPage::InitImageInfo()\r
-{\r
-    const uint16_t pixelByteSize = FIND_PHONE_PIXELBYTE_SIZE;  // 4: bytes per pixel\r
-    const uint16_t width = FIND_PHONE_PIXELBYTEH;              // 100: image's width\r
-    const uint16_t height = FIND_PHONE_PIXELBYTEH;             // 100: image's height\r
-    uint32_t dataSize = width * height * pixelByteSize;\r
-    uint8_t *srcData1 = static_cast<uint8_t *>(UIMalloc(dataSize));\r
-    if (srcData1 == nullptr) {\r
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "FindPhoneMainPage::srcData1 fail");\r
-        return;\r
-    }\r
-    for (uint32_t i = 0; i < dataSize; i += pixelByteSize) {\r
-        srcData1[i] = SET_INT_MAX;             // 255: pixel value\r
-        srcData1[i + 1] = 0;                   // 1: set green channel\r
-        srcData1[i + SET_TWO] = 0;             // 2: set red channel\r
-        srcData1[i + SET_THREE] = OPA_OPAQUE;  // 3: set alpha channel\r
-    }\r
-    imageInfo1_ = static_cast<ImageInfo *>(UIMalloc(sizeof(ImageInfo)));\r
-    if (imageInfo1_ == nullptr) {\r
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "FindPhoneMainPage::new imageInfo1_ fail");\r
-        UIFree(srcData1);\r
-        return;\r
-    }\r
-\r
-    imageInfo1_->header.width = width;\r
-    imageInfo1_->header.height = height;\r
-    imageInfo1_->header.colorMode = ColorMode::ARGB8888;\r
-    imageInfo1_->dataSize = dataSize;\r
-    imageInfo1_->data = srcData1;\r
-\r
-    uint8_t *srcData2 = static_cast<uint8_t *>(UIMalloc(dataSize));\r
-    if (srcData2 == nullptr) {\r
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "FindPhoneMainPage::srcData2 fail");\r
-        UIFree(imageInfo1_);\r
-        UIFree(srcData1);\r
-        return;\r
-    }\r
-    for (uint32_t i = 0; i < dataSize; i += pixelByteSize) {\r
-        srcData2[i] = 0;                       // set blue channel\r
-        srcData2[i + 1] = SET_INT_MAX;         // 1: set green channel 255: pixel value\r
-        srcData2[i + SET_TWO] = 0;             // 2: set red channel\r
-        srcData2[i + SET_THREE] = OPA_OPAQUE;  // 3: set alpha channel\r
-    }\r
-\r
-    imageInfo2_ = static_cast<ImageInfo *>(UIMalloc(sizeof(ImageInfo)));\r
-    if (imageInfo2_ == nullptr) {\r
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "FindPhoneMainPage::new imageInfo2_ fail");\r
-        UIFree(srcData2);\r
-        UIFree(imageInfo1_);\r
-        UIFree(srcData1);\r
-        return;\r
-    }\r
-    imageInfo2_->header.width = width;\r
-    imageInfo2_->header.height = height;\r
-    imageInfo2_->header.colorMode = ARGB8888;\r
-    imageInfo2_->dataSize = dataSize;\r
-    imageInfo2_->data = srcData2;\r
-\r
-    uint8_t *srcData3 = static_cast<uint8_t *>(UIMalloc(dataSize));\r
-    if (srcData3 == nullptr) {\r
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "FindPhoneMainPage::srcData3 fail");\r
-        UIFree(imageInfo2_);\r
-        UIFree(srcData2);\r
-        UIFree(imageInfo1_);\r
-        UIFree(srcData1);\r
-        return;\r
-    }\r
-    for (uint32_t i = 0; i < dataSize; i += pixelByteSize) {\r
-        srcData3[i] = 0;                       // set blue channel\r
-        srcData3[i + 1] = 0;                   // 1: set green channel\r
-        srcData3[i + SET_TWO] = SET_INT_MAX;   // 2: set red channel 255: pixel value\r
-        srcData3[i + SET_THREE] = OPA_OPAQUE;  // 3: set alpha channel\r
-    }\r
-\r
-    imageInfo3_ = static_cast<ImageInfo *>(UIMalloc(sizeof(ImageInfo)));\r
-    if (imageInfo3_ == nullptr) {\r
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "FindPhoneMainPage::new imageInfo3_ fail");\r
-        UIFree(srcData3);\r
-        UIFree(imageInfo2_);\r
-        UIFree(srcData2);\r
-        UIFree(imageInfo1_);\r
-        UIFree(srcData1);\r
-        return;\r
+    SettingDisplayModel::GetInstance().DisableSteadyOn();\r
+    if (startCount_ != nullptr) {\r
+        startCount_->Stop();\r
+        delete startCount_;\r
+        startCount_ = nullptr;\r
     }\r
-    imageInfo3_->header.width = width;\r
-    imageInfo3_->header.height = height;\r
-    imageInfo3_->header.colorMode = ARGB8888;\r
-    imageInfo3_->dataSize = dataSize;\r
-    imageInfo3_->data = srcData3;\r
-\r
-    imageAnimatorImageInfo_[0].imageInfo = imageInfo1_;\r
-    imageAnimatorImageInfo_[0].pos = {FIND_PHONE_IMAGEANIMATOR_POSITION_X, FIND_PHONE_IMAGEANIMATOR_POSITION_Y};\r
-    imageAnimatorImageInfo_[0].width = FIND_PHONE_IMAGEANIMATOR_WIDTH;    // 100: width value\r
-    imageAnimatorImageInfo_[0].height = FIND_PHONE_IMAGEANIMATOR_HEIGHT;  // 100: height value\r
-    imageAnimatorImageInfo_[0].imageType = IMG_SRC_IMAGE_INFO;\r
-\r
-    imageAnimatorImageInfo_[1].imageInfo = imageInfo2_;\r
-    imageAnimatorImageInfo_[1].pos = {FIND_PHONE_IMAGEANIMATOR_POSITION_X, FIND_PHONE_IMAGEANIMATOR_POSITION_Y};\r
-    imageAnimatorImageInfo_[1].width = FIND_PHONE_IMAGEANIMATOR_WIDTH;    // 100: width value\r
-    imageAnimatorImageInfo_[1].height = FIND_PHONE_IMAGEANIMATOR_HEIGHT;  // 100: height value\r
-    imageAnimatorImageInfo_[1].imageType = IMG_SRC_IMAGE_INFO;\r
-\r
-    imageAnimatorImageInfo_[SET_TWO].imageInfo = imageInfo3_;  // 2: image index\r
-    imageAnimatorImageInfo_[SET_TWO].pos = {FIND_PHONE_IMAGEANIMATOR_POSITION_X, FIND_PHONE_IMAGEANIMATOR_POSITION_Y};\r
-    imageAnimatorImageInfo_[SET_TWO].width = FIND_PHONE_IMAGEANIMATOR_WIDTH;    // 2: image index, 100: width value\r
-    imageAnimatorImageInfo_[SET_TWO].height = FIND_PHONE_IMAGEANIMATOR_HEIGHT;  // 2: image index, 100: height value\r
-    imageAnimatorImageInfo_[SET_TWO].imageType = IMG_SRC_IMAGE_INFO;            // 2: image index\r
 }\r
 }\r
index c4784a6..762fab5 100644 (file)
@@ -6,18 +6,10 @@
 \r
 #include "ohos_timer.h"\r
 #include "wearable_log.h"\r
-#include "findphone/FindPhoneModel.h"\r
 #include "findphone/FindPhoneView.h"\r
+#include "findphone/FindPhoneModel.h"\r
 \r
 namespace OHOS {\r
-static constexpr uint64_t CENTI_SECOND_UNIT = 100;\r
-static constexpr uint64_t MS_ONE_SECONDS = 1000;\r
-static constexpr uint16_t NUM_TEN = 10;\r
-static constexpr uint16_t NUM_TIME_MIN = 60;\r
-static constexpr uint16_t NUM_TIME_HOUR = 3600;\r
-static constexpr int32_t NUM_TIME_DAY = 86400;\r
-static constexpr int16_t MIN_TO_HOUR = 60;\r
-static constexpr int16_t HOURLY_SYSTEM = 24;\r
 FindPhoneModel::FindPhoneModel() {}\r
 \r
 FindPhoneModel::~FindPhoneModel() {}\r
index 96f909c..53b7336 100644 (file)
@@ -6,10 +6,10 @@
 \r
 #include "NativeRegisterManager.h"\r
 #include "uiservice/ui_service.h"\r
-#include "findphone/FindPhonePresenter.h"\r
 #include "findphone/FindPhoneModel.h"\r
 #include "findphone/FindPhoneView.h"\r
+#include "findphone/FindPhonePresenter.h"\r
 \r
 namespace OHOS {\r
-REGIST_MENU(VIEW_FIND_PHONE, FindPhoneView, FindPhonePresenter, FINDPHONE_MAIN_ICON, FINDPHONE_MAIN_ICON, "查找手机");\r
+REGIST_MENU(VIEW_FIND_PHONE, FindPhoneView, FindPhonePresenter, FINDPHONE_ICON, FINDPHONE_ICON, "查找手机");\r
 }\r
index 5216735..9bb5e9e 100644 (file)
@@ -1,43 +1,43 @@
 /*\r
- * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
  * Description: FlashLightBlinkPage\r
  * Create: 2025-04-24\r
  */\r
 \r
-#include "flashlight/FlashLightBlinkPage.h"\r
-#include "flashlight/FlashLightPresenter.h"\r
 #include "SlicePageFactory.h"\r
-#include "flashlight/FlashLightView.h"\r
 #include "AppViewIDs.h"\r
 #include "wearable_log.h"\r
 #include "NativeAbility.h"\r
-#include "flashlight/FlashLightModel.h"\r
 #include "main/LoadImg.h"\r
-#include "flashlight/FlashlightUiResourceImage.h"\r
+#include "ui_resource_flashlight.h"\r
+#include "flashlight/FlashLightView.h"\r
+#include "flashlight/FlashLightPresenter.h"\r
+#include "flashlight/FlashLightModel.h"\r
+#include "flashlight/FlashLightBlinkPage.h"\r
+\r
 namespace OHOS {\r
-static const uint16_t BLINK_PICKER_POS_X = 106;\r
-static const uint16_t BLINK_PICKER_POS_Y = 113;\r
-static const uint16_t BLINK_PICKER_WIDTH = 254;\r
-static const uint16_t BLINK_PICKER_HEIGHT = 218;\r
-static const uint16_t BLINK_PICKER_BACKGROUND_FONT_SIZE = 38;\r
-static const uint16_t BLINK_PICKER_HIGHLIGHT_FONT_SIZE = 44;\r
-static const uint16_t BLINK_PICKER_ITEM_HEIGHT = 73;\r
-static const uint16_t BLINK_PICKER_NUM = 3;\r
-static const uint16_t BLINK_BUTTON_POS_X = 59;\r
-static const uint16_t BLINK_BUTTON_POS_Y = 358;\r
-static const uint16_t BLINK_BUTTON_WIDTH = 337;\r
-static const uint16_t BLINK_BUTTON_HEIGHT = 96;\r
-static const uint16_t BLINK_TEXT_POS_X = 100;\r
-static const uint16_t BLINK_TEXT_POS_Y = 38;\r
-static const uint16_t BLINK_TEXT_WIDTH = 253;\r
-static const uint16_t BLINK_TEXT_HEIGHT = 53;\r
-static const uint16_t BLINK_TEXT_FONT_SIZE = 38;\r
-static const std::string START_BLINK_BUTTON_ID = "startBlink";\r
+static constexpr uint16_t BLINK_PICKER_POS_X = 106;\r
+static constexpr uint16_t BLINK_PICKER_POS_Y = 113;\r
+static constexpr uint16_t BLINK_PICKER_WIDTH = 254;\r
+static constexpr uint16_t BLINK_PICKER_HEIGHT = 218;\r
+static constexpr uint16_t BLINK_PICKER_BACKGROUND_FONT_SIZE = 38;\r
+static constexpr uint16_t BLINK_PICKER_HIGHLIGHT_FONT_SIZE = 44;\r
+static constexpr uint16_t BLINK_PICKER_ITEM_HEIGHT = 73;\r
+static constexpr uint16_t BLINK_PICKER_NUM = 3;\r
+static constexpr uint16_t BLINK_BUTTON_POS_X = 59;\r
+static constexpr uint16_t BLINK_BUTTON_POS_Y = 358;\r
+static constexpr uint16_t BLINK_BUTTON_WIDTH = 337;\r
+static constexpr uint16_t BLINK_BUTTON_HEIGHT = 96;\r
+static constexpr uint16_t BLINK_TEXT_POS_X = 100;\r
+static constexpr uint16_t BLINK_TEXT_POS_Y = 38;\r
+static constexpr uint16_t BLINK_TEXT_WIDTH = 253;\r
+static constexpr uint16_t BLINK_TEXT_HEIGHT = 53;\r
+static constexpr uint16_t BLINK_TEXT_FONT_SIZE = 38;\r
+static constexpr char *START_BLINK_BUTTON_ID = "startBlink";\r
 \r
 REGIST_SLICE_PAGE(VIEW_FLASHLIGHT, FlashLightAllView::FLASH_LIGHT_BLINK_VIEW, FlashLightBlinkPage, false);\r
 void FlashLightBlinkPage::OnStart(void *data)\r
 {\r
-    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "FlashLightBlinkPage::OnStart");\r
     if (container_ == nullptr) {\r
         container_ = new UIScrollView();\r
         container_->SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);\r
@@ -51,11 +51,10 @@ void FlashLightBlinkPage::OnStart(void *data)
     blinkLabel_->SetText("闪烁频率");\r
     blinkLabel_->SetStyle(STYLE_TEXT_COLOR, Color::White().full);\r
     blinkLabel_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
-    blinkLabel_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, BLINK_TEXT_FONT_SIZE);\r
+    blinkLabel_->SetFont(BOLD_VECTOR_FONT_FILENAME, BLINK_TEXT_FONT_SIZE);\r
     container_->Add(blinkLabel_);\r
     blinkLabel_->SetVisible(true);\r
 \r
-    // Add Picker to App\r
     if (blinkPicker_ == nullptr) {\r
         blinkPicker_ = new UIPicker();\r
     }\r
@@ -73,14 +72,12 @@ void FlashLightBlinkPage::OnStart(void *data)
     container_->Add(blinkPicker_);\r
     blinkPicker_->SetVisible(true);\r
 \r
-    // Add LabelButtonExt to App\r
     if (blinkButton_ == nullptr) {\r
         blinkButton_ = new UILabelButtonExt();\r
     }\r
     blinkButton_->SetPosition(BLINK_BUTTON_POS_X, BLINK_BUTTON_POS_Y, BLINK_BUTTON_WIDTH, BLINK_BUTTON_HEIGHT);\r
-    blinkButton_->SetViewId(START_BLINK_BUTTON_ID.c_str());\r
-    LOADIMG::LoadBtnImage(blinkButton_, FLASHLIGHT_IMAGE, IMAGE_CONVERTER_TOOL_BLINKBUTTON,\r
-                          IMAGE_CONVERTER_TOOL_BLINKBUTTON);\r
+    blinkButton_->SetViewId(START_BLINK_BUTTON_ID);\r
+    LOADIMG::LoadBtnImage(blinkButton_, FLASHLIGHT_IMAGE, IMAGE_FLASHLIGHT_BLINKBUTTON, IMAGE_FLASHLIGHT_BLINKBUTTON);\r
     blinkButton_->SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
     blinkButton_->SetStyleForState(STYLE_BACKGROUND_COLOR, Color::Black().full, UIButton::PRESSED);\r
     container_->Add(blinkButton_);\r
@@ -91,9 +88,13 @@ void FlashLightBlinkPage::OnStart(void *data)
     AddViewToPageContainer(container_);\r
 }\r
 \r
+FlashLightBlinkPage::FlashLightBlinkPage()\r
+{\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "FlashLightBlinkPage::FlashLightBlinkPage");\r
+}\r
+\r
 FlashLightBlinkPage::~FlashLightBlinkPage()\r
 {\r
-    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "FlashLightBlinkPage::~FlashLightBlinkPage");\r
     if (container_ != nullptr) {\r
         container_->RemoveAll();\r
         delete container_;\r
@@ -112,30 +113,27 @@ FlashLightBlinkPage::~FlashLightBlinkPage()
         blinkButton_ = nullptr;\r
     }\r
     ImageCacheManager::GetInstance().UnloadSingleRes(FLASHLIGHT_IMAGE);\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "FlashLightBlinkPage::~FlashLightBlinkPage");\r
 }\r
 \r
 bool FlashLightBlinkPage::OnDrag(UIView &view, const DragEvent &event)\r
 {\r
-    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "FlashLightBlinkPage::OnDrag");\r
     if ((event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT) && (event.GetDeltaX() > X_DRAG_OFFSET) &&\r
         (event.GetDeltaX() > (DOUBLES * MATH_ABS(event.GetDeltaY())))) {\r
-        NativeAbility::GetInstance().SwitchSlice(VIEW_FLASHLIGHT, FlashLightAllView::FLASH_LIGHT_SET_VIEW);\r
+        NativeAbility::GetInstance().SwitchPageInSlice(FlashLightAllView::FLASH_LIGHT_SET_VIEW,\r
+            TransitionType::TRANSITION_INVALID, false);\r
     }\r
-    return false;\r
+    return true;\r
 }\r
 \r
 bool FlashLightBlinkPage::OnClick(UIView &view, const ClickEvent &event)\r
 {\r
-    std::string viewId = view.GetViewId();\r
     uint16_t itemIndex = blinkPicker_->GetSelected();\r
-    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "FlashLightBlinkPage::OnClick [%s], itemIndex : [%d] ", viewId.c_str(),\r
-                  itemIndex);\r
-    if (viewId == START_BLINK_BUTTON_ID) {\r
+    if (strcmp(view.GetViewId(), START_BLINK_BUTTON_ID) == 0) {\r
         FlashLightModel::GetInstance().SetBlinkFrequency((FlashLightBlinkFrequency)itemIndex);\r
-        NativeAbility::GetInstance().SwitchSlice(VIEW_FLASHLIGHT, FlashLightAllView::FLASH_LIGHT_PLAY_VIEW);\r
-    } else {\r
-        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "FlashLightBlinkPage::OnClick [Invalid]");\r
+        NativeAbility::GetInstance().SwitchPageInSlice(FlashLightAllView::FLASH_LIGHT_PLAY_VIEW,\r
+            TransitionType::TRANSITION_INVALID, false);\r
     }\r
-    return false;\r
+    return true;\r
 }\r
 }
\ No newline at end of file
index 20ae1c0..1740e60 100644 (file)
@@ -1,76 +1,80 @@
 /*\r
- * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
  * Description: FlashLightColorPage\r
  * Create: 2025-04-24\r
  */\r
 \r
-#include "flashlight/FlashLightColorPage.h"\r
-#include "flashlight/FlashLightPresenter.h"\r
 #include "SlicePageFactory.h"\r
-#include "flashlight/FlashLightView.h"\r
 #include "AppViewIDs.h"\r
 #include "wearable_log.h"\r
 #include "NativeAbility.h"\r
-#include "flashlight/FlashLightModel.h"\r
 #include "main/LoadImg.h"\r
-#include "flashlight/FlashlightUiResourceImage.h"\r
+#include "ui_resource_flashlight.h"\r
+#include "flashlight/FlashLightView.h"\r
+#include "flashlight/FlashLightPresenter.h"\r
+#include "flashlight/FlashLightModel.h"\r
+#include "flashlight/FlashLightColorPage.h"\r
+\r
 namespace OHOS {\r
-static const uint16_t COLOR_LABEL_POS_X = 100;\r
-static const uint16_t COLOR_LABEL_POS_Y = 38;\r
-static const uint16_t COLOR_LABEL_WIDTH = 253;\r
-static const uint16_t COLOR_LABEL_HEIGHT = 53;\r
-static const uint16_t COLOR_LABEL_FONT_SIZE = 38;\r
-static const uint16_t CONTAINER_BLANK_SIZE = 100;\r
+static constexpr uint16_t COLOR_LABEL_POS_X = 100;\r
+static constexpr uint16_t COLOR_LABEL_POS_Y = 38;\r
+static constexpr uint16_t COLOR_LABEL_WIDTH = 253;\r
+static constexpr uint16_t COLOR_LABEL_HEIGHT = 53;\r
+static constexpr uint16_t COLOR_LABEL_FONT_SIZE = 38;\r
+static constexpr uint16_t CONTAINER_BLANK_SIZE = 100;\r
 // 行坐标\r
-const uint16_t FIRST_ROW_COLOR_BUTTON_POS_Y = 104;\r
-const uint16_t SECOND_ROW_COLOR_BUTTON_POS_Y = 225;\r
-const uint16_t THIRD_ROW_COLOR_BUTTON_POS_Y = 346;\r
+static constexpr uint16_t FIRST_ROW_COLOR_BUTTON_POS_Y = 104;\r
+static constexpr uint16_t SECOND_ROW_COLOR_BUTTON_POS_Y = 225;\r
+static constexpr uint16_t THIRD_ROW_COLOR_BUTTON_POS_Y = 346;\r
 // 列坐标\r
-const uint16_t FIRST_COLUMN_COLOR_BUTTON_POS_X = 46;\r
-const uint16_t SECOND_COLUMN_COLOR_BUTTON_POS_X = 169;\r
-const uint16_t THIRD_COLUMN_COLOR_BUTTON_POS_X = 290;\r
+static constexpr uint16_t FIRST_COLUMN_COLOR_BUTTON_POS_X = 46;\r
+static constexpr uint16_t SECOND_COLUMN_COLOR_BUTTON_POS_X = 169;\r
+static constexpr uint16_t THIRD_COLUMN_COLOR_BUTTON_POS_X = 290;\r
 // 按钮大小\r
-const uint16_t COLOR_BUTTON_WIDTH = 117;\r
-const uint16_t COLOR_BUTTON_HEIGHT = 117;\r
-static const uint32_t SELECT_COLOR_BUTTON_RES[10] = {\r
+static constexpr uint16_t COLOR_BUTTON_WIDTH = 117;\r
+static constexpr uint16_t COLOR_BUTTON_HEIGHT = 117;\r
+// 选中按钮偏移值\r
+static constexpr uint16_t COLOR_BUTTON_OFFSET = 8;\r
+static constexpr uint32_t g_selectColorButtonRes[] = {\r
     0,\r
-    IMAGE_CONVERTER_TOOL_COLOR1PRESSBUTTON,\r
-    IMAGE_CONVERTER_TOOL_COLOR2PRESSBUTTON,\r
-    IMAGE_CONVERTER_TOOL_COLOR3PRESSBUTTON,\r
-    IMAGE_CONVERTER_TOOL_COLOR4PRESSBUTTON,\r
-    IMAGE_CONVERTER_TOOL_COLOR5PRESSBUTTON,\r
-    IMAGE_CONVERTER_TOOL_COLOR6PRESSBUTTON,\r
-    IMAGE_CONVERTER_TOOL_COLOR7PRESSBUTTON,\r
-    IMAGE_CONVERTER_TOOL_COLOR8PRESSBUTTON,\r
-    IMAGE_CONVERTER_TOOL_COLOR9PRESSBUTTON,\r
+    IMAGE_FLASHLIGHT_COLOR_WHITE_PRESSBUTTON,\r
+    IMAGE_FLASHLIGHT_COLOR_RED_PRESSBUTTON,\r
+    IMAGE_FLASHLIGHT_COLOR_ORANGE_PRESSBUTTON,\r
+    IMAGE_FLASHLIGHT_COLOR_YELLOW_PRESSBUTTON,\r
+    IMAGE_FLASHLIGHT_COLOR_GREEN_PRESSBUTTON,\r
+    IMAGE_FLASHLIGHT_COLOR_LIGHT_BLUE_PRESSBUTTON,\r
+    IMAGE_FLASHLIGHT_COLOR_DARK_BLUE_PRESSBUTTON,\r
+    IMAGE_FLASHLIGHT_COLOR_PURPLE_PRESSBUTTON,\r
+    IMAGE_FLASHLIGHT_COLOR_MULTI_PRESSBUTTON,\r
 };\r
-static const std::string COLOR1_BUTTON_ID = "color1Button";\r
-static const std::string COLOR2_BUTTON_ID = "color2Button";\r
-static const std::string COLOR3_BUTTON_ID = "color3Button";\r
-static const std::string COLOR4_BUTTON_ID = "color4Button";\r
-static const std::string COLOR5_BUTTON_ID = "color5Button";\r
-static const std::string COLOR6_BUTTON_ID = "color6Button";\r
-static const std::string COLOR7_BUTTON_ID = "color7Button";\r
-static const std::string COLOR8_BUTTON_ID = "color8Button";\r
-static const std::string COLOR9_BUTTON_ID = "color9Button";\r
+static constexpr char *COLOR_WHITE_BUTTON_ID = "colorWhiteButton";\r
+static constexpr char *COLOR_RED_BUTTON_ID = "colorRedButton";\r
+static constexpr char *COLOR_ORANGE_BUTTON_ID = "colorOrangeButton";\r
+static constexpr char *COLOR_YELLOW_BUTTON_ID = "colorYellowButton";\r
+static constexpr char *COLOR_GREEN_BUTTON_ID = "colorGreenButton";\r
+static constexpr char *COLOR_LIGHT_BLUE_BUTTON_ID = "colorLightBlueButton";\r
+static constexpr char *COLOR_DARK_BLUE_BUTTON_ID = "colorDarkBlueButton";\r
+static constexpr char *COLOR_PURPLE_BUTTON_ID = "colorPurpleButton";\r
+static constexpr char *COLOR_MULTI_BUTTON_ID = "colorMultiButton";\r
+\r
 REGIST_SLICE_PAGE(VIEW_FLASHLIGHT, FlashLightAllView::FLASH_LIGHT_COLOR_VIEW, FlashLightColorPage, false);\r
 void FlashLightColorPage::OnStart(void *data)\r
 {\r
-    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "FlashLightColorPage::OnStart");\r
-    uint32_t COLOR_BUTTON_RES[10] = {\r
+    uint32_t colorButtonRes[] = {\r
         0,\r
-        IMAGE_CONVERTER_TOOL_COLOR1BUTTON,\r
-        IMAGE_CONVERTER_TOOL_COLOR2BUTTON,\r
-        IMAGE_CONVERTER_TOOL_COLOR3BUTTON,\r
-        IMAGE_CONVERTER_TOOL_COLOR4BUTTON,\r
-        IMAGE_CONVERTER_TOOL_COLOR5BUTTON,\r
-        IMAGE_CONVERTER_TOOL_COLOR6BUTTON,\r
-        IMAGE_CONVERTER_TOOL_COLOR7BUTTON,\r
-        IMAGE_CONVERTER_TOOL_COLOR8BUTTON,\r
-        IMAGE_CONVERTER_TOOL_COLOR9BUTTON,\r
+        IMAGE_FLASHLIGHT_COLOR_WHITE_BUTTON,\r
+        IMAGE_FLASHLIGHT_COLOR_RED_BUTTON,\r
+        IMAGE_FLASHLIGHT_COLOR_ORANGE_BUTTON,\r
+        IMAGE_FLASHLIGHT_COLOR_YELLOW_BUTTON,\r
+        IMAGE_FLASHLIGHT_COLOR_GREEN_BUTTON,\r
+        IMAGE_FLASHLIGHT_COLOR_LIGHT_BLUE_BUTTON,\r
+        IMAGE_FLASHLIGHT_COLOR_DARK_BLUE_BUTTON,\r
+        IMAGE_FLASHLIGHT_COLOR_PURPLE_BUTTON,\r
+        IMAGE_FLASHLIGHT_COLOR_MULTI_BUTTON,\r
     };\r
-    uint16_t selectColor = (uint16_t)FlashLightModel::GetInstance().GetViewColor();\r
-    COLOR_BUTTON_RES[selectColor] = SELECT_COLOR_BUTTON_RES[selectColor];\r
+\r
+    uint16_t selectColor = (uint16_t)FlashLightModel::GetInstance().GetViewColorId();\r
+    colorButtonRes[selectColor] = g_selectColorButtonRes[selectColor];\r
     if (container_ == nullptr) {\r
         container_ = new UIScrollView();\r
         container_->SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);\r
@@ -86,153 +90,215 @@ void FlashLightColorPage::OnStart(void *data)
     colorLabel_->SetText("灯光颜色");\r
     colorLabel_->SetStyle(STYLE_TEXT_COLOR, Color::White().full);\r
     colorLabel_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
-    colorLabel_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, COLOR_LABEL_FONT_SIZE);\r
+    colorLabel_->SetFont(BOLD_VECTOR_FONT_FILENAME, COLOR_LABEL_FONT_SIZE);\r
     container_->Add(colorLabel_);\r
     colorLabel_->SetVisible(true);\r
     // 第一行颜色按钮\r
-    if (color1Button_ == nullptr) {\r
-        color1Button_ = new UILabelButtonExt();\r
-    }\r
-    color1Button_->SetPosition(FIRST_COLUMN_COLOR_BUTTON_POS_X, FIRST_ROW_COLOR_BUTTON_POS_Y, COLOR_BUTTON_WIDTH,\r
-                               COLOR_BUTTON_HEIGHT);\r
-    color1Button_->SetViewId(COLOR1_BUTTON_ID.c_str());\r
-    color1Button_->SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
-    color1Button_->SetStyleForState(STYLE_BACKGROUND_COLOR, Color::Black().full, UIButton::PRESSED);\r
-    color1Button_->SetAlign(TEXT_ALIGNMENT_CENTER);\r
-    LOADIMG::LoadBtnImage(color1Button_, FLASHLIGHT_IMAGE, COLOR_BUTTON_RES[WHITE_COLOR], COLOR_BUTTON_RES[WHITE_COLOR]);\r
-    container_->Add(color1Button_);\r
-    color1Button_->SetVisible(true);\r
+    if (colorWhiteButton_ == nullptr) {\r
+        colorWhiteButton_ = new UILabelButtonExt();\r
+    }\r
+    if (selectColor == WHITE_COLOR) {\r
+        colorWhiteButton_->SetPosition(FIRST_COLUMN_COLOR_BUTTON_POS_X - COLOR_BUTTON_OFFSET,\r
+                                       FIRST_ROW_COLOR_BUTTON_POS_Y - COLOR_BUTTON_OFFSET, COLOR_BUTTON_WIDTH,\r
+                                       COLOR_BUTTON_HEIGHT);\r
+    } else {\r
+        colorWhiteButton_->SetPosition(FIRST_COLUMN_COLOR_BUTTON_POS_X, FIRST_ROW_COLOR_BUTTON_POS_Y,\r
+                                       COLOR_BUTTON_WIDTH, COLOR_BUTTON_HEIGHT);\r
+    }\r
+    colorWhiteButton_->SetViewId(COLOR_WHITE_BUTTON_ID);\r
+    colorWhiteButton_->SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
+    colorWhiteButton_->SetStyleForState(STYLE_BACKGROUND_COLOR, Color::Black().full, UIButton::PRESSED);\r
+    colorWhiteButton_->SetAlign(TEXT_ALIGNMENT_CENTER);\r
+    LOADIMG::LoadBtnImage(colorWhiteButton_, FLASHLIGHT_IMAGE, colorButtonRes[WHITE_COLOR],\r
+                          colorButtonRes[WHITE_COLOR]);\r
+    container_->Add(colorWhiteButton_);\r
+    colorWhiteButton_->SetVisible(true);\r
 \r
-    if (color2Button_ == nullptr) {\r
-        color2Button_ = new UILabelButtonExt();\r
-    }\r
-    color2Button_->SetPosition(SECOND_COLUMN_COLOR_BUTTON_POS_X, FIRST_ROW_COLOR_BUTTON_POS_Y, COLOR_BUTTON_WIDTH,\r
-                               COLOR_BUTTON_HEIGHT);\r
-    color2Button_->SetViewId(COLOR2_BUTTON_ID.c_str());\r
-    color2Button_->SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
-    color2Button_->SetStyleForState(STYLE_BACKGROUND_COLOR, Color::Black().full, UIButton::PRESSED);\r
-    color2Button_->SetAlign(TEXT_ALIGNMENT_CENTER);\r
-    LOADIMG::LoadBtnImage(color2Button_, FLASHLIGHT_IMAGE, COLOR_BUTTON_RES[RED_COLOR], COLOR_BUTTON_RES[RED_COLOR]);\r
-    container_->Add(color2Button_);\r
-    color2Button_->SetVisible(true);\r
+    if (colorRedButton_ == nullptr) {\r
+        colorRedButton_ = new UILabelButtonExt();\r
+    }\r
+    if (selectColor == RED_COLOR) {\r
+        colorRedButton_->SetPosition(SECOND_COLUMN_COLOR_BUTTON_POS_X - COLOR_BUTTON_OFFSET,\r
+                                     FIRST_ROW_COLOR_BUTTON_POS_Y - COLOR_BUTTON_OFFSET, COLOR_BUTTON_WIDTH,\r
+                                     COLOR_BUTTON_HEIGHT);\r
+    } else {\r
+        colorRedButton_->SetPosition(SECOND_COLUMN_COLOR_BUTTON_POS_X, FIRST_ROW_COLOR_BUTTON_POS_Y, COLOR_BUTTON_WIDTH,\r
+                                     COLOR_BUTTON_HEIGHT);\r
+    }\r
+    colorRedButton_->SetViewId(COLOR_RED_BUTTON_ID);\r
+    colorRedButton_->SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
+    colorRedButton_->SetStyleForState(STYLE_BACKGROUND_COLOR, Color::Black().full, UIButton::PRESSED);\r
+    colorRedButton_->SetAlign(TEXT_ALIGNMENT_CENTER);\r
+    LOADIMG::LoadBtnImage(colorRedButton_, FLASHLIGHT_IMAGE, colorButtonRes[RED_COLOR], colorButtonRes[RED_COLOR]);\r
+    container_->Add(colorRedButton_);\r
+    colorRedButton_->SetVisible(true);\r
 \r
-    if (color3Button_ == nullptr) {\r
-        color3Button_ = new UILabelButtonExt();\r
-    }\r
-    color3Button_->SetPosition(THIRD_COLUMN_COLOR_BUTTON_POS_X, FIRST_ROW_COLOR_BUTTON_POS_Y, COLOR_BUTTON_WIDTH,\r
-                               COLOR_BUTTON_HEIGHT);\r
-    color3Button_->SetViewId(COLOR3_BUTTON_ID.c_str());\r
-    color3Button_->SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
-    color3Button_->SetStyleForState(STYLE_BACKGROUND_COLOR, Color::Black().full, UIButton::PRESSED);\r
-    color3Button_->SetAlign(TEXT_ALIGNMENT_CENTER);\r
-    LOADIMG::LoadBtnImage(color3Button_, FLASHLIGHT_IMAGE, COLOR_BUTTON_RES[ORANGE_COLOR],\r
-                          COLOR_BUTTON_RES[ORANGE_COLOR]);\r
-    container_->Add(color3Button_);\r
-    color3Button_->SetVisible(true);\r
+    if (colorOrangeButton_ == nullptr) {\r
+        colorOrangeButton_ = new UILabelButtonExt();\r
+    }\r
+    if (selectColor == ORANGE_COLOR) {\r
+        colorOrangeButton_->SetPosition(THIRD_COLUMN_COLOR_BUTTON_POS_X - COLOR_BUTTON_OFFSET,\r
+                                        FIRST_ROW_COLOR_BUTTON_POS_Y - COLOR_BUTTON_OFFSET, COLOR_BUTTON_WIDTH,\r
+                                        COLOR_BUTTON_HEIGHT);\r
+    } else {\r
+        colorOrangeButton_->SetPosition(THIRD_COLUMN_COLOR_BUTTON_POS_X, FIRST_ROW_COLOR_BUTTON_POS_Y,\r
+                                        COLOR_BUTTON_WIDTH, COLOR_BUTTON_HEIGHT);\r
+    }\r
+    colorOrangeButton_->SetViewId(COLOR_ORANGE_BUTTON_ID);\r
+    colorOrangeButton_->SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
+    colorOrangeButton_->SetStyleForState(STYLE_BACKGROUND_COLOR, Color::Black().full, UIButton::PRESSED);\r
+    colorOrangeButton_->SetAlign(TEXT_ALIGNMENT_CENTER);\r
+    LOADIMG::LoadBtnImage(colorOrangeButton_, FLASHLIGHT_IMAGE, colorButtonRes[ORANGE_COLOR],\r
+                          colorButtonRes[ORANGE_COLOR]);\r
+    container_->Add(colorOrangeButton_);\r
+    colorOrangeButton_->SetVisible(true);\r
 \r
     // 第二行颜色按钮\r
-    if (color4Button_ == nullptr) {\r
-        color4Button_ = new UILabelButtonExt();\r
-    }\r
-    color4Button_->SetPosition(FIRST_COLUMN_COLOR_BUTTON_POS_X, SECOND_ROW_COLOR_BUTTON_POS_Y, COLOR_BUTTON_WIDTH,\r
-                               COLOR_BUTTON_HEIGHT);\r
-    color4Button_->SetViewId(COLOR4_BUTTON_ID.c_str());\r
-    color4Button_->SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
-    color4Button_->SetStyleForState(STYLE_BACKGROUND_COLOR, Color::Black().full, UIButton::PRESSED);\r
-    color4Button_->SetAlign(TEXT_ALIGNMENT_CENTER);\r
-    LOADIMG::LoadBtnImage(color4Button_, FLASHLIGHT_IMAGE, COLOR_BUTTON_RES[YELLOW_COLOR],\r
-                          COLOR_BUTTON_RES[YELLOW_COLOR]);\r
-    container_->Add(color4Button_);\r
-    color4Button_->SetVisible(true);\r
+    if (colorYellowButton_ == nullptr) {\r
+        colorYellowButton_ = new UILabelButtonExt();\r
+    }\r
+    if (selectColor == YELLOW_COLOR) {\r
+        colorYellowButton_->SetPosition(FIRST_COLUMN_COLOR_BUTTON_POS_X - COLOR_BUTTON_OFFSET,\r
+                                        SECOND_ROW_COLOR_BUTTON_POS_Y - COLOR_BUTTON_OFFSET, COLOR_BUTTON_WIDTH,\r
+                                        COLOR_BUTTON_HEIGHT);\r
+    } else {\r
+        colorYellowButton_->SetPosition(FIRST_COLUMN_COLOR_BUTTON_POS_X, SECOND_ROW_COLOR_BUTTON_POS_Y,\r
+                                        COLOR_BUTTON_WIDTH, COLOR_BUTTON_HEIGHT);\r
+    }\r
+    colorYellowButton_->SetViewId(COLOR_YELLOW_BUTTON_ID);\r
+    colorYellowButton_->SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
+    colorYellowButton_->SetStyleForState(STYLE_BACKGROUND_COLOR, Color::Black().full, UIButton::PRESSED);\r
+    colorYellowButton_->SetAlign(TEXT_ALIGNMENT_CENTER);\r
+    LOADIMG::LoadBtnImage(colorYellowButton_, FLASHLIGHT_IMAGE, colorButtonRes[YELLOW_COLOR],\r
+                          colorButtonRes[YELLOW_COLOR]);\r
+    container_->Add(colorYellowButton_);\r
+    colorYellowButton_->SetVisible(true);\r
 \r
-    if (color5Button_ == nullptr) {\r
-        color5Button_ = new UILabelButtonExt();\r
-    }\r
-    color5Button_->SetPosition(SECOND_COLUMN_COLOR_BUTTON_POS_X, SECOND_ROW_COLOR_BUTTON_POS_Y, COLOR_BUTTON_WIDTH,\r
-                               COLOR_BUTTON_HEIGHT);\r
-    color5Button_->SetViewId(COLOR5_BUTTON_ID.c_str());\r
-    color5Button_->SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
-    color5Button_->SetStyleForState(STYLE_BACKGROUND_COLOR, Color::Black().full, UIButton::PRESSED);\r
-    color5Button_->SetAlign(TEXT_ALIGNMENT_CENTER);\r
-    LOADIMG::LoadBtnImage(color5Button_, FLASHLIGHT_IMAGE, COLOR_BUTTON_RES[GREEN_COLOR], COLOR_BUTTON_RES[GREEN_COLOR]);\r
-    container_->Add(color5Button_);\r
-    color5Button_->SetVisible(true);\r
+    if (colorGreenButton_ == nullptr) {\r
+        colorGreenButton_ = new UILabelButtonExt();\r
+    }\r
+    if (selectColor == GREEN_COLOR) {\r
+        colorGreenButton_->SetPosition(SECOND_COLUMN_COLOR_BUTTON_POS_X - COLOR_BUTTON_OFFSET,\r
+                                       SECOND_ROW_COLOR_BUTTON_POS_Y - COLOR_BUTTON_OFFSET, COLOR_BUTTON_WIDTH,\r
+                                       COLOR_BUTTON_HEIGHT);\r
+    } else {\r
+        colorGreenButton_->SetPosition(SECOND_COLUMN_COLOR_BUTTON_POS_X, SECOND_ROW_COLOR_BUTTON_POS_Y,\r
+                                       COLOR_BUTTON_WIDTH, COLOR_BUTTON_HEIGHT);\r
+    }\r
 \r
-    if (color6Button_ == nullptr) {\r
-        color6Button_ = new UILabelButtonExt();\r
-    }\r
-    color6Button_->SetPosition(THIRD_COLUMN_COLOR_BUTTON_POS_X, SECOND_ROW_COLOR_BUTTON_POS_Y, COLOR_BUTTON_WIDTH,\r
-                               COLOR_BUTTON_HEIGHT);\r
-    color6Button_->SetViewId(COLOR6_BUTTON_ID.c_str());\r
-    color6Button_->SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
-    color6Button_->SetStyleForState(STYLE_BACKGROUND_COLOR, Color::Black().full, UIButton::PRESSED);\r
-    color6Button_->SetAlign(TEXT_ALIGNMENT_CENTER);\r
-    LOADIMG::LoadBtnImage(color6Button_, FLASHLIGHT_IMAGE, COLOR_BUTTON_RES[LIGHT_BLUE_COLOR],\r
-                          COLOR_BUTTON_RES[LIGHT_BLUE_COLOR]);\r
+    colorGreenButton_->SetViewId(COLOR_GREEN_BUTTON_ID);\r
+    colorGreenButton_->SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
+    colorGreenButton_->SetStyleForState(STYLE_BACKGROUND_COLOR, Color::Black().full, UIButton::PRESSED);\r
+    colorGreenButton_->SetAlign(TEXT_ALIGNMENT_CENTER);\r
+    LOADIMG::LoadBtnImage(colorGreenButton_, FLASHLIGHT_IMAGE, colorButtonRes[GREEN_COLOR],\r
+                          colorButtonRes[GREEN_COLOR]);\r
+    container_->Add(colorGreenButton_);\r
+    colorGreenButton_->SetVisible(true);\r
 \r
-    container_->Add(color6Button_);\r
-    color6Button_->SetVisible(true);\r
+    if (colorLightBlueButton_ == nullptr) {\r
+        colorLightBlueButton_ = new UILabelButtonExt();\r
+    }\r
+    if (selectColor == LIGHT_BLUE_COLOR) {\r
+        colorLightBlueButton_->SetPosition(THIRD_COLUMN_COLOR_BUTTON_POS_X - COLOR_BUTTON_OFFSET,\r
+                                           SECOND_ROW_COLOR_BUTTON_POS_Y - COLOR_BUTTON_OFFSET, COLOR_BUTTON_WIDTH,\r
+                                           COLOR_BUTTON_HEIGHT);\r
+    } else {\r
+        colorLightBlueButton_->SetPosition(THIRD_COLUMN_COLOR_BUTTON_POS_X, SECOND_ROW_COLOR_BUTTON_POS_Y,\r
+                                           COLOR_BUTTON_WIDTH, COLOR_BUTTON_HEIGHT);\r
+    }\r
+    colorLightBlueButton_->SetViewId(COLOR_LIGHT_BLUE_BUTTON_ID);\r
+    colorLightBlueButton_->SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
+    colorLightBlueButton_->SetStyleForState(STYLE_BACKGROUND_COLOR, Color::Black().full, UIButton::PRESSED);\r
+    colorLightBlueButton_->SetAlign(TEXT_ALIGNMENT_CENTER);\r
+    LOADIMG::LoadBtnImage(colorLightBlueButton_, FLASHLIGHT_IMAGE, colorButtonRes[LIGHT_BLUE_COLOR],\r
+                          colorButtonRes[LIGHT_BLUE_COLOR]);\r
+\r
+    container_->Add(colorLightBlueButton_);\r
+    colorLightBlueButton_->SetVisible(true);\r
 \r
     // 第三行颜色按钮\r
-    if (color7Button_ == nullptr) {\r
-        color7Button_ = new UILabelButtonExt();\r
-    }\r
-    color7Button_->SetPosition(FIRST_COLUMN_COLOR_BUTTON_POS_X, THIRD_ROW_COLOR_BUTTON_POS_Y, COLOR_BUTTON_WIDTH,\r
-                               COLOR_BUTTON_HEIGHT);\r
-    color7Button_->SetViewId(COLOR7_BUTTON_ID.c_str());\r
-    color7Button_->SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
-    color7Button_->SetStyleForState(STYLE_BACKGROUND_COLOR, Color::Black().full, UIButton::PRESSED);\r
-    color7Button_->SetAlign(TEXT_ALIGNMENT_CENTER);\r
-    LOADIMG::LoadBtnImage(color7Button_, FLASHLIGHT_IMAGE, COLOR_BUTTON_RES[DARK_BLUE_COLOR],\r
-                          COLOR_BUTTON_RES[DARK_BLUE_COLOR]);\r
-    container_->Add(color7Button_);\r
-    color7Button_->SetVisible(true);\r
+    if (colorDarkBlueButton_ == nullptr) {\r
+        colorDarkBlueButton_ = new UILabelButtonExt();\r
+    }\r
+    if (selectColor == DARK_BLUE_COLOR) {\r
+        colorDarkBlueButton_->SetPosition(FIRST_COLUMN_COLOR_BUTTON_POS_X - COLOR_BUTTON_OFFSET,\r
+                                          THIRD_ROW_COLOR_BUTTON_POS_Y - COLOR_BUTTON_OFFSET, COLOR_BUTTON_WIDTH,\r
+                                          COLOR_BUTTON_HEIGHT);\r
+    } else {\r
+        colorDarkBlueButton_->SetPosition(FIRST_COLUMN_COLOR_BUTTON_POS_X, THIRD_ROW_COLOR_BUTTON_POS_Y,\r
+                                          COLOR_BUTTON_WIDTH, COLOR_BUTTON_HEIGHT);\r
+    }\r
+    colorDarkBlueButton_->SetViewId(COLOR_DARK_BLUE_BUTTON_ID);\r
+    colorDarkBlueButton_->SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
+    colorDarkBlueButton_->SetStyleForState(STYLE_BACKGROUND_COLOR, Color::Black().full, UIButton::PRESSED);\r
+    colorDarkBlueButton_->SetAlign(TEXT_ALIGNMENT_CENTER);\r
+    LOADIMG::LoadBtnImage(colorDarkBlueButton_, FLASHLIGHT_IMAGE, colorButtonRes[DARK_BLUE_COLOR],\r
+                          colorButtonRes[DARK_BLUE_COLOR]);\r
+    container_->Add(colorDarkBlueButton_);\r
+    colorDarkBlueButton_->SetVisible(true);\r
 \r
-    if (color8Button_ == nullptr) {\r
-        color8Button_ = new UILabelButtonExt();\r
-    }\r
-    color8Button_->SetPosition(SECOND_COLUMN_COLOR_BUTTON_POS_X, THIRD_ROW_COLOR_BUTTON_POS_Y, COLOR_BUTTON_WIDTH,\r
-                               COLOR_BUTTON_HEIGHT);\r
-    color8Button_->SetViewId(COLOR8_BUTTON_ID.c_str());\r
-    color8Button_->SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
-    color8Button_->SetStyleForState(STYLE_BACKGROUND_COLOR, Color::Black().full, UIButton::PRESSED);\r
-    color8Button_->SetAlign(TEXT_ALIGNMENT_CENTER);\r
-    LOADIMG::LoadBtnImage(color8Button_, FLASHLIGHT_IMAGE, COLOR_BUTTON_RES[PURPLE_COLOR],\r
-                          COLOR_BUTTON_RES[PURPLE_COLOR]);\r
-    container_->Add(color8Button_);\r
-    color8Button_->SetVisible(true);\r
+    if (colorPurpleButton_ == nullptr) {\r
+        colorPurpleButton_ = new UILabelButtonExt();\r
+    }\r
+    if (selectColor == PURPLE_COLOR) {\r
+        colorPurpleButton_->SetPosition(SECOND_COLUMN_COLOR_BUTTON_POS_X - COLOR_BUTTON_OFFSET,\r
+                                        THIRD_ROW_COLOR_BUTTON_POS_Y - COLOR_BUTTON_OFFSET, COLOR_BUTTON_WIDTH,\r
+                                        COLOR_BUTTON_HEIGHT);\r
+    } else {\r
+        colorPurpleButton_->SetPosition(SECOND_COLUMN_COLOR_BUTTON_POS_X, THIRD_ROW_COLOR_BUTTON_POS_Y,\r
+                                        COLOR_BUTTON_WIDTH, COLOR_BUTTON_HEIGHT);\r
+    }\r
+    colorPurpleButton_->SetViewId(COLOR_PURPLE_BUTTON_ID);\r
+    colorPurpleButton_->SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
+    colorPurpleButton_->SetStyleForState(STYLE_BACKGROUND_COLOR, Color::Black().full, UIButton::PRESSED);\r
+    colorPurpleButton_->SetAlign(TEXT_ALIGNMENT_CENTER);\r
+    LOADIMG::LoadBtnImage(colorPurpleButton_, FLASHLIGHT_IMAGE, colorButtonRes[PURPLE_COLOR],\r
+                          colorButtonRes[PURPLE_COLOR]);\r
+    container_->Add(colorPurpleButton_);\r
+    colorPurpleButton_->SetVisible(true);\r
 \r
-    if (color9Button_ == nullptr) {\r
-        color9Button_ = new UILabelButtonExt();\r
-    }\r
-    color9Button_->SetPosition(THIRD_COLUMN_COLOR_BUTTON_POS_X, THIRD_ROW_COLOR_BUTTON_POS_Y, COLOR_BUTTON_WIDTH,\r
-                               COLOR_BUTTON_HEIGHT);\r
-    color9Button_->SetViewId(COLOR9_BUTTON_ID.c_str());\r
-    color9Button_->SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
-    color9Button_->SetStyleForState(STYLE_BACKGROUND_COLOR, Color::Black().full, UIButton::PRESSED);\r
-    color9Button_->SetAlign(TEXT_ALIGNMENT_CENTER);\r
-    LOADIMG::LoadBtnImage(color9Button_, FLASHLIGHT_IMAGE, COLOR_BUTTON_RES[MULTI_COLOR], COLOR_BUTTON_RES[MULTI_COLOR]);\r
-    container_->Add(color9Button_);\r
-    color9Button_->SetVisible(true);\r
+    if (colorMultiButton_ == nullptr) {\r
+        colorMultiButton_ = new UILabelButtonExt();\r
+    }\r
+    if (selectColor == MULTI_COLOR) {\r
+        colorMultiButton_->SetPosition(THIRD_COLUMN_COLOR_BUTTON_POS_X - COLOR_BUTTON_OFFSET,\r
+                                       THIRD_ROW_COLOR_BUTTON_POS_Y - COLOR_BUTTON_OFFSET, COLOR_BUTTON_WIDTH,\r
+                                       COLOR_BUTTON_HEIGHT);\r
+    } else {\r
+        colorMultiButton_->SetPosition(THIRD_COLUMN_COLOR_BUTTON_POS_X, THIRD_ROW_COLOR_BUTTON_POS_Y,\r
+                                       COLOR_BUTTON_WIDTH, COLOR_BUTTON_HEIGHT);\r
+    }\r
+    colorMultiButton_->SetViewId(COLOR_MULTI_BUTTON_ID);\r
+    colorMultiButton_->SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
+    colorMultiButton_->SetStyleForState(STYLE_BACKGROUND_COLOR, Color::Black().full, UIButton::PRESSED);\r
+    colorMultiButton_->SetAlign(TEXT_ALIGNMENT_CENTER);\r
+    LOADIMG::LoadBtnImage(colorMultiButton_, FLASHLIGHT_IMAGE, colorButtonRes[MULTI_COLOR],\r
+                          colorButtonRes[MULTI_COLOR]);\r
+    container_->Add(colorMultiButton_);\r
+    colorMultiButton_->SetVisible(true);\r
 \r
     // 设置界面组件回调函数\r
     container_->SetOnDragListener(this);\r
     // 设置手电筒多个颜色按钮回调函数\r
-    color3Button_->SetOnClickListener(this);\r
-    color1Button_->SetOnClickListener(this);\r
-    color2Button_->SetOnClickListener(this);\r
-    color6Button_->SetOnClickListener(this);\r
-    color5Button_->SetOnClickListener(this);\r
-    color4Button_->SetOnClickListener(this);\r
-    color9Button_->SetOnClickListener(this);\r
-    color8Button_->SetOnClickListener(this);\r
-    color7Button_->SetOnClickListener(this);\r
+    colorOrangeButton_->SetOnClickListener(this);\r
+    colorWhiteButton_->SetOnClickListener(this);\r
+    colorRedButton_->SetOnClickListener(this);\r
+    colorLightBlueButton_->SetOnClickListener(this);\r
+    colorGreenButton_->SetOnClickListener(this);\r
+    colorYellowButton_->SetOnClickListener(this);\r
+    colorMultiButton_->SetOnClickListener(this);\r
+    colorPurpleButton_->SetOnClickListener(this);\r
+    colorDarkBlueButton_->SetOnClickListener(this);\r
     AddViewToPageContainer(container_);\r
 }\r
 \r
+FlashLightColorPage::FlashLightColorPage()\r
+{\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "FlashLightColorPage::FlashLightColorPage");\r
+}\r
+\r
 FlashLightColorPage::~FlashLightColorPage()\r
 {\r
-    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "FlashLightColorPage::~FlashLightColorPage");\r
     if (container_ != nullptr) {\r
         container_->RemoveAll();\r
         delete container_;\r
@@ -242,89 +308,95 @@ FlashLightColorPage::~FlashLightColorPage()
         delete colorLabel_;\r
         colorLabel_ = nullptr;\r
     }\r
-    if (color1Button_ != nullptr) {\r
-        delete color1Button_;\r
-        color1Button_ = nullptr;\r
+    if (colorWhiteButton_ != nullptr) {\r
+        delete colorWhiteButton_;\r
+        colorWhiteButton_ = nullptr;\r
     }\r
-    if (color2Button_ != nullptr) {\r
-        delete color2Button_;\r
-        color2Button_ = nullptr;\r
+    if (colorRedButton_ != nullptr) {\r
+        delete colorRedButton_;\r
+        colorRedButton_ = nullptr;\r
     }\r
-    if (color3Button_ != nullptr) {\r
-        delete color3Button_;\r
-        color3Button_ = nullptr;\r
+    if (colorOrangeButton_ != nullptr) {\r
+        delete colorOrangeButton_;\r
+        colorOrangeButton_ = nullptr;\r
     }\r
-    if (color4Button_ != nullptr) {\r
-        delete color4Button_;\r
-        color4Button_ = nullptr;\r
+    if (colorYellowButton_ != nullptr) {\r
+        delete colorYellowButton_;\r
+        colorYellowButton_ = nullptr;\r
     }\r
-    if (color5Button_ != nullptr) {\r
-        delete color5Button_;\r
-        color5Button_ = nullptr;\r
+    if (colorGreenButton_ != nullptr) {\r
+        delete colorGreenButton_;\r
+        colorGreenButton_ = nullptr;\r
     }\r
-    if (color6Button_ != nullptr) {\r
-        delete color6Button_;\r
-        color6Button_ = nullptr;\r
+    if (colorLightBlueButton_ != nullptr) {\r
+        delete colorLightBlueButton_;\r
+        colorLightBlueButton_ = nullptr;\r
     }\r
-    if (color7Button_ != nullptr) {\r
-        delete color7Button_;\r
-        color7Button_ = nullptr;\r
+    if (colorDarkBlueButton_ != nullptr) {\r
+        delete colorDarkBlueButton_;\r
+        colorDarkBlueButton_ = nullptr;\r
     }\r
-    if (color8Button_ != nullptr) {\r
-        delete color8Button_;\r
-        color8Button_ = nullptr;\r
+    if (colorPurpleButton_ != nullptr) {\r
+        delete colorPurpleButton_;\r
+        colorPurpleButton_ = nullptr;\r
     }\r
-    if (color9Button_ != nullptr) {\r
-        delete color9Button_;\r
-        color9Button_ = nullptr;\r
+    if (colorMultiButton_ != nullptr) {\r
+        delete colorMultiButton_;\r
+        colorMultiButton_ = nullptr;\r
     }\r
     ImageCacheManager::GetInstance().UnloadSingleRes(FLASHLIGHT_IMAGE);\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "FlashLightColorPage::~FlashLightColorPage");\r
 }\r
 \r
 bool FlashLightColorPage::OnDrag(UIView &view, const DragEvent &event)\r
 {\r
-    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "FlashLightColorPage::OnDrag");\r
     if ((event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT) && (event.GetDeltaX() > X_DRAG_OFFSET) &&\r
         (event.GetDeltaX() > (DOUBLES * MATH_ABS(event.GetDeltaY())))) {\r
-        NativeAbility::GetInstance().SwitchSlice(VIEW_FLASHLIGHT, FlashLightAllView::FLASH_LIGHT_SET_VIEW);\r
+        NativeAbility::GetInstance().SwitchPageInSlice(FlashLightAllView::FLASH_LIGHT_SET_VIEW,\r
+            TransitionType::TRANSITION_INVALID, false);\r
     }\r
-    return false;\r
+    return true;\r
 }\r
 \r
 bool FlashLightColorPage::OnClick(UIView &view, const ClickEvent &event)\r
 {\r
-    std::string viewId = view.GetViewId();\r
-    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "FlashLightColorPage::OnClick [%s]", viewId.c_str());\r
-    if (viewId == COLOR1_BUTTON_ID) {\r
-        FlashLightModel::GetInstance().SetViewColor(FlashLightColorAttribute::WHITE_COLOR);\r
-        NativeAbility::GetInstance().SwitchSlice(VIEW_FLASHLIGHT, FlashLightAllView::FLASH_LIGHT_PLAY_VIEW);\r
-    } else if (viewId == COLOR2_BUTTON_ID) {\r
-        FlashLightModel::GetInstance().SetViewColor(FlashLightColorAttribute::RED_COLOR);\r
-        NativeAbility::GetInstance().SwitchSlice(VIEW_FLASHLIGHT, FlashLightAllView::FLASH_LIGHT_PLAY_VIEW);\r
-    } else if (viewId == COLOR3_BUTTON_ID) {\r
-        FlashLightModel::GetInstance().SetViewColor(FlashLightColorAttribute::ORANGE_COLOR);\r
-        NativeAbility::GetInstance().SwitchSlice(VIEW_FLASHLIGHT, FlashLightAllView::FLASH_LIGHT_PLAY_VIEW);\r
-    } else if (viewId == COLOR4_BUTTON_ID) {\r
-        FlashLightModel::GetInstance().SetViewColor(FlashLightColorAttribute::YELLOW_COLOR);\r
-        NativeAbility::GetInstance().SwitchSlice(VIEW_FLASHLIGHT, FlashLightAllView::FLASH_LIGHT_PLAY_VIEW);\r
-    } else if (viewId == COLOR5_BUTTON_ID) {\r
-        FlashLightModel::GetInstance().SetViewColor(FlashLightColorAttribute::GREEN_COLOR);\r
-        NativeAbility::GetInstance().SwitchSlice(VIEW_FLASHLIGHT, FlashLightAllView::FLASH_LIGHT_PLAY_VIEW);\r
-    } else if (viewId == COLOR6_BUTTON_ID) {\r
-        FlashLightModel::GetInstance().SetViewColor(FlashLightColorAttribute::LIGHT_BLUE_COLOR);\r
-        NativeAbility::GetInstance().SwitchSlice(VIEW_FLASHLIGHT, FlashLightAllView::FLASH_LIGHT_PLAY_VIEW);\r
-    } else if (viewId == COLOR7_BUTTON_ID) {\r
-        FlashLightModel::GetInstance().SetViewColor(FlashLightColorAttribute::DARK_BLUE_COLOR);\r
-        NativeAbility::GetInstance().SwitchSlice(VIEW_FLASHLIGHT, FlashLightAllView::FLASH_LIGHT_PLAY_VIEW);\r
-    } else if (viewId == COLOR8_BUTTON_ID) {\r
-        FlashLightModel::GetInstance().SetViewColor(FlashLightColorAttribute::PURPLE_COLOR);\r
-        NativeAbility::GetInstance().SwitchSlice(VIEW_FLASHLIGHT, FlashLightAllView::FLASH_LIGHT_PLAY_VIEW);\r
-    } else if (viewId == COLOR9_BUTTON_ID) {\r
-        FlashLightModel::GetInstance().SetViewColor(FlashLightColorAttribute::MULTI_COLOR);\r
-        NativeAbility::GetInstance().SwitchSlice(VIEW_FLASHLIGHT, FlashLightAllView::FLASH_LIGHT_PLAY_VIEW);\r
-    } else {\r
-        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "FlashLightColorPage::OnClick [Invalid]");\r
+    if (strcmp(view.GetViewId(), COLOR_WHITE_BUTTON_ID) == 0) {\r
+        FlashLightModel::GetInstance().SetViewColorId(FlashLightColorAttribute::WHITE_COLOR);\r
+        NativeAbility::GetInstance().SwitchPageInSlice(FlashLightAllView::FLASH_LIGHT_PLAY_VIEW,\r
+            TransitionType::TRANSITION_INVALID, false);\r
+    } else if (strcmp(view.GetViewId(), COLOR_RED_BUTTON_ID) == 0) {\r
+        FlashLightModel::GetInstance().SetViewColorId(FlashLightColorAttribute::RED_COLOR);\r
+        NativeAbility::GetInstance().SwitchPageInSlice(FlashLightAllView::FLASH_LIGHT_PLAY_VIEW,\r
+            TransitionType::TRANSITION_INVALID, false);\r
+    } else if (strcmp(view.GetViewId(), COLOR_ORANGE_BUTTON_ID) == 0) {\r
+        FlashLightModel::GetInstance().SetViewColorId(FlashLightColorAttribute::ORANGE_COLOR);\r
+        NativeAbility::GetInstance().SwitchPageInSlice(FlashLightAllView::FLASH_LIGHT_PLAY_VIEW,\r
+            TransitionType::TRANSITION_INVALID, false);\r
+    } else if (strcmp(view.GetViewId(), COLOR_YELLOW_BUTTON_ID) == 0) {\r
+        FlashLightModel::GetInstance().SetViewColorId(FlashLightColorAttribute::YELLOW_COLOR);\r
+        NativeAbility::GetInstance().SwitchPageInSlice(FlashLightAllView::FLASH_LIGHT_PLAY_VIEW,\r
+            TransitionType::TRANSITION_INVALID, false);\r
+    } else if (strcmp(view.GetViewId(), COLOR_GREEN_BUTTON_ID) == 0) {\r
+        FlashLightModel::GetInstance().SetViewColorId(FlashLightColorAttribute::GREEN_COLOR);\r
+        NativeAbility::GetInstance().SwitchPageInSlice(FlashLightAllView::FLASH_LIGHT_PLAY_VIEW,\r
+            TransitionType::TRANSITION_INVALID, false);\r
+    } else if (strcmp(view.GetViewId(), COLOR_LIGHT_BLUE_BUTTON_ID) == 0) {\r
+        FlashLightModel::GetInstance().SetViewColorId(FlashLightColorAttribute::LIGHT_BLUE_COLOR);\r
+        NativeAbility::GetInstance().SwitchPageInSlice(FlashLightAllView::FLASH_LIGHT_PLAY_VIEW,\r
+            TransitionType::TRANSITION_INVALID, false);\r
+    } else if (strcmp(view.GetViewId(), COLOR_DARK_BLUE_BUTTON_ID) == 0) {\r
+        FlashLightModel::GetInstance().SetViewColorId(FlashLightColorAttribute::DARK_BLUE_COLOR);\r
+        NativeAbility::GetInstance().SwitchPageInSlice(FlashLightAllView::FLASH_LIGHT_PLAY_VIEW,\r
+            TransitionType::TRANSITION_INVALID, false);\r
+    } else if (strcmp(view.GetViewId(), COLOR_PURPLE_BUTTON_ID) == 0) {\r
+        FlashLightModel::GetInstance().SetViewColorId(FlashLightColorAttribute::PURPLE_COLOR);\r
+        NativeAbility::GetInstance().SwitchPageInSlice(FlashLightAllView::FLASH_LIGHT_PLAY_VIEW,\r
+            TransitionType::TRANSITION_INVALID, false);\r
+    } else if (strcmp(view.GetViewId(), COLOR_MULTI_BUTTON_ID) == 0) {\r
+        FlashLightModel::GetInstance().SetViewColorId(FlashLightColorAttribute::MULTI_COLOR);\r
+        NativeAbility::GetInstance().SwitchPageInSlice(FlashLightAllView::FLASH_LIGHT_PLAY_VIEW,\r
+            TransitionType::TRANSITION_INVALID, false);\r
     }\r
-    return false;\r
+    return true;\r
 }\r
 }
\ No newline at end of file
index 273a464..269ddfe 100644 (file)
@@ -1,15 +1,16 @@
 /*\r
- * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
  * Description: FlashLightModel\r
  * Create: 2025-04-24\r
  */\r
-#include "flashlight/FlashLightModel.h"\r
+\r
 #ifdef BUILD_IN_LINUX\r
 #include "localtime.h"\r
 #endif\r
+#include "flashlight/FlashLightModel.h"\r
 \r
 namespace OHOS {\r
-static const uint32_t TIME_DISPLAY_NUM = 10;\r
+static constexpr uint32_t TIME_DISPLAY_NUM = 10;\r
 FlashLightModel::FlashLightModel(FlashLightColorAttribute color, FlashLightBlinkFrequency blinkFrequency)\r
 {\r
     color_ = color;\r
@@ -24,12 +25,12 @@ FlashLightModel &FlashLightModel::GetInstance()
     return instance;\r
 }\r
 \r
-FlashLightColorAttribute FlashLightModel::GetViewColor()\r
+FlashLightColorAttribute FlashLightModel::GetViewColorId()\r
 {\r
     return color_;\r
 }\r
 \r
-void FlashLightModel::SetViewColor(FlashLightColorAttribute color)\r
+void FlashLightModel::SetViewColorId(FlashLightColorAttribute color)\r
 {\r
     color_ = color;\r
 }\r
index ba91d99..33792e2 100644 (file)
@@ -1,71 +1,72 @@
 /*\r
- * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
  * Description: FlashLightPage\r
  * Create: 2025-04-24\r
  */\r
+\r
 #include <string>\r
-#include "flashlight/FlashLightPage.h"\r
-#include "flashlight/FlashLightPresenter.h"\r
-#include "flashlight/FlashLightModel.h"\r
 #include "SlicePageFactory.h"\r
-#include "flashlight/FlashLightView.h"\r
 #include "AppViewIDs.h"\r
 #include "wearable_log.h"\r
 #include "main/LoadImg.h"\r
-#include "flashlight/FlashlightUiResourceImage.h"\r
+#include "ui_resource_flashlight.h"\r
+#include "flashlight/FlashLightView.h"\r
+#include "flashlight/FlashLightPresenter.h"\r
+#include "flashlight/FlashLightModel.h"\r
+#include "flashlight/FlashLightPage.h"\r
 \r
 namespace OHOS {\r
-static const uint16_t SWITCH_BUTTON_POS_X = 168;\r
-static const uint16_t SWITCH_BUTTON_POS_Y = 168;\r
-static const uint16_t SWITCH_BUTTON_WIDTH = 119;\r
-static const uint16_t SWITCH_BUTTON_HEIGHT = 119;\r
-static const uint16_t SWITCH_LABEL_POS_X = 168;\r
-static const uint16_t SWITCH_LABEL_POS_Y = 308;\r
-static const uint16_t SWITCH_LABEL_WIDTH = 128;\r
-static const uint16_t SWITCH_LABEL_HEIGHT = 46;\r
-static const uint16_t SWITCH_LABEL_FONT_SIZE = 32;\r
-static const uint16_t TIME_LABEL_FONT_SIZE = 38;\r
-static const uint16_t IMAGE_VIEW_POS_X = 213;\r
-static const uint16_t IMAGE_VIEW_POS_Y = 414;\r
-static const uint16_t TIME_TEXT_POS_X = 151;\r
-static const uint16_t TIME_TEXT_POS_Y = 31;\r
-static const uint16_t TIME_TEXT_WIDTH = 153;\r
-static const uint16_t TIME_TEXT_HEIGHT = 53;\r
-static const uint16_t Y_OFFSET = 300;\r
-static const std::string SWITCH_BUTTON_ID = "switch";\r
+static constexpr uint16_t SWITCH_BUTTON_POS_X = 168;\r
+static constexpr uint16_t SWITCH_BUTTON_POS_Y = 168;\r
+static constexpr uint16_t SWITCH_BUTTON_WIDTH = 119;\r
+static constexpr uint16_t SWITCH_BUTTON_HEIGHT = 119;\r
+static constexpr uint16_t SWITCH_LABEL_POS_X = 168;\r
+static constexpr uint16_t SWITCH_LABEL_POS_Y = 308;\r
+static constexpr uint16_t SWITCH_LABEL_WIDTH = 128;\r
+static constexpr uint16_t SWITCH_LABEL_HEIGHT = 46;\r
+static constexpr uint16_t SWITCH_LABEL_FONT_SIZE = 32;\r
+static constexpr uint16_t TIME_LABEL_FONT_SIZE = 38;\r
+static constexpr uint16_t IMAGE_VIEW_POS_X = 213;\r
+static constexpr uint16_t IMAGE_VIEW_POS_Y = 414;\r
+static constexpr uint16_t TIME_TEXT_POS_X = 151;\r
+static constexpr uint16_t TIME_TEXT_POS_Y = 31;\r
+static constexpr uint16_t TIME_TEXT_WIDTH = 153;\r
+static constexpr uint16_t TIME_TEXT_HEIGHT = 53;\r
+static constexpr uint16_t Y_OFFSET = 300;\r
+static constexpr char *SWITCH_BUTTON_ID = "switch";\r
 \r
-REGIST_SLICE_PAGE(VIEW_FLASHLIGHT, FlashLightAllView::FLASH_LIGTH_VIEW, FlashLightPage, true);\r
+REGIST_SLICE_PAGE(VIEW_FLASHLIGHT, FlashLightAllView::FLASH_LIGHT_VIEW, FlashLightPage, true);\r
 void FlashLightPage::OnStart(void *data)\r
 {\r
-    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "FlashLightPage::OnStart");\r
     if (container_ == nullptr) {\r
         container_ = new UIScrollView();\r
         container_->SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);\r
     }\r
 \r
-    if (OnLabel_ == nullptr) {\r
-        OnLabel_ = new UILabel();\r
-    }\r
-    OnLabel_->SetPosition(SWITCH_LABEL_POS_X, SWITCH_LABEL_POS_Y, SWITCH_LABEL_WIDTH, SWITCH_LABEL_HEIGHT);\r
-    OnLabel_->SetText("点击照明");\r
-    OnLabel_->SetStyle(STYLE_TEXT_COLOR, Color::White().full);\r
-    OnLabel_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SWITCH_LABEL_FONT_SIZE);\r
-    OnLabel_->SetStyle(STYLE_BACKGROUND_COLOR, OPA_OPAQUE);\r
-    OnLabel_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
-    OnLabel_->SetVisible(true);\r
-    container_->Add(OnLabel_);\r
+    if (tipsLabel_ == nullptr) {\r
+        tipsLabel_ = new UILabel();\r
+    }\r
+    tipsLabel_->SetPosition(SWITCH_LABEL_POS_X, SWITCH_LABEL_POS_Y, SWITCH_LABEL_WIDTH, SWITCH_LABEL_HEIGHT);\r
+    tipsLabel_->SetText("点击照明");\r
+    tipsLabel_->SetStyle(STYLE_TEXT_COLOR, Color::White().full);\r
+    tipsLabel_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SWITCH_LABEL_FONT_SIZE);\r
+    tipsLabel_->SetStyle(STYLE_BACKGROUND_COLOR, OPA_OPAQUE);\r
+    tipsLabel_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+    tipsLabel_->SetVisible(true);\r
+    container_->Add(tipsLabel_);\r
 \r
-    if (flashLightOn_ == nullptr) {\r
-        flashLightOn_ = new UILabelButton();\r
-    }\r
-    flashLightOn_->SetPosition(SWITCH_BUTTON_POS_X, SWITCH_BUTTON_POS_Y, SWITCH_BUTTON_WIDTH, SWITCH_BUTTON_HEIGHT);\r
-    flashLightOn_->SetViewId(SWITCH_BUTTON_ID.c_str());\r
-    flashLightOn_->SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
-    flashLightOn_->SetStyleForState(STYLE_BACKGROUND_COLOR, Color::Black().full, UIButton::PRESSED);\r
-    LOADIMG::LoadBtnImage(flashLightOn_, FLASHLIGHT_IMAGE, IMAGE_CONVERTER_TOOL_FLASHLIGHTON,\r
-                          IMAGE_CONVERTER_TOOL_FLASHLIGHTON);\r
-    flashLightOn_->SetVisible(true);\r
-    container_->Add(flashLightOn_);\r
+    if (flashLightButtonOn_ == nullptr) {\r
+        flashLightButtonOn_ = new UILabelButton();\r
+    }\r
+    flashLightButtonOn_->SetPosition(SWITCH_BUTTON_POS_X, SWITCH_BUTTON_POS_Y,\r
+                                     SWITCH_BUTTON_WIDTH, SWITCH_BUTTON_HEIGHT);\r
+    flashLightButtonOn_->SetViewId(SWITCH_BUTTON_ID);\r
+    flashLightButtonOn_->SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
+    flashLightButtonOn_->SetStyleForState(STYLE_BACKGROUND_COLOR, Color::Black().full, UIButton::PRESSED);\r
+    LOADIMG::LoadBtnImage(flashLightButtonOn_, FLASHLIGHT_IMAGE, IMAGE_FLASHLIGHT_FLASHLIGHTON,\r
+                          IMAGE_FLASHLIGHT_FLASHLIGHTON);\r
+    flashLightButtonOn_->SetVisible(true);\r
+    container_->Add(flashLightButtonOn_);\r
 \r
     // 创建时间显示组件\r
     if (systemTime_ == nullptr) {\r
@@ -87,77 +88,79 @@ void FlashLightPage::OnStart(void *data)
     }\r
     timeAnimator_->Start();\r
 \r
-    // Add ImageView to App\r
     if (imageArrow_ == nullptr) {\r
         imageArrow_ = new UIImageView();\r
     }\r
     imageArrow_->SetPosition(IMAGE_VIEW_POS_X, IMAGE_VIEW_POS_Y);\r
     container_->Add(imageArrow_);\r
     imageArrow_->SetVisible(true);\r
-    LOADIMG::LoadImageViewImg(imageArrow_, FLASHLIGHT_IMAGE, IMAGE_CONVERTER_TOOL_DOWNARROW);\r
+    LOADIMG::LoadImageViewImg(imageArrow_, FLASHLIGHT_IMAGE, IMAGE_FLASHLIGHT_DOWNARROW);\r
 \r
-    flashLightOn_->SetOnClickListener(this);\r
+    flashLightButtonOn_->SetOnClickListener(this);\r
     container_->SetOnDragListener(this);\r
     AddViewToPageContainer(container_);\r
 }\r
 \r
+FlashLightPage::FlashLightPage()\r
+{\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "FlashLightPage::FlashLightPage");\r
+}\r
+\r
 FlashLightPage::~FlashLightPage()\r
 {\r
-    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "FlashLightPage::~FlashLightPage");\r
-    if (timeAnimator_ != nullptr) {\r
-        timeAnimator_->Stop();\r
-    }\r
     if (container_ != nullptr) {\r
         container_->RemoveAll();\r
         delete container_;\r
         container_ = nullptr;\r
     }\r
-    if (flashLightOn_ != nullptr) {\r
-        delete flashLightOn_;\r
-        flashLightOn_ = nullptr;\r
+    if (flashLightButtonOn_ != nullptr) {\r
+        delete flashLightButtonOn_;\r
+        flashLightButtonOn_ = nullptr;\r
     }\r
     if (systemTime_ != nullptr) {\r
         delete systemTime_;\r
         systemTime_ = nullptr;\r
     }\r
+    if (tipsLabel_ != nullptr) {\r
+        delete tipsLabel_;\r
+        tipsLabel_ = nullptr;\r
+    }\r
     if (imageArrow_ != nullptr) {\r
         delete imageArrow_;\r
         imageArrow_ = nullptr;\r
     }\r
-    if (timeAnimator_ != nullptr) {\r
-        delete timeAnimator_;\r
-        timeAnimator_ = nullptr;\r
-    }\r
     if (timeCallback_ != nullptr) {\r
         delete timeCallback_;\r
         timeCallback_ = nullptr;\r
     }\r
+    if (timeAnimator_ != nullptr) {\r
+        delete timeAnimator_;\r
+        timeAnimator_ = nullptr;\r
+    }\r
     ImageCacheManager::GetInstance().UnloadSingleRes(FLASHLIGHT_IMAGE);\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "FlashLightPage::~FlashLightPage");\r
 }\r
 \r
 bool FlashLightPage::OnDrag(UIView &view, const DragEvent &event)\r
 {\r
-    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "FlashLightColorPage::OnDrag");\r
     if ((event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT) && (event.GetDeltaX() > X_DRAG_OFFSET) &&\r
         (event.GetDeltaX() > (DOUBLES * MATH_ABS(event.GetDeltaY())))) {\r
-        NativeAbility::GetInstance().ChangeSlice(VIEW_APPLIST);\r
+        NativeAbility::GetInstance().ChangeSliceToApplist();\r
     } else if ((event.GetDragDirection() == DragEvent::DIRECTION_BOTTOM_TO_TOP) &&\r
                (event.GetStartPoint().y > Y_OFFSET)) {\r
-        NativeAbility::GetInstance().SwitchSlice(VIEW_FLASHLIGHT, FlashLightAllView::FLASH_LIGHT_SET_VIEW);\r
+        NativeAbility::GetInstance().SwitchPageInSlice(FlashLightAllView::FLASH_LIGHT_SET_VIEW,\r
+            TransitionType::TRANSITION_INVALID, false);\r
     }\r
-    return false;\r
+    return true;\r
 }\r
 \r
 bool FlashLightPage::OnClick(UIView &view, const ClickEvent &event)\r
 {\r
-    std::string viewId = view.GetViewId();\r
-    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "FlashLightPage::OnClick [%s]", viewId.c_str());\r
-    if (viewId == SWITCH_BUTTON_ID) {\r
-        NativeAbility::GetInstance().SwitchSlice(VIEW_FLASHLIGHT, FlashLightAllView::FLASH_LIGHT_PLAY_VIEW);\r
-    } else {\r
-        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "FlashLightPage::OnClick [Invalid]");\r
-    }\r
-    return false;\r
+    if (strcmp(view.GetViewId(), SWITCH_BUTTON_ID) == 0) {\r
+        NativeAbility::GetInstance().SwitchPageInSlice(FlashLightAllView::FLASH_LIGHT_PLAY_VIEW,\r
+            TransitionType::TRANSITION_INVALID, false);\r
+    }\r
+    return true;\r
 }\r
 \r
 void FlashLightPage::TimeAnimatorCallback::Callback(UIView *view)\r
index fdf35dc..8650285 100644 (file)
 /*\r
- * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
  * Description: FlashLightPlayPage\r
  * Create: 2025-04-24\r
  */\r
 \r
-#include "flashlight/FlashLightPlayPage.h"\r
-#include "flashlight/FlashLightPresenter.h"\r
 #include "SlicePageFactory.h"\r
-#include "flashlight/FlashLightView.h"\r
 #include "wearable_log.h"\r
 #include "AppViewIDs.h"\r
 #include "NativeAbility.h"\r
 #include "main/LoadImg.h"\r
+#include "flashlight/FlashLightView.h"\r
+#include "flashlight/FlashLightPresenter.h"\r
+#include "flashlight/FlashLightPlayPage.h"\r
 \r
 namespace OHOS {\r
-static const uint32_t FLASHLIGHT_PAGE_RES[10] = {\r
-    IMAGE_CONVERTER_TOOL_PLAYBLACKPAGE, IMAGE_CONVERTER_TOOL_PLAY1PAGE, IMAGE_CONVERTER_TOOL_PLAY2PAGE,\r
-    IMAGE_CONVERTER_TOOL_PLAY3PAGE,     IMAGE_CONVERTER_TOOL_PLAY4PAGE, IMAGE_CONVERTER_TOOL_PLAY5PAGE,\r
-    IMAGE_CONVERTER_TOOL_PLAY6PAGE,     IMAGE_CONVERTER_TOOL_PLAY7PAGE, IMAGE_CONVERTER_TOOL_PLAY8PAGE,\r
-    IMAGE_CONVERTER_TOOL_PLAY9PAGE,\r
+static constexpr uint32_t g_flashLightPageRes[] = {\r
+    IMAGE_FLASHLIGHT_PLAY_BLACK_PAGE,      IMAGE_FLASHLIGHT_PLAY_WHITE_PAGE,     IMAGE_FLASHLIGHT_PLAY_RED_PAGE,\r
+    IMAGE_FLASHLIGHT_PLAY_ORANGE_PAGE,     IMAGE_FLASHLIGHT_PLAY_YELLOW_PAGE,    IMAGE_FLASHLIGHT_PLAY_GREEN_PAGE,\r
+    IMAGE_FLASHLIGHT_PLAY_LIGHT_BLUE_PAGE, IMAGE_FLASHLIGHT_PLAY_DARK_BLUE_PAGE, IMAGE_FLASHLIGHT_PLAY_PURPLE_PAGE,\r
+    IMAGE_FLASHLIGHT_PLAY_MULTI_PAGE,\r
 };\r
-static const uint32_t FLASHLIGHT_BLINK_FREQ[3] = {500, 100, 0};\r
-static const uint32_t IMAGE_NUM = 2;\r
-static const std::string PLAY_VIEW_ID = "flashLightPlayPage";\r
+static constexpr uint32_t g_flashLightBlinkFreq[] = {500, 100, 0};\r
+static constexpr char *PLAY_VIEW_ID = "flashLightPlayPage";\r
 \r
 REGIST_SLICE_PAGE(VIEW_FLASHLIGHT, FlashLightAllView::FLASH_LIGHT_PLAY_VIEW, FlashLightPlayPage, false);\r
 void FlashLightPlayPage::OnStart(void *data)\r
 {\r
-    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "FlashLightPlayPage::OnStart");\r
     if (container_ == nullptr) {\r
         container_ = new UIScrollView();\r
         container_->SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);\r
-        container_->SetViewId(PLAY_VIEW_ID.c_str());\r
+        container_->SetViewId(PLAY_VIEW_ID);\r
     }\r
-    uint16_t colorIndex = (uint16_t)FlashLightModel::GetInstance().GetViewColor();\r
+    uint16_t colorIndex = (uint16_t)FlashLightModel::GetInstance().GetViewColorId();\r
     uint16_t blinkIndex = (uint16_t)FlashLightModel::GetInstance().GetBlinkFrequency();\r
-    if (playImageAnimal == nullptr) {\r
-        playImageAnimal = new UIImageAnimatorView();\r
+    if (playImageAnimal_ == nullptr) {\r
+        playImageAnimal_ = new UIImageAnimatorView();\r
     }\r
-    playImageInfo[0].imageInfo =\r
-        ImageCacheManager::GetInstance().LoadOneInMultiRes(FLASHLIGHT_PAGE_RES[colorIndex], FLASHLIGHT_IMAGE);\r
-    playImageInfo[0].imageType = IMG_SRC_IMAGE_INFO;\r
-    playImageInfo[0].pos.x = 0;\r
-    playImageInfo[0].pos.y = 0;\r
-    playImageInfo[0].width = HORIZONTAL_RESOLUTION;\r
-    playImageInfo[0].height = VERTICAL_RESOLUTION;\r
-    playImageInfo[1].imageInfo =\r
-        ImageCacheManager::GetInstance().LoadOneInMultiRes(FLASHLIGHT_PAGE_RES[0], FLASHLIGHT_IMAGE);\r
-    playImageInfo[1].imageType = IMG_SRC_IMAGE_INFO;\r
-    playImageInfo[1].pos.x = 0;\r
-    playImageInfo[1].pos.y = 0;\r
-    playImageInfo[1].width = HORIZONTAL_RESOLUTION;\r
-    playImageInfo[1].height = VERTICAL_RESOLUTION;\r
-    playImageAnimal->SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);\r
-    playImageAnimal->SetImageAnimatorSrc(playImageInfo, IMAGE_NUM, FLASHLIGHT_BLINK_FREQ[blinkIndex]);\r
-    playImageAnimal->SetRepeat(true);\r
-    playImageAnimal->SetAutoEnable(false);\r
-    playImageAnimal->SetResizeMode(UIImageView::FILL);\r
-    container_->Add(playImageAnimal);\r
+    playImageInfo_[0].imageInfo =\r
+        ImageCacheManager::GetInstance().LoadOneInMultiRes(g_flashLightPageRes[colorIndex], FLASHLIGHT_IMAGE);\r
+    playImageInfo_[0].imageType = IMG_SRC_IMAGE_INFO;\r
+    playImageInfo_[0].pos.x = 0;\r
+    playImageInfo_[0].pos.y = 0;\r
+    playImageInfo_[0].width = HORIZONTAL_RESOLUTION;\r
+    playImageInfo_[0].height = VERTICAL_RESOLUTION;\r
+    playImageInfo_[1].imageInfo =\r
+        ImageCacheManager::GetInstance().LoadOneInMultiRes(g_flashLightPageRes[0], FLASHLIGHT_IMAGE);\r
+    playImageInfo_[1].imageType = IMG_SRC_IMAGE_INFO;\r
+    playImageInfo_[1].pos.x = 0;\r
+    playImageInfo_[1].pos.y = 0;\r
+    playImageInfo_[1].width = HORIZONTAL_RESOLUTION;\r
+    playImageInfo_[1].height = VERTICAL_RESOLUTION;\r
+    playImageAnimal_->SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);\r
+    playImageAnimal_->SetImageAnimatorSrc(playImageInfo_, IMAGE_NUM, g_flashLightBlinkFreq[blinkIndex]);\r
+    playImageAnimal_->SetRepeat(true);\r
+    playImageAnimal_->SetAutoEnable(false);\r
+    playImageAnimal_->SetResizeMode(UIImageView::FILL);\r
+    container_->Add(playImageAnimal_);\r
 \r
-    playImageAnimal->Start();\r
+    playImageAnimal_->Start();\r
     container_->SetOnDragListener(this);\r
     container_->SetOnClickListener(this);\r
     AddViewToPageContainer(container_);\r
 }\r
 \r
+FlashLightPlayPage::FlashLightPlayPage()\r
+{\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "FlashLightPlayPage::FlashLightPlayPage");\r
+}\r
+\r
 FlashLightPlayPage::~FlashLightPlayPage()\r
 {\r
-    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "FlashLightPlayPage::~FlashLightPlayPage");\r
     if (container_ != nullptr) {\r
         container_->RemoveAll();\r
         delete container_;\r
         container_ = nullptr;\r
     }\r
-    if (playImageAnimal != nullptr) {\r
-        playImageAnimal->Stop();\r
-        delete playImageAnimal;\r
-        playImageAnimal = nullptr;\r
+    if (playImageAnimal_ != nullptr) {\r
+        playImageAnimal_->Stop();\r
+        delete playImageAnimal_;\r
+        playImageAnimal_ = nullptr;\r
     }\r
     ImageCacheManager::GetInstance().UnloadSingleRes(FLASHLIGHT_IMAGE);\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "FlashLightPlayPage::~FlashLightPlayPage");\r
 }\r
 \r
 bool FlashLightPlayPage::OnDrag(UIView &view, const DragEvent &event)\r
 {\r
-    std::string id = view.GetViewId();\r
-    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "FlashLightColorPage::OnDrag [%s]", id.c_str());\r
     if ((event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT) && (event.GetDeltaX() > X_DRAG_OFFSET) &&\r
         (event.GetDeltaX() > (DOUBLES * MATH_ABS(event.GetDeltaY())))) {\r
-        NativeAbility::GetInstance().ChangeSlice(VIEW_APPLIST);\r
+        NativeAbility::GetInstance().ChangeSliceToApplist();\r
     }\r
-    return false;\r
+    return true;\r
 }\r
 \r
 bool FlashLightPlayPage::OnClick(UIView &view, const ClickEvent &event)\r
 {\r
-    std::string viewId = view.GetViewId();\r
-    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "FlashLightPlayPage::OnClick [%s]", viewId.c_str());\r
-    if (viewId == PLAY_VIEW_ID) {\r
-        NativeAbility::GetInstance().SwitchSlice(VIEW_FLASHLIGHT, FlashLightAllView::FLASH_LIGTH_VIEW);\r
+    if (strcmp(view.GetViewId(), PLAY_VIEW_ID) == 0) {\r
+        NativeAbility::GetInstance().SwitchPageInSlice(FlashLightAllView::FLASH_LIGHT_VIEW,\r
+            TransitionType::TRANSITION_INVALID, false);\r
     }\r
-    return false;\r
+    return true;\r
 }\r
 }
\ No newline at end of file
index 57bb513..df1b8ba 100644 (file)
@@ -1,5 +1,5 @@
 /*\r
- * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
  * Description: FlashLightPresenter\r
  * Create: 2025-04-24\r
  */\r
@@ -9,6 +9,5 @@
 #include "NativeRegisterManager.h"\r
 \r
 namespace OHOS {\r
-REGIST_MENU(VIEW_FLASHLIGHT, FlashLightView, FlashLightPresenter, FLASHLIGHT_MAIN_ICON, PNG_APPLIST_DEFAULT_IMG,\r
-            "手电筒");\r
+REGIST_MENU(VIEW_FLASHLIGHT, FlashLightView, FlashLightPresenter, FLASHLIGHT_ICON, FLASHLIGHT_ICON, "手电筒");\r
 }\r
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/flashlight/src/FlashLightRecoverPage.cpp b/code/sdk/application/wearable/evb/nativeapp/nativeui/flashlight/src/FlashLightRecoverPage.cpp
new file mode 100644 (file)
index 0000000..7813e43
--- /dev/null
@@ -0,0 +1,135 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: FlashLightRecoverPage\r
+ * Create: 2025-04-24\r
+ */\r
+\r
+#include "SlicePageFactory.h"\r
+#include "AppViewIDs.h"\r
+#include "wearable_log.h"\r
+#include "NativeAbility.h"\r
+#include "main/LoadImg.h"\r
+#include "ui_resource_flashlight.h"\r
+#include "flashlight/FlashLightView.h"\r
+#include "flashlight/FlashLightModel.h"\r
+#include "flashlight/FlashLightPresenter.h"\r
+#include "flashlight/FlashLightRecoverPage.h"\r
+\r
+namespace OHOS {\r
+static constexpr uint16_t RECOVER_LABEL_POS_X = 15;\r
+static constexpr uint16_t RECOVER_LABEL_POS_Y = 185;\r
+static constexpr uint16_t RECOVER_LABEL_WIDTH = 424;\r
+static constexpr uint16_t RECOVER_LABEL_HEIGHT = 50;\r
+static constexpr uint16_t RECOVER_LABEL_FONT_SIZE = 36;\r
+static constexpr uint16_t CANCLE_BUTTON_POS_X = 115;\r
+static constexpr uint16_t CANCLE_BUTTON_POS_Y = 300;\r
+static constexpr uint16_t CONFIRM_BUTTON_POS_X = 255;\r
+static constexpr uint16_t CONFIRM_BUTTON_POS_Y = 300;\r
+static constexpr uint16_t CANCLE_BUTTON_WIDTH = 85;\r
+static constexpr uint16_t CANCLE_BUTTON_HEIGHT = 85;\r
+static constexpr char *CANCLE_BUTTON_ID = "cancle";\r
+static constexpr char *CONFIRM_BUTTON_ID = "confirm";\r
+\r
+REGIST_SLICE_PAGE(VIEW_FLASHLIGHT, FlashLightAllView::FLASH_LIGHT_RECOVER_VIEW, FlashLightRecoverPage, false);\r
+void FlashLightRecoverPage::OnStart(void *data)\r
+{\r
+    if (container_ == nullptr) {\r
+        container_ = new UIScrollView();\r
+        container_->SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);\r
+        container_->SetStyle(STYLE_BACKGROUND_OPA, 0);\r
+    }\r
+\r
+    if (recoverLabel_ == nullptr) {\r
+        recoverLabel_ = new UILabel();\r
+    }\r
+    recoverLabel_->SetPosition(RECOVER_LABEL_POS_X, RECOVER_LABEL_POS_Y, RECOVER_LABEL_WIDTH, RECOVER_LABEL_HEIGHT);\r
+    recoverLabel_->SetText("是否恢复默认设置");\r
+    recoverLabel_->SetStyle(STYLE_TEXT_COLOR, Color::White().full);\r
+    recoverLabel_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+    recoverLabel_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, RECOVER_LABEL_FONT_SIZE);\r
+    // Add to rootView\r
+    container_->Add(recoverLabel_);\r
+    recoverLabel_->SetVisible(true);\r
+\r
+    if (cancelButton_ == nullptr) {\r
+        cancelButton_ = new UILabelButtonExt();\r
+    }\r
+    cancelButton_->SetPosition(CANCLE_BUTTON_POS_X, CANCLE_BUTTON_POS_Y, CANCLE_BUTTON_WIDTH, CANCLE_BUTTON_HEIGHT);\r
+    cancelButton_->SetViewId(CANCLE_BUTTON_ID);\r
+    LOADIMG::LoadBtnImage(cancelButton_, FLASHLIGHT_IMAGE, IMAGE_FLASHLIGHT_RECOVERCANCLE,\r
+                          IMAGE_FLASHLIGHT_RECOVERCANCLE);\r
+    cancelButton_->SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
+    cancelButton_->SetStyleForState(STYLE_BACKGROUND_COLOR, Color::Black().full, UIButton::PRESSED);\r
+    container_->Add(cancelButton_);\r
+    cancelButton_->SetVisible(true);\r
+\r
+    if (confirmButton_ == nullptr) {\r
+        confirmButton_ = new UILabelButtonExt();\r
+    }\r
+    confirmButton_->SetPosition(CONFIRM_BUTTON_POS_X, CONFIRM_BUTTON_POS_Y, CANCLE_BUTTON_WIDTH, CANCLE_BUTTON_HEIGHT);\r
+    confirmButton_->SetViewId(CONFIRM_BUTTON_ID);\r
+    LOADIMG::LoadBtnImage(confirmButton_, FLASHLIGHT_IMAGE, IMAGE_FLASHLIGHT_RECOVERCONFIRM,\r
+                          IMAGE_FLASHLIGHT_RECOVERCONFIRM);\r
+    confirmButton_->SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
+    confirmButton_->SetStyleForState(STYLE_BACKGROUND_COLOR, Color::Black().full, UIButton::PRESSED);\r
+    container_->Add(confirmButton_);\r
+    confirmButton_->SetVisible(true);\r
+\r
+    // 设置界面组件回调函数\r
+    container_->SetOnDragListener(this);\r
+    cancelButton_->SetOnClickListener(this);\r
+    confirmButton_->SetOnClickListener(this);\r
+    AddViewToPageContainer(container_);\r
+}\r
+\r
+FlashLightRecoverPage::FlashLightRecoverPage()\r
+{\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "FlashLightRecoverPage::FlashLightRecoverPage");\r
+}\r
+\r
+FlashLightRecoverPage::~FlashLightRecoverPage()\r
+{\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "FlashLightRecoverPage::~FlashLightRecoverPage");\r
+    if (container_ != nullptr) {\r
+        container_->RemoveAll();\r
+        delete container_;\r
+        container_ = nullptr;\r
+    }\r
+    if (recoverLabel_ != nullptr) {\r
+        delete recoverLabel_;\r
+        recoverLabel_ = nullptr;\r
+    }\r
+    if (cancelButton_ != nullptr) {\r
+        delete cancelButton_;\r
+        cancelButton_ = nullptr;\r
+    }\r
+    if (confirmButton_ != nullptr) {\r
+        delete confirmButton_;\r
+        confirmButton_ = nullptr;\r
+    }\r
+    ImageCacheManager::GetInstance().UnloadSingleRes(FLASHLIGHT_IMAGE);\r
+}\r
+\r
+bool FlashLightRecoverPage::OnDrag(UIView &view, const DragEvent &event)\r
+{\r
+    if ((event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT) && (event.GetDeltaX() > X_DRAG_OFFSET) &&\r
+        (event.GetDeltaX() > (DOUBLES * MATH_ABS(event.GetDeltaY())))) {\r
+        NativeAbility::GetInstance().SwitchPageInSlice(FlashLightAllView::FLASH_LIGHT_SET_VIEW,\r
+            TransitionType::TRANSITION_INVALID, false);\r
+    }\r
+    return true;\r
+}\r
+\r
+bool FlashLightRecoverPage::OnClick(UIView &view, const ClickEvent &event)\r
+{\r
+    if (strcmp(view.GetViewId(), CONFIRM_BUTTON_ID) == 0) {\r
+        NativeAbility::GetInstance().SwitchPageInSlice(FlashLightAllView::FLASH_LIGHT_VIEW,\r
+            TransitionType::TRANSITION_INVALID, false);\r
+        FlashLightModel::GetInstance().SetDefault();\r
+    } else if (strcmp(view.GetViewId(), CANCLE_BUTTON_ID) == 0) {\r
+        NativeAbility::GetInstance().SwitchPageInSlice(FlashLightAllView::FLASH_LIGHT_SET_VIEW,\r
+            TransitionType::TRANSITION_INVALID, false);\r
+    }\r
+    return true;\r
+}\r
+}
\ No newline at end of file
index 32f330b..9b06a98 100644 (file)
@@ -1,15 +1,15 @@
 /*\r
- * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
  * Description: FlashLightSetItemView\r
  * Create: 2025-02-15\r
  */\r
 \r
 #include "wearable_log.h"\r
 #include "UiConfig.h"\r
-#include "flashlight/FlashLightSetItemView.h"\r
 #include "screensetting/ScreenModels.h"\r
 #include "main/LoadImg.h"\r
 #include "flashlight/FlashLightModel.h"\r
+#include "flashlight/FlashLightSetItemView.h"\r
 \r
 namespace OHOS {\r
 static constexpr uint16_t ITEM_X = 0;\r
@@ -34,62 +34,52 @@ static constexpr uint16_t ITEM_LABEL_FONT = 32;
 FlashLightSetItemView::FlashLightSetItemView()\r
 {\r
     WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "FlashLightSetItemView");\r
-    SetPosition(ITEM_X, ITEM_Y, ITEM_W, ITEM_H);\r
-    SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
-    SetStyle(STYLE_BACKGROUND_OPA, UN_OPACITY);\r
-    SetTouchable(true);\r
-\r
-    sIcon.SetPosition(ICON_X, ICON_Y);\r
-    sIcon.SetStyle(STYLE_IMAGE_OPA, OPA_OPAQUE);\r
+    sIcon_.SetPosition(ICON_X, ICON_Y);\r
+    sIcon_.SetStyle(STYLE_IMAGE_OPA, OPA_OPAQUE);\r
 \r
-    sLabel.SetPosition(LABEL_X, LABEL_Y);\r
-    sLabel.Resize(LABEL_W, LABEL_H);\r
-    sLabel.SetFont(DEFAULT_VECTOR_FONT_FILENAME, LABEL_FONT);\r
-    sLabel.SetAlign(TEXT_ALIGNMENT_LEFT, TEXT_ALIGNMENT_CENTER);\r
-    sLabel.SetStyle(STYLE_TEXT_OPA, OPA_OPAQUE);\r
-    sLabel.SetStyle(STYLE_TEXT_COLOR, Color::White().full);\r
-    sLabel.SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
-    sLabel.SetStyle(STYLE_BACKGROUND_OPA, OPA_OPAQUE);\r
+    sLabel_.SetPosition(LABEL_X, LABEL_Y);\r
+    sLabel_.Resize(LABEL_W, LABEL_H);\r
+    sLabel_.SetFont(DEFAULT_VECTOR_FONT_FILENAME, LABEL_FONT);\r
+    sLabel_.SetAlign(TEXT_ALIGNMENT_LEFT, TEXT_ALIGNMENT_CENTER);\r
+    sLabel_.SetStyle(STYLE_TEXT_OPA, OPA_OPAQUE);\r
+    sLabel_.SetStyle(STYLE_TEXT_COLOR, Color::White().full);\r
+    sLabel_.SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
+    sLabel_.SetStyle(STYLE_BACKGROUND_OPA, OPA_OPAQUE);\r
 \r
-    itemLabel.SetPosition(ITEM_LABEL_X, ITEM_LABEL_Y);\r
-    itemLabel.Resize(ITEM_LABEL_W, ITEM_LABEL_H);\r
-    itemLabel.SetFont(DEFAULT_VECTOR_FONT_FILENAME, ITEM_LABEL_FONT);\r
-    itemLabel.SetAlign(TEXT_ALIGNMENT_LEFT, TEXT_ALIGNMENT_CENTER);\r
-    itemLabel.SetStyle(STYLE_TEXT_OPA, OPA_OPAQUE);\r
-    itemLabel.SetStyle(STYLE_TEXT_COLOR, Color::Gray().full);\r
-    itemLabel.SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
-    itemLabel.SetStyle(STYLE_BACKGROUND_OPA, OPA_OPAQUE);\r
+    itemLabel_.SetPosition(ITEM_LABEL_X, ITEM_LABEL_Y);\r
+    itemLabel_.Resize(ITEM_LABEL_W, ITEM_LABEL_H);\r
+    itemLabel_.SetFont(DEFAULT_VECTOR_FONT_FILENAME, ITEM_LABEL_FONT);\r
+    itemLabel_.SetAlign(TEXT_ALIGNMENT_LEFT, TEXT_ALIGNMENT_CENTER);\r
+    itemLabel_.SetStyle(STYLE_TEXT_OPA, OPA_OPAQUE);\r
+    itemLabel_.SetStyle(STYLE_TEXT_COLOR, Color::Gray().full);\r
+    itemLabel_.SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
+    itemLabel_.SetStyle(STYLE_BACKGROUND_OPA, OPA_OPAQUE);\r
 \r
-    sNextImage.SetPosition(IMAGE_X, IMAGE_Y);\r
-    sNextImage.SetStyle(STYLE_IMAGE_OPA, OPA_OPAQUE);\r
-    LOADIMG::LoadImageViewImg(&sNextImage, FLASHLIGHT_IMAGE, IMAGE_CONVERTER_TOOL_RIGHTARROW);\r
+    sNextImage_.SetPosition(IMAGE_X, IMAGE_Y);\r
+    sNextImage_.SetStyle(STYLE_IMAGE_OPA, OPA_OPAQUE);\r
+    LOADIMG::LoadImageViewImg(&sNextImage_, FLASHLIGHT_IMAGE, IMAGE_FLASHLIGHT_RIGHTARROW);\r
 \r
-    Add(&sIcon);\r
-    Add(&sLabel);\r
-    Add(&itemLabel);\r
-    Add(&sNextImage);\r
+    Add(&sIcon_);\r
+    Add(&sLabel_);\r
+    Add(&itemLabel_);\r
+    Add(&sNextImage_);\r
 }\r
 \r
 FlashLightSetItemView::~FlashLightSetItemView()\r
 {\r
-    Remove(&sIcon);\r
-    Remove(&sLabel);\r
-    Remove(&itemLabel);\r
-    Remove(&sNextImage);\r
+    Remove(&sIcon_);\r
+    Remove(&sLabel_);\r
+    Remove(&itemLabel_);\r
+    Remove(&sNextImage_);\r
     ImageCacheManager::GetInstance().UnloadSingleRes(FLASHLIGHT_IMAGE);\r
 }\r
 \r
 void FlashLightSetItemView::SetItemInfo(const FlashLightSetItem itemInfo)\r
 {\r
-    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "FlashLightSetItemView::SetItemInfo %[s]", itemInfo.viewId.c_str());\r
-    sItemInfo = itemInfo;\r
-    sLabel.SetText(itemInfo.label.c_str());\r
-    itemLabel.SetText(itemInfo.itemLabel.c_str());\r
-    LOADIMG::LoadImageViewImg(&sIcon, FLASHLIGHT_IMAGE, itemInfo.resId);\r
-}\r
-\r
-const char *FlashLightSetItemView::GetViewId() const\r
-{\r
-    return sItemInfo.viewId.c_str();\r
+    itemInfo_ = itemInfo;\r
+    sLabel_.SetText(itemInfo.label.c_str());\r
+    itemLabel_.SetText(itemInfo.itemLabel.c_str());\r
+    SetViewId(itemInfo_.viewId.c_str());\r
+    LOADIMG::LoadImageViewImg(&sIcon_, FLASHLIGHT_IMAGE, itemInfo.resId);\r
 }\r
 }
\ No newline at end of file
index 7a2361a..6d99afb 100644 (file)
@@ -1,48 +1,80 @@
 /*\r
- * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
  * Description: FlashLightSetPage\r
  * Create: 2025-04-24\r
  */\r
 \r
-#include "flashlight/FlashLightSetPage.h"\r
-#include "flashlight/FlashLightPresenter.h"\r
-#include "SlicePageFactory.h"\r
-#include "flashlight/FlashLightView.h"\r
-#include "flashlight/FlashLightModel.h"\r
 #include "AppViewIDs.h"\r
 #include "wearable_log.h"\r
 #include "NativeAbility.h"\r
-#include <iostream>\r
 #include "main/LoadImg.h"\r
+#include "SlicePageFactory.h"\r
+#include "flashlight/FlashLightView.h"\r
+#include "flashlight/FlashLightModel.h"\r
+#include "flashlight/FlashLightPresenter.h"\r
+#include "flashlight/FlashLightSetPage.h"\r
 \r
 namespace OHOS {\r
+static constexpr uint16_t SET_LABEL_POS_X = 117;\r
+static constexpr uint16_t SET_LABEL_POS_Y = 31;\r
+static constexpr uint16_t SET_LABEL_WIDTH = 220;\r
+static constexpr uint16_t SET_LABEL_HEIGHT = 53;\r
+static constexpr uint16_t SET_LABEL_FONT_SIZE = 38;\r
+static constexpr uint16_t SET_LIST_POS_X = 59;\r
+static constexpr uint16_t SET_LIST_POS_Y = 127;\r
+static constexpr uint16_t SET_LIST_WIDTH = 340;\r
+static constexpr uint16_t SET_LIST_HEIGHT = 244;\r
+static constexpr uint16_t RECOVER_BUTTON_POS_X = 120;\r
+static constexpr uint16_t RECOVER_BUTTON_POS_Y = 408;\r
+static constexpr uint16_t RECOVER_BUTTON_WIDTH = 220;\r
+static constexpr uint16_t RECOVER_BUTTON_HEIGHT = 80;\r
+static constexpr uint16_t RECOVER_BUTTON_FONT_SIZE = 36;\r
+static constexpr uint16_t CONTAINER_BLANK_SIZE = 100;\r
+static constexpr uint16_t ITEM_X = 0;\r
+static constexpr uint16_t ITEM_Y = 0;\r
+static constexpr uint16_t ITEM_W = 340;\r
+static constexpr uint16_t ITEM_H = 122;\r
+static constexpr char *COLOR__BUTTON_ID = "setColorItem";\r
+static constexpr char *BLINK_BUTTON_ID = "setBlinkItem";\r
+static constexpr char *RECOVER_BUTTON_ID = "recoverDefault";\r
+static std::string g_blinkItemContent[] = {"慢", "快", "不闪烁"};\r
+static std::string g_colorItemContent[] = {"黑色", "白色",   "红色",   "橙色", "黄色",\r
+                                           "绿色", "浅蓝色", "深蓝色", "紫色", "彩色"};\r
+static FlashLightSetItem g_listItem[] = {\r
+    {IMAGE_FLASHLIGHT_COLORITEM, "灯光颜色", "", ""},\r
+    {IMAGE_FLASHLIGHT_BLINKITEM, "闪烁频率", "", ""}\r
+};\r
+REGIST_SLICE_PAGE(VIEW_FLASHLIGHT, FlashLightAllView::FLASH_LIGHT_SET_VIEW, FlashLightSetPage, false);\r
+static FlashLightSetPage *g_pFlashLightSetPage = nullptr;\r
+\r
+static UIView* CreateViewCb(uint8_t type)\r
+{\r
+    FlashLightSetItemView* item = new FlashLightSetItemView();\r
+    if (item == nullptr) {\r
+        return nullptr;\r
+    }\r
 \r
-static const uint16_t SET_LABEL_POS_X = 117;\r
-static const uint16_t SET_LABEL_POS_Y = 31;\r
-static const uint16_t SET_LABEL_WIDTH = 220;\r
-static const uint16_t SET_LABEL_HEIGHT = 53;\r
-static const uint16_t SET_LABEL_FONT_SIZE = 38;\r
-static const uint16_t SET_LIST_POS_X = 59;\r
-static const uint16_t SET_LIST_POS_Y = 127;\r
-static const uint16_t SET_LIST_WIDTH = 340;\r
-static const uint16_t SET_LIST_HEIGHT = 244;\r
-static const uint16_t RECOVER_BUTTON_POS_X = 120;\r
-static const uint16_t RECOVER_BUTTON_POS_Y = 408;\r
-static const uint16_t RECOVER_BUTTON_WIDTH = 220;\r
-static const uint16_t RECOVER_BUTTON_HEIGHT = 80;\r
-static const uint16_t RECOVER_BUTTON_FONT_SIZE = 36;\r
-static const uint16_t CONTAINER_BLANK_SIZE = 100;\r
-static const std::string COLOR__BUTTON_ID = "setColorItem";\r
-static const std::string BLINK_BUTTON_ID = "setBlinkItem";\r
-static const std::string RECOVER_BUTTON_ID = "recoverDefault";\r
-static std::string BLINK_ITEM_CONTENT[3] = {"慢", "快", "不闪烁"};\r
-static std::string COLOR_ITEM_CONTENT[10] = {"黑色", "白色",   "红色",   "橙色", "黄色",\r
-                                             "绿色", "浅蓝色", "深蓝色", "紫色", "彩色"};\r
+    item->SetPosition(ITEM_X, ITEM_Y, ITEM_W, ITEM_H);\r
+    item->SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
+    item->SetStyle(STYLE_BACKGROUND_OPA, UN_OPACITY);\r
+    item->SetTouchable(true);\r
+    item->SetOnClickListener(g_pFlashLightSetPage);\r
+    return item;\r
+}\r
+\r
+static void UpdateViewCb(UIView* view, void* data, uint8_t type)\r
+{\r
+    FlashLightSetItemView* item = dynamic_cast<FlashLightSetItemView*>(view);\r
+    if (view == nullptr || data == nullptr || item == nullptr) {\r
+        return;\r
+    }\r
+    FlashLightSetItem* content = static_cast<FlashLightSetItem *>(data);\r
+    item->SetItemInfo(*content);\r
+}\r
 \r
-REGIST_SLICE_PAGE(VIEW_FLASHLIGHT, FlashLightAllView::FLASH_LIGHT_SET_VIEW, FlashLightSetPage, false);\r
 void FlashLightSetPage::OnStart(void *data)\r
 {\r
-    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "FlashLightSetPage::OnStart");\r
+    g_pFlashLightSetPage = this;\r
     if (container_ == nullptr) {\r
         container_ = new UIScrollView();\r
         container_->SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);\r
@@ -51,36 +83,43 @@ void FlashLightSetPage::OnStart(void *data)
         container_->SetScrollBlankSize(CONTAINER_BLANK_SIZE, UIAbstractScroll::Direction::BOTTOM);\r
     }\r
 \r
-    if (setLabel_ == nullptr) {\r
-        setLabel_ = new UILabel();\r
+    if (titleLabel_ == nullptr) {\r
+        titleLabel_ = new UILabel();\r
     }\r
-    setLabel_->SetPosition(SET_LABEL_POS_X, SET_LABEL_POS_Y, SET_LABEL_WIDTH, SET_LABEL_HEIGHT);\r
-    setLabel_->SetText("手电筒设置");\r
-    setLabel_->SetStyle(STYLE_TEXT_COLOR, Color::White().full);\r
-    setLabel_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
-    setLabel_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SET_LABEL_FONT_SIZE);\r
-    container_->Add(setLabel_);\r
-    setLabel_->SetVisible(true);\r
+    titleLabel_->SetPosition(SET_LABEL_POS_X, SET_LABEL_POS_Y, SET_LABEL_WIDTH, SET_LABEL_HEIGHT);\r
+    titleLabel_->SetText("手电筒设置");\r
+    titleLabel_->SetStyle(STYLE_TEXT_COLOR, Color::White().full);\r
+    titleLabel_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+    titleLabel_->SetFont(BOLD_VECTOR_FONT_FILENAME, SET_LABEL_FONT_SIZE);\r
+    container_->Add(titleLabel_);\r
+    titleLabel_->SetVisible(true);\r
 \r
     if (setItemList_ == nullptr) {\r
-        setItemList_ = new UIList();\r
+        setItemList_ = new UISimpleList();\r
     }\r
     setItemList_->SetPosition(SET_LIST_POS_X, SET_LIST_POS_Y, SET_LIST_WIDTH, SET_LIST_HEIGHT);\r
     setItemList_->SetLoopState(false);\r
     setItemList_->EnableAutoAlign(true);\r
-    if (setItemAdapter_ == nullptr) {\r
-        setItemAdapter_ = new FlashLightSetItemAdapter();\r
-    }\r
-    uint16_t colorIndex = (uint16_t)FlashLightModel::GetInstance().GetViewColor();\r
+    setItemList_->SetBoundaryIntercept(DragEvent::DIRECTION_TOP_TO_BOTTOM, false);\r
+    setItemList_->SetBoundaryIntercept(DragEvent::DIRECTION_BOTTOM_TO_TOP, false);\r
+\r
+    uint16_t colorIndex = (uint16_t)FlashLightModel::GetInstance().GetViewColorId();\r
     uint16_t blinkIndex = (uint16_t)FlashLightModel::GetInstance().GetBlinkFrequency();\r
-    colorItem_.itemLabel = COLOR_ITEM_CONTENT[colorIndex];\r
-    colorItem_.viewId = COLOR__BUTTON_ID;\r
-    blinkItem_.itemLabel = BLINK_ITEM_CONTENT[blinkIndex];\r
-    blinkItem_.viewId = BLINK_BUTTON_ID;\r
-    setItemAdapter_->AddListItem(colorItem_);\r
-    setItemAdapter_->AddListItem(blinkItem_);\r
-    setItemAdapter_->SetItemClickListener(this);\r
-    setItemList_->SetAdapter(setItemAdapter_);\r
+\r
+    g_listItem[0].itemLabel = g_colorItemContent[colorIndex];\r
+    g_listItem[0].viewId = COLOR__BUTTON_ID;\r
+    g_listItem[1].itemLabel = g_blinkItemContent[blinkIndex];\r
+    g_listItem[1].viewId = BLINK_BUTTON_ID;\r
+\r
+    for (uint8_t i = 0; i < (sizeof(g_listItem) / sizeof(FlashLightSetItem)); ++i) {\r
+        Contents content;\r
+        content.createFunc = CreateViewCb;\r
+        content.updateFunc = UpdateViewCb;\r
+        content.data = reinterpret_cast<void *>(&g_listItem[i]);\r
+        setItemList_->AddContent(content);\r
+    }\r
+    setItemList_->RefreshList();\r
+\r
     container_->Add(setItemList_);\r
     setItemList_->SetVisible(true);\r
 \r
@@ -89,13 +128,13 @@ void FlashLightSetPage::OnStart(void *data)
     }\r
     recoverButton_->SetPosition(RECOVER_BUTTON_POS_X, RECOVER_BUTTON_POS_Y, RECOVER_BUTTON_WIDTH,\r
                                 RECOVER_BUTTON_HEIGHT);\r
-    recoverButton_->SetViewId(RECOVER_BUTTON_ID.c_str());\r
+    recoverButton_->SetViewId(RECOVER_BUTTON_ID);\r
     recoverButton_->SetText("恢复默认\n");\r
     recoverButton_->SetTextColor(Color::Red());\r
     recoverButton_->SetAlign(TEXT_ALIGNMENT_CENTER);\r
     recoverButton_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, RECOVER_BUTTON_FONT_SIZE);\r
-    LOADIMG::LoadBtnImage(recoverButton_, FLASHLIGHT_IMAGE, IMAGE_CONVERTER_TOOL_RECOVERBUTTON,\r
-                          IMAGE_CONVERTER_TOOL_RECOVERBUTTON);\r
+    LOADIMG::LoadBtnImage(recoverButton_, FLASHLIGHT_IMAGE, IMAGE_FLASHLIGHT_RECOVERBUTTON,\r
+                          IMAGE_FLASHLIGHT_RECOVERBUTTON);\r
     recoverButton_->SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
     recoverButton_->SetStyleForState(STYLE_BACKGROUND_COLOR, Color::Black().full, UIButton::PRESSED);\r
     container_->Add(recoverButton_);\r
@@ -107,6 +146,11 @@ void FlashLightSetPage::OnStart(void *data)
     AddViewToPageContainer(container_);\r
 }\r
 \r
+FlashLightSetPage::FlashLightSetPage()\r
+{\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "FlashLightSetPage::FlashLightSetPage");\r
+}\r
+\r
 FlashLightSetPage::~FlashLightSetPage()\r
 {\r
     WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "FlashLightSetPage::~FlashLightSetPage");\r
@@ -115,52 +159,44 @@ FlashLightSetPage::~FlashLightSetPage()
         delete container_;\r
         container_ = nullptr;\r
     }\r
-    if (setLabel_ != nullptr) {\r
-        delete setLabel_;\r
-        setLabel_ = nullptr;\r
+    if (titleLabel_ != nullptr) {\r
+        delete titleLabel_;\r
+        titleLabel_ = nullptr;\r
     }\r
     if (recoverButton_ != nullptr) {\r
         delete recoverButton_;\r
         recoverButton_ = nullptr;\r
     }\r
     if (setItemList_ != nullptr) {\r
+        setItemList_->ClearAll();\r
         delete setItemList_;\r
         setItemList_ = nullptr;\r
     }\r
-    if (setItemAdapter_ != nullptr) {\r
-        delete setItemAdapter_;\r
-        setItemAdapter_ = nullptr;\r
-    }\r
     ImageCacheManager::GetInstance().UnloadSingleRes(FLASHLIGHT_IMAGE);\r
 }\r
 \r
 bool FlashLightSetPage::OnDrag(UIView &view, const DragEvent &event)\r
 {\r
-    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "FlashLightColorPage::OnDrag");\r
     if ((event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT) && (event.GetDeltaX() > X_DRAG_OFFSET) &&\r
         (event.GetDeltaX() > (DOUBLES * MATH_ABS(event.GetDeltaY())))) {\r
-        NativeAbility::GetInstance().SwitchSlice(VIEW_FLASHLIGHT, FlashLightAllView::FLASH_LIGTH_VIEW);\r
+        NativeAbility::GetInstance().SwitchPageInSlice(FlashLightAllView::FLASH_LIGHT_VIEW,\r
+            TransitionType::TRANSITION_INVALID, false);\r
     }\r
-    return false;\r
+    return true;\r
 }\r
 \r
 bool FlashLightSetPage::OnClick(UIView &view, const ClickEvent &event)\r
 {\r
-    uint8_t viewType = view.GetViewType();\r
-    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "FlashLightSetPage::OnClick [%d]", viewType);\r
-    if (viewType == UIViewType::UI_VIEW_GROUP) {\r
-        FlashLightSetItemView *itemView = static_cast<FlashLightSetItemView *>(&view);\r
-        std::string viewId = itemView->GetViewId();\r
-        if (viewId == COLOR__BUTTON_ID) {\r
-            NativeAbility::GetInstance().SwitchSlice(VIEW_FLASHLIGHT, FlashLightAllView::FLASH_LIGHT_COLOR_VIEW);\r
-        } else if (viewId == BLINK_BUTTON_ID) {\r
-            NativeAbility::GetInstance().SwitchSlice(VIEW_FLASHLIGHT, FlashLightAllView::FLASH_LIGHT_BLINK_VIEW);\r
-        }\r
-    } else if (viewType == UIViewType::UI_LABEL_BUTTON_EXT && view.GetViewId() == RECOVER_BUTTON_ID) {\r
-        NativeAbility::GetInstance().SwitchSlice(VIEW_FLASHLIGHT, FlashLightAllView::FLASH_LIGHT_DEFAULT_VIEW);\r
-    } else {\r
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "FlashLightSetPage::OnClick [Invalid]");\r
+    if (strcmp(view.GetViewId(), COLOR__BUTTON_ID) == 0) {\r
+        NativeAbility::GetInstance().SwitchPageInSlice(FlashLightAllView::FLASH_LIGHT_COLOR_VIEW,\r
+            TransitionType::TRANSITION_INVALID, false);\r
+    } else if (strcmp(view.GetViewId(), BLINK_BUTTON_ID) == 0) {\r
+        NativeAbility::GetInstance().SwitchPageInSlice(FlashLightAllView::FLASH_LIGHT_BLINK_VIEW,\r
+            TransitionType::TRANSITION_INVALID, false);\r
+    } else if (strcmp(view.GetViewId(), RECOVER_BUTTON_ID) == 0) {\r
+        NativeAbility::GetInstance().SwitchPageInSlice(FlashLightAllView::FLASH_LIGHT_RECOVER_VIEW,\r
+            TransitionType::TRANSITION_INVALID, false);\r
     }\r
-    return false;\r
+    return true;\r
+}\r
 }\r
-}
\ No newline at end of file
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/heartrate/src/HeartRateMainPage.cpp b/code/sdk/application/wearable/evb/nativeapp/nativeui/heartrate/src/HeartRateMainPage.cpp
new file mode 100644 (file)
index 0000000..d5cba8a
--- /dev/null
@@ -0,0 +1,272 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: HeartRateMainPage\r
+ * Create: 2025-06\r
+ */\r
+\r
+#include <string>\r
+#include <chrono>\r
+#include <sstream>\r
+#include <string>\r
+#include <iomanip>\r
+#include "ui_test_group.h"\r
+#include "main/LoadImg.h"\r
+#include "ui_resource_heartRate.h"\r
+#include "heartrate/HeartRatePresenter.h"\r
+#include "heartrate/HeartRateView.h"\r
+#include "heartrate/HeartRateModel.h"\r
+#include "heartrate/HeartRateMainPage.h"\r
+\r
+namespace OHOS {\r
+static constexpr uint16_t HEART_BUTTON_POSITION_X = 116;\r
+static constexpr uint16_t HEART_BUTTON_HEIGHT = 76;\r
+static constexpr uint16_t HEART_TITLE_POSITION_X = 195;\r
+static constexpr uint16_t HEART_TITLE_POSITION_Y = 40;\r
+static constexpr uint16_t HEART_TITLE_WIDTH = 260;\r
+static constexpr uint16_t HEART_TITLE_HEIGHT = 53;\r
+static constexpr uint16_t HEART_TITLE_FONT_SIZE = 38;\r
+static constexpr uint16_t HEART_BUTTON_TWO_POSITION_Y = 330;\r
+static constexpr uint16_t HEART_BUTTON_TWO_WIDTH = 232;\r
+static constexpr uint16_t BOTTOM_TEXT_ONE_X = 138;\r
+static constexpr uint16_t BOTTOM_TEXT_ONE_Y = 281;\r
+static constexpr uint16_t BOTTOM_TEXT_WIDTH_ONE = 250;\r
+static constexpr uint16_t BOTTOM_TEXT_HEIGHT_ONE = 36;\r
+static constexpr uint16_t HEART_RATE_LIMIT_FONT_SIZE_TWO = 24;\r
+static constexpr uint16_t VIDEO_WIDTH = 454;\r
+static constexpr uint16_t VIDEO_HEIGHT = 454;\r
+static constexpr uint16_t STRIDE_ALIGNMENT_VALUE = 128;\r
+static constexpr uint16_t BUFFER_QUEUE_SIZE = 3;\r
+static constexpr uint16_t JPEG_HEIGHT_DIVISOR = 2;\r
+static constexpr uint16_t JPEG_WIDTH_BYTE_ALIGNMENT = 128;\r
+static constexpr uint16_t JPEG_HEIGHT_BYTE_ALIGNMENT = 16;\r
+static constexpr uint16_t HEART_BUTTON_FONT_SIZE = 35;\r
+static constexpr uint16_t HEART_DATE_TIME_ONE = 90;\r
+static constexpr uint16_t HEART_DATE_TIME_TWO = 3000;\r
+static constexpr uint16_t HEART_DATE_TIME_THREE = 60;\r
+static constexpr uint16_t HEART_DATE_TIME_FOUR = 3600;\r
+static constexpr uint16_t HEART_DATE_MAX = 454;\r
+static constexpr uint16_t HEART_DATE_WIDTH = 2;\r
+static constexpr char *HEART_START_BUTTON = "startButton";\r
+\r
+REGIST_SLICE_PAGE(VIEW_HEARTRATE, HeartRateAllView::HEARTRATE_MAIN_PAGE, HeartRateMainPage, true);\r
+\r
+HeartRateMainPage::HeartRateMainPage()\r
+{\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HeartRateMainPage::HeartRateMainPage");\r
+}\r
+\r
+HeartRateMainPage::~HeartRateMainPage()\r
+{\r
+    if (group_ != nullptr) {\r
+        group_->RemoveAll();\r
+        delete group_;\r
+        group_ = nullptr;\r
+    }\r
+    if (button_ != nullptr) {\r
+        delete button_;\r
+        button_ = nullptr;\r
+    }\r
+\r
+    if (labelTitle_ != nullptr) {\r
+        delete labelTitle_;\r
+        labelTitle_ = nullptr;\r
+    }\r
+\r
+    if (labelPreTest_ != nullptr) {\r
+        delete labelPreTest_;\r
+        labelPreTest_ = nullptr;\r
+    }\r
+\r
+    if (videoPlay_ != nullptr) {\r
+        videoPlay_->StopVideoPlay();\r
+        delete videoPlay_;\r
+        videoPlay_ = nullptr;\r
+    }\r
+\r
+    if (surfaceView_ != nullptr) {\r
+        delete surfaceView_;\r
+        surfaceView_ = nullptr;\r
+    }\r
+    ImageCacheManager::GetInstance().UnloadAllInMultiRes(HEART_RATE_IMAGE);\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HeartRateMainPage::~HeartRateMainPage");\r
+}\r
+\r
+void HeartRateMainPage::OnStart(void *data)\r
+{\r
+    group_ = new UIViewGroup();\r
+    if (group_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new group_ fail");\r
+        return;\r
+    }\r
+    group_->SetPosition(0, 0);\r
+    group_->Resize(HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);\r
+    group_->SetOnDragListener(this);\r
+\r
+    group_->SetDraggable(true);\r
+    group_->SetTouchable(true);\r
+    group_->SetOnDragListener(this);\r
+\r
+    InitImageAnimator();\r
+\r
+    button_ = new UILabelButton();\r
+    if (button_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new button_ fail");\r
+        return;\r
+    }\r
+    button_->SetPosition(HEART_BUTTON_POSITION_X, HEART_BUTTON_TWO_POSITION_Y);\r
+    button_->Resize(HEART_BUTTON_TWO_WIDTH, HEART_BUTTON_HEIGHT);\r
+    button_->SetViewId(HEART_START_BUTTON);\r
+    button_->SetOnClickListener(this);\r
+    button_->SetStyleForState(STYLE_BACKGROUND_COLOR, 0x14FFFFFF, UIButton::RELEASED);\r
+    button_->SetStyleForState(STYLE_BACKGROUND_COLOR, 0x14FFFFFF, UIButton::PRESSED);\r
+    button_->SetStyleForState(STYLE_BACKGROUND_COLOR, 0x14FFFFFF, UIButton::INACTIVE);\r
+    button_->SetText("开始测量");\r
+    button_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, HEART_BUTTON_FONT_SIZE);\r
+    button_->SetVisible(true);\r
+\r
+    labelTitle_ = new UILabel();\r
+    if (labelTitle_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new labelTitle_ fail");\r
+        return;\r
+    }\r
+    labelTitle_->SetPosition(HEART_TITLE_POSITION_X, HEART_TITLE_POSITION_Y, HEART_TITLE_WIDTH, HEART_TITLE_HEIGHT);\r
+    labelTitle_->SetText("心率");\r
+    labelTitle_->SetFont(BOLD_VECTOR_FONT_FILENAME, HEART_TITLE_FONT_SIZE);\r
+    SetTestTime();\r
+    group_->Add(button_);\r
+    group_->Add(labelPreTest_);\r
+    group_->Add(labelTitle_);\r
+    AddViewToPageContainer(group_);\r
+}\r
+\r
+void HeartRateMainPage::OnResume()\r
+{\r
+    videoPlay_->StartVideoPlay();\r
+}\r
+\r
+void HeartRateMainPage::OnPause()\r
+{\r
+    videoPlay_->StopVideoPlay();\r
+}\r
+\r
+void HeartRateMainPage::SetTestTime()\r
+{\r
+    labelPreTest_ = new UILabel();\r
+    if (labelPreTest_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new labelPreTest_ fail");\r
+        return;\r
+    }\r
+    labelPreTest_->SetPosition(BOTTOM_TEXT_ONE_X, BOTTOM_TEXT_ONE_Y, BOTTOM_TEXT_WIDTH_ONE, BOTTOM_TEXT_HEIGHT_ONE);\r
+    labelPreTest_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, HEART_RATE_LIMIT_FONT_SIZE_TWO);\r
+    labelPreTest_->SetStyle(STYLE_TEXT_COLOR, 0xFFCCCCCC);\r
+    labelPreTest_->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+    labelPreTest_->SetVisible(false);\r
+    heartRateMeasurementInfo info = HeartRateModel::GetInstance().GetHeartRate();\r
+    struct timeval current_time;\r
+    if (info.heartRate == 0) {\r
+        info.heartRate = HEART_DATE_TIME_ONE;\r
+        gettimeofday(&current_time, nullptr);\r
+        int64_t now = current_time.tv_sec;\r
+        struct timeval time1;\r
+        time1.tv_sec = now - HEART_DATE_TIME_TWO;\r
+        info.time = time1;\r
+    }\r
+    if (info.heartRate != 0) {\r
+        struct timeval tv = info.time;\r
+        std::time_t time = tv.tv_sec;\r
+        std::tm *tm_info = std::localtime(&time);\r
+        std::stringstream ss;\r
+        if (IsToday(tv)) {\r
+            gettimeofday(&current_time, nullptr);\r
+            int64_t now = current_time.tv_sec;\r
+            int64_t diff_seconds = now - tv.tv_sec;\r
+            if (diff_seconds < 0) {\r
+                ss << info.heartRate << "次/分  ("\r
+                   << "刚刚)";\r
+            } else if (diff_seconds < HEART_DATE_TIME_THREE) {\r
+                ss << info.heartRate << "次/分 ("\r
+                   << "刚刚)";\r
+            } else if (diff_seconds < HEART_DATE_TIME_FOUR) {\r
+                int minutes = diff_seconds / HEART_DATE_TIME_THREE;\r
+                ss << info.heartRate << "次/分  (" << minutes << "分钟前)";\r
+            } else {\r
+                int hours = diff_seconds / HEART_DATE_TIME_FOUR;\r
+                ss << info.heartRate << "次/分  (" << hours << "小时前)";\r
+            }\r
+        } else {\r
+            ss << info.heartRate << "次/分  " << (tm_info->tm_mon + 1) << "/" << tm_info->tm_mday;\r
+        }\r
+        labelPreTest_->SetText(ss.str().c_str());\r
+        labelPreTest_->SetText(ss.str().c_str());\r
+        int textWidth = labelPreTest_->GetTextWidth();\r
+        int posX = (HEART_DATE_MAX - textWidth) / HEART_DATE_WIDTH;\r
+        labelPreTest_->SetX(posX);\r
+        labelPreTest_->SetVisible(true);\r
+    }\r
+}\r
+\r
+bool HeartRateMainPage::IsToday(const struct timeval &tv)\r
+{\r
+    time_t now = time(nullptr);\r
+    std::tm *now_tm = localtime(&now);\r
+    std::time_t given_time = tv.tv_sec;\r
+    std::tm *given_tm = std::localtime(&given_time);\r
+\r
+    return (now_tm->tm_year == given_tm->tm_year) && (now_tm->tm_mon == given_tm->tm_mon) &&\r
+           (now_tm->tm_mday == given_tm->tm_mday);\r
+}\r
+\r
+bool HeartRateMainPage::OnDrag(UIView &view, const DragEvent &event)\r
+{\r
+    UNUSED(view);\r
+    if ((event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT) && (event.GetDeltaX() > X_DRAG_OFFSET) &&\r
+        (event.GetDeltaX() > (DOUBLES * MATH_ABS(event.GetDeltaY())))) {\r
+        NativeAbility::GetInstance().ChangeSliceToApplist();\r
+    }\r
+    return true;\r
+}\r
+\r
+bool HeartRateMainPage::OnClick(UIView &view, const ClickEvent &event)\r
+{\r
+    if (strcmp(view.GetViewId(), HEART_START_BUTTON) == 0) {\r
+        NativeAbility::GetInstance().SwitchPageInSlice(HeartRateAllView::HEARTRATE_READY_PAGE,\r
+            TransitionType::TRANSITION_INVALID, false);\r
+    }\r
+    UNUSED(event);\r
+    return true;\r
+}\r
+\r
+void HeartRateMainPage::InitImageAnimator()\r
+{\r
+    surfaceView_ = new UILiteSurfaceView();\r
+    if (surfaceView_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new surfaceView_ fail");\r
+        return;\r
+    }\r
+    colorKey_.full = 0xff202020;\r
+    surfaceView_->SetPosition(0, 0, VIDEO_WIDTH, VIDEO_HEIGHT);\r
+    surfaceView_->SetPreview(\r
+        ImageCacheManager::GetInstance().LoadOneInMultiRes(IMAGE_HEART_RATE_PREVIEW1, HEART_RATE_IMAGE));\r
+    surfaceView_->SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
+    surfaceView_->SetSurfaceColorkey(colorKey_);\r
+    group_->Add(surfaceView_);\r
+\r
+    Surface *surface = surfaceView_->GetSurface();\r
+    surface->SetStrideAlignment(STRIDE_ALIGNMENT_VALUE);\r
+    surface->SetWidthAndHeight(VIDEO_WIDTH, VIDEO_HEIGHT);\r
+    surface->SetQueueSize(BUFFER_QUEUE_SIZE);\r
+    surface->SetFormat(PIXEL_FMT_YCBCR_420_SP);\r
+\r
+    int32_t ySize = ALIGN_BYTE(VIDEO_WIDTH, JPEG_WIDTH_BYTE_ALIGNMENT) * VIDEO_HEIGHT;\r
+    int32_t uvSize = ALIGN_BYTE(VIDEO_WIDTH, JPEG_WIDTH_BYTE_ALIGNMENT) *\r
+                     ALIGN_BYTE(VIDEO_HEIGHT, JPEG_HEIGHT_BYTE_ALIGNMENT) / JPEG_HEIGHT_DIVISOR;\r
+    int32_t bufferSize = ySize + uvSize;\r
+    surface->SetSize(bufferSize);\r
+    std::string uri("/user/res/video/heartBackGround.mp4");\r
+    videoPlay_ = new MediaVideoPlay(surface, nullptr, uri, false);\r
+    if (videoPlay_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new videoPlay_ fail");\r
+        return;\r
+    }\r
+}\r
+}\r
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/heartrate/src/HeartRateMeasurePage.cpp b/code/sdk/application/wearable/evb/nativeapp/nativeui/heartrate/src/HeartRateMeasurePage.cpp
new file mode 100644 (file)
index 0000000..1b8ba61
--- /dev/null
@@ -0,0 +1,301 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: HeartRateMeasurePage\r
+ * Create: 2025-06\r
+ */\r
+\r
+#include <string>\r
+#include <random>\r
+#include <chrono>\r
+#include "ui_test_group.h"\r
+#include "main/LoadImg.h"\r
+#include "settings/model/SettingDisplayModel.h"\r
+#include "ui_resource_heartRate.h"\r
+#include "heartrate/HeartRatePresenter.h"\r
+#include "heartrate/HeartRateModel.h"\r
+#include "heartrate/HeartRateMeasurePage.h"\r
+\r
+namespace OHOS {\r
+static constexpr uint16_t HEARTRATE_BUTTON_TWO_POSITION_X = 142;\r
+static constexpr uint16_t HEARTRATE_BUTTON_TWO_POSITION_Y = 370;\r
+static constexpr uint16_t HEARTRATE_LABEL_FRONT = 40;\r
+static constexpr uint16_t HEARTRATE_LABEL_FRONT_BOTTOM = 36;\r
+static constexpr uint16_t HEARTRATE_LABEL2_POSITION_X = 133;\r
+static constexpr uint16_t HEARTRATE_LABEL2_POSITION_Y = 200;\r
+static constexpr uint16_t HEARTRATE_LABEL2_WIDTH = 180;\r
+static constexpr uint16_t HEARTRATE_LABEL2_HEIGHT = 62;\r
+static constexpr uint16_t HEARTRATE_LABLE_TITLE_POSITION_X = 195;\r
+static constexpr uint16_t HEARTRATE_LABLE_TITLE_POSITION_Y = 40;\r
+static constexpr uint16_t HEARTRATE_LABLE_TITLE_WIDTH = 260;\r
+static constexpr uint16_t HEARTRATE_LABLE_TITLE_HEIGHT = 53;\r
+static constexpr uint16_t HEARTRATE_LABLE_TITLE_FONT_SIZE = 38;\r
+static constexpr uint16_t HEARTRATE_LABLEBACK_FONT_SIZE = 30;\r
+static constexpr uint16_t VIDEO_WIDTH = 454;\r
+static constexpr uint16_t VIDEO_HEIGHT = 454;\r
+static constexpr uint16_t STRIDE_ALIGNMENT_VALUE = 128;\r
+static constexpr uint16_t BUFFER_QUEUE_SIZE = 3;\r
+static constexpr uint16_t JPEG_HEIGHT_DIVISOR = 2;\r
+static constexpr uint16_t JPEG_WIDTH_BYTE_ALIGNMENT = 128;\r
+static constexpr uint16_t JPEG_HEIGHT_BYTE_ALIGNMENT = 16;\r
+static constexpr uint16_t HEART_TIME_NUM = 15;\r
+\r
+REGIST_SLICE_PAGE(VIEW_HEARTRATE, HeartRateAllView::HEARTRATE_MEASUREMENT_PAGE, HeartRateMeasurePage, false);\r
+\r
+HeartRateMeasurePage::HeartRateMeasurePage()\r
+{\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HeartRateMeasurePage::HeartRateMeasurePage");\r
+}\r
+\r
+HeartRateMeasurePage::~HeartRateMeasurePage()\r
+{\r
+    if (group_ != nullptr) {\r
+        group_->RemoveAll();\r
+        delete group_;\r
+        group_ = nullptr;\r
+    }\r
+\r
+    if (labelTitle_ != nullptr) {\r
+        delete labelTitle_;\r
+        labelTitle_ = nullptr;\r
+    }\r
+\r
+    if (labelTimeOrResult_ != nullptr) {\r
+        delete labelTimeOrResult_;\r
+        labelTimeOrResult_ = nullptr;\r
+    }\r
+\r
+    if (labelTips_ != nullptr) {\r
+        delete labelTips_;\r
+        labelTips_ = nullptr;\r
+    }\r
+\r
+    if (callBack_ != nullptr) {\r
+        delete callBack_;\r
+        callBack_ = nullptr;\r
+    }\r
+\r
+    if (animator_ != nullptr) {\r
+        delete animator_;\r
+        animator_ = nullptr;\r
+    }\r
+\r
+    if (videoPlay_ != nullptr) {\r
+        videoPlay_->StopVideoPlay();\r
+        delete videoPlay_;\r
+        videoPlay_ = nullptr;\r
+    }\r
+\r
+    if (surfaceView_ != nullptr) {\r
+        delete surfaceView_;\r
+        surfaceView_ = nullptr;\r
+    }\r
+\r
+    if (chartLineResultGroup_ != nullptr) {\r
+        delete chartLineResultGroup_;\r
+        chartLineResultGroup_ = nullptr;\r
+    }\r
+    ImageCacheManager::GetInstance().UnloadAllInMultiRes(HEART_RATE_IMAGE);\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HeartRateMeasurePage::~HeartRateMeasurePage");\r
+}\r
+\r
+void HeartRateMeasurePage::OnStart(void *data)\r
+{\r
+    group_ = new UIViewGroup();\r
+    if (group_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new group_ fail");\r
+        return;\r
+    }\r
+    group_->SetPosition(0, 0);\r
+    group_->Resize(HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);\r
+    group_->SetOnDragListener(this);\r
+\r
+    group_->SetDraggable(true);\r
+    group_->SetTouchable(true);\r
+    group_->SetOnDragListener(this);\r
+\r
+    InitVideoView();\r
+\r
+    labelTitle_ = new UILabel();\r
+    if (labelTitle_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new labelTitle_ fail");\r
+        return;\r
+    }\r
+    labelTitle_->SetPosition(HEARTRATE_LABLE_TITLE_POSITION_X, HEARTRATE_LABLE_TITLE_POSITION_Y,\r
+                             HEARTRATE_LABLE_TITLE_WIDTH, HEARTRATE_LABLE_TITLE_HEIGHT);\r
+    labelTitle_->SetText("心率");\r
+    labelTitle_->SetFont(BOLD_VECTOR_FONT_FILENAME, HEARTRATE_LABLE_TITLE_FONT_SIZE);\r
+\r
+    labelTimeOrResult_ = new UILabel();\r
+    if (labelTimeOrResult_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new labelTimeOrResult_ fail");\r
+        return;\r
+    }\r
+    labelTimeOrResult_->SetPosition(HEARTRATE_LABEL2_POSITION_X,\r
+                                    HEARTRATE_LABEL2_POSITION_Y);\r
+    labelTimeOrResult_->Resize(HEARTRATE_LABEL2_WIDTH, HEARTRATE_LABEL2_HEIGHT);\r
+    labelTimeOrResult_->SetStyle(STYLE_TEXT_FONT, HEARTRATE_LABEL_FRONT);\r
+    labelTimeOrResult_->SetLineBreakMode(UILabel::LINE_BREAK_ELLIPSIS);\r
+    labelTimeOrResult_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+    labelTimeOrResult_->SetFont(BOLD_VECTOR_FONT_FILENAME, HEARTRATE_LABEL_FRONT);\r
+\r
+    labelTips_ = new UILabel();\r
+    if (labelTips_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new labelTips_ fail");\r
+        return;\r
+    }\r
+    labelTips_->SetPosition(HEARTRATE_BUTTON_TWO_POSITION_X, HEARTRATE_BUTTON_TWO_POSITION_Y);\r
+    labelTips_->Resize(HEARTRATE_LABEL2_WIDTH, HEARTRATE_LABEL2_HEIGHT);\r
+    labelTips_->SetStyle(STYLE_TEXT_FONT, HEARTRATE_LABEL_FRONT_BOTTOM);\r
+    labelTips_->SetLineBreakMode(UILabel::LINE_BREAK_ELLIPSIS);\r
+    labelTips_->SetText("正在测量");\r
+    labelTips_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+    labelTips_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, HEARTRATE_LABEL_FRONT_BOTTOM);\r
+    group_->Add(labelTimeOrResult_);\r
+    group_->Add(labelTips_);\r
+\r
+    InitAnimator();\r
+    gettimeofday(&startTime_, nullptr);\r
+    group_->Add(labelTitle_);\r
+\r
+    AddViewToPageContainer(group_);\r
+    animator_->Start();\r
+\r
+    SetTestStatus(false);\r
+}\r
+\r
+void HeartRateMeasurePage::OnResume()\r
+{\r
+    videoPlay_->StartVideoPlay();\r
+    SettingDisplayModel::GetInstance().EnableSteadyOn();\r
+}\r
+\r
+void HeartRateMeasurePage::OnPause()\r
+{\r
+    videoPlay_->StopVideoPlay();\r
+    SettingDisplayModel::GetInstance().DisableSteadyOn();\r
+}\r
+\r
+void HeartRateMeasurePage::InitAnimator()\r
+{\r
+    callBack_ = new HeartAnimatorCallback(this);\r
+    if (callBack_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new callBack_ fail");\r
+        return;\r
+    }\r
+    animator_ = new Animator(callBack_, nullptr, 0, true);\r
+    if (animator_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new animator_ fail");\r
+        return;\r
+    }\r
+}\r
+\r
+void HeartRateMeasurePage::SetTimeAndResultText(std::string str)\r
+{\r
+    labelTimeOrResult_->SetText(str.c_str());\r
+}\r
+\r
+void HeartRateMeasurePage::SetTestStatus(bool value)\r
+{\r
+    measureStatus_ = value;\r
+}\r
+\r
+void HeartRateMeasurePage::HeartAnimatorCallback::Callback(UIView *view)\r
+{\r
+    (void)view;\r
+    if (page_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "page_ is nullptr");\r
+        return;\r
+    }\r
+    static int count = 0;\r
+    struct timeval current_time;\r
+    gettimeofday(&current_time, nullptr);\r
+    int time = current_time.tv_sec - page_->startTime_.tv_sec;\r
+    std::string strTime;\r
+    // 测量结束,修改文本,显示当前心率\r
+    if (time >= HEART_TIME_NUM) {\r
+        page_->StopAnimator();\r
+        heartRateMeasurementInfo info;\r
+        info.heartRate = 80; // 80:心率打桩数据\r
+        info.time = current_time;\r
+        strTime = std::to_string(info.heartRate) + "次/分";\r
+        HeartRateModel::GetInstance().SetHeartRate(info);\r
+        page_->SetTestStatus(true);\r
+        page_->labelTips_->SetText("当前心率");\r
+        std::string strHeartRate = std::to_string(info.heartRate);\r
+        if (page_->chartLineResultGroup_ == nullptr) {\r
+            page_->chartLineResultGroup_ = new HeartRateResultGroup();\r
+            if (page_->chartLineResultGroup_ == nullptr) {\r
+                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "chartLineResultGroup_ fail");\r
+                return;\r
+            }\r
+        }\r
+        page_->chartLineResultGroup_->SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);\r
+        page_->chartLineResultGroup_->SetVisible(false);\r
+        page_->group_->Add(page_->chartLineResultGroup_);\r
+        page_->chartLineResultGroup_->labelHeartRateValue_->SetText(strHeartRate.c_str());\r
+        page_->chartLineResultGroup_->SetVisible(true);\r
+    } else {\r
+        // 测量中,文本仅更新倒计时\r
+        strTime = std::to_string(HEART_TIME_NUM - time) + "s";\r
+    }\r
+    page_->SetTimeAndResultText(strTime);\r
+}\r
+\r
+void HeartRateMeasurePage::StopAnimator()\r
+{\r
+    animator_->Stop();\r
+}\r
+\r
+bool HeartRateMeasurePage::OnDrag(UIView &view, const DragEvent &event)\r
+{\r
+    UNUSED(view);\r
+    // 在测量完成后 才能拉起心率线状图\r
+    if (measureStatus_) {\r
+        if (event.GetDragDirection() == DragEvent::DIRECTION_TOP_TO_BOTTOM) {\r
+            chartLineResultGroup_->SetVisible(false);\r
+        } else if (event.GetDragDirection() == DragEvent::DIRECTION_BOTTOM_TO_TOP) {\r
+            chartLineResultGroup_->SetVisible(true);\r
+        }\r
+    }\r
+    if (event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT) {\r
+        StopAnimator();\r
+        NativeAbility::GetInstance().SwitchPageInSlice(HeartRateAllView::HEARTRATE_MAIN_PAGE,\r
+            TransitionType::TRANSITION_INVALID, false);\r
+    }\r
+    return true;\r
+}\r
+\r
+void HeartRateMeasurePage::InitVideoView()\r
+{\r
+    surfaceView_ = new UILiteSurfaceView();\r
+    if (surfaceView_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new surfaceView_ fail");\r
+        return;\r
+    }\r
+    colorKey_.full = 0xff202020;\r
+    surfaceView_->SetPosition(0, 0, VIDEO_WIDTH, VIDEO_HEIGHT);\r
+    surfaceView_->SetPreview(\r
+        ImageCacheManager::GetInstance().LoadOneInMultiRes(IMAGE_HEART_RATE_PREVIEW2, HEART_RATE_IMAGE));\r
+    surfaceView_->SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
+    surfaceView_->SetSurfaceColorkey(colorKey_);\r
+    group_->Add(surfaceView_);\r
+\r
+    Surface *surface = surfaceView_->GetSurface();\r
+    surface->SetStrideAlignment(STRIDE_ALIGNMENT_VALUE);\r
+    surface->SetWidthAndHeight(VIDEO_WIDTH, VIDEO_HEIGHT);\r
+    surface->SetQueueSize(BUFFER_QUEUE_SIZE);\r
+    surface->SetFormat(PIXEL_FMT_YCBCR_420_SP);\r
+\r
+    int32_t ySize = ALIGN_BYTE(VIDEO_WIDTH, JPEG_WIDTH_BYTE_ALIGNMENT) * VIDEO_HEIGHT;\r
+    int32_t uvSize = ALIGN_BYTE(VIDEO_WIDTH, JPEG_WIDTH_BYTE_ALIGNMENT) *\r
+                     ALIGN_BYTE(VIDEO_HEIGHT, JPEG_HEIGHT_BYTE_ALIGNMENT) / JPEG_HEIGHT_DIVISOR;\r
+    int32_t bufferSize = ySize + uvSize;\r
+    surface->SetSize(bufferSize);\r
+    std::string uri("/user/res/video/heart.mp4");\r
+    videoPlay_ = new MediaVideoPlay(surface, nullptr, uri, false);\r
+    if (videoPlay_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new videoPlay_ fail");\r
+        return;\r
+    }\r
+}\r
+}\r
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/heartrate/src/HeartRateModel.cpp b/code/sdk/application/wearable/evb/nativeapp/nativeui/heartrate/src/HeartRateModel.cpp
new file mode 100644 (file)
index 0000000..378a492
--- /dev/null
@@ -0,0 +1,23 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: HeartRateModel\r
+ * Create: 2025-06\r
+ */\r
+\r
+#include <sys/time.h>\r
+#include "ohos_timer.h"\r
+#include "wearable_log.h"\r
+#include "heartrate/HeartRateView.h"\r
+#include "heartrate/HeartRateModel.h"\r
+\r
+namespace OHOS {\r
+HeartRateModel::HeartRateModel() {}\r
+\r
+HeartRateModel::~HeartRateModel() {}\r
+\r
+HeartRateModel &HeartRateModel::GetInstance()\r
+{\r
+    static HeartRateModel instance;\r
+    return instance;\r
+}\r
+}
\ No newline at end of file
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/heartrate/src/HeartRatePresenter.cpp b/code/sdk/application/wearable/evb/nativeapp/nativeui/heartrate/src/HeartRatePresenter.cpp
new file mode 100644 (file)
index 0000000..c5f52d6
--- /dev/null
@@ -0,0 +1,21 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: HeartRatePresenter\r
+ * Create: 2025-06\r
+ */\r
+\r
+#include "uiservice/ui_service.h"\r
+#include "NativeRegisterManager.h"\r
+#include "wearable_log.h"\r
+#include "heartrate/HeartRateView.h"\r
+#include "heartrate/HeartRatePresenter.h"\r
+\r
+namespace OHOS {\r
+REGIST_MENU(VIEW_HEARTRATE, HeartRateView, HeartRatePresenter, HEART_RATE_ICON, HEART_RATE_ICON, "心率");\r
+static HeartRatePresenter *g_pHeartRatePresenter = nullptr;\r
+HeartRatePresenter *HeartRatePresenter::GetInstance()\r
+{\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HeartRatePresenter GetInstance");\r
+    return g_pHeartRatePresenter;\r
+}\r
+}\r
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/heartrate/src/HeartRateReadyPage.cpp b/code/sdk/application/wearable/evb/nativeapp/nativeui/heartrate/src/HeartRateReadyPage.cpp
new file mode 100644 (file)
index 0000000..0077c3f
--- /dev/null
@@ -0,0 +1,258 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: HeartRateReadyPage\r
+ * Create: 2025-06\r
+ */\r
+\r
+#include <string>\r
+#include <cmath>\r
+#include "ui_test_group.h"\r
+#include "main/LoadImg.h"\r
+#include "ui_resource_heartRate.h"\r
+#include "heartrate/HeartRatePresenter.h"\r
+#include "heartrate/HeartRateReadyPage.h"\r
+\r
+namespace OHOS {\r
+static constexpr uint16_t HEARTRATE_BUTTON_POSITION_X = 188;\r
+static constexpr uint16_t HEARTRATE_BUTTON_WIDTH = 96;\r
+static constexpr uint16_t HEARTRATE_BUTTON_HEIGHT = 96;\r
+static constexpr uint16_t HEARTRATE_BUTTON_TWO_POSITION_Y = 288;\r
+static constexpr uint16_t HEARTRATE_LABEL3_POSITION_X = 65;\r
+static constexpr uint16_t HEARTRATE_LABEL3_POSITION_Y = 150;\r
+static constexpr uint16_t HEARTRATE_LABLETIPSSATRT_POSITION_X = 110;\r
+static constexpr uint16_t HEARTRATE_LABLETIPSSATRT_POSITION_Y = 200;\r
+static constexpr uint16_t HEARTRATE_LABLETIPSSATRT_WIDTH = 424;\r
+static constexpr uint16_t HEARTRATE_LABLETIPSSATRT_HEIGHT = 424;\r
+static constexpr uint16_t HEARTRATE_LABLETIPSSATRT_FONT_SIZE = 36;\r
+static constexpr uint16_t HEARTRATE_LABLEBACK_POSITION_X = 218;\r
+static constexpr uint16_t HEARTRATE_LABLEBACK_POSITION_Y = 318;\r
+static constexpr uint16_t HEARTRATE_LABLEBACK_WIDTH = 50;\r
+static constexpr uint16_t HEARTRATE_LABLEBACK_HEIGHT = 50;\r
+static constexpr uint16_t HEARTRATE_LABLEBACK_FONT_SIZE = 30;\r
+static constexpr uint16_t HEARTRATE_PLAYBACK_POSITION_X = 140;\r
+static constexpr uint16_t HEARTRATE_PLAYBACK_POSITION_Y = 250;\r
+static constexpr uint16_t HEARTRATE_PLAYBACK_WIDTH = 172;\r
+static constexpr uint16_t HEARTRATE_PLAYBACK_HEIGHT = 172;\r
+static constexpr uint16_t HEARTRATE_PLAYBACK_VENTER_POSITION = 86;\r
+static constexpr uint32_t HEARTRATE_PLAYBACK_RANGE = 100000;\r
+static constexpr uint16_t HEARTRATE_PLAYBACK_RADIUS = 48;\r
+static constexpr uint16_t HEARTRATE_PLAYBACK_START_ANGLE = 360;\r
+static constexpr uint16_t HEARTRATE_PLAYBACK_STYLE_LINE_WIDTH = 12;\r
+static constexpr uint16_t HEARTRATE_TIME_NUM = 3;\r
+static constexpr uint16_t HEARTRATE_PROGRESS_TIME = 3;\r
+static constexpr uint16_t HEARTRATE_TIME_USEC = 1000;\r
+static constexpr char *HEART_START_BUTTON = "startButton";\r
+\r
+REGIST_SLICE_PAGE(VIEW_HEARTRATE, HeartRateAllView::HEARTRATE_READY_PAGE, HeartRateReadyPage, false);\r
+\r
+HeartRateReadyPage::HeartRateReadyPage()\r
+{\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HeartRateReadyPage::HeartRateReadyPage");\r
+}\r
+\r
+HeartRateReadyPage::~HeartRateReadyPage()\r
+{\r
+    if (group_ != nullptr) {\r
+        group_->RemoveAll();\r
+        delete group_;\r
+        group_ = nullptr;\r
+    }\r
+\r
+    if (button_ != nullptr) {\r
+        delete button_;\r
+        button_ = nullptr;\r
+    }\r
+\r
+    if (labelTips_ != nullptr) {\r
+        delete labelTips_;\r
+        labelTips_ = nullptr;\r
+    }\r
+\r
+    if (timeProgress_ != nullptr) {\r
+        delete timeProgress_;\r
+        timeProgress_ = nullptr;\r
+    }\r
+\r
+    if (labelProgressTime_ != nullptr) {\r
+        delete labelProgressTime_;\r
+        labelProgressTime_ = nullptr;\r
+    }\r
+\r
+    if (callBack_ != nullptr) {\r
+        delete callBack_;\r
+        callBack_ = nullptr;\r
+    }\r
+\r
+    if (animator_ != nullptr) {\r
+        delete animator_;\r
+        animator_ = nullptr;\r
+    }\r
+    ImageCacheManager::GetInstance().UnloadAllInMultiRes(HEART_RATE_IMAGE);\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HeartRateReadyPage::~HeartRateReadyPage");\r
+}\r
+\r
+void HeartRateReadyPage::OnStart(void *data)\r
+{\r
+    group_ = new UIViewGroup();\r
+    if (group_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new group_ fail");\r
+        return;\r
+    }\r
+    group_->SetPosition(0, 0);\r
+    group_->Resize(HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);\r
+    group_->SetOnDragListener(this);\r
+    group_->SetDraggable(true);\r
+    group_->SetTouchable(true);\r
+    group_->SetOnDragListener(this);\r
+\r
+    button_ = new UILabelButton();\r
+    if (button_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new button_ fail");\r
+        return;\r
+    }\r
+    button_->SetPosition(HEARTRATE_BUTTON_POSITION_X, HEARTRATE_BUTTON_TWO_POSITION_Y);\r
+    button_->Resize(HEARTRATE_BUTTON_WIDTH, HEARTRATE_BUTTON_HEIGHT);\r
+    LOADIMG::LoadBtnImage(button_, HEART_RATE_IMAGE, IMAGE_HEART_RATE_RESET, IMAGE_HEART_RATE_RESET);\r
+    button_->SetViewId(HEART_START_BUTTON);\r
+    button_->SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
+    button_->SetStyleForState(STYLE_BACKGROUND_COLOR, Color::Black().full, UIButton::PRESSED);\r
+    button_->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+    button_->SetVisible(true);\r
+    button_->SetOnClickListener(this);\r
+\r
+    labelTips_ = new UILabel();\r
+    if (labelTips_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new labelTips_ fail");\r
+        return;\r
+    }\r
+    labelTips_->SetPosition(HEARTRATE_LABLETIPSSATRT_POSITION_X, HEARTRATE_LABLETIPSSATRT_POSITION_Y,\r
+                            HEARTRATE_LABLETIPSSATRT_WIDTH, HEARTRATE_LABLETIPSSATRT_HEIGHT);\r
+    labelTips_->SetText("请佩戴手表测量");\r
+    labelTips_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, HEARTRATE_LABLETIPSSATRT_FONT_SIZE);\r
+    labelTips_->SetVisible(true);\r
+\r
+    InitCircleProgress();\r
+\r
+    InitAnimator();\r
+\r
+    group_->Add(button_);\r
+    group_->Add(labelTips_);\r
+    AddViewToPageContainer(group_);\r
+}\r
+\r
+void HeartRateReadyPage::InitAnimator()\r
+{\r
+    callBack_ = new HeartAnimatorCallback(this);\r
+    if (callBack_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new callBack_ fail");\r
+        return;\r
+    }\r
+    animator_ = new Animator(callBack_, nullptr, 0, true);\r
+    if (animator_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new animator_ fail");\r
+        return;\r
+    }\r
+}\r
+\r
+int HeartRateReadyPage::InitCircleProgress()\r
+{\r
+    labelProgressTime_ = new UILabel();\r
+    if (labelProgressTime_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new labelProgressTime_ fail");\r
+        return OHOS_FAILURE;\r
+    }\r
+    labelProgressTime_->SetPosition(HEARTRATE_LABLEBACK_POSITION_X, HEARTRATE_LABLEBACK_POSITION_Y,\r
+                                    HEARTRATE_LABLEBACK_WIDTH, HEARTRATE_LABLEBACK_HEIGHT);\r
+    labelProgressTime_->SetText("3");\r
+    labelProgressTime_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, HEARTRATE_LABLEBACK_FONT_SIZE);\r
+    labelProgressTime_->SetVisible(false);\r
+    group_->Add(labelProgressTime_);\r
+\r
+    timeProgress_ = new UICircleProgress();\r
+    if (timeProgress_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new timeProgress_ fail");\r
+        return OHOS_FAILURE;\r
+    }\r
+    timeProgress_->SetPosition(HEARTRATE_PLAYBACK_POSITION_X, HEARTRATE_PLAYBACK_POSITION_Y,\r
+                               HEARTRATE_PLAYBACK_WIDTH, HEARTRATE_PLAYBACK_HEIGHT);\r
+    timeProgress_->SetCenterPosition(HEARTRATE_PLAYBACK_VENTER_POSITION, HEARTRATE_PLAYBACK_VENTER_POSITION);\r
+    timeProgress_->SetRange(HEARTRATE_PLAYBACK_RANGE, 0);\r
+    timeProgress_->SetRadius(HEARTRATE_PLAYBACK_RADIUS);\r
+    timeProgress_->SetStartAngle(HEARTRATE_PLAYBACK_START_ANGLE);\r
+    timeProgress_->SetEndAngle(0);\r
+    timeProgress_->SetValue(0);\r
+    timeProgress_->SetForegroundStyle(STYLE_LINE_COLOR, 0xFF491010);\r
+    timeProgress_->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+    timeProgress_->SetBackgroundStyle(STYLE_LINE_COLOR, 0xFFD72C2E);\r
+    timeProgress_->SetBackgroundStyle(STYLE_LINE_WIDTH, HEARTRATE_PLAYBACK_STYLE_LINE_WIDTH);\r
+    timeProgress_->SetForegroundStyle(STYLE_LINE_WIDTH, HEARTRATE_PLAYBACK_STYLE_LINE_WIDTH);\r
+    timeProgress_->SetVisible(false);\r
+    group_->Add(timeProgress_);\r
+    return OHOS_SUCCESS;\r
+}\r
+\r
+void HeartRateReadyPage::HeartAnimatorCallback::Callback(UIView *view)\r
+{\r
+    (void)view;\r
+    static int count = 0;\r
+    struct timeval current_time;\r
+    gettimeofday(&current_time, nullptr);\r
+    long seconds = current_time.tv_sec - page_->startTime_.tv_sec;\r
+    long micros = current_time.tv_usec - page_->startTime_.tv_usec;\r
+    long time = (seconds * HEARTRATE_TIME_USEC) + (micros / HEARTRATE_TIME_USEC);\r
+    page_->SetLabelProgressTime(time);\r
+    if ((time / HEARTRATE_TIME_USEC) == HEARTRATE_TIME_NUM) {\r
+        page_->StopAnimator();\r
+        NativeAbility::GetInstance().SwitchPageInSlice(HeartRateAllView::HEARTRATE_MEASUREMENT_PAGE,\r
+            TransitionType::TRANSITION_INVALID, false);\r
+    }\r
+}\r
+\r
+void HeartRateReadyPage::StopAnimator()\r
+{\r
+    button_->SetVisible(false);\r
+    labelTips_->SetVisible(false);\r
+    timeProgress_->SetVisible(false);\r
+    labelProgressTime_->SetVisible(false);\r
+    animator_->Stop();\r
+}\r
+\r
+void HeartRateReadyPage::SetLabelProgressTime(int time)\r
+{\r
+    int progressTime = HEARTRATE_PROGRESS_TIME - (time / HEARTRATE_TIME_USEC);\r
+    std::string strTime = std::to_string(progressTime);\r
+    labelProgressTime_->SetText(strTime.c_str());\r
+    double percentage = static_cast<double>(time) / (HEARTRATE_TIME_NUM * HEARTRATE_TIME_USEC);\r
+    double value = round(percentage * 100000);\r
+    timeProgress_->SetValue(value);\r
+}\r
+\r
+bool HeartRateReadyPage::OnDrag(UIView &view, const DragEvent &event)\r
+{\r
+    UNUSED(view);\r
+    if ((event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT) && (event.GetDeltaX() > X_DRAG_OFFSET) &&\r
+        (event.GetDeltaX() > (DOUBLES * MATH_ABS(event.GetDeltaY())))) {\r
+        StopAnimator();\r
+        NativeAbility::GetInstance().SwitchPageInSlice(HeartRateAllView::HEARTRATE_MAIN_PAGE,\r
+            TransitionType::TRANSITION_INVALID, false);\r
+    }\r
+    return true;\r
+}\r
+\r
+bool HeartRateReadyPage::OnClick(UIView &view, const ClickEvent &event)\r
+{\r
+    UNUSED(event);\r
+    if (strcmp(view.GetViewId(), HEART_START_BUTTON) == 0) {\r
+        labelTips_->SetVisible(false);\r
+        labelTips_->SetPosition(HEARTRATE_LABEL3_POSITION_X, HEARTRATE_LABEL3_POSITION_Y);\r
+        labelTips_->SetText("请屏幕朝上偏紧佩戴,                  保持静止");\r
+        labelTips_->SetVisible(true);\r
+        button_->SetVisible(false);\r
+        animator_->Start();\r
+        timeProgress_->SetVisible(true);\r
+        labelProgressTime_->SetVisible(true);\r
+        gettimeofday(&startTime_, nullptr);\r
+    }\r
+    return true;\r
+}\r
+}
\ No newline at end of file
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/heartrate/src/HeartRateResultGroup.cpp b/code/sdk/application/wearable/evb/nativeapp/nativeui/heartrate/src/HeartRateResultGroup.cpp
new file mode 100644 (file)
index 0000000..eb79403
--- /dev/null
@@ -0,0 +1,440 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: HeartRateResultGroup\r
+ * Create: 2025-06\r
+ */\r
+\r
+#include <string>\r
+#include "components/ui_list_nested.h"\r
+#include "components/ui_chart.h"\r
+#include "components/ui_scroll_view_nested.h"\r
+#include "common/image_cache_manager.h"\r
+#include "NativeAbility.h"\r
+#include "SlicePageFactory.h"\r
+#include "wearable_log.h"\r
+#include "main/LoadImg.h"\r
+#include "AppViewIDs.h"\r
+#include "ui_resource_heartRate.h"\r
+#include "heartrate/HeartRatePresenter.h"\r
+#include "heartrate/HeartRateModel.h"\r
+#include "heartrate/HeartRateResultGroup.h"\r
+\r
+static constexpr uint16_t PERSEC_HEART_RATE_FONT_SIZE = 38;\r
+static constexpr uint16_t PERSEC_HEART_RATE_X = 195;\r
+static constexpr uint16_t PERSEC_HEART_RATE_Y = 40;\r
+static constexpr uint16_t PERSEC_HEART_RATE_WIDTH = 260;\r
+static constexpr uint16_t PERSEC_HEART_RATE_HEIGHT = 53;\r
+static constexpr uint16_t PERSEC_HEART_TEXT_FONT_SIZE = 56;\r
+static constexpr uint16_t PERSEC_HEART_TEXT_X = 188;\r
+static constexpr uint16_t PERSEC_HEART_TEXT_Y = 96;\r
+static constexpr uint16_t PERSEC_HEART_TEXT_WIDTH = 80;\r
+static constexpr uint16_t PERSEC_HEART_TEXT_HEIGHT = 64;\r
+static constexpr uint16_t PERSEC_HEART_TEXT_FONT_SIZE_ONE = 21;\r
+static constexpr uint16_t PERSEC_HEART_TEXT_ONE_X = 259;\r
+static constexpr uint16_t PERSEC_HEART_TEXT_ONE_Y = 128;\r
+static constexpr uint16_t PERSEC_HEART_TEXT_WIDTH_ONE = 55;\r
+static constexpr uint16_t PERSEC_HEART_TEXT_HEIGHT_ONE = 24;\r
+static constexpr uint16_t COORDINATE_POINT_X = 70;\r
+static constexpr uint16_t COORDINATE_POINT_Y = 207;\r
+static constexpr uint16_t COORDINATE_HEIGHT = 156;\r
+static constexpr uint16_t COORDINATE_WIDTH = 330;\r
+static constexpr uint16_t HEART_RATE_LIMIT_FONT_SIZE = 25;\r
+static constexpr uint16_t HEART_RATE_X_FONT_SIZE = 16;\r
+static constexpr uint16_t TOP_TEXT_WIDTH = 52;\r
+static constexpr uint16_t TOP_TEXT_HEIGHT = 36;\r
+static constexpr uint16_t TOP_TEXT_X = 177;\r
+static constexpr uint16_t TOP_TEXT_Y = 392;\r
+static constexpr uint16_t BOTTOM_TEXT_WIDTH = 35;\r
+static constexpr uint16_t BOTTOM_TEXT_HEIGHT = 36;\r
+static constexpr uint16_t BOTTOM_TEXT_X = 274;\r
+static constexpr uint16_t BOTTOM_TEXT_Y = 392;\r
+static constexpr uint16_t HEART_RATE_LIMIT_FONT_SIZE_ONE = 24;\r
+static constexpr uint16_t BOTTOM_TEXT_WIDTH_ONE = 89;\r
+static constexpr uint16_t BOTTOM_TEXT_HEIGHT_ONE = 29;\r
+static constexpr uint16_t BOTTOM_TEXT_ONE_X = 188;\r
+static constexpr uint16_t BOTTOM_TEXT_ONE_Y = 160;\r
+static constexpr uint16_t ANIMATOR_IMAGE_X = 120;\r
+static constexpr uint16_t ANIMATOR_IMAGE_Y = 98;\r
+static constexpr uint16_t ANIMATOR_IMAGE_WIDTH = 60;\r
+static constexpr uint16_t ANIMATOR_IMAGE_HEIGHT = 60;\r
+static constexpr uint16_t HEART_LABLE_ONE_POSION_X = 63;\r
+static constexpr uint16_t HEART_LABLE_THREE_POSION_X = 210;\r
+static constexpr uint16_t HEART_LABLE_FIVE_POSION_X = 350;\r
+static constexpr uint16_t HEART_LABLE_POSION_X = 10;\r
+static constexpr uint16_t HEART_LABLE_POSION_Y = 369;\r
+static constexpr uint16_t HEART_LABLE1_POSION_Y = 320;\r
+static constexpr uint16_t HEART_LABLE2_POSION_Y = 290;\r
+static constexpr uint16_t HEART_LABLE3_POSION_Y = 260;\r
+static constexpr uint16_t HEART_LABLE4_POSION_Y = 230;\r
+static constexpr uint16_t IMAGE_RED_TEXT_X = 157;\r
+static constexpr uint16_t IMAGE_RED_TEXT_Y = 407;\r
+static constexpr uint16_t IMAGE_BACK_TEXT_X = 254;\r
+static constexpr uint16_t IMAGE_BACK_TEXT_Y = 407;\r
+static constexpr uint16_t XAXIS_SETMARKNUM = 40;\r
+static constexpr uint16_t XAXIS_LINENUM = 3;\r
+static constexpr uint16_t YAXIS_SETMARKNUM = 5;\r
+static constexpr uint16_t XAXIS_SETDATARANGE = 45;\r
+static constexpr uint16_t YAXIS_SETDATARANGE = 200;\r
+static constexpr uint16_t CHART_LINE_NUM_ONE = 10;\r
+static constexpr uint16_t CHART_LINE_NUM_TWO = 60;\r
+\r
+namespace OHOS {\r
+const int g_imageAnimatorInfo[HEARTRATE_ANIMATOR_IMAGE_NUM] = {\r
+    IMAGE_HEART_RATE_FRAME00, IMAGE_HEART_RATE_FRAME01, IMAGE_HEART_RATE_FRAME02, IMAGE_HEART_RATE_FRAME03,\r
+    IMAGE_HEART_RATE_FRAME04, IMAGE_HEART_RATE_FRAME05, IMAGE_HEART_RATE_FRAME06, IMAGE_HEART_RATE_FRAME07,\r
+    IMAGE_HEART_RATE_FRAME08, IMAGE_HEART_RATE_FRAME09, IMAGE_HEART_RATE_FRAME10, IMAGE_HEART_RATE_FRAME11,\r
+    IMAGE_HEART_RATE_FRAME12, IMAGE_HEART_RATE_FRAME13, IMAGE_HEART_RATE_FRAME14, IMAGE_HEART_RATE_FRAME15,\r
+    IMAGE_HEART_RATE_FRAME16, IMAGE_HEART_RATE_FRAME17, IMAGE_HEART_RATE_FRAME18, IMAGE_HEART_RATE_FRAME19,\r
+    IMAGE_HEART_RATE_FRAME20, IMAGE_HEART_RATE_FRAME21, IMAGE_HEART_RATE_FRAME22, IMAGE_HEART_RATE_FRAME23,\r
+    IMAGE_HEART_RATE_FRAME24, IMAGE_HEART_RATE_FRAME25, IMAGE_HEART_RATE_FRAME26, IMAGE_HEART_RATE_FRAME27,\r
+    IMAGE_HEART_RATE_FRAME28, IMAGE_HEART_RATE_FRAME29,\r
+};\r
+\r
+HeartRateResultGroup::HeartRateResultGroup()\r
+{\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HeartRateResultGroup::HeartRateResultGroup");\r
+    InitPage();\r
+}\r
+\r
+void HeartRateResultGroup::InitPage()\r
+{\r
+    SetPosition(0, 0);\r
+    Resize(HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);\r
+\r
+    mainImg_ = new UIImageView();\r
+    if (mainImg_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new mainImg_ fail");\r
+        return;\r
+    }\r
+    mainImg_->SetPosition(0, 0);\r
+    mainImg_->SetStyle(STYLE_BACKGROUND_OPA, OPA_OPAQUE);\r
+    LOADIMG::LoadImageViewImg(mainImg_, HEART_RATE_IMAGE, IMAGE_HEART_RATE_BG2);\r
+    Add(mainImg_);\r
+\r
+    labelTitle_ = new UILabel();\r
+    if (labelTitle_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new labelTitle_ fail");\r
+        return;\r
+    }\r
+    labelTitle_->SetText("心率");\r
+    labelTitle_->SetPosition(PERSEC_HEART_RATE_X, PERSEC_HEART_RATE_Y, PERSEC_HEART_RATE_WIDTH,\r
+                             PERSEC_HEART_RATE_HEIGHT);\r
+    labelTitle_->SetFont(BOLD_VECTOR_FONT_FILENAME, PERSEC_HEART_RATE_FONT_SIZE);\r
+    Add(labelTitle_);\r
+\r
+    labelHeartRateValue_ = new UILabel();\r
+    if (labelHeartRateValue_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new labelHeartRateValue_ fail");\r
+        return;\r
+    }\r
+    labelHeartRateValue_->SetPosition(PERSEC_HEART_TEXT_X, PERSEC_HEART_TEXT_Y, PERSEC_HEART_TEXT_WIDTH,\r
+                                      PERSEC_HEART_TEXT_HEIGHT);\r
+    labelHeartRateValue_->SetFont(BOLD_VECTOR_FONT_FILENAME, PERSEC_HEART_TEXT_FONT_SIZE);\r
+    heartRateMeasurementInfo info = HeartRateModel::GetInstance().GetHeartRate();\r
+    std::string strHeartRate = std::to_string(info.heartRate);\r
+    labelHeartRateValue_->SetText(strHeartRate.c_str());\r
+    Add(labelHeartRateValue_);\r
+\r
+    labelUnitText_ = new UILabel();\r
+    if (labelUnitText_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new labelUnitText_ fail");\r
+        return;\r
+    }\r
+    labelUnitText_->SetText("次/分");\r
+    labelUnitText_->SetPosition(PERSEC_HEART_TEXT_ONE_X, PERSEC_HEART_TEXT_ONE_Y, PERSEC_HEART_TEXT_WIDTH_ONE,\r
+                                PERSEC_HEART_TEXT_HEIGHT_ONE);\r
+    labelUnitText_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, PERSEC_HEART_TEXT_FONT_SIZE_ONE);\r
+    Add(labelUnitText_);\r
+\r
+    dataSerial_ = new UIChartDataSerial();\r
+    if (dataSerial_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new dataSerial_ fail");\r
+        return;\r
+    }\r
+    dataSerial_->SetMaxDataCount(XAXIS_SETDATARANGE);\r
+    // 打桩数据,真实测量数据的存储和更新需要客户自实现\r
+    Point pointArray[XAXIS_SETDATARANGE] = {\r
+        {0, 100},  {1, 110},  {2, 112},  {3, 114},  {4, 116},  {5, 118},  {6, 120},  {7, 122},  {8, 124},\r
+        {9, 126},  {10, 128}, {11, 140}, {12, 140}, {13, 160}, {14, 160}, {15, 160}, {16, 176}, {17, 180},\r
+        {18, 192}, {19, 160}, {20, 176}, {21, 172}, {22, 172}, {23, 148}, {24, 146}, {25, 144}, {26, 120},\r
+        {27, 110}, {28, 110}, {29, 108}, {30, 106}, {31, 104}, {32, 102}, {33, 88},  {34, 86},  {35, 78},\r
+        {36, 78},  {37, 78},  {38, 80},  {39, 80},  {40, 82},  {41, 82},  {42, 88},  {43, 90},  {44, 96}};\r
+    dataSerial_->AddPoints(pointArray, XAXIS_SETDATARANGE);\r
+    dataSerial_->SetLineColor(Color::Red());\r
+    dataSerial_->SetFillColor(Color::Red());\r
+    dataSerial_->EnableGradient(true);\r
+\r
+    chartPolyline_ = new UIChartPolyline();\r
+    if (chartPolyline_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new chartPolyline_ fail");\r
+        return;\r
+    }\r
+    chartPolyline_->SetPosition(COORDINATE_POINT_X, COORDINATE_POINT_Y);\r
+    chartPolyline_->SetWidth(COORDINATE_WIDTH);\r
+    chartPolyline_->SetHeight(COORDINATE_HEIGHT);\r
+    chartPolyline_->SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
+    chartPolyline_->SetStyle(STYLE_BACKGROUND_OPA, 0);\r
+    chartPolyline_->SetStyle(STYLE_LINE_WIDTH, XAXIS_LINENUM);\r
+\r
+    UIXAxis &xAxis = chartPolyline_->GetXAxis();\r
+    UIYAxis &yAxis = chartPolyline_->GetYAxis();\r
+    xAxis.SetDataRange(0, XAXIS_SETDATARANGE);\r
+    yAxis.SetDataRange(0, YAXIS_SETDATARANGE);\r
+    xAxis.SetMarkNum(XAXIS_SETMARKNUM);\r
+    yAxis.SetMarkNum(YAXIS_SETMARKNUM);\r
+    xAxis.SetStyle(STYLE_LINE_COLOR, 0x14FF5F5F5);\r
+    yAxis.SetStyle(STYLE_LINE_COLOR, 0x14FF5F5F5);\r
+    chartPolyline_->SetGradientOpacity(CHART_LINE_NUM_ONE, CHART_LINE_NUM_TWO);\r
+    chartPolyline_->AddDataSerial(dataSerial_);\r
+    Add(chartPolyline_);\r
+\r
+    labelXAxisPointOne_ = new UILabel();\r
+    if (labelXAxisPointOne_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new labelXAxisPointOne_ fail");\r
+        return;\r
+    }\r
+    labelXAxisPointOne_->SetText("00:00");\r
+    labelXAxisPointOne_->SetPosition(HEART_LABLE_ONE_POSION_X, HEART_LABLE_POSION_Y, TOP_TEXT_WIDTH, TOP_TEXT_HEIGHT);\r
+    labelXAxisPointOne_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, HEART_RATE_X_FONT_SIZE);\r
+    Add(labelXAxisPointOne_);\r
+\r
+    labelXAxisPointTwo_ = new UILabel();\r
+    if (labelXAxisPointTwo_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new labelXAxisPointTwo_ fail");\r
+        return;\r
+    }\r
+    labelXAxisPointTwo_->SetText("12:00");\r
+    labelXAxisPointTwo_->SetPosition(HEART_LABLE_THREE_POSION_X, HEART_LABLE_POSION_Y, TOP_TEXT_WIDTH, TOP_TEXT_HEIGHT);\r
+    labelXAxisPointTwo_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, HEART_RATE_X_FONT_SIZE);\r
+    Add(labelXAxisPointTwo_);\r
+    labelXAxisPointThree_ = new UILabel();\r
+    if (labelXAxisPointThree_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new labelXAxisPointThree_ fail");\r
+        return;\r
+    }\r
+    labelXAxisPointThree_->SetText("24:00");\r
+    labelXAxisPointThree_->SetPosition(HEART_LABLE_FIVE_POSION_X, HEART_LABLE_POSION_Y, TOP_TEXT_WIDTH,\r
+                                       TOP_TEXT_HEIGHT);\r
+    labelXAxisPointThree_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, HEART_RATE_X_FONT_SIZE);\r
+    Add(labelXAxisPointThree_);\r
+\r
+    labelYAxisPointOne_ = new UILabel();\r
+    if (labelYAxisPointOne_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new labelYAxisPointOne_ fail");\r
+        return;\r
+    }\r
+    labelYAxisPointOne_->SetText("50");\r
+    labelYAxisPointOne_->SetPosition(HEART_LABLE_POSION_X, HEART_LABLE1_POSION_Y, TOP_TEXT_WIDTH, TOP_TEXT_HEIGHT);\r
+    labelYAxisPointOne_->SetAlign(TEXT_ALIGNMENT_RIGHT);\r
+    labelYAxisPointOne_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, HEART_RATE_X_FONT_SIZE);\r
+    Add(labelYAxisPointOne_);\r
+\r
+    labelYAxisPointTwo_ = new UILabel();\r
+    if (labelYAxisPointTwo_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new labelYAxisPointTwo_ fail");\r
+        return;\r
+    }\r
+    labelYAxisPointTwo_->SetText("100");\r
+    labelYAxisPointTwo_->SetPosition(HEART_LABLE_POSION_X, HEART_LABLE2_POSION_Y, TOP_TEXT_WIDTH, TOP_TEXT_HEIGHT);\r
+    labelYAxisPointTwo_->SetAlign(TEXT_ALIGNMENT_RIGHT);\r
+    labelYAxisPointTwo_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, HEART_RATE_X_FONT_SIZE);\r
+    Add(labelYAxisPointTwo_);\r
+\r
+    labelYAxisPointThree_ = new UILabel();\r
+    if (labelYAxisPointThree_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new labelYAxisPointThree_ fail");\r
+        return;\r
+    }\r
+    labelYAxisPointThree_->SetText("150");\r
+    labelYAxisPointThree_->SetPosition(HEART_LABLE_POSION_X, HEART_LABLE3_POSION_Y, TOP_TEXT_WIDTH, TOP_TEXT_HEIGHT);\r
+    labelYAxisPointThree_->SetAlign(TEXT_ALIGNMENT_RIGHT);\r
+    labelYAxisPointThree_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, HEART_RATE_X_FONT_SIZE);\r
+    Add(labelYAxisPointThree_);\r
+\r
+    labelYAxisPointFour_ = new UILabel();\r
+    if (labelYAxisPointFour_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new labelYAxisPointFour_ fail");\r
+        return;\r
+    }\r
+    labelYAxisPointFour_->SetText("200");\r
+    labelYAxisPointFour_->SetPosition(HEART_LABLE_POSION_X, HEART_LABLE4_POSION_Y, TOP_TEXT_WIDTH, TOP_TEXT_HEIGHT);\r
+    labelYAxisPointFour_->SetAlign(TEXT_ALIGNMENT_RIGHT);\r
+    labelYAxisPointFour_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, HEART_RATE_X_FONT_SIZE);\r
+    Add(labelYAxisPointFour_);\r
+\r
+    labelMaxValue_ = new UILabel();\r
+    if (labelMaxValue_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new labelMaxValue_ fail");\r
+        return;\r
+    }\r
+    \r
+    // 打桩数据,后续需要根据测量结果修改最大值显示\r
+    labelMaxValue_->SetText("148");\r
+    labelMaxValue_->SetPosition(TOP_TEXT_X, TOP_TEXT_Y, TOP_TEXT_WIDTH, TOP_TEXT_HEIGHT);\r
+    labelMaxValue_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, HEART_RATE_LIMIT_FONT_SIZE);\r
+    Add(labelMaxValue_);\r
+\r
+    imageRedArrow_ = new UIImageView();\r
+    if (imageRedArrow_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new imageRedArrow_ fail");\r
+        return;\r
+    }\r
+    imageRedArrow_->SetPosition(IMAGE_RED_TEXT_X, IMAGE_RED_TEXT_Y);\r
+    imageRedArrow_->SetStyle(STYLE_BACKGROUND_OPA, OPA_OPAQUE);\r
+    LOADIMG::LoadImageViewImg(imageRedArrow_, HEART_RATE_IMAGE, IMAGE_HEART_RATE_UP);\r
+    Add(imageRedArrow_);\r
+    labelMinValue_ = new UILabel();\r
+    if (labelMinValue_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new labelMinValue_ fail");\r
+        return;\r
+    }\r
+\r
+    // 打桩数据,后续需要根据测量结果修改最小值显示\r
+    labelMinValue_->SetText("59");\r
+    labelMinValue_->SetPosition(BOTTOM_TEXT_X, BOTTOM_TEXT_Y, BOTTOM_TEXT_WIDTH, BOTTOM_TEXT_HEIGHT);\r
+    labelMinValue_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, HEART_RATE_LIMIT_FONT_SIZE);\r
+    Add(labelMinValue_);\r
+\r
+    imageBlackArrow_ = new UIImageView();\r
+    if (imageBlackArrow_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new imageBlackArrow_ fail");\r
+        return;\r
+    }\r
+    imageBlackArrow_->SetPosition(IMAGE_BACK_TEXT_X, IMAGE_BACK_TEXT_Y);\r
+    imageBlackArrow_->SetStyle(STYLE_BACKGROUND_OPA, OPA_OPAQUE);\r
+    LOADIMG::LoadImageViewImg(imageBlackArrow_, HEART_RATE_IMAGE, IMAGE_HEART_RATE_DOWN);\r
+    Add(imageBlackArrow_);\r
+\r
+    labelLastMeasureTime_ = new UILabel();\r
+    if (labelLastMeasureTime_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new labelLastMeasureTime_ fail");\r
+        return;\r
+    }\r
+    labelLastMeasureTime_->SetText("刚刚");\r
+    labelLastMeasureTime_->SetPosition(BOTTOM_TEXT_ONE_X, BOTTOM_TEXT_ONE_Y, BOTTOM_TEXT_WIDTH_ONE,\r
+                                       BOTTOM_TEXT_HEIGHT_ONE);\r
+    labelLastMeasureTime_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, HEART_RATE_LIMIT_FONT_SIZE_ONE);\r
+    labelLastMeasureTime_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+    labelLastMeasureTime_->SetStyle(STYLE_TEXT_COLOR, 0xFFCCCCCC);\r
+    labelLastMeasureTime_->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+\r
+    Add(labelLastMeasureTime_);\r
+\r
+    SetDraggable(true);\r
+    SetTouchable(true);\r
+    InitImageAnimator();\r
+}\r
+\r
+HeartRateResultGroup::~HeartRateResultGroup()\r
+{\r
+    RemoveAll();\r
+\r
+    if (labelTitle_ != nullptr) {\r
+        delete labelTitle_;\r
+        labelTitle_ = nullptr;\r
+    }\r
+    if (labelHeartRateValue_ != nullptr) {\r
+        delete labelHeartRateValue_;\r
+        labelHeartRateValue_ = nullptr;\r
+    }\r
+    if (chartPolyline_ != nullptr) {\r
+        delete chartPolyline_;\r
+        chartPolyline_ = nullptr;\r
+    }\r
+    if (labelLastMeasureTime_ != nullptr) {\r
+        delete labelLastMeasureTime_;\r
+        labelLastMeasureTime_ = nullptr;\r
+    }\r
+    if (labelMaxValue_ != nullptr) {\r
+        delete labelMaxValue_;\r
+        labelMaxValue_ = nullptr;\r
+    }\r
+    if (labelMinValue_ != nullptr) {\r
+        delete labelMinValue_;\r
+        labelMinValue_ = nullptr;\r
+    }\r
+    if (labelUnitText_ != nullptr) {\r
+        delete labelUnitText_;\r
+        labelUnitText_ = nullptr;\r
+    }\r
+    if (imageAnimator_ != nullptr) {\r
+        delete imageAnimator_;\r
+        imageAnimator_ = nullptr;\r
+    }\r
+    if (dataSerial_ != nullptr) {\r
+        delete dataSerial_;\r
+        dataSerial_ = nullptr;\r
+    }\r
+    if (imageRedArrow_ != nullptr) {\r
+        delete imageRedArrow_;\r
+        imageRedArrow_ = nullptr;\r
+    }\r
+    if (imageBlackArrow_ != nullptr) {\r
+        delete imageBlackArrow_;\r
+        imageBlackArrow_ = nullptr;\r
+    }\r
+    if (labelXAxisPointOne_ != nullptr) {\r
+        delete labelXAxisPointOne_;\r
+        labelXAxisPointOne_ = nullptr;\r
+    }\r
+    if (labelXAxisPointTwo_ != nullptr) {\r
+        delete labelXAxisPointTwo_;\r
+        labelXAxisPointTwo_ = nullptr;\r
+    }\r
+    if (labelXAxisPointThree_ != nullptr) {\r
+        delete labelXAxisPointThree_;\r
+        labelXAxisPointThree_ = nullptr;\r
+    }\r
+    if (labelYAxisPointOne_ != nullptr) {\r
+        delete labelYAxisPointOne_;\r
+        labelYAxisPointOne_ = nullptr;\r
+    }\r
+    if (labelYAxisPointTwo_ != nullptr) {\r
+        delete labelYAxisPointTwo_;\r
+        labelYAxisPointTwo_ = nullptr;\r
+    }\r
+    if (labelYAxisPointThree_ != nullptr) {\r
+        delete labelYAxisPointThree_;\r
+        labelYAxisPointThree_ = nullptr;\r
+    }\r
+    if (labelYAxisPointFour_ != nullptr) {\r
+        delete labelYAxisPointFour_;\r
+        labelYAxisPointFour_ = nullptr;\r
+    }\r
+    if (mainImg_ != nullptr) {\r
+        delete mainImg_;\r
+        mainImg_ = nullptr;\r
+    }\r
+    ImageCacheManager::GetInstance().UnloadAllInMultiRes(HEART_RATE_IMAGE);\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HeartRateResultGroup::~HeartRateResultGroup");\r
+}\r
+\r
+void HeartRateResultGroup::InitImageAnimator()\r
+{\r
+    imageAnimator_ = new UIImageAnimatorView();\r
+    if (imageAnimator_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new imageAnimator_ fail");\r
+        return;\r
+    }\r
+    for (uint8_t i = 0; i < HEARTRATE_ANIMATOR_IMAGE_NUM; i++) {\r
+        imageAnimatorImageInfo_[i].imageInfo =\r
+            ImageCacheManager::GetInstance().LoadOneInMultiRes(g_imageAnimatorInfo[i], HEART_RATE_IMAGE);\r
+        imageAnimatorImageInfo_[i].imageType = IMG_SRC_IMAGE_INFO;\r
+        imageAnimatorImageInfo_[i].pos.x = ANIMATOR_IMAGE_X;\r
+        imageAnimatorImageInfo_[i].pos.y = ANIMATOR_IMAGE_Y;\r
+        imageAnimatorImageInfo_[i].width = ANIMATOR_IMAGE_WIDTH;\r
+        imageAnimatorImageInfo_[i].height = ANIMATOR_IMAGE_HEIGHT;\r
+    }\r
+\r
+    imageAnimator_->SetPosition(PERSEC_HEART_TEXT_X, PERSEC_HEART_TEXT_Y);\r
+    imageAnimator_->SetImageAnimatorSrc(imageAnimatorImageInfo_, HEARTRATE_ANIMATOR_IMAGE_NUM,\r
+                                        HEARTRATE_ANIMATOR_IMAGE_UPDATE);\r
+    imageAnimator_->SetRepeat(true);\r
+    imageAnimator_->SetAutoEnable(false);\r
+    imageAnimator_->SetResizeMode(UIImageView::FILL);\r
+    imageAnimator_->Start();\r
+    imageAnimator_->LayoutCenterOfParent();\r
+    imageAnimator_->SetDraggable(true);\r
+    Add(imageAnimator_);\r
+}\r
+}
\ No newline at end of file
index 2d0a687..b639739 100644 (file)
@@ -19,7 +19,6 @@
 #include "font/ui_font_bitmap.h"\r
 #include "font/ui_font.h"\r
 #include "graphic_config.h"\r
-#include "main/ModelListenerSample.h"\r
 #include "activity/ActivityModel.h"\r
 #include "activity/ActivityPresenter.h"\r
 #include "activity/ActivityWeekView.h"\r
index 0732949..11c5211 100644 (file)
 #include "components/ui_label_button.h"\r
 #include "components/ui_digital_clock.h"\r
 #include "gfx_utils/graphic_log.h"\r
-#include "main/ModelListenerSample.h"\r
 #include "alarm/AlarmCloseRingView.h"\r
 #include "alarm/AlarmRingView.h"\r
 #include "alarm/AlarmPopUpView.h"\r
 #include "alarm/AlarmClockModel.h"\r
 #include "wearable_log.h"\r
+#include "common/task.h"\r
 \r
 namespace OHOS {\r
 #define SET_TIME "settime"\r
@@ -49,7 +49,7 @@ typedef enum {
 \r
 class AlarmPopUpView;\r
 class AlarmPopUpPresenter : public Presenter<AlarmPopUpView>, public UIView::OnClickListener,\r
-    public UIView::OnDragListener, public ModelListenerSample {\r
+    public UIView::OnDragListener, public Task {\r
 public:\r
     AlarmPopUpPresenter();\r
     ~AlarmPopUpPresenter() override;\r
@@ -57,9 +57,11 @@ public:
     bool OnClick(UIView &view, const ClickEvent &event) override;\r
     bool OnDrag(UIView& view, const DragEvent& event) override;\r
     bool OnDragEnd(UIView& view, const DragEvent& event) override;\r
-    void Notify() override;\r
+    void Callback() override;\r
     void CancelAlarmRing(void);\r
     void DelayAlarmRing(void);\r
+    void OnPause() override;\r
+    void OnResume() override;\r
 private:\r
     bool isStartCalcu{true};\r
     uint16_t calcuNotifyNums{0};\r
index 0216f98..d7f5489 100644 (file)
 #include "aod_view/AodView.h"
 #include "components/ui_view.h"
 #include "key/KeyInputListener.h"
-#include "main/ModelListenerSample.h"
+#include "common/task.h"
 
 namespace OHOS {
 class AodView;
 class AodModel;
-class AodPresenter : public Presenter<AodView>, public ModelListenerSample {
+class AodPresenter : public Presenter<AodView>, public Task {
 public:
     AodPresenter() {}
     ~AodPresenter() override {}
     AodPresenter(const AodPresenter &) = delete;
     AodPresenter &operator=(const AodPresenter &) = delete;
-    void Notify() override;
+    void OnResume() override;
+    void OnPause() override;
+    void Callback() override;
 }; // AodPresenter
 } // OHOS
 
index e012a46..99f0587 100644 (file)
@@ -9,10 +9,10 @@
 #define AODVIEW_H
 #include "View.h"
 #include "main/MainModel.h"
-#include "set_dial/SetDialInfo.h"
 #include "main/DialBinTypesV2.h"
 #include "components/ui_view.h"
 #include "components/ui_card_page.h"
+#include "components/ui_fragment.h"
 
 namespace OHOS {
 class AodPresenter;
@@ -25,7 +25,7 @@ public:
 
     void OnStart() override;
     void OnStop() override;
-    void PeriodicUpdate();
+    void Update();
 
 private:
     UIViewGroup *InitAodDial(DialSetting &setting);
@@ -33,7 +33,8 @@ private:
     UIViewGroup *InitDefaultAod();
     bool isLoaded_ = false;
 
-    UIViewGroup *clockDial_;
+    UIViewGroup *clockDial_{nullptr};
+    UIFragment *clockDialFragment_{nullptr};
 };
 } // OHOS
 #endif // AODVIEW_H
\ No newline at end of file
index 51eb58c..fa19b49 100644 (file)
@@ -33,46 +33,6 @@ private:
     UILabelExt label_;
     AppItem itemInfo_;
 };
-
-class HexagonsItemView : public UIImageView {
-public:
-    explicit HexagonsItemView();
-    ~HexagonsItemView();
-    void SetItemInfo(const AppItem &itemInfo);
-    AppViewId GetViewId();
-    const char *GetAppUid();
-private:
-    HexagonsItemView(const HexagonsItemView &);
-    HexagonsItemView &operator = (const HexagonsItemView &);
-    AppItem itemInfo_;
-};
-
-class FootballItemView : public UIImageView {
-public:
-    explicit FootballItemView() {}
-    ~FootballItemView();
-    void SetItemInfo(const AppItem &itemInfo);
-    AppViewId GetViewId();
-    const char *GetAppUid();
-private:
-    FootballItemView(const FootballItemView &);
-    FootballItemView &operator = (const FootballItemView &);
-    AppItem itemInfo_;
-};
-
-
-class WaterfallItemView : public UIImageView {
-public:
-    explicit WaterfallItemView() {}
-    ~WaterfallItemView();
-    void SetItemInfo(const AppItem &itemInfo);
-    AppViewId GetViewId();
-    const char *GetAppUid();
-private:
-    WaterfallItemView(const WaterfallItemView &);
-    WaterfallItemView &operator = (const WaterfallItemView &);
-    AppItem itemInfo_;
-};
 }
 
 #endif
index 1cd7bd0..5371b1a 100644 (file)
@@ -57,13 +57,6 @@ struct AppItem {
         uid(uid) {}
 };
 
-enum AppListStyle {
-    APPLIST_STYLE,
-    HEXAGONS_STYLE,
-    FOOTBALL_STYLE,
-    WATERFALL_STYLE
-};
-
 class ApplistPresenter;
 class ApplistModel {
 public:
@@ -75,12 +68,14 @@ public:
     void ResolvingJSAppItems(void);
     void SetStartIndex(uint16_t index);
     uint16_t GetStartIndex(void);
+    void SetLastOffset(int16_t x, int16_t y);
+    void GetLastOffset(int16_t& x, int16_t& y);
     void SetHeadItemY(int index);
     int GetHeadItemY(void);
     void ApplistUpdate(void);
     void SetPresenter(ApplistPresenter *p);
-    AppListStyle GetCurrentStyle(void);
     void SetInitFlag(bool flag);
+    void CleanupApplistStrings(uint8_t nativeAppNumTotal);
 
 private:
     ApplistModel();
@@ -93,9 +88,11 @@ private:
     BundleInfo *bundleInfos = nullptr;
     int32 bundleLen = 0;
     uint8 appLen = 0;
-
+    uint8 nativeAppNumTotal = 0;
     uint16_t startIndex = 0;
     int headItemY = 0;
+    int16_t lastOffsetX = 0;
+    int16_t lastOffsetY = 0;
     bool initFlag{false};
 };
 }
index 1275b0a..4e47b73 100644 (file)
@@ -9,37 +9,21 @@
 #define APPLIST_PRESENTER_H
 
 #include "Presenter.h"
-#include "ohos_types.h"
-#include "applist/AppItemView.h"
-#include "applist/ApplistView.h"
-#include "applist/ApplistModel.h"
-#include "components/root_view.h"
+#include "ApplistView.h"
+#include "ApplistModel.h"
 
 namespace OHOS {
-    class ApplistPresenter : public Presenter<ApplistView>, public UIView::OnClickListener,
-                             public ListScrollListener, public UIView::OnRotateListener {
-    public:
-        ApplistPresenter();
-        ~ApplistPresenter() override;
+class ApplistPresenter : public Presenter<ApplistView> {
+public:
+    ApplistPresenter();
+    ~ApplistPresenter() override;
+    void OnStart() override;
+    void OnResume() override;
+    ApplistView* GetAppListView();
 
-        void OnStart() override;
-        void OnResume() override;
-        bool OnRotate(UIView& view, const RotateEvent& event) override;
-        bool OnClick(UIView &view, const ClickEvent &event) override;
-        void OnItemSelected(int16 index, UIView *view) override;
-        void SetStartIndex(uint16_t index);
-        uint16_t GetStartIndex(void);
-        void SetHeadItemY(int y);
-        int GetHeadItemY(void);
-        uint8_t GetListItemNum(void);
-        ApplistView* GetAppListView();
-        AppListStyle GetCurrentStyle(void);
-
-    private:
-        AppItemView *itemViewSele{nullptr};
-        AppItemView *preItemViewSele{nullptr};
-        ApplistModel *model{nullptr};
-    };
+private:
+    ApplistModel *model{nullptr};
+};
 }
 
 #endif // APPLIST_PRESENTER_H
index ab2ce4a..7e502f0 100644 (file)
 #define APPLIST_VIEW_H
 
 #include "View.h"
-#include "animator/animator_manager.h"
-#include "components/root_view.h"
-#include "components/ui_view_group.h"
-#include "components/ui_scroll_view.h"
-#include "components/ui_label.h"
-#include "components/ui_list.h"
-#include "components/ui_custom_hexagons_list.h"
-#include "components/ui_waterfall_list.h"
-#include "components/ui_icosahedron_view.h"
-#include "gfx_utils/list.h"
-#include "ohos_types.h"
-#include "applist/ApplistAdapter.h"
-#include "ChangeSliceListener.h"
-#include "drag_event.h"
-#include "UiConfig.h"
+#include "UIDesktopFragment.h"
 
 namespace OHOS {
-class AppListOnDragListener : public UIView::OnDragListener {
-public:
-    AppListOnDragListener()
-    {
-        continueDrag = false;
-    }
-    ~AppListOnDragListener() override {}
-    bool OnDragStart(UIView& view, const DragEvent& event) override
-    {
-        UNUSED(view);
-        UNUSED(event);
-        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Applist Ondragstart!!");
-        continueDrag = true;
-        return false;
-    }
-
-    bool OnDrag(UIView& view, const DragEvent& event) override
-    {
-        UNUSED(view);
-        if (!continueDrag) {
-            WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "AppList : Can not continue drag!!");
-            return false;
-        }
-        if ((event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT) &&
-            (event.GetDeltaX() > X_DRAG_OFFSET) && (event.GetDeltaX() > (DOUBLES * MATH_ABS(event.GetDeltaY())))) {
-            WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Applist Ondrag!!");
-            NativeAbility::GetInstance().ChangeSlice(VIEW_MAIN_SAMPLE, TransitionType::TRANSITION_ZOOM);
-        }
-
-        return false;
-    }
-
-    bool OnDragEnd(UIView& view, const DragEvent& event) override
-    {
-        UNUSED(view);
-        UNUSED(event);
-        return false;
-    }
-private:
-    bool continueDrag{false};
-};
-
-class FootballAnimatorCallback : public AnimatorCallback {
-public:
-    explicit FootballAnimatorCallback(UIView* view, int16_t startPos, int16_t endPos)
-        : startPos_(startPos),
-          endPos_(endPos),
-          startTime_(0),
-          animator_(new Animator(this, view, 1000, false)) {}  // 1000:duration of animator_, in milliseconds.
-
-    ~FootballAnimatorCallback() override
-    {
-        if (animator_ != nullptr) {
-            delete animator_;
-            animator_ = nullptr;
-        }
-    }
-
-    void Callback(UIView* view) override;
-
-    Animator* GetAnimator() const
-    {
-        return animator_;
-    }
-
-    void SetStartTime(uint32_t time)
-    {
-        isStartAnim_ = false;
-        startTime_ = time;
-    }
-protected:
-    int16_t startPos_;
-    int16_t endPos_;
-    uint32_t startTime_;
-    bool isStartAnim_ = false;
-    Animator* animator_;
-};
-
 class ApplistPresenter;
 class ApplistView : public View<ApplistPresenter> {
 public:
-    ApplistView();
-    ~ApplistView() override;
+    ApplistView() {};
+    ~ApplistView() override {};
 
     void OnStart() override;
     void OnStop() override;
-
-    void LoadAppIconImage(UIImageView *view, const uint32_t id, const char *path);
+    void OnResume();
     void AddAppItemToList(const AppItem &item);
     void ClearAppItemToList();
-    void RefreshAppList(void);
-    void StartFootBallAnimator();
-    void ResumeWaterFallDraggable();
+    void RefreshAppList();
 
 private:
-    /* for list style */
-    void ListStyleOnStart();
-    void ListStyleOnStop();
-    ApplistAdapter *listAdapter_{nullptr};
-    UIList *contentList_{nullptr};
-    UIView::OnDragListener *dragListener_{nullptr};
-
-    /* for hexagons style */
-    void HexagonsStyleOnStart();
-    void HexagonsStyleOnStop();
-    UICustomHexagonsList* hexagonsList_{nullptr};
-    List<HexagonsItemView*> listHexagonsView_;
-    uint16_t imgSize_ = 0;
-    uint16_t imgDistance_ = 0;
-
-    /* for football style */
-    void FootballStyleOnStart();
-    void FootballStyleOnStop();
-    UIIcosahedronView* footballList_ = nullptr;
-    List<FootballItemView*> footballItemList_;
-    ImageInfo* footballDefaultImg_ = nullptr;
-    FootballAnimatorCallback* callback_ = nullptr;
-    Animator* enterAnimator_ = nullptr;
-
-    /* for waterfall style */
-    void WaterfallStyleOnStart();
-    void WaterfallStyleOnStop();
-    UIWaterfallList* waterfallList_{nullptr};
-    List<WaterfallItemView*> waterfallItemList_;
+    UIDesktopFragment *desktopFragment_ = nullptr;
 };
 }
-#endif // APPLIST_VIEW_H
\ No newline at end of file
+#endif // APPLIST_VIEW_H
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/include/applist/DesktopFactory.h b/code/sdk/application/wearable/evb/nativeapp/nativeui/include/applist/DesktopFactory.h
new file mode 100644 (file)
index 0000000..f95f8af
--- /dev/null
@@ -0,0 +1,71 @@
+/*
+ * Copyright (c) CompanyNameMagicTag 2025. All rights reserved.
+ * Description: DesktopFactory
+ * Author:
+ * Create: 2025-07
+ */
+
+#ifndef DESKTOP_FACTORY_H
+#define DESKTOP_FACTORY_H
+
+#include <unordered_map>
+#include "UIDesktopFragment.h"
+
+namespace OHOS {
+class DesktopInterface;
+class DesktopFactory {
+public:
+    static DesktopFactory& GetInstance()
+    {
+        static DesktopFactory instance;
+        return instance;
+    }
+    void RegisterDesktopStyle(const uint16_t style, DesktopInterface* desktop);
+    UIDesktopFragment* CreateDesktopStyle(uint16_t style);
+
+private:
+    DesktopFactory() {};
+    ~DesktopFactory() {};
+    DesktopFactory(const DesktopFactory&) = delete;
+    DesktopFactory &operator=(const DesktopFactory&) = delete;
+    std::unordered_map<uint16_t, DesktopInterface*> desktops_;
+};
+
+class DesktopStyleRegister {
+public:
+    DesktopStyleRegister(const uint16_t style, DesktopInterface* uiCardPage)
+    {
+        DesktopFactory::GetInstance().RegisterDesktopStyle(style, uiCardPage);
+    }
+};
+
+class DesktopInterface {
+public:
+    virtual UIDesktopFragment* CreateDesktop() = 0;
+    DesktopInterface() = default;
+    virtual ~DesktopInterface() = default;
+    DesktopInterface(const DesktopInterface&) = delete;
+    DesktopInterface& operator=(const DesktopInterface&) = delete;
+    DesktopInterface(DesktopInterface&&) = delete;
+    DesktopInterface& operator=(DesktopInterface&&) = delete;
+};
+
+template <class D>
+class DesktopProxy : public DesktopInterface {
+public:
+    UIDesktopFragment* CreateDesktop() override
+    {
+        D* d = new D();
+        UIDesktopFragment* fragment = dynamic_cast<UIDesktopFragment*>(d);
+        if (fragment == nullptr) {
+            delete d;
+        }
+        return fragment;
+    }
+};
+} // namespace OHOS
+
+#define REGIST_DESKTOP_STYLE(style, D) \
+    const static OHOS::DesktopStyleRegister (STATIC_VAR)(static_cast<uint16_t>(style), new DesktopProxy<D>())
+
+#endif // DESKTOP_FACTORY_H
\ No newline at end of file
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/include/applist/FootballDesktopFragment.h b/code/sdk/application/wearable/evb/nativeapp/nativeui/include/applist/FootballDesktopFragment.h
new file mode 100644 (file)
index 0000000..7c10760
--- /dev/null
@@ -0,0 +1,87 @@
+/*
+ * Copyright (c) CompanyNameMagicTag 2025-2025. All rights reserved.
+ * Description: FootballDesktopFragment.h
+ * Author:
+ * Create: 2025-07-04
+ */
+
+#ifndef FOOTBALL_DESKTOP_FRAGMENT_H
+#define FOOTBALL_DESKTOP_FRAGMENT_H
+
+#include "UIDesktopFragment.h"
+#include "components/ui_icosahedron_view.h"
+
+namespace OHOS {
+class FootballAnimatorCallback;
+class FootballItemView;
+class FootballDesktopFragment : public UIDesktopFragment {
+public:
+    bool OnClick(UIView &view, const ClickEvent &event) override;
+    void AddAppItemToList(const AppItem &item) override;
+    void ClearAppItemToList() override;
+    void RefreshAppList() override;
+
+protected:
+    void OnCreateView(void* data) override;
+    void OnDestroyView() override;
+    void OnResumeView() override;
+
+private:
+    UIIcosahedronView* footballList_ = nullptr;
+    List<FootballItemView*> footballItemList_;
+    ImageInfo* footballDefaultImg_ = nullptr;
+    FootballAnimatorCallback* callback_ = nullptr;
+    Animator* enterAnimator_ = nullptr;
+};
+
+class FootballAnimatorCallback : public AnimatorCallback {
+public:
+    explicit FootballAnimatorCallback(UIView* view, int16_t startPos, int16_t endPos)
+        : startPos_(startPos),
+          endPos_(endPos),
+          startTime_(0),
+          animator_(new Animator(this, view, 1000, false)) {}  // 1000:duration of animator_, in milliseconds.
+
+    ~FootballAnimatorCallback() override
+    {
+        if (animator_ != nullptr) {
+            delete animator_;
+            animator_ = nullptr;
+        }
+    }
+
+    void Callback(UIView* view) override;
+
+    Animator* GetAnimator() const
+    {
+        return animator_;
+    }
+
+    void SetStartTime(uint32_t time)
+    {
+        isStartAnim_ = false;
+        startTime_ = time;
+    }
+protected:
+    int16_t startPos_;
+    int16_t endPos_;
+    uint32_t startTime_;
+    bool isStartAnim_ = false;
+    Animator* animator_;
+};
+
+class FootballItemView : public UIImageView {
+public:
+    explicit FootballItemView() {}
+    ~FootballItemView() override;
+    bool SetItemInfo(const AppItem &itemInfo);
+    AppViewId GetViewId();
+    const char *GetAppUid();
+private:
+    FootballItemView(const FootballItemView &);
+    FootballItemView &operator = (const FootballItemView &);
+    AppItem itemInfo_;
+};
+}
+
+#endif // FOOTBALL_DESKTOP_FRAGMENT_H
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/include/applist/HexagonsDesktopFragment.h b/code/sdk/application/wearable/evb/nativeapp/nativeui/include/applist/HexagonsDesktopFragment.h
new file mode 100644 (file)
index 0000000..fded07d
--- /dev/null
@@ -0,0 +1,47 @@
+/*
+ * Copyright (c) CompanyNameMagicTag 2025-2025. All rights reserved.
+ * Description: HexagonsDesktopFragment.h
+ * Author:
+ * Create: 2025-07-04
+ */
+
+#ifndef HEXAGONS_DESKTOP_FRAGMENT_H
+#define HEXAGONS_DESKTOP_FRAGMENT_H
+
+#include "UIDesktopFragment.h"
+#include "components/ui_custom_hexagons_list.h"
+
+namespace OHOS {
+class HexagonsItemView;
+class HexagonsDesktopFragment : public UIDesktopFragment {
+public:
+    bool OnClick(UIView &view, const ClickEvent &event) override;
+    bool OnRotate(UIView& view, const RotateEvent& event) override;
+    void AddAppItemToList(const AppItem &item) override;
+    void ClearAppItemToList() override;
+    void RefreshAppList() override;
+
+protected:
+    void OnCreateView(void* data) override;
+    void OnDestroyView() override;
+
+private:
+    UICustomHexagonsList* hexagonsList_{nullptr};
+    List<HexagonsItemView*> listHexagonsView_;
+};
+
+class HexagonsItemView : public UIImageView {
+public:
+    explicit HexagonsItemView() {};
+    ~HexagonsItemView();
+    bool SetItemInfo(const AppItem &itemInfo);
+    AppViewId GetViewId();
+    const char *GetAppUid();
+private:
+    HexagonsItemView(const HexagonsItemView &);
+    HexagonsItemView &operator = (const HexagonsItemView &);
+    AppItem itemInfo_;
+};
+}
+
+#endif // HEXAGONS_DESKTOP_FRAGMENT_H
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/include/applist/ListDesktopFragment.h b/code/sdk/application/wearable/evb/nativeapp/nativeui/include/applist/ListDesktopFragment.h
new file mode 100644 (file)
index 0000000..6e8fbc7
--- /dev/null
@@ -0,0 +1,81 @@
+/*
+ * Copyright (c) CompanyNameMagicTag 2025-2025. All rights reserved.
+ * Description: ListDesktopFragment.h
+ * Author:
+ * Create: 2025-07-04
+ */
+
+#ifndef LIST_DESKTOP_FRAGMENT_H
+#define LIST_DESKTOP_FRAGMENT_H
+
+#include "UIDesktopFragment.h"
+#include "ApplistAdapter.h"
+#include "ChangeSliceListener.h"
+#include "components/ui_list.h"
+#include "drag_event.h"
+
+namespace OHOS {
+class ListDesktopFragment : public UIDesktopFragment {
+public:
+    bool OnClick(UIView &view, const ClickEvent &event) override;
+    void OnItemSelected(int16 index, UIView *view) override;
+    void AddAppItemToList(const AppItem &item) override;
+    void ClearAppItemToList() override;
+    void RefreshAppList() override;
+
+protected:
+    void OnCreateView(void* data) override;
+    void OnDestroyView() override;
+
+private:
+    ApplistAdapter *listAdapter_{nullptr};
+    UIList *contentList_{nullptr};
+    UIView::OnDragListener *dragListener_{nullptr};
+    AppItemView *itemViewSele{nullptr};
+    AppItemView *preItemViewSele{nullptr};
+};
+
+class AppListOnDragListener : public UIView::OnDragListener {
+public:
+    AppListOnDragListener()
+    {
+        continueDrag_ = false;
+    }
+    ~AppListOnDragListener() override {}
+    bool OnDragStart(UIView& view, const DragEvent& event) override
+    {
+        UNUSED(view);
+        UNUSED(event);
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Applist Ondragstart!!");
+        continueDrag_ = true;
+        return false;
+    }
+
+    bool OnDrag(UIView& view, const DragEvent& event) override
+    {
+        UNUSED(view);
+        if (!continueDrag_) {
+            WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "AppList : Can not continue drag!!");
+            return false;
+        }
+        if ((event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT) &&
+            (event.GetDeltaX() > X_DRAG_OFFSET) && (event.GetDeltaX() > (DOUBLES * MATH_ABS(event.GetDeltaY())))) {
+            WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Applist Ondrag!!");
+            NativeAbility::GetInstance().ChangeSlice(VIEW_MAIN_SAMPLE, TransitionType::TRANSITION_ZOOM);
+        }
+
+        return false;
+    }
+
+    bool OnDragEnd(UIView& view, const DragEvent& event) override
+    {
+        UNUSED(view);
+        UNUSED(event);
+        return false;
+    }
+private:
+    bool continueDrag_{false};
+};
+}
+
+#endif // LIST_DESKTOP_FRAGMENT_H
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/include/applist/PlanetDesktopFragment.h b/code/sdk/application/wearable/evb/nativeapp/nativeui/include/applist/PlanetDesktopFragment.h
new file mode 100644 (file)
index 0000000..fa4982c
--- /dev/null
@@ -0,0 +1,48 @@
+/*
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.
+ * Description: PlanetDesktop
+ * Created: 2025-07-29
+ */
+
+#ifndef PLANET_DESKTOP_FRAGMENT_H
+#define PLANET_DESKTOP_FRAGMENT_H
+
+#include "UIDesktopFragment.h"
+#include "components/ui_custom_planet_list.h"
+
+namespace OHOS {
+class PlanetItemView;
+class PlanetDesktopFragment : public UIDesktopFragment {
+public:
+    bool OnClick(UIView &view, const ClickEvent &event) override;
+    void AddAppItemToList(const AppItem &item) override;
+    void ClearAppItemToList() override;
+    void RefreshAppList() override;
+
+protected:
+    void OnCreateView(void* data) override;
+    void OnDestroyView() override;
+
+private:
+    UICustomPlanetList* planetList_{nullptr};
+    List<PlanetItemView*> pltItemList_;
+    List<UILabel*> pltLabelList_;
+};
+
+class PlanetItemView : public UIImageView {
+public:
+    explicit PlanetItemView() {}
+    ~PlanetItemView() {}
+    void SetItemInfo(const AppItem &itemInfo);
+    AppViewId GetViewId();
+    const char *GetAppUid();
+    const char *GetAppLabel();
+
+private:
+    PlanetItemView(const PlanetItemView &) = delete;
+    PlanetItemView &operator = (const PlanetItemView &) = delete;
+    AppItem itemInfo_ = { VIEW_INVALID, nullptr, nullptr, nullptr, nullptr };
+};
+}
+
+#endif // PLANET_DESKTOP_FRAGMENT_H
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/include/applist/SphereDesktopFragment.h b/code/sdk/application/wearable/evb/nativeapp/nativeui/include/applist/SphereDesktopFragment.h
new file mode 100644 (file)
index 0000000..28c34e9
--- /dev/null
@@ -0,0 +1,93 @@
+  /*
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025. All rights reserved.
+ * Description: SphereDesktopFragment
+ * Author: Hisi Graphic Team
+ * Created: 2025-09
+ */
+
+#ifndef SPHERE_DESKTOP_FRAGMENT_H
+#define SPHERE_DESKTOP_FRAGMENT_H
+
+#include "UIDesktopFragment.h"
+#include "components/ui_sphere_view.h"
+#include "components/ui_transform_group.h"
+
+namespace OHOS {
+class SphereAnimatorCallback;
+class SphereItemView;
+class SphereDesktopFragment : public UIDesktopFragment {
+public:
+    bool OnClick(UIView &view, const ClickEvent &event) override;
+    bool OnRotate(UIView& view, const RotateEvent& event) override;
+    void AddAppItemToList(const AppItem &item) override;
+    void ClearAppItemToList() override;
+    void RefreshAppList() override;
+
+protected:
+    void OnCreateView(void* data) override;
+    void OnDestroyView() override;
+    void OnResumeView() override;
+
+private:
+    UISphereView* sphereView_{nullptr};
+    List<SphereItemView*> listSphereView_;
+    SphereAnimatorCallback* callback_ = nullptr;
+    Animator* enterAnimator_ = nullptr;
+};
+
+class SphereAnimatorCallback : public AnimatorCallback {
+public:
+    explicit SphereAnimatorCallback(UIView* view, int16_t width, int16_t height)
+        : width_(width),
+          height_(height),
+          startTime_(0),
+          passTime_(0),
+          angle_(0),
+          animator_(new Animator(this, view, 600, false)) {}  // 600 ms:duration of animator_
+
+    ~SphereAnimatorCallback() override
+    {
+        if (animator_ != nullptr) {
+            delete animator_;
+            animator_ = nullptr;
+        }
+    }
+
+    void Callback(UIView* view) override;
+
+    Animator* GetAnimator() const
+    {
+        return animator_;
+    }
+
+    void SetStartTime(uint32_t time)
+    {
+        isStartAnim_ = false;
+        startTime_ = time;
+    }
+protected:
+    int16_t width_;
+    int16_t height_;
+    uint32_t startTime_;
+    uint32_t passTime_;
+    bool isStartAnim_ = false;
+    int16_t angle_;
+    Animator* animator_;
+};
+
+class SphereItemView : public UITransformGroup {
+public:
+    explicit SphereItemView() {};
+    ~SphereItemView();
+    bool SetItemInfo(const AppItem &itemInfo);
+    AppViewId GetViewId();
+    const char *GetAppUid();
+private:
+    SphereItemView(const SphereItemView &);
+    SphereItemView &operator = (const SphereItemView &);
+    UIImageView* imageView_{nullptr};
+    AppItem itemInfo_;
+};
+}
+
+#endif // SPHERE_DESKTOP_FRAGMENT_H
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/include/applist/UIDesktopFragment.h b/code/sdk/application/wearable/evb/nativeapp/nativeui/include/applist/UIDesktopFragment.h
new file mode 100644 (file)
index 0000000..6bb8237
--- /dev/null
@@ -0,0 +1,38 @@
+/*
+ * Copyright (c) CompanyNameMagicTag 2025-2025. All rights reserved.
+ * Description: UIDesktopFragment.h
+ * Author:
+ * Create: 2025-07-07
+ */
+
+#ifndef UI_DESKTOP_FRAGMENT_H
+#define UI_DESKTOP_FRAGMENT_H
+
+#include "applist/AppItemView.h"
+#include "components/ui_fragment.h"
+#include "components/ui_list.h"
+#include "components/ui_view_group.h"
+#include "components/ui_scroll_view.h"
+#include "settings/model/SettingDesktopModel.h"
+#include "TransitionType.h"
+#include "ohos_types.h"
+#include "wearable_log.h"
+
+namespace OHOS {
+class UIDesktopFragment : public UIFragment, public UIView::OnClickListener,
+                          public ListScrollListener, public UIView::OnRotateListener {
+public:
+    virtual void AddAppItemToList(const AppItem &item) = 0;
+    virtual void ClearAppItemToList() = 0;
+    virtual void RefreshAppList() = 0;
+    void SetPosition(int16_t x, int16_t y, int16_t width, int16_t height);
+
+protected:
+    uint16_t imgSize_ = 0;
+    uint16_t imgDistance_ = 0;
+    void OnCreateView(void* data) override {};
+    void OnDestroyView() override {};
+    bool SwitchView(AppViewId viewId, char *uid, TransitionType type, DesktopStyle style);
+};
+}
+#endif // UI_DESKTOP_FRAGMENT_H
\ No newline at end of file
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/include/applist/WaterfallDesktopFragment.h b/code/sdk/application/wearable/evb/nativeapp/nativeui/include/applist/WaterfallDesktopFragment.h
new file mode 100644 (file)
index 0000000..4a2fa18
--- /dev/null
@@ -0,0 +1,47 @@
+/*
+ * Copyright (c) CompanyNameMagicTag 2025-2025. All rights reserved.
+ * Description: WaterfallDesktopFragment.h
+ * Author:
+ * Create: 2025-07-04
+ */
+
+#ifndef WATERFALL_DESKTOP_FRAGMENT_H
+#define WATERFALL_DESKTOP_FRAGMENT_H
+
+#include "UIDesktopFragment.h"
+#include "components/ui_waterfall_list.h"
+
+namespace OHOS {
+class WaterfallItemView;
+class WaterfallDesktopFragment : public UIDesktopFragment {
+public:
+    bool OnClick(UIView &view, const ClickEvent &event) override;
+    void AddAppItemToList(const AppItem &item) override;
+    void ClearAppItemToList() override;
+    void RefreshAppList() override;
+
+protected:
+    void OnCreateView(void* data) override;
+    void OnDestroyView() override;
+    void OnResumeView() override;
+
+private:
+    UIWaterfallList* waterfallList_{nullptr};
+    List<WaterfallItemView*> waterfallItemList_;
+};
+
+class WaterfallItemView : public UIImageView {
+public:
+    explicit WaterfallItemView() {}
+    ~WaterfallItemView();
+    bool SetItemInfo(const AppItem &itemInfo);
+    AppViewId GetViewId();
+    const char *GetAppUid();
+private:
+    WaterfallItemView(const WaterfallItemView &);
+    WaterfallItemView &operator = (const WaterfallItemView &);
+    AppItem itemInfo_;
+};
+}
+
+#endif // WATERFALL_DESKTOP_FRAGMENT_H
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/include/blood/BloodChartPage.h b/code/sdk/application/wearable/evb/nativeapp/nativeui/include/blood/BloodChartPage.h
new file mode 100644 (file)
index 0000000..f615267
--- /dev/null
@@ -0,0 +1,59 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: BloodChartPage\r
+ * Create: 2025-06\r
+ */\r
+\r
+#ifndef BLOOD_CHART_PAGE_H\r
+#define BLOOD_CHART_PAGE_H\r
+\r
+#include <sys/time.h>\r
+#include "components/ui_scroll_view.h"\r
+#include "components/ui_image_view.h"\r
+#include "components/ui_swipe_view.h"\r
+#include "components/ui_label.h"\r
+#include "components/ui_chart.h"\r
+#include "components/ui_label_button.h"\r
+#include "components/ui_image_animator.h"\r
+#include "SlicePage.h"\r
+#include "UiConfig.h"\r
+#include "BloodView.h"\r
+#include "BloodPresenter.h"\r
+\r
+namespace OHOS {\r
+static constexpr uint8_t HEART_AVE_NUM = 360;\r
+static constexpr uint8_t BLOOD_ANIMATOR_IMAGE_NUM = 30;\r
+static constexpr uint8_t BLOOD_ANIMATOR_IMAGE_UPDATE = 40;\r
+static constexpr uint8_t INDEX_1 = 1;\r
+static constexpr uint8_t INDEX_2 = 2;\r
+static constexpr uint8_t INDEX_3 = 3;\r
+static constexpr uint8_t DATA_SERIAL_COUNT = 4;\r
+class BloodPresenter;\r
+class BloodChartPage : public SlicePage<BloodPresenter>,\r
+                            public UIView::OnClickListener,\r
+                            public UIView::OnDragListener {\r
+public:\r
+    BloodChartPage();\r
+    ~BloodChartPage() override;\r
+    void OnStart(void *data) override;\r
+    bool OnClick(UIView &view, const ClickEvent &event) override;\r
+    bool OnDrag(UIView &view, const DragEvent &event) override;\r
+    void InitImageAnimator();\r
+    \r
+private:\r
+    UIViewGroup *group_ = nullptr;\r
+    UILabel *labelTitle_ = nullptr;\r
+    UILabel *labelTestTime_ = nullptr;\r
+    UILabel *labelXAxisPointOne_ = nullptr;\r
+    UILabel *labelXAxisPointTwo_ = nullptr;\r
+    UILabel *labelXAxisPointThree_ = nullptr;\r
+    UILabelButton *labelButtonRetest_ = nullptr;\r
+    UIChartDataSerial *dataSerial_{nullptr};\r
+    UIChartPillar *chartPillar_ = nullptr;\r
+    UIImageView *mainImg_ = nullptr;\r
+    UIImageView *chartImg_ = nullptr;\r
+    UIImageAnimatorView *imageAnimator_ = nullptr;\r
+    ImageAnimatorInfo imageAnimatorImageInfo_[BLOOD_ANIMATOR_IMAGE_NUM];\r
+};\r
+}\r
+#endif // BLOOD_CHART_PAGE_H
\ No newline at end of file
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/include/blood/BloodExplainPage.h b/code/sdk/application/wearable/evb/nativeapp/nativeui/include/blood/BloodExplainPage.h
new file mode 100644 (file)
index 0000000..7bc8421
--- /dev/null
@@ -0,0 +1,50 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: BloodExplainPage\r
+ * Create: 2025-06\r
+ */\r
+\r
+#ifndef BLOOD_EXPLAIN_PAGE_H\r
+#define BLOOD_EXPLAIN_PAGE_H\r
+\r
+#include "View.h"\r
+#include "components/root_view.h"\r
+#include "components/ui_view_group.h"\r
+#include "components/ui_scroll_view.h"\r
+#include "components/ui_label.h"\r
+#include "components/ui_label_button.h"\r
+#include "ChangeSliceListener.h"\r
+#include "UiConfig.h"\r
+#include "ui_test.h"\r
+#include "SlicePageFactory.h"\r
+#include "SlicePage.h"\r
+#include "BloodView.h"\r
+#include "BloodModel.h"\r
+#include "BloodPresenter.h"\r
+\r
+namespace OHOS {\r
+static constexpr uint8_t LABEL_DES_COUNT = 4;\r
+class BloodPresenter;\r
+class BloodModel;\r
+class BloodExplainPage : public SlicePage<BloodPresenter>,\r
+                        public UIView::OnClickListener,\r
+                        public UIView::OnDragListener {\r
+public:\r
+    BloodExplainPage();\r
+    ~BloodExplainPage() override;\r
+    static BloodExplainPage *GetInstance();\r
+    void OnStart(void* data) override;\r
+    bool OnDrag(UIView& view, const DragEvent& event) override;\r
+    bool InitSimilarLabel(int16 num, int16 labelX, int16 labelY, const char *labelText);\r
+private:\r
+    UIScrollView *scrollGroup_ = nullptr;\r
+    UIImageView *imgNormal_ = nullptr;\r
+    UIImageView *imgGeneral_ = nullptr;\r
+    UIImageView *imgAbnormal_ = nullptr;\r
+    UILabel *labelNormal_ = nullptr;\r
+    UILabel *labelGeneral_ = nullptr;\r
+    UILabel *labelAbnormal_ = nullptr;\r
+    UILabel *labelDes_[LABEL_DES_COUNT]{nullptr};\r
+};\r
+}\r
+#endif // BLOOD_EXPLAIN_PAGE_H\r
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/include/blood/BloodMainPage.h b/code/sdk/application/wearable/evb/nativeapp/nativeui/include/blood/BloodMainPage.h
new file mode 100644 (file)
index 0000000..12ec04b
--- /dev/null
@@ -0,0 +1,54 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: BloodMainPage\r
+ * Create: 2025-06\r
+ */\r
+\r
+#ifndef BLOOD_MAIN_PAGE_H\r
+#define BLOOD_MAIN_PAGE_H\r
+\r
+#include "View.h"\r
+#include "components/ui_view_group.h"\r
+#include "components/ui_scroll_view.h"\r
+#include "components/ui_digital_clock.h"\r
+#include "components/ui_lite_surface_view.h"\r
+#include "ChangeSliceListener.h"\r
+#include "UiConfig.h"\r
+#include "layout/grid_layout.h"\r
+#include "ui_test.h"\r
+#include "SlicePageFactory.h"\r
+#include "SlicePage.h"\r
+#include "video_play_wrapper.h"\r
+#include "BloodModel.h"\r
+#include "BloodPresenter.h"\r
+#include "BloodView.h"\r
+\r
+namespace OHOS {\r
+class BloodPresenter;\r
+class BloodModel;\r
+class BloodMainPage : public SlicePage<BloodPresenter>,\r
+                    public UIView::OnClickListener,\r
+                    public UIView::OnDragListener {\r
+public:\r
+    BloodMainPage();\r
+    ~BloodMainPage() override;\r
+    static BloodMainPage *GetInstance();\r
+    void OnStart(void *data) override;\r
+    bool OnClick(UIView &view, const ClickEvent &event) override;\r
+    bool OnDrag(UIView &view, const DragEvent &event) override;\r
+    void OnResume() override;\r
+    void OnPause() override;\r
+    void InitImageAnimator();\r
+    bool IsToday(const struct timeval &tv);\r
+    void SetTestTime();\r
+private:\r
+    UIViewGroup *group_ = nullptr;\r
+    UILabelButton *buttonStart_ = nullptr;\r
+    UILabel *labelTitle_ = nullptr;\r
+    UILabel *labelPreTest_ = nullptr;\r
+    UILiteSurfaceView *surfaceView_ =  nullptr;\r
+    MediaVideoPlay *videoPlay_ = nullptr;\r
+    ColorType colorKey_;\r
+};\r
+}\r
+#endif // BLOOD_MAIN_PAGE_H\r
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/include/blood/BloodMeasurementPage.h b/code/sdk/application/wearable/evb/nativeapp/nativeui/include/blood/BloodMeasurementPage.h
new file mode 100644 (file)
index 0000000..087e18f
--- /dev/null
@@ -0,0 +1,74 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: BloodMeasurementPage\r
+ * Create: 2025-06\r
+ */\r
+\r
+#ifndef BLOOD_MEASUREMENT_PAGE_H\r
+#define BLOOD_MEASUREMENT_PAGE_H\r
+\r
+#include <sys/time.h>\r
+#include "components/root_view.h"\r
+#include "components/ui_view_group.h"\r
+#include "components/ui_scroll_view.h"\r
+#include "components/ui_digital_clock.h"\r
+#include "components/ui_label.h"\r
+#include "components/ui_list.h"\r
+#include "components/ui_circle_progress.h"\r
+#include "components/ui_image_animator.h"\r
+#include "components/ui_lite_surface_view.h"\r
+#include "layout/grid_layout.h"\r
+#include "animator/animator.h"\r
+#include "ChangeSliceListener.h"\r
+#include "video_play_wrapper.h"\r
+#include "View.h"\r
+#include "ui_test.h"\r
+#include "SlicePageFactory.h"\r
+#include "SlicePage.h"\r
+#include "UiConfig.h"\r
+#include "BloodModel.h"\r
+#include "BloodPresenter.h"\r
+#include "BloodView.h"\r
+\r
+\r
+namespace OHOS {\r
+class BloodPresenter;\r
+class BloodModel;\r
+class BloodMeasurementPage : public SlicePage<BloodPresenter>,\r
+                        public UIView::OnClickListener,\r
+                        public UIView::OnDragListener {\r
+public:\r
+    BloodMeasurementPage();\r
+    ~BloodMeasurementPage() override;\r
+    void OnStart(void *data) override;\r
+    bool OnDrag(UIView &view, const DragEvent &event) override;\r
+    void OnResume() override;\r
+    void OnPause() override;\r
+    void InitImageAnimator();\r
+    void InitAnimator();\r
+    void SetLabelTime(std::string str);\r
+    void StopAnimator();\r
+    void ShowOnMeasurement();\r
+    void StartAnimator();\r
+private:\r
+    UIViewGroup *group_ = nullptr;\r
+    UILabel *labelTitle_ = nullptr;\r
+    UILabel *labelTips_ = nullptr;\r
+    UILabel *labelTime_ = nullptr;\r
+    UILiteSurfaceView *surfaceView_ =  nullptr;\r
+    MediaVideoPlay *videoPlay_ = nullptr;\r
+    ColorType colorKey_;\r
+    struct timeval startTime_;\r
+    class BloodAnimatorCallback : public AnimatorCallback {\r
+    public:\r
+        explicit BloodAnimatorCallback(BloodMeasurementPage *page) : page_(page) {}\r
+        ~BloodAnimatorCallback() override {}\r
+        void Callback(UIView *view) override;\r
+    private:\r
+        BloodMeasurementPage *page_{nullptr};\r
+    };\r
+    Animator *animator_ = nullptr;\r
+    BloodAnimatorCallback *callBack_ = nullptr;\r
+};\r
+}\r
+#endif // BLOOD_MEASUREMENT_PAGE_H
\ No newline at end of file
index 47a2cae..dd5e6f3 100644 (file)
@@ -1,8 +1,7 @@
 /*\r
- * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
- * Description: SettingModel.h\r
- * Author:\r
- * Create: 2025-03-23\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: BloodModel\r
+ * Create: 2025-06\r
  */\r
 \r
 #ifndef BLOOD_MODEL_H\r
 \r
 #include <string>\r
 #include <list>\r
+#include <sys/time.h>\r
 #include "graphic_timer.h"\r
 \r
 namespace OHOS {\r
-    class BloodModel {\r
-    public:\r
-        static BloodModel &GetInstance(void);\r
-        bool GetbuttonStatus();\r
-        void SetbuttonStatus(bool status);\r
-        std::string GetCurrentTimeString();\r
-        void StartCurrentTimeTimer();\r
-        void PauseCurrentTimeTimer();\r
-    private:\r
-        virtual ~BloodModel();\r
-        BloodModel();\r
-        BloodModel(const BloodModel &);\r
-        void InitCurrentTimeTimer();\r
-        void DisableCurrentTimeTimer();\r
-        BloodModel &operator=(const BloodModel &);\r
-        bool buttonStatus = 0;\r
-        GraphicTimer *pCurrentTimeTimer_ = nullptr;\r
+typedef struct {\r
+    uint16_t blood;\r
+    struct timeval time;\r
+} bloodMeasurementInfo;\r
+class BloodModel {\r
+public:\r
+    static BloodModel &GetInstance(void);\r
+    void SetBlood(bloodMeasurementInfo value)\r
+    {\r
+        blood = value;\r
     };\r
+    bloodMeasurementInfo GetBlood()\r
+    {\r
+        return blood;\r
+    };\r
+\r
+private:\r
+    BloodModel();\r
+    BloodModel(const BloodModel &);\r
+    BloodModel &operator=(const BloodModel &);\r
+    virtual ~BloodModel();\r
+    bloodMeasurementInfo blood = {0, 0};\r
+};\r
 }\r
-#endif // BLOOD_MODEL_H
\ No newline at end of file
+#endif  // BLOOD_MODEL_H
\ No newline at end of file
index 893d577..ec00cf9 100644 (file)
@@ -1,8 +1,7 @@
 /*\r
- * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
- * Description: SettingPresenter.h\r
- * Author:\r
- * Create: 2025-03-23\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: BloodPresenter\r
+ * Create: 2025-06\r
  */\r
 \r
 #ifndef BLOOD_PRESENTER_H\r
 #include "components/ui_view.h"\r
 \r
 namespace OHOS {\r
-typedef enum {\r
-    BLOOD_START,\r
-    BLOOD_TEST,\r
-    BLOOD_MORE,\r
-    MAX_BLOOD_PAGE,\r
-} PageId;\r
-constexpr short SET_ZERO = 0;\r
-constexpr short SET_ONE = 1;\r
-constexpr short SET_TWO = 2;\r
-constexpr short SET_THREE = 3;\r
-constexpr short SET_FOUR = 4;\r
-constexpr short SET_FIVE = 5;\r
-constexpr short TEMP_SET_SIX = 6;\r
-constexpr short SET_SEVEN = 7;\r
-constexpr short SET_EIGHT = 8;\r
-constexpr short SET_NINE = 9;\r
-constexpr short SET_HUNDRED = 100;\r
-constexpr short SET_INT_MAX = 255;\r
 class BloodView;\r
-class BloodModel;\r
-class BloodPresenter : public Presenter<BloodView>,\r
-                           public UIView::OnClickListener,\r
-                           public UIView::OnDragListener {\r
-public:\r
-    BloodPresenter();\r
-    ~BloodPresenter() override;\r
-    static BloodPresenter *GetInstance();\r
-\r
-    void OnResume() override;\r
-    bool OnClick(UIView &view, const ClickEvent &event) override;\r
-    bool OnDrag(UIView& view, const DragEvent& event) override;\r
-    void OnPause() override;\r
-    bool ClickFuncId(const char *buttonName);\r
-\r
-private:\r
-    BloodModel *findPhoneModel;\r
-};\r
+class BloodPresenter : public Presenter<BloodView> {};\r
 }\r
-\r
-#endif // BLOOD_PRESENTER_H
\ No newline at end of file
+#endif  // BLOOD_PRESENTER_H
\ No newline at end of file
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/include/blood/BloodReadyPage.h b/code/sdk/application/wearable/evb/nativeapp/nativeui/include/blood/BloodReadyPage.h
new file mode 100644 (file)
index 0000000..f485a0e
--- /dev/null
@@ -0,0 +1,70 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: BloodReadyPage\r
+ * Create: 2025-06\r
+ */\r
+\r
+#ifndef BLOOD_READY_PAGE_H\r
+#define BLOOD_READY_PAGE_H\r
+\r
+#include <sys/time.h>\r
+#include "components/root_view.h"\r
+#include "components/ui_view_group.h"\r
+#include "components/ui_scroll_view.h"\r
+#include "components/ui_label.h"\r
+#include "components/ui_circle_progress.h"\r
+#include "components/ui_image_animator.h"\r
+#include "components/ui_lite_surface_view.h"\r
+#include "layout/grid_layout.h"\r
+#include "animator/animator.h"\r
+#include "ChangeSliceListener.h"\r
+#include "video_play_wrapper.h"\r
+#include "View.h"\r
+#include "ui_test.h"\r
+#include "SlicePageFactory.h"\r
+#include "SlicePage.h"\r
+#include "UiConfig.h"\r
+#include "BloodModel.h"\r
+#include "BloodPresenter.h"\r
+#include "BloodView.h"\r
+\r
+\r
+namespace OHOS {\r
+class BloodPresenter;\r
+class BloodModel;\r
+class BloodReadyPage : public SlicePage<BloodPresenter>,\r
+                        public UIView::OnClickListener,\r
+                        public UIView::OnDragListener {\r
+public:\r
+    BloodReadyPage();\r
+    ~BloodReadyPage() override;\r
+    void OnStart(void *data) override;\r
+    bool OnClick(UIView &view, const ClickEvent &event) override;\r
+    bool OnDrag(UIView &view, const DragEvent &event) override;\r
+    void InitAnimator();\r
+    void SetLabelProgressTime(int value);\r
+    void StopAnimator();\r
+    void ShowOnMeasurement();\r
+    int InitCircleProgress();\r
+    \r
+private:\r
+    UIViewGroup *group_ = nullptr;\r
+    UILabel *labelTips_ = nullptr;\r
+    UILabelButton *buttonStart_ = nullptr;\r
+    UICircleProgress *timeProgress_ = nullptr;\r
+    UILabel *labelProgressTime_ = nullptr;\r
+    class BloodAnimatorCallback : public AnimatorCallback {\r
+    public:\r
+        explicit BloodAnimatorCallback(BloodReadyPage *page) : page_(page) {}\r
+        ~BloodAnimatorCallback() override {}\r
+        void Callback(UIView *view) override;\r
+\r
+    private:\r
+        BloodReadyPage *page_{nullptr};\r
+    };\r
+    struct timeval startTime_;\r
+    Animator *animator_ = nullptr;\r
+    BloodAnimatorCallback *callBack_ = nullptr;\r
+};\r
+}\r
+#endif // BLOOD_READY_PAGE_H\r
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/include/blood/BloodResultPage.h b/code/sdk/application/wearable/evb/nativeapp/nativeui/include/blood/BloodResultPage.h
new file mode 100644 (file)
index 0000000..47d1986
--- /dev/null
@@ -0,0 +1,48 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: BloodResultPage\r
+ * Create: 2025-06\r
+ */\r
+\r
+#ifndef BLOOD_RESULT_PAGE_H\r
+#define BLOOD_RESULT_PAGE_H\r
+\r
+#include "View.h"\r
+#include "components/root_view.h"\r
+#include "components/ui_view_group.h"\r
+#include "components/ui_scroll_view.h"\r
+#include "components/ui_label.h"\r
+#include "components/ui_label_button.h"\r
+#include "ChangeSliceListener.h"\r
+#include "UiConfig.h"\r
+#include "ui_test.h"\r
+#include "SlicePageFactory.h"\r
+#include "SlicePage.h"\r
+#include "BloodView.h"\r
+#include "BloodModel.h"\r
+#include "BloodPresenter.h"\r
+\r
+namespace OHOS {\r
+class BloodPresenter;\r
+class BloodModel;\r
+class BloodResultPage : public SlicePage<BloodPresenter>,\r
+                        public UIView::OnClickListener,\r
+                        public UIView::OnDragListener {\r
+public:\r
+    BloodResultPage();\r
+    ~BloodResultPage() override;\r
+    static BloodResultPage *GetInstance();\r
+    void OnStart(void *data) override;\r
+    bool OnClick(UIView &view, const ClickEvent &event) override;\r
+    bool OnDrag(UIView &view, const DragEvent &event) override;\r
+private:\r
+    UIViewGroup *group_ = nullptr;\r
+    UILabel *labelTitle_ = nullptr;\r
+    UILabel *labelData_ = nullptr;\r
+    UILabel *labelBloodOxygen_ = nullptr;\r
+    UILabelButton *buttonMore_ = nullptr;\r
+    UIImageView *mainImg_ = nullptr;\r
+    UIImageView *levelImg_ = nullptr;\r
+};\r
+}\r
+#endif // BLOOD_RESULT_PAGE_H\r
index f28958a..ac4bb13 100644 (file)
@@ -1,86 +1,23 @@
 /*\r
- * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
- * Description: SettingView.h\r
- * Author:\r
- * Create: 2025-03-23\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: BloodView\r
+ * Create: 2025-06\r
  */\r
 \r
 #ifndef BLOOD_VIEW_H\r
 #define BLOOD_VIEW_H\r
 \r
 #include "View.h"\r
-#include "components/root_view.h"\r
-#include "components/ui_view_group.h"\r
-#include "components/ui_scroll_view.h"\r
-#include "components/ui_digital_clock.h"\r
-#include "components/ui_label.h"\r
-#include "components/ui_list.h"\r
-#include "components/ui_image_animator.h"\r
-#include "ChangeSliceListener.h"\r
-#include "test_case_list_adapter.h"\r
-#include "UiConfig.h"\r
-#include "blood/BloodModel.h"\r
-#include "blood/BloodPresenter.h"\r
-#include "layout/grid_layout.h"\r
-#include "ui_test.h"\r
 namespace OHOS {\r
-class BloodPresenter;\r
-\r
-class BloodModel;\r
-class BloodView : public View<BloodPresenter> {\r
-public:\r
-    BloodView();\r
-    ~BloodView() override;\r
-\r
-    static BloodView *GetInstance();\r
-\r
-    void OnStart() override;\r
-    void OnStop() override;\r
-    bool ClickButtonChange(bool status);\r
-    void SetupCurrentTime();\r
-    void SetupImageAnimator();\r
-    void UpdateCurrentTimeLabel(const char *currentTime);\r
-    bool IsCurrentTimeLabelValid();\r
-    void SetUpImageAnimator();\r
-    void SetupButton();\r
-    void InitImageInfo();\r
-\r
-    void InitStart();\r
-    void InitTest();\r
-    void InitMore();\r
-    bool TempInitLabel(void);\r
-    bool InitSimilarLabel(int16 num, int16 labelY, const char *labelText);\r
-    void ChangeView(int16 hideView, int16 showView);\r
-\r
-    void DropView(UIView& view, int type);\r
-    bool ClickFunc(int16 interf);\r
-    bool ChangeBloodStart(int16_t thisView);\r
-    bool ChangeBloodTest(int16_t thisView);\r
-    bool ChangeBloodMore(int16_t thisView);\r
-private:\r
-    UIView::OnDragListener *dragListener_ = nullptr;\r
-    TestCaseListAdapter* adapter_ = nullptr;\r
-    BloodModel *findPhoneModel;\r
-    UILabel *currentTime_{nullptr};\r
-    GridLayout* layout_ = nullptr;\r
-\r
-    UIViewGroup* container[MAX_BLOOD_PAGE] = {nullptr};\r
-    UIViewGroup *group = nullptr;\r
-    UIViewGroup *groupTest = nullptr;\r
-    UIScrollView *scrollGroup = nullptr;\r
-    UILabelButton* button = nullptr;\r
-    UILabelButton* buttonMore = nullptr;\r
-    UILabel *label1_ = nullptr;\r
-    UILabel *label2_ = nullptr;\r
-\r
-    ImageInfo* imageInfo1_ = nullptr;\r
-    ImageInfo* imageInfo2_ = nullptr;\r
-    ImageInfo* imageInfo3_ = nullptr;\r
-    ImageAnimatorInfo imageAnimatorImageInfo_[3] = { 0 };\r
-    UIImageAnimatorView* imageAnimator_ = nullptr;\r
-\r
-    UILabel *tempTitle{nullptr};\r
-    UILabel *tempLabel[SET_THREE]{nullptr};\r
+enum BLOOD_PAGES {\r
+    BLOOD_MAIN_PAGE = 1,  // 0 is invalid\r
+    BLOOD_READY_PAGE = 2,\r
+    BLOOD_MEASUREMENT_PAGE = 3,\r
+    BLOOD_RESULT_PAGE = 4,\r
+    BLOOD_CHART_PAGE = 5,\r
+    BLOOD_EXPLAIN_PAGE = 6,\r
 };\r
+class BloodPresenter;\r
+class BloodView : public View<BloodPresenter> {};\r
 }\r
-#endif // BLOOD_VIEW_H\r
+#endif  // BLOOD_VIEW_H
\ No newline at end of file
index 3c645fe..e777309 100644 (file)
@@ -11,6 +11,7 @@
 #include "bts_def.h"\r
 #include "bts_gatt_stru.h"\r
 #include "bts_gatt_server.h"\r
+#include "bts_gatt_client.h"\r
 #include "bts_le_gap.h"\r
 \r
 #ifdef __cplusplus\r
@@ -18,7 +19,9 @@ extern "C" {
 #endif\r
 \r
 errcode_t wrapper_gap_ble_register_callbacks(gap_ble_callbacks_t *func);\r
+errcode_t wrapper_gattc_register_client(bt_uuid_t *uuid, uint8_t *clientId);\r
 errcode_t wrapper_gatts_register_callbacks(gatts_callbacks_t *func);\r
+errcode_t wrapper_gattc_register_callbacks(gattc_callbacks_t *func);\r
 void wrapper_ble_register(void);\r
 errcode_t wrapper_gatts_register_server(bt_uuid_t *app_uuid, uint8_t *server_id);\r
 errcode_t wrapper_gatts_add_service(uint8_t server_id, bt_uuid_t *service_uuid, bool is_primary);\r
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/include/breathexercise/BreathExerPage.h b/code/sdk/application/wearable/evb/nativeapp/nativeui/include/breathexercise/BreathExerPage.h
new file mode 100644 (file)
index 0000000..8f3c538
--- /dev/null
@@ -0,0 +1,59 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: BreathExerPage\r
+ * Create: 2025-5-13\r
+ */\r
+#ifndef BREATH_EXER_PAGE_H\r
+#define BREATH_EXER_PAGE_H\r
+\r
+#include "layout/grid_layout.h"\r
+#include "components/ui_label.h"\r
+#include "components/ui_digital_clock.h"\r
+#include "components/ui_image_animator.h"\r
+#include "View.h"\r
+#include "SlicePage.h"\r
+#include "graphic_timer.h"\r
+#include "SlicePageFactory.h"\r
+#include "power_display_service.h"\r
+#include "BreathModel.h"\r
+#include "BreathPresenter.h"\r
+\r
+namespace OHOS {\r
+int32_t g_StartTime;\r
+class BreathExerPage : public SlicePage<BreathPresenter>,\r
+                                public UIView::OnClickListener,\r
+                                public UIView::OnDragListener {\r
+public:\r
+    BreathExerPage();\r
+    ~BreathExerPage() override;\r
+    void OnStart(void* data) override;\r
+    void OnPause() override;\r
+    bool OnDrag(UIView &view, const DragEvent &event) override;\r
+    void SetUpImageAnimator();\r
+    void UpdateTextOpa();\r
+    void UpdateImageRotate();\r
+    class BreathExerPageCallback : public AnimatorCallback {\r
+    public:\r
+        BreathExerPageCallback(BreathExerPage* page) : BreathExerPage(page) {}\r
+        virtual ~BreathExerPageCallback() override {}\r
+        void Callback(UIView* view) override;\r
+    private:\r
+        BreathExerPage* BreathExerPage{nullptr};\r
+    };\r
+    BreathExerPageCallback* animatorCallBack_{nullptr};\r
+    Animator *animator_ = nullptr;\r
+private:\r
+    UIViewGroup *group_ = nullptr;\r
+    UIImageView* mainImg_ = nullptr;\r
+    UIImageView* romataImg_ = nullptr;\r
+    UIImageView* romataImgVirtual_ = nullptr;\r
+    UILabel *breathInhale_ = nullptr;\r
+    UILabel *breathExhale_ = nullptr;\r
+    float scale_ = 0;\r
+    float angle_ = 0;\r
+    bool flag_ = true;\r
+    float rotateStep_ = 0.0f;\r
+};\r
+}  // namespace OHOS\r
+\r
+#endif
\ No newline at end of file
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/include/breathexercise/BreathMainPage.h b/code/sdk/application/wearable/evb/nativeapp/nativeui/include/breathexercise/BreathMainPage.h
new file mode 100644 (file)
index 0000000..1b5c16b
--- /dev/null
@@ -0,0 +1,50 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: BreathMainPage\r
+ * Create: 2025-5-13\r
+ */\r
+#ifndef BREATH_MAIN_PAGE_H\r
+#define BREATH_MAIN_PAGE_H\r
+\r
+#include "components/ui_label.h"\r
+#include "components/ui_button.h"\r
+#include "components/ui_label_button.h"\r
+#include "components/ui_digital_clock.h"\r
+#include "components/ui_image_animator.h"\r
+#include "View.h"\r
+#include "SlicePageFactory.h"\r
+#include "SlicePage.h"\r
+#include "BreathView.h"\r
+#include "BreathModel.h"\r
+#include "BreathPresenter.h"\r
+#ifndef _WIN32\r
+#include "time64.h"\r
+#endif\r
+\r
+namespace OHOS {\r
+\r
+class BreathMainPage : public SlicePage<BreathPresenter>,\r
+                        public UIView::OnClickListener,\r
+                        public UIView::OnDragListener {\r
+public:\r
+    BreathMainPage();\r
+    ~BreathMainPage() override;\r
+    void OnStart(void* data) override;\r
+    void OnResume() override;\r
+    bool OnClick(UIView &view, const ClickEvent &event) override;\r
+    bool OnDrag(UIView &view, const DragEvent &event) override;\r
+\r
+private:\r
+    UIViewGroup *group_ = nullptr;\r
+    UILabel *labelTitle_ = nullptr;\r
+    UIButton *buttonTime_ = nullptr;\r
+    UIButton *buttonSetting_ = nullptr;\r
+    UIButton *buttonStart_ = nullptr;\r
+    UILabel *lableSetting_ = nullptr;\r
+    UILabel *lableTime_ = nullptr;\r
+    UIImageView *bgImg_ = nullptr;\r
+    UIImageView *center_ = nullptr;\r
+};\r
+}  // namespace OHOS\r
+\r
+#endif
\ No newline at end of file
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/include/breathexercise/BreathModel.h b/code/sdk/application/wearable/evb/nativeapp/nativeui/include/breathexercise/BreathModel.h
new file mode 100644 (file)
index 0000000..ebc5bfd
--- /dev/null
@@ -0,0 +1,51 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: BreathModel\r
+ * Create: 2025-5-13\r
+ */\r
+#ifndef BREATH_MODEL_H\r
+#define BREATH_MODEL_H\r
+\r
+#include <string>\r
+#include "gfx_utils/graphic_math.h"\r
+namespace OHOS {\r
+class BreathModel {\r
+public:\r
+    static BreathModel &GetInstance();\r
+    virtual ~BreathModel();\r
+\r
+    uint8_t GetTrainTime();\r
+    void SetTrainTime(uint16_t value);           // 设置呼吸训练时间\r
+    uint8_t GetRhythm();\r
+    void SetRhythm(uint16_t value);              // 设置呼吸节奏\r
+    int32_t GetStartTime();\r
+    void SetStartTime(int32_t value);            // 设置呼吸准备页面开始时间\r
+    int32_t GetBeginTime();\r
+    void SetBeginTime(int32_t value);            // 设置呼吸训练开始时间\r
+    uint8_t GetFrequencyScore();\r
+    void SetFrequencyScore();                    // 调用传感器接口实现呼吸数据,客户自实现\r
+    uint8_t GetHeartRate();\r
+    void SetHeartRate();                         // 调用传感器接口实现心率数据,客户自实现\r
+    std::string GetTrainingDurationTime();\r
+    void SetTrainingDurationTime(uint16_t data); // 增加训练总时长\r
+    std::string GetTrainingCount();\r
+    void SetTrainingCount();                     // 增加训练总次数\r
+    float GetRotateStep();                       // 获取图片旋转步频\r
+    char *GetRhythmText();                       // 获取呼吸频率节奏文本\r
+\r
+private:\r
+    BreathModel();\r
+    BreathModel(const BreathModel &);\r
+    BreathModel &operator=(const BreathModel &);\r
+    uint8_t selectTrainTime_ = 0;\r
+    uint8_t selectRhythm_ = 0;\r
+    uint8_t trainingDurationTime_ = 0;\r
+    uint8_t trainingCount_ = 0;\r
+    int32_t startTime_ = 0;  // 用于记录五秒倒计时开始时间\r
+    int32_t beginTime_ = 0;  // 用于记录训练倒计时开始时间\r
+    uint8_t frequencyScore_ = 0;\r
+    uint8_t heartRate_ = 0;\r
+};\r
+}\r
+\r
+#endif
\ No newline at end of file
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/include/breathexercise/BreathPresenter.h b/code/sdk/application/wearable/evb/nativeapp/nativeui/include/breathexercise/BreathPresenter.h
new file mode 100644 (file)
index 0000000..74147f6
--- /dev/null
@@ -0,0 +1,17 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: BreathPresenter\r
+ * Create: 2025-5-23\r
+ */\r
+\r
+#ifndef Breath_PRESENTER_H\r
+#define Breath_PRESENTER_H\r
+\r
+#include "Presenter.h"\r
+\r
+namespace OHOS {\r
+class BreathView;\r
+class BreathPresenter : public Presenter<BreathView> {};\r
+}\r
+\r
+#endif  // Breath_PRESENTER_H
\ No newline at end of file
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/include/breathexercise/BreathResultPage.h b/code/sdk/application/wearable/evb/nativeapp/nativeui/include/breathexercise/BreathResultPage.h
new file mode 100644 (file)
index 0000000..b80729d
--- /dev/null
@@ -0,0 +1,59 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: BreathResult\r
+ * Create: 2025-5-13\r
+ */\r
+#ifndef BREATH_RESULT_PAGE_H\r
+#define BREATH_RESULT_PAGE_H\r
+\r
+#include "components/ui_label.h"\r
+#include "components/ui_picker.h"\r
+#include "components/ui_view_group.h"\r
+#include "components/ui_image_view.h"\r
+#include "components/ui_scroll_view.h"\r
+#include "components/ui_label_button.h"\r
+#include "components/ui_toggle_button.h"\r
+#include "View.h"\r
+#include "power_display_service.h"\r
+#include "UiConfig.h"\r
+#include "SlicePage.h"\r
+#include "SlicePageFactory.h"\r
+#include "BreathModel.h"\r
+#include "BreathPresenter.h"\r
+#ifndef _WIN32\r
+#include "time64.h"\r
+#endif\r
+\r
+namespace OHOS {\r
+static constexpr uint16_t LABEL_COUNT = 5;\r
+\r
+class BreathResultPage : public SlicePage<BreathPresenter>,\r
+                        public UIView::OnClickListener,\r
+                        public UIView::OnDragListener {\r
+public:\r
+    BreathResultPage();\r
+    ~BreathResultPage() override;\r
+    void OnStart(void* data) override;\r
+    bool OnDrag(UIView &view, const DragEvent &event) override;\r
+    bool OnClick(UIView &view, const ClickEvent &event) override;\r
+    void InitBtn();\r
+    void InitBtnBg();\r
+    void InitLabelDes();\r
+    void InitLabelCount();\r
+    void InitLabelUnit();\r
+    uint8_t GetTimeScour();\r
+private:\r
+    UIScrollView *group_ = nullptr;\r
+    UILabel *labelTitle_ = nullptr;\r
+    UILabel *labelTimeAndRhythmTitle_ = nullptr;\r
+    UIButton *buttonBg_[LABEL_COUNT]{nullptr};\r
+    UILabel *labelDes_[LABEL_COUNT]{nullptr};\r
+    UILabel *labelValue_[LABEL_COUNT]{nullptr};\r
+    UILabel *labelUnit_[LABEL_COUNT]{nullptr};\r
+    UIImageView *scores_ = nullptr;\r
+    UIImageView *pageBgImg_ = nullptr;\r
+    UIButton *buttonComplete_ = nullptr;\r
+    UIButton *buttonRestart_ = nullptr;\r
+};\r
+}\r
+#endif
\ No newline at end of file
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/include/breathexercise/BreathRhythmSetPage.h b/code/sdk/application/wearable/evb/nativeapp/nativeui/include/breathexercise/BreathRhythmSetPage.h
new file mode 100644 (file)
index 0000000..1bfcbf3
--- /dev/null
@@ -0,0 +1,41 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: BreathRhythmSetPage\r
+ * Create: 2025-5-13\r
+ */\r
+#ifndef BREATH_RHYTHM_SET_PAGE_H\r
+#define BREATH_RHYTHM_SET_PAGE_H\r
+\r
+#include "components/ui_label.h"\r
+#include "components/ui_picker.h"\r
+#include "components/ui_image_view.h"\r
+#include "components/ui_label_button.h"\r
+#include "View.h"\r
+#include "SlicePage.h"\r
+#include "SlicePageFactory.h"\r
+#include "BreathModel.h"\r
+#include "BreathPresenter.h"\r
+\r
+namespace OHOS {\r
+class BreathRhythmSetPage : public SlicePage<BreathPresenter>,\r
+                    public UIView::OnClickListener,\r
+                    public UIView::OnDragListener,\r
+                    public UIPicker::SelectedListener {\r
+public:\r
+    BreathRhythmSetPage();\r
+    ~BreathRhythmSetPage() override;\r
+    void OnStart(void* data) override;\r
+    void OnResume() override;\r
+    bool OnClick(UIView &view, const ClickEvent &event) override;\r
+    bool OnDrag(UIView &view, const DragEvent &event) override;\r
+\r
+private:\r
+    UILabel *lableRhythm_ = nullptr;\r
+    UIPicker *pickerRhythm_ = nullptr;\r
+    UIButton *buttonOk_ = nullptr;\r
+    UIViewGroup *group_ = nullptr;\r
+    UIImageView *pickerImg_ = nullptr;\r
+};\r
+}  // namespace OHOS\r
+\r
+#endif
\ No newline at end of file
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/include/breathexercise/BreathStartPage.h b/code/sdk/application/wearable/evb/nativeapp/nativeui/include/breathexercise/BreathStartPage.h
new file mode 100644 (file)
index 0000000..5ffb856
--- /dev/null
@@ -0,0 +1,53 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: BreathStartPage\r
+ * Create: 2025-5-13\r
+ */\r
+#ifndef BREATH_START_PAGE_H\r
+#define BREATH_START_PAGE_H\r
+\r
+#include "components/ui_label.h"\r
+#include "components/ui_image_view.h"\r
+#include "View.h"\r
+#include "power_display_service.h"\r
+#include "SlicePage.h"\r
+#include "graphic_timer.h"\r
+#include "SlicePageFactory.h"\r
+#include "BreathModel.h"\r
+#include "BreathPresenter.h"\r
+#ifndef _WIN32\r
+#include "time64.h"\r
+#endif\r
+\r
+namespace OHOS {\r
+class BreathStartPage : public SlicePage<BreathPresenter>,\r
+                        public UIView::OnClickListener,\r
+                        public UIView::OnDragListener {\r
+public:\r
+    BreathStartPage();\r
+    ~BreathStartPage() override;\r
+    void OnStart(void* data) override;\r
+    void OnTimer();\r
+    bool OnDrag(UIView &view, const DragEvent &event) override;\r
+    void OnPause() override;\r
+private:\r
+    UILabel *titleLable_ = nullptr;\r
+    UILabel *guideLable_ = nullptr;\r
+    UIImageView *centerImg_ = nullptr;\r
+    UIViewGroup *group_ = nullptr;\r
+    UIImageView *bgImg_ = nullptr;\r
+\r
+    class BreathStartCallback : public AnimatorCallback {\r
+    public:\r
+        BreathStartCallback(BreathStartPage* page) : BreathStartPage(page) {}\r
+        virtual ~BreathStartCallback() override {}\r
+        void Callback(UIView* view) override;\r
+    private:\r
+        BreathStartPage* BreathStartPage{nullptr};\r
+    };\r
+    BreathStartCallback* animatorCallBack_{nullptr};\r
+    Animator *animator_ = nullptr;\r
+};\r
+}  // namespace OHOS\r
+\r
+#endif
\ No newline at end of file
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/include/breathexercise/BreathTimeSetPage.h b/code/sdk/application/wearable/evb/nativeapp/nativeui/include/breathexercise/BreathTimeSetPage.h
new file mode 100644 (file)
index 0000000..93f9d95
--- /dev/null
@@ -0,0 +1,44 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: BreathTimeSetPage\r
+ * Create: 2025-5-13\r
+ */\r
+#ifndef BREATH_TIME_SET_PAGE_H\r
+#define BREATH_TIME_SET_PAGE_H\r
+\r
+#include <string>\r
+#include "components/ui_label.h"\r
+#include "components/ui_picker.h"\r
+#include "components/ui_image_view.h"\r
+#include "components/ui_view_group.h"\r
+#include "components/ui_scroll_view.h"\r
+#include "components/ui_label_button.h"\r
+#include "components/ui_toggle_button.h"\r
+#include "View.h"\r
+#include "UiConfig.h"\r
+#include "SlicePage.h"\r
+#include "SlicePageFactory.h"\r
+#include "BreathModel.h"\r
+#include "BreathPresenter.h"\r
+\r
+namespace OHOS {\r
+class BreathTimeSetPage : public SlicePage<BreathPresenter>,\r
+                        public UIView::OnClickListener,\r
+                        public UIView::OnDragListener {\r
+public:\r
+    BreathTimeSetPage();\r
+    ~BreathTimeSetPage() override;\r
+    void OnStart(void* data) override;\r
+    void OnResume() override;\r
+    bool OnClick(UIView &view, const ClickEvent &event) override;\r
+    bool OnDrag(UIView &view, const DragEvent &event) override;\r
+private:\r
+    UILabel *labelTitle_ = nullptr;\r
+    UIPicker *pickerTime_ = nullptr;\r
+    UIButton *buttonOk_ = nullptr;\r
+    UIViewGroup *group_ = nullptr;\r
+    UIImageView *pickerImg_ = nullptr;\r
+};\r
+}  // namespace OHOS\r
+\r
+#endif
\ No newline at end of file
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/include/breathexercise/BreathTrainingRecordsPage.h b/code/sdk/application/wearable/evb/nativeapp/nativeui/include/breathexercise/BreathTrainingRecordsPage.h
new file mode 100644 (file)
index 0000000..593e17b
--- /dev/null
@@ -0,0 +1,44 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: BreathTrainingRecordsPage\r
+ * Create: 2025-5-13\r
+ */\r
+#ifndef BREATH_TRAINING_PAGE_H\r
+#define BREATH_TRAINING_PAGE_H\r
+\r
+#include "components/ui_label.h"\r
+#include "components/ui_image_view.h"\r
+#include "View.h"\r
+#include "SlicePage.h"\r
+#include "graphic_timer.h"\r
+#include "SlicePageFactory.h"\r
+#include "BreathModel.h"\r
+#include "BreathPresenter.h"\r
+\r
+namespace OHOS {\r
+class BreathTrainingRecordsPage : public SlicePage<BreathPresenter>,\r
+                                  public UIView::OnDragListener {\r
+public:\r
+    BreathTrainingRecordsPage();\r
+    ~BreathTrainingRecordsPage() override;\r
+    void OnStart(void* data) override;\r
+    void OnResume() override;\r
+    bool OnDrag(UIView &view, const DragEvent &event) override;\r
+\r
+private:\r
+    UILabel *labelTitle_ = nullptr;\r
+    UILabel *labelTimeDes_ = nullptr;\r
+    UILabel *labelTimeUnit_ = nullptr;\r
+    UILabel *labelTimeValue_ = nullptr;\r
+    UILabel *labelCountDes_ = nullptr;\r
+    UILabel *labelCountUnit_ = nullptr;\r
+    UILabel *labelCountValue_ = nullptr;\r
+    UIViewGroup *group_ = nullptr;\r
+    UIImageView *bgImg1_ = nullptr;\r
+    UIImageView *bgImg2_ = nullptr;\r
+    UIImageView *bgImg3_ = nullptr;\r
+    UIImageView *bgImg4_ = nullptr;\r
+};\r
+}  // namespace OHOS\r
+\r
+#endif
\ No newline at end of file
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/include/breathexercise/BreathView.h b/code/sdk/application/wearable/evb/nativeapp/nativeui/include/breathexercise/BreathView.h
new file mode 100644 (file)
index 0000000..c7a8a5f
--- /dev/null
@@ -0,0 +1,25 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: BreathView\r
+ * Create: 2025-5-14\r
+ */\r
+\r
+#ifndef BREATH_VIEW_H\r
+#define BREATH_VIEW_H\r
+\r
+#include "View.h"\r
+namespace OHOS {\r
+enum BREATH_PAGE {\r
+    BREATH_MAIN_VIEW = 1,\r
+    BREATH_DUR_VIEW = 2,\r
+    BREATH_EXER_VIEW = 3,\r
+    BREATH_RHY_VIEW = 4,\r
+    BREATH_START_VIEW = 5,\r
+    BREATH_RESULT_VIEW = 6,\r
+    BREATH_TRAINING_VIEW = 7,\r
+};\r
+\r
+class BreathPresenter;\r
+class BreathView : public View<BreathPresenter> {};\r
+}\r
+#endif  // BREATH_VIEW_H
\ No newline at end of file
index 01aa7b8..558c2df 100644 (file)
@@ -29,9 +29,7 @@
 #include "camera/CameraPresenter.h"\r
 \r
 namespace OHOS {\r
-\r
 class CameraPresenter;\r
-\r
 class CameraModel;\r
 class CameraMainPage : public SlicePage<CameraPresenter>,\r
                         public UIView::OnClickListener,\r
@@ -39,17 +37,14 @@ class CameraMainPage : public SlicePage<CameraPresenter>,
 public:\r
     CameraMainPage();\r
     ~CameraMainPage() override;\r
-\r
     static CameraMainPage *GetInstance();\r
-\r
     void OnStart(void* data) override;\r
     uint8_t GetConnectStatus();\r
     bool OnClick(UIView &view, const ClickEvent &event) override;\r
     bool OnDrag(UIView& view, const DragEvent& event) override;\r
     void OnPause() override;\r
-    \r
-    bool GetFirstFlag();\r
-    void SetFirstFlag(bool value);\r
+    bool GetFirstClickFlag();\r
+    void SetFirstClickFlag(bool value);\r
     void SetUpButton();\r
     void InitCameraTimer();\r
     void InitCameraView();\r
@@ -58,15 +53,16 @@ public:
     void StopAnimator();\r
     void PhotoTaken();\r
     void Refresh_page();\r
+\r
 private:\r
-    UILabel *title = nullptr;\r
-    UILabel *cameraFind = nullptr;\r
-    UILabel *cameraTitle = nullptr;\r
-    UILabel *cameraTime = nullptr;\r
-    UIButton *button = nullptr;\r
-    bool isFirst;\r
+    UILabel *disconnectTitle_ = nullptr;\r
+    UILabel *cameraFind_ = nullptr;\r
+    UILabel *cameraTitle_ = nullptr;\r
+    UILabel *cameraTime_ = nullptr;\r
+    UIButton *takePhotoButton_ = nullptr;\r
     UIScrollView* container_ = nullptr;\r
-    UIImageView *bluetoothDisconnected = nullptr;\r
+    UIImageView *btDisconnected_ = nullptr;\r
+    bool isFirstClick_;\r
 \r
 class CameraAnimatorCallback : public AnimatorCallback {\r
 public:\r
@@ -81,4 +77,4 @@ private:
     CameraAnimatorCallback *callBack_ = nullptr;\r
 };\r
 }\r
-#endif // CAMERA_VIEW_H\r
+#endif // CAMERA_MAIN_PAGE_H\r
index 61a9c5e..70adcb3 100644 (file)
@@ -20,7 +20,6 @@ private:
     CameraModel(const CameraModel &);\r
     CameraModel &operator=(const CameraModel &);\r
     virtual ~CameraModel();\r
-    bool buttonStatus = 0;\r
 };\r
 }\r
 \r
index bb20b9c..1f52f76 100644 (file)
 #include "main/HealthModel.h"
 #include "activity/ActivityModel.h"
 #include "UiConfig.h"
-#include "components/ui_card_page.h"
+#include "components/ui_fragment.h"
 #include "animator/animator_manager.h"
 #include "sys/time.h"
+#include "common/periodicupdate_interface.h"
 
 namespace OHOS {
-class AmbientClockView : public UICardPage {
+class AmbientClockView : public UIFragment, public PeriodicUpdateInterface {
 public:
     AmbientClockView();
     ~AmbientClockView() override;
     AmbientClockView(const AmbientClockView &) = delete;
     AmbientClockView &operator=(const AmbientClockView &) = delete;
-
-    bool InitView(void);
-    void PreLoad(void) override;
-    void UpdateTime(void);
-    uint32_t GetPeriod(void) const
+    void Update(void) override;
+    uint32_t GetPeriod(void) override
     {
         return 1000; // 1000: ms
     }
 
 private:
+    void OnCreateView(void* data) override;
+    void OnDestroyView() override;
     bool InitCenterCircleView(void);
     bool InitHandView(void);
     void InitDateTime(void);
@@ -58,7 +58,6 @@ private:
     Image *bigCircle_{nullptr};
     Image *medCircle_{nullptr};
     Image *smallCircle_{nullptr};
-    bool viewiInitStatus_{false};
 }; // class AmbientClockView
 } // namespace OHOS
 #endif // AMBIENT_VIEW_GROUP_H
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/include/clock/ClockResourceImage.h b/code/sdk/application/wearable/evb/nativeapp/nativeui/include/clock/ClockResourceImage.h
new file mode 100644 (file)
index 0000000..29838a2
--- /dev/null
@@ -0,0 +1,47 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: ClockResourceImage\r
+ * Author:\r
+ * Create: 2025-05-06\r
+ */\r
+\r
+#ifndef CLOCK_RESOURCE_IMAGE_H\r
+#define CLOCK_RESOURCE_IMAGE_H\r
+#include "UiConfig.h"\r
+\r
+namespace OHOS {\r
+    static constexpr const char *PNG_GRADIENT_CLOCK_RESOURCE = APP_RES_PATH"/GRADIENT_CLOCK_IMAGES.bin";\r
+\r
+    static const int PNG_DATA_0 = 0x100001;\r
+    static const int PNG_DATA_1 = 0x100002;\r
+    static const int PNG_DATA_2 = 0x100003;\r
+    static const int PNG_DATA_3 = 0x100004;\r
+    static const int PNG_DATA_4 = 0x100005;\r
+    static const int PNG_DATA_5 = 0x100006;\r
+    static const int PNG_DATA_6 = 0x100007;\r
+    static const int PNG_DATA_7 = 0x100008;\r
+    static const int PNG_DATA_8 = 0x100009;\r
+    static const int PNG_DATA_9 = 0x10000a;\r
+    static const int PNG_DATA_SPLIT = 0x10000b;\r
+    static const int PNG_TIME_0 = 0x10000c;\r
+    static const int PNG_TIME_1 = 0x10000d;\r
+    static const int PNG_TIME_2 = 0x10000e;\r
+    static const int PNG_TIME_3 = 0x10000f;\r
+    static const int PNG_TIME_4 = 0x100010;\r
+    static const int PNG_TIME_5 = 0x100011;\r
+    static const int PNG_TIME_6 = 0x100012;\r
+    static const int PNG_TIME_7 = 0x100013;\r
+    static const int PNG_TIME_8 = 0x100014;\r
+    static const int PNG_TIME_9 = 0x100015;\r
+    static const int PNG_TIME_SCALE = 0x100016;\r
+    static const int PNG_TIME_SPLIT = 0x100017;\r
+    static const int PNG_WEEK_FRI = 0x100018;\r
+    static const int PNG_WEEK_MON = 0x100019;\r
+    static const int PNG_WEEK_SAT = 0x10001a;\r
+    static const int PNG_WEEK_SUN = 0x10001b;\r
+    static const int PNG_WEEK_THU = 0x10001c;\r
+    static const int PNG_WEEK_TUE = 0x10001d;\r
+    static const int PNG_WEEK_WED = 0x10001e;\r
+} // OHOS\r
+\r
+#endif // CLOCK_RESOURCE_IMAGE_H
\ No newline at end of file
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/include/clock/GradientAodView.h b/code/sdk/application/wearable/evb/nativeapp/nativeui/include/clock/GradientAodView.h
new file mode 100644 (file)
index 0000000..28e3d8d
--- /dev/null
@@ -0,0 +1,38 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: GradientAodView\r
+ * Create: 2025-04\r
+ */\r
+\r
+#ifndef GRADIENT_AOD_VIEW_H\r
+#define GRADIENT_AOD_VIEW_H\r
+\r
+#include "components/ui_card_page.h"\r
+#include "GradientDateView.h"\r
+#include "components/ui_fragment.h"\r
+#include "common/periodicupdate_interface.h"\r
+\r
+namespace OHOS {\r
+\r
+class GradientAodView : public UIFragment, public PeriodicUpdateInterface {\r
+public:\r
+    GradientAodView();\r
+    ~GradientAodView() override;\r
+    GradientAodView(const GradientAodView &) = delete;\r
+    static GradientAodView* GetInstance(void);\r
+    GradientAodView &operator=(const GradientAodView &) = delete;\r
+    void Update(void) override;\r
+    uint32_t GetPeriod(void) override\r
+    {\r
+        return 1000; // 1000: ms\r
+    }\r
+\r
+private:\r
+    void OnCreateView(void* data) override;\r
+    void OnDestroyView() override;\r
+    GradientDateView* gradientDateView_{nullptr};\r
+}; // class GradientAodView\r
+\r
+} // namespace OHOS\r
+\r
+#endif // GRADIENT_AOD_VIEW_H
\ No newline at end of file
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/include/clock/GradientClockView.h b/code/sdk/application/wearable/evb/nativeapp/nativeui/include/clock/GradientClockView.h
new file mode 100644 (file)
index 0000000..1f86e28
--- /dev/null
@@ -0,0 +1,62 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: GradientClockView\r
+ * Create: 2025-04\r
+ */\r
+\r
+#ifndef GRADIENT_CLOCK_VIEW_H\r
+#define GRADIENT_CLOCK_VIEW_H\r
+\r
+#include <ctime>\r
+#include "View.h"\r
+#include "components/ui_canvas_ext.h"\r
+#include "ChangeSliceListener.h"\r
+#include "UiConfig.h"\r
+#include "components/ui_card_page.h"\r
+#include "GradientDateView.h"\r
+#include "common/periodicupdate_interface.h"\r
+\r
+namespace OHOS {\r
+\r
+struct sectorInfo {\r
+    float startAngle;\r
+    float angleRange;\r
+    uint16_t sectorRadius;\r
+    uint16_t stopCount;\r
+    ColorStop* colorStop;\r
+\r
+    sectorInfo(float start, float angle, uint16_t radius, uint16_t count, ColorStop* color = nullptr):\r
+         startAngle(start), angleRange(angle), sectorRadius(radius), stopCount(count), colorStop(color)\r
+    {}\r
+};\r
+\r
+class GradientClockView : public UICardPage, public PeriodicUpdateInterface {\r
+public:\r
+    GradientClockView();\r
+    static GradientClockView *GetInstance(void);\r
+    ~GradientClockView() override;\r
+    GradientClockView(const GradientClockView &) = delete;\r
+    GradientClockView &operator=(const GradientClockView &) = delete;\r
+    bool InitView(void);\r
+    void PreLoad(void) override;\r
+    void Update(void) override;\r
+    uint32_t GetPeriod(void) override\r
+    {\r
+        return DEFAULT_TASK_PERIOD;\r
+    }\r
+\r
+private:\r
+    void UpdateHands(uint8_t minute, uint8_t second, uint64_t milliSecond);\r
+    void UpdateCanvas(UICanvasExt* canvas, const sectorInfo& sectorInfo);\r
+    void SafeDelete(UIView* ptr);\r
+    UICanvasExt* backgroudCanvas_;\r
+    UICanvasExt* secondHandCanvas_;\r
+    UICanvasExt* minuteHandCanvas_;\r
+    bool viewiInitStatus_{false};\r
+    uint8_t second_ = 0xFF;\r
+    float secondAngle_;\r
+    GradientDateView* gradientDateView_{nullptr};\r
+}; // class GradientClockView\r
+} // namespace OHOS\r
+\r
+#endif // GRADIENT_CLOCK_VIEW_H
\ No newline at end of file
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/include/clock/GradientDateView.h b/code/sdk/application/wearable/evb/nativeapp/nativeui/include/clock/GradientDateView.h
new file mode 100644 (file)
index 0000000..5b1410a
--- /dev/null
@@ -0,0 +1,53 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: GradientDateView\r
+ * Create: 2025-04\r
+ */\r
+\r
+#ifndef GRADIENT_DATE_VIEW_H\r
+#define GRADIENT_DATE_VIEW_H\r
+\r
+#include <vector>\r
+#include "components/ui_view_group.h"\r
+#include "components/ui_image_view.h"\r
+#include "main/dial/DialDigitalImgView.h"\r
+\r
+namespace OHOS {\r
+\r
+class GradientDateView : public UIViewGroup {\r
+public:\r
+    GradientDateView();\r
+    ~GradientDateView();\r
+    GradientDateView(const GradientDateView &) = delete;\r
+    GradientDateView &operator=(const GradientDateView &) = delete;\r
+    bool InitView(void);\r
+    void UpdateTime(void);\r
+\r
+private:\r
+    bool LoadClockImageById(UIImageView* view, uint32_t resId);\r
+    bool LoadGradientDateImages(std::vector<ImageInfo*> &imgInfos, std::vector<int> resIds, uint16_t length);\r
+    void InitDigitalImgView(DialDigitalImgView* &dialView, Point pos, uint16_t integerLength,\r
+        std::vector<ImageInfo*> &numImgInfo);\r
+    void HandleDigitalData(DialDigitalImgView* digitalView, float data);\r
+    void InitWeekImgView(void);\r
+    void InitDateImgViews(void);\r
+    void InitTimeImgViews(void);\r
+    UIImageView weekImgView_;\r
+    std::vector<ImageInfo*> weekInfo_;\r
+    DialDigitalImgView* yearImgView_{nullptr};\r
+    DialDigitalImgView* monthImgView_{nullptr};\r
+    DialDigitalImgView* dayImgView_{nullptr};\r
+    UIImageView dateSplitLeft_;\r
+    UIImageView dateSplitRight_;\r
+    std::vector<ImageInfo*> dateNumImgInfo_;\r
+    DialDigitalImgView* hourImgView_{nullptr};\r
+    DialDigitalImgView* minuteImgView_{nullptr};\r
+    std::vector<ImageInfo*> timeNumImgInfo_;\r
+    UIImageView timeSplit_;\r
+    UIImageView* backgroudImage_;\r
+    bool viewiInitStatus_{false};\r
+}; // class GradientDateView\r
+\r
+} // namespace OHOS\r
+\r
+#endif // GRADIENT_DATE_VIEW_H
\ No newline at end of file
index c643693..75e2249 100644 (file)
 #include "animator/animator_manager.h"
 #include <ctime>
 #include "sys/time.h"
+#include "common/periodicupdate_interface.h"
 
 namespace OHOS {
-class MainClockView : public UICardPage {
+class MainClockView : public UICardPage, public PeriodicUpdateInterface {
 public:
     MainClockView();
     ~MainClockView() override;
@@ -42,7 +43,11 @@ public:
     void RefreshHeartRate(int value);
     void ClockAnimatorStart(void);
     void ClockAnimatorStop(void);
-    void UpdateTime(void);
+    void Update(void) override;
+    uint32_t GetPeriod(void) override
+    {
+        return DEFAULT_TASK_PERIOD;
+    }
 
 private:
     void InitStepValue();
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/include/compass/CompassCalibrationView.h b/code/sdk/application/wearable/evb/nativeapp/nativeui/include/compass/CompassCalibrationView.h
new file mode 100644 (file)
index 0000000..704e60d
--- /dev/null
@@ -0,0 +1,34 @@
+/*\r
+ * Copyright (c) CompanyNameMagicTag 2022-2022. All rights reserved.\r
+ * Description: CompassCalibrationView.h\r
+ * Author:\r
+ * Create: 2022-04-02\r
+ */\r
+\r
+#ifndef COMPASS_CALIBRATION_VIEW_H\r
+#define COMPASS_CALIBRATION_VIEW_H\r
+\r
+#include "components/ui_label.h"\r
+#include "View.h"\r
+#include "ohos_types.h"\r
+#include "AppGroupView.h"\r
+#include "components/ui_image_view.h"\r
+\r
+namespace OHOS {\r
+class CompassCalibrationView : public AppGroupView {\r
+public:\r
+    CompassCalibrationView();\r
+    ~CompassCalibrationView() override;\r
+\r
+    bool CreateUIViewGroup(void);\r
+    static CompassCalibrationView *GetInstance(void);\r
+    bool InitView(void *caller) override;\r
+private:\r
+    UILabel *labelOne{nullptr};\r
+    UILabel *labelTwo{nullptr};\r
+    UIImageView *imageView{nullptr};\r
+\r
+    void ClearAll(void);\r
+};\r
+}\r
+#endif
\ No newline at end of file
index e2242e1..4f52df8 100644 (file)
 \r
 #include "components/ui_card_page.h"\r
 #include "compass/CompassFragment.h"\r
+#include "common/periodicupdate_interface.h"\r
 \r
 namespace OHOS {\r
 \r
-class CompassControlView : public UICardPage {\r
+class CompassControlView : public UICardPage, public PeriodicUpdateInterface {\r
 public:\r
     CompassControlView();\r
+    ~CompassControlView() override;\r
     void PreLoad(void) override;\r
     void UnLoad(void) override;\r
     void OnPause(void) override;\r
     void OnActive(void) override;\r
     void ScrollBegin(bool isActive) override;\r
     void ScrollEnd(bool isActive) override;\r
+    void Update(void) override;\r
+    uint32_t GetPeriod(void) override\r
+    {\r
+        return DEFAULT_TASK_PERIOD; // DEFAULT_TASK_PERIOD: ms\r
+    }\r
+\r
 private:\r
     CompassFragment *compassFragment_{nullptr};\r
 };\r
index 64c6ee0..b4e6fba 100644 (file)
 #include "components/ui_label.h"
 #include "components/ui_image_view.h"
 #include "components/ui_fragment.h"
-#include "common/task.h"
 
 namespace OHOS {
-class CompassFragment : public UIFragment, public Task {
+class CompassFragment : public UIFragment {
 public:
     void OnCreateView(void* data) override;
     void OnResumeView() override;
     void OnPauseView() override;
     void OnDestroyView() override;
-    void Callback() override;
+    void Update(void);
 
 private:
     bool InitCompassImage(void);
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/include/compass/CompassPresenter.h b/code/sdk/application/wearable/evb/nativeapp/nativeui/include/compass/CompassPresenter.h
new file mode 100644 (file)
index 0000000..68d6877
--- /dev/null
@@ -0,0 +1,46 @@
+/*\r
+ * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved.\r
+ * Description: CompassPresenter.h\r
+ * Author:\r
+ * Create: 2021-12-21\r
+ */\r
+#ifndef COMPASS_PRESENTER_H\r
+#define COMPASS_PRESENTER_H\r
+\r
+#include "Presenter.h"\r
+#include "components/ui_view.h"\r
+#include "components/ui_image_view.h"\r
+#include "ohos_types.h"\r
+#include "UiConfig.h"\r
+#include "AppViewIDs.h"\r
+#include "CompassView.h"\r
+\r
+namespace OHOS {\r
+typedef struct {\r
+    uint16_t beginAngle;\r
+    uint16_t endAngle;\r
+    const char *dir;\r
+} CompassItem;\r
+\r
+class CompassView;\r
+class CompassPresenter {\r
+public:\r
+    CompassPresenter();\r
+    virtual ~CompassPresenter();\r
+\r
+    static CompassPresenter *GetInstance(void);\r
+    void DisplayAngleDir(uint16_t angle);\r
+    void DetermineToRotate(void);\r
+    void InScopeRotate(void);\r
+    void TimeCreateRandomNum(void);\r
+    void DisplayAngleRight(uint16_t angle);\r
+\r
+private:\r
+    int16_t lastRotateAngle{0};\r
+    int16_t currentRotateAngle{0};\r
+    int16_t angleDiff{0};\r
+    bool getAngleStatus{false};\r
+    bool initDisplayStatus{true};\r
+};\r
+}\r
+#endif
\ No newline at end of file
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/include/compass/CompassView.h b/code/sdk/application/wearable/evb/nativeapp/nativeui/include/compass/CompassView.h
new file mode 100644 (file)
index 0000000..97cd957
--- /dev/null
@@ -0,0 +1,47 @@
+/*\r
+ * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved.\r
+ * Description: CompassView.h\r
+ * Author:\r
+ * Create: 2021-12-21\r
+ */\r
+\r
+#ifndef COMPASS_VIEW_H\r
+#define COMPASS_VIEW_H\r
+\r
+#include "View.h"\r
+#include "components/root_view.h"\r
+#include "components/ui_label.h"\r
+#include "components/ui_image_view.h"\r
+#include "ChangeSliceListener.h"\r
+#include "UiConfig.h"\r
+#include "AppGroupView.h"\r
+#include "CompassCalibrationView.h"\r
+\r
+namespace OHOS {\r
+static constexpr float VIEW_CENTERS = 227;\r
+\r
+class CompassView : public AppGroupView {\r
+public:\r
+    CompassView();\r
+    ~CompassView() override;\r
+\r
+    void DirectionSetText(const char *text, const char *angle);\r
+    static CompassView *GetInstance(void);\r
+    void CompassStartRotate(int16_t numb);\r
+    bool InitPage(void);\r
+    bool InitView(void *caller) override;\r
+    bool GetInitViewState(void);\r
+    bool InitCompassImage(void);\r
+\r
+private:\r
+    bool LoadCompassImage(UIImageView *view, uint32_t resId);\r
+    void ClearAll(void);\r
+    UILabel *directionLabel{nullptr};\r
+    UILabel *angledLabel{nullptr};\r
+    UIImageView *backGround{nullptr};\r
+    UIImageView *rotateShaft{nullptr};\r
+    UIImageView *triangulation{nullptr};\r
+    const Vector2<float> VIEW_CENTER = {VIEW_CENTERS, VIEW_CENTERS};\r
+};\r
+}\r
+#endif
\ No newline at end of file
index 2588f0a..ef4bc0b 100644 (file)
 #include "Presenter.h"\r
 #include "compass/MainCompassView.h"\r
 #include "compass/CompassModel.h"\r
+#include "common/task.h"\r
 \r
 namespace OHOS {\r
 class MainCompassView;\r
-class MainCompassPresenter : public Presenter<MainCompassView>, public UIView::OnDragListener {\r
+class MainCompassPresenter : public Presenter<MainCompassView>, public UIView::OnDragListener, public Task {\r
 public:\r
     bool OnDrag(UIView& view, const DragEvent& event) override;\r
 \r
     void OnResume() override;\r
 \r
     void OnPause() override;\r
+\r
+    void Callback() override;\r
 };\r
 }\r
 #endif
\ No newline at end of file
index c03c4b2..0b38897 100644 (file)
@@ -7,7 +7,7 @@
 #ifndef DATE_BUTTON_ITEM_VIEW_H\r
 #define DATE_BUTTON_ITEM_VIEW_H\r
 \r
-#include "date/DateModel.h"\r
+#include "DateModel.h"\r
 #include "UiConfig.h"\r
 #include "components/ui_canvas.h"\r
 #include "components/ui_image_view.h"\r
@@ -22,13 +22,11 @@ public:
     explicit DateButtonItemView();\r
     ~DateButtonItemView() override;\r
     virtual void SetItemInfo(const DateButtonItem itemInfo);\r
-    virtual void SetUpChild();\r
     DateButtonItem GetItem();\r
 \r
 private:\r
-    static bool flag;\r
-    UILabelButton sLabelButton;\r
-    DateButtonItem sItemInfo = {nullptr, 0, false, false};\r
+    UILabelButton labelButton_;\r
+    DateButtonItem itemInfo_ = {"", nullptr, false, false};\r
 };\r
 }\r
 \r
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/include/date/DateContentItemView.h b/code/sdk/application/wearable/evb/nativeapp/nativeui/include/date/DateContentItemView.h
new file mode 100644 (file)
index 0000000..befc60a
--- /dev/null
@@ -0,0 +1,38 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: DateContentItemView\r
+ * Create: 2025-03-23\r
+ */\r
+\r
+#ifndef DATE_CONTENT_ITEM_VIEW_H\r
+#define DATE_CONTENT_ITEM_VIEW_H\r
+\r
+#include "DateModel.h"\r
+#include "UiConfig.h"\r
+#include "main/LoadImg.h"\r
+#include "components/ui_canvas.h"\r
+#include "components/ui_image_view.h"\r
+#include "components/ui_label.h"\r
+#include "components/ui_button.h"\r
+#include "components/ui_view_group.h"\r
+\r
+namespace OHOS {\r
+class DateContentItemView : public UIViewGroup {\r
+public:\r
+    explicit DateContentItemView();\r
+    ~DateContentItemView() override;\r
+    virtual void SetItemInfo(const DateItem itemInfo);\r
+    const char *GetViewId();\r
+    bool GetVisiable();\r
+\r
+private:\r
+    UILabel labelTitle_;\r
+    UILabel labelDes_;\r
+    UILabel labelAddress_;\r
+    UIImageView signs_;\r
+    UIButton backGround_;\r
+    DateItem itemInfo_ = {nullptr, nullptr, nullptr, nullptr, false};\r
+};\r
+}\r
+\r
+#endif\r
index 9bb4584..f365ca9 100644 (file)
 #include <iomanip>\r
 #include <string>\r
 #include <sys/time.h>\r
+#include "gfx_utils/vector.h"\r
 #include "components/ui_scroll_view.h"\r
 #include "components/ui_label.h"\r
-#include "components/ui_list.h"\r
-#include "date/DateAdapter.h"\r
-#include "date/DateButtonAdapter.h"\r
-#include "date/DatePresenter.h"\r
+#include "components/ui_button.h"\r
+#include "components/ui_simple_list.h"\r
+#include "DateButtonItemView.h"\r
+#include "DateContentItemView.h"\r
+#include "DatePresenter.h"\r
 #include "SlicePage.h"\r
 #include "UiConfig.h"\r
-#include "date/DateView.h"\r
-#include "components/ui_button.h"\r
+#include "DateView.h"\r
 \r
 namespace OHOS {\r
-#define LABEL_COUNT 4\r
-static constexpr int16_t START_YEAR = 1900;\r
+static constexpr int16_t WEEK_DYAS = 7;\r
 \r
 class DatePresenter;\r
 class DateMainPage : public SlicePage<DatePresenter>,\r
@@ -33,26 +33,30 @@ class DateMainPage : public SlicePage<DatePresenter>,
 public:\r
     DateMainPage();\r
     ~DateMainPage() override;\r
+    static DateMainPage *GetInstance();\r
     void OnStart(void* data) override;\r
     bool OnClick(UIView &view, const ClickEvent &event) override;\r
     bool OnDrag(UIView& view, const DragEvent& event) override;\r
-    void InitDownList();\r
-    void UpdateMsg(std::string dateMsg);\r
-    void SetDownListAdapter();\r
-    bool InitDateTop();\r
+    void InitList();\r
+    bool InitListTopDate();\r
+    void SetContentListDate();\r
+    void SetDateButtonList(std::string viewId);\r
+    void RefreshDateMsg(std::string dateMsg);\r
     std::string GetFutureDate(int days_ahead);\r
-    void RefreshButtonListDate(int value);\r
+    void ReloadPage();\r
+    void ClearButtonList();\r
+    void ClearContentList();\r
+    void RefreshListData();\r
+       \r
 private:\r
-    UIScrollView *uiScrollView = nullptr;\r
-    DateAdapter *listAdapter{nullptr};\r
-    UIList *downContentList{nullptr};\r
-    UIImageView *image1{nullptr};\r
-    DateButtonAdapter *buttonAdapter{nullptr};\r
-    UIList *buttonContentList{nullptr};\r
-    UILabel *title{nullptr};\r
-    std::list<DateButtonItem> listTop;\r
-    std::string strDate[SET_SEVEN];\r
-    std::string strDay[SET_SEVEN];\r
+    UIScrollView *uiScrollView_{nullptr};\r
+    UISimpleList *detailList_{nullptr};\r
+    UISimpleList *dateList_{nullptr};\r
+    UIImageView *bgImage_{nullptr};\r
+    UILabel *titlLabel_{nullptr};\r
+    Graphic::Vector<DateButtonItem> listTop_;\r
+    std::string strDate_[WEEK_DYAS];\r
+    std::string strDay_[WEEK_DYAS];\r
 };\r
 }\r
 #endif // SETTING_MAIN_PAGE_H
\ No newline at end of file
index 8a5e59c..01022b0 100644 (file)
 #include "components/ui_label_button.h"\r
 #include "components/ui_swipe_view.h"\r
 #include "ui_swipe_view.h"\r
-#include "date/DatePresenter.h"\r
-#include "date/DateModel.h"\r
-#include "date/DateView.h"\r
+#include "DatePresenter.h"\r
+#include "DateModel.h"\r
+#include "DateView.h"\r
 #include "SlicePage.h"\r
 #include "UiConfig.h"\r
 \r
 namespace OHOS {\r
-#define LABEL_COUNT 8\r
 class DatePresenter;\r
 class DateMessagePage : public SlicePage<DatePresenter>,\r
                         public UIView::OnDragListener {\r
@@ -28,13 +27,15 @@ public:
     ~DateMessagePage() override;\r
     void OnStart(void* data) override;\r
     bool OnDrag(UIView& view, const DragEvent& event) override;\r
+    void InitLabel();\r
 \r
 private:\r
-    UIViewGroup *group;\r
-    UIImageView *image1;\r
-    UILabel *labelTitle{nullptr};\r
-    UILabel *labelMessage{nullptr};\r
-    UILabel *labelTime{nullptr};\r
+    UIScrollView *group_{nullptr};\r
+    UIImageView *bgImage_{nullptr};\r
+    UILabel *labelTitle_{nullptr};\r
+    UILabel *labelMessage_{nullptr};\r
+    UILabel *labelAddress_{nullptr};\r
+    UILabel *labelTime_{nullptr};\r
 };\r
 }\r
 #endif
\ No newline at end of file
index b86e3e2..2faac99 100644 (file)
 #include <random>\r
 #include <sstream>\r
 #include <unordered_map>\r
+#include <sys/stat.h>\r
+#include "graphic_timer.h"\r
+#include "ohos_timer.h"\r
 #include "hal_tick.h"\r
 #include "AppViewIDs.h"\r
 #include "UiConfig.h"\r
 #include "cJSON.h"\r
-\r
+#include "diag_service.h"\r
+#include "gfx_utils/vector.h"\r
+#ifndef _WIN32\r
+#include "time64.h"\r
+#define DATE_PATH "/user/app/user/ace/data/com.vendor.Weather"\r
+#else\r
+#define DATE_PATH APP_RES_PATH\r
+#endif\r
 namespace OHOS {\r
+static constexpr int16 DATE_COUNT = 24;\r
+static constexpr int16 DATE_HOUR = 12;\r
 static constexpr int16 HOUR_COUNT = 24;\r
 static constexpr uint64_t CENTI_SECOND_UNIT = 100;\r
 static constexpr uint64_t MS_ONE_SECONDS = 1000;\r
-static constexpr uint16_t NUM_TEN = 10;\r
+static constexpr uint16_t NUM_THIRTY = 30;\r
 static constexpr uint16_t NUM_TIME_MIN = 60;\r
 static constexpr uint16_t NUM_TIME_HOUR = 3600;\r
-static constexpr int32_t NUM_TIME_DAY = 86400;\r
-static constexpr int16_t MIN_TO_HOUR = 60;\r
-static constexpr int16_t HOURLY_SYSTEM = 24;\r
+static constexpr uint32_t NUM_TIME_DAY = 86400;\r
+static constexpr uint16_t TIME_END = 16;\r
+static constexpr uint8_t DATE_UNIT_COUNT = 3;\r
+static constexpr uint8_t PAGE_STATUS_0 = 0; // 主页面滑动/按钮退出或在子页面通过按钮退出应用,清除selectButton_记录\r
+static constexpr uint8_t PAGE_STATUS_1 = 1; // 从主页面进入子页面,设置resetPage,用于主页面恢复选择记录\r
+static constexpr uint8_t PAGE_STATUS_2 = 2; // 从子页面回退到主页面,当在主页面未点击任何按钮,不修改selectButton_记录,退出到主页面时清除记录\r
+\r
 typedef struct {\r
     std::string hour;\r
     std::string eventTitle;\r
-    std::string startTime;\r
-    std::string week;\r
+    std::string address;\r
+    std::string index;\r
 } DateMsg;\r
 \r
 typedef struct {\r
-    const char *label_1;\r
-    const char *label_2;\r
+    const char *title;\r
+    const char *describetion;\r
+    const char *address;\r
     const char *index;\r
     bool visiable;\r
 } DateItem;\r
 \r
 typedef struct {\r
-    const char *button_viewId;\r
-    const char *button_day;\r
-    int index;\r
+    std::string buttonViewId;\r
+    const char *buttonDay;\r
     bool isFirst;\r
     bool isSelect;\r
 } DateButtonItem;\r
 \r
+typedef struct {\r
+    std::string eventTitle;\r
+    std::string time;\r
+} DateToMessage;\r
+\r
 static const uint16_t DATE_ITEM_COUNT = 10;\r
+\r
 class DateModel {\r
 public:\r
     static DateModel &GetInstance(void);\r
     virtual ~DateModel();\r
-    bool InitDateVec(std::string dateStr);\r
+    void Init();\r
     bool InitDate();\r
-\r
+    bool InitDateVec(std::string dateStr);\r
     const char *GetViewId();\r
-    std::unordered_map<std::string, std::vector<DateMsg>> keyValues;\r
-    std::list<DateItem> listDate;\r
-    std::string now;\r
-    std::string titleName;\r
-    std::string messageIndex;\r
-    std::string strIndex;\r
+    void InitDateTimer();\r
+    void DisableDatePhoneTimer();\r
+    void PollFileUntilChange(const std::string& filePath);\r
+    void CalcClockTime(std::string hour, std::string eventTitle);\r
+    void ClearData();\r
+    uint8_t GetConnectStatus();\r
+    std::vector<DateToMessage> dateClockVec_;\r
+    std::vector<DateItem> listDate_;\r
+    std::string titleName_ = "";\r
+    std::string selectButton_ = "";\r
+    int resetPage_ = 0;\r
+    std::string messageIndex_;\r
 \r
 private:\r
     DateModel();\r
     DateModel(const DateModel &);\r
     DateModel &operator=(const DateModel &);\r
+    GraphicTimer *startCount_ = nullptr;\r
+    std::unordered_map<std::string, std::vector<DateMsg>> keyValues_;\r
 };\r
 }\r
 \r
-#endif  // DATE_MODEL_H
\ No newline at end of file
+#endif // Date_MODEL_H
\ No newline at end of file
index 813c5ba..f0ae9c2 100644 (file)
@@ -7,30 +7,13 @@
 #ifndef DATE_PRESENTER_H\r
 #define DATE_PRESENTER_H\r
 \r
-#include "date/DateModel.h"\r
+#include "DateModel.h"\r
 #include "Presenter.h"\r
 #include "components/ui_view.h"\r
 namespace OHOS {\r
-constexpr int16 BACKGROUND_IMAGE_WIDTH = 190;\r
-constexpr int16 SET_ZERO = 0;\r
-constexpr int16 SET_ONE = 1;\r
-constexpr int16 SET_TWO = 2;\r
-constexpr int16 SET_THREE = 3;\r
-constexpr int16 SET_FOUR = 4;\r
-constexpr int16 SET_FIVE = 5;\r
-constexpr int16 SET_SIX = 6;\r
-constexpr int16 SET_SEVEN = 7;\r
-constexpr int16 SET_EIGHT = 8;\r
-constexpr int16 SET_NINE = 9;\r
-constexpr int16 SET_TEN = 10;\r
-constexpr int16 SET_TWELVE = 12;\r
-constexpr int16 SET_THIRTEEN = 13;\r
-constexpr int16 SET_FOURTEEN = 14;\r
-constexpr int16 SET_HUNDRED = 100;\r
-constexpr int16 SET_TWO_HUNDRED = 200;\r
 \r
 class DateView;\r
 class DatePresenter : public Presenter<DateView> {};\r
 }\r
 \r
-#endif  // DATE_PRESENTER_H
\ No newline at end of file
+#endif // DATE_PRESENTER_H
\ No newline at end of file
index 8271b29..93a6e52 100644 (file)
@@ -17,4 +17,4 @@ enum DATE_PAGES {
 class DatePresenter;\r
 class DateView : public View<DatePresenter> {};\r
 }\r
-#endif  // Date_VIEW_H\r
+#endif // Date_VIEW_H\r
index 0b497c7..889b4d6 100644 (file)
@@ -1,15 +1,15 @@
 /*\r
- * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
  * Description: EmptyPage\r
  * Create: 2025-04-24\r
  */\r
 #ifndef EMPTY_PAGE_H\r
 #define EMPTY_PAGE_H\r
 #include "components/ui_view_group.h"\r
-#include "components/ui_scroll_view.h"\r
+#include "components/ui_image_view.h"\r
 #include "components/ui_label.h"\r
 #include "SlicePage.h"\r
-#include "emptypage/EmptyPresenter.h"\r
+#include "EmptyPresenter.h"\r
 \r
 namespace OHOS {\r
 \r
@@ -17,11 +17,10 @@ class EmptyPage : public SlicePage<EmptyPresenter>,
     public UIView::OnClickListener,\r
     public UIView::OnDragListener {\r
 public:\r
-    EmptyPage(){};\r
+    EmptyPage();\r
     ~EmptyPage();\r
     void OnStart(void* data) override;\r
     bool OnDrag(UIView& view, const DragEvent& event) override;\r
-    bool OnClick(UIView& view, const ClickEvent& event) override;\r
 \r
 private:\r
     EmptyPage(const EmptyPage &) = delete;\r
@@ -29,17 +28,17 @@ private:
     EmptyPage(EmptyPage &&) = delete;\r
     EmptyPage &operator=(EmptyPage &&) = delete;\r
 \r
-    UIScrollView *container_ = nullptr;\r
-    UILabel *memLabel_ = nullptr;\r
-    uint32_t used_ = 0;\r
-    uint32_t free_ = 0;\r
+    UIViewGroup *container_ = nullptr;\r
+    UIImageView *bgImg_{nullptr};\r
+    UILabel *memUsedLabel_ = nullptr;\r
+    UILabel *memFreeLabel_ = nullptr;\r
 };\r
 \r
 #ifdef __cplusplus\r
 extern "C" {\r
 #endif\r
 #if !defined(_WIN32)\r
-uint32_t test_get_mem_info(uint8_t memType, uint32_t *used, uint32_t *free);\r
+uint32_t test_get_mem_info(uint32_t *used, uint32_t *free);\r
 #endif\r
 #ifdef __cplusplus\r
 }\r
index ca245c8..35e9ad6 100644 (file)
@@ -1,5 +1,5 @@
 /*\r
- * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
  * Description: EmptyPresenter\r
  * Create: 2025-04-24\r
  */\r
index b17ea9e..fdcce25 100644 (file)
@@ -1,5 +1,5 @@
 /*\r
- * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
  * Description: EmptyView\r
  * Create: 2025-04-24\r
  */\r
index 39e3b92..5f1224d 100644 (file)
 #include "SlicePage.h"\r
 #include "diag_service.h"\r
 #include "ohos_timer.h"\r
-#include "findphone/FindPhoneModel.h"\r
-#include "findphone/FindPhonePresenter.h"\r
+#include "FindPhoneModel.h"\r
+#include "FindPhonePresenter.h"\r
 \r
-#define ALIPAY_BIND_SEARCH_IMAGE_NUM 28\r
 namespace OHOS {\r
-static int timeCount = 0;\r
-static constexpr uint64_t MS_ONE_SECONDS = 1000;\r
+static constexpr uint16_t FINDPHONE_IMAGE_COUNT = 28;\r
+\r
 class FindPhonePresenter;\r
 class FindPhoneModel;\r
 class FindPhoneMainPage : public SlicePage<FindPhonePresenter>,\r
@@ -45,8 +44,8 @@ public:
     bool OnClick(UIView &view, const ClickEvent &event) override;\r
     bool OnDrag(UIView& view, const DragEvent& event) override;\r
     bool ClickButtonChange();\r
-    void SetUpImageAnimator();\r
-    void SetupButton();\r
+    void InitImageAnimator();\r
+    void InitButton();\r
     void InitImageInfo();\r
     void ShowReset();\r
     void DisableFindPhoneTimer();\r
@@ -54,21 +53,17 @@ public:
     bool StopFindPhone();\r
     uint8_t GetConnectStatus();\r
     void ChangeToDisConnect();\r
+\r
 private:\r
     UIViewGroup* container_ = nullptr;\r
-    UILabel* labelUnder = nullptr;\r
-    UILabel* labelFindTitle = nullptr;\r
-    UIButton* buttonFind = nullptr;\r
-    UIButton* buttonRty = nullptr;\r
-    UILabel *labelRing = nullptr;\r
-    UIImageView *mainImage = nullptr;\r
-    ImageInfo* imageInfo1_ = nullptr;\r
-    ImageInfo* imageInfo2_ = nullptr;\r
-    ImageInfo* imageInfo3_ = nullptr;\r
-    ImageAnimatorInfo imageAnimatorImageInfo_[SET_THREE] = { 0 };\r
+    UILabel* labelDisconnect_ = nullptr;\r
+    UILabel* labelTitle_ = nullptr;\r
+    UIButton* buttonFind_ = nullptr;\r
+    UIButton* buttonRetry_ = nullptr;\r
+    UILabel *labelRing_ = nullptr;\r
     UIImageAnimatorView* imageAnimator_ = nullptr;\r
-    GraphicTimer *g_startCount = nullptr;\r
-    ImageAnimatorInfo searchImageInfo[ALIPAY_BIND_SEARCH_IMAGE_NUM];\r
+    GraphicTimer *startCount_ = nullptr;\r
+    ImageAnimatorInfo searchImageInfo_[FINDPHONE_IMAGE_COUNT];\r
 };\r
 }\r
-#endif // FINDPHONE_VIEW_H\r
+#endif // FINDPHONE_MAIN_PAGE_H\r
index 494c171..f093182 100644 (file)
 #include "graphic_timer.h"\r
 \r
 namespace OHOS {\r
-constexpr int16_t SET_ZERO = 0;\r
-constexpr int16_t SET_ONE = 1;\r
-constexpr int16_t SET_TWO = 2;\r
-constexpr int16_t SET_THREE = 3;\r
-constexpr int16_t SET_FOUR = 4;\r
-constexpr int16_t SET_FIVE = 5;\r
-constexpr int16_t SET_SIX = 6;\r
-constexpr int16_t SET_SEVEN = 7;\r
-constexpr int16_t SET_EIGHT = 8;\r
-constexpr int16_t SET_NINE = 9;\r
-constexpr int16_t SET_TEN = 10;\r
-constexpr int16_t SET_INT_MAX = 255;\r
-\r
 class FindPhoneModel {\r
 public:\r
     static FindPhoneModel &GetInstance(void);\r
@@ -35,7 +22,6 @@ private:
     FindPhoneModel(const FindPhoneModel &);\r
     FindPhoneModel &operator=(const FindPhoneModel &);\r
     virtual ~FindPhoneModel();\r
-    bool buttonStatus = 0;\r
 };\r
 }\r
 \r
index 6cb7de1..547b617 100644 (file)
@@ -11,7 +11,6 @@
 namespace OHOS {\r
 enum FIND_PHONE_PAGES {\r
     FIND_PHONE_MAIN_PAGE = 1,  // 0 is invalid\r
-    FIND_PHONE_MESSAGE_PAGE = 2,\r
 };\r
 \r
 class FindPhonePresenter;\r
index 46f4ef9..2dddf14 100644 (file)
@@ -11,7 +11,7 @@
 #include "components/ui_label_button_ext.h"\r
 #include "components/ui_scroll_view.h"\r
 #include "SlicePage.h"\r
-#include "flashlight/FlashLightPresenter.h"\r
+#include "FlashLightPresenter.h"\r
 #include "components/ui_picker.h"\r
 \r
 namespace OHOS {\r
@@ -19,7 +19,7 @@ class FlashLightBlinkPage : public SlicePage<FlashLightPresenter>,
     public UIView::OnClickListener,\r
     public UIView::OnDragListener {\r
 public:\r
-    FlashLightBlinkPage(){};\r
+    FlashLightBlinkPage();\r
     ~FlashLightBlinkPage();\r
     void OnStart(void* data) override;\r
     bool OnDrag(UIView& view, const DragEvent& event) override;\r
index acbe25c..3385159 100644 (file)
 #include "components/ui_label_button_ext.h"\r
 #include "components/ui_scroll_view.h"\r
 #include "SlicePage.h"\r
-#include "flashlight/FlashLightPresenter.h"\r
+#include "FlashLightPresenter.h"\r
 \r
 namespace OHOS {\r
 class FlashLightColorPage : public SlicePage<FlashLightPresenter>,\r
     public UIView::OnClickListener,\r
     public UIView::OnDragListener {\r
 public:\r
-    FlashLightColorPage(){};\r
+    FlashLightColorPage();\r
     ~FlashLightColorPage();\r
     void OnStart(void* data) override;\r
     bool OnDrag(UIView& view, const DragEvent& event) override;\r
@@ -32,15 +32,15 @@ private:
 \r
     UIScrollView *container_ = nullptr;\r
     UILabel *colorLabel_ = nullptr;\r
-    UILabelButtonExt *color1Button_ = nullptr;\r
-    UILabelButtonExt *color2Button_ = nullptr;\r
-    UILabelButtonExt *color3Button_ = nullptr;\r
-    UILabelButtonExt *color4Button_ = nullptr;\r
-    UILabelButtonExt *color5Button_ = nullptr;\r
-    UILabelButtonExt *color6Button_ = nullptr;\r
-    UILabelButtonExt *color7Button_ = nullptr;\r
-    UILabelButtonExt *color8Button_ = nullptr;\r
-    UILabelButtonExt *color9Button_ = nullptr;\r
+    UILabelButtonExt *colorWhiteButton_ = nullptr;\r
+    UILabelButtonExt *colorRedButton_ = nullptr;\r
+    UILabelButtonExt *colorOrangeButton_ = nullptr;\r
+    UILabelButtonExt *colorYellowButton_ = nullptr;\r
+    UILabelButtonExt *colorGreenButton_ = nullptr;\r
+    UILabelButtonExt *colorLightBlueButton_ = nullptr;\r
+    UILabelButtonExt *colorDarkBlueButton_ = nullptr;\r
+    UILabelButtonExt *colorPurpleButton_ = nullptr;\r
+    UILabelButtonExt *colorMultiButton_ = nullptr;\r
 };\r
 }  // namespace OHOS\r
 #endif /* FLASHLIGHT_COLOR_PAGE_H */\r
index adf42ce..a19e656 100644 (file)
@@ -13,8 +13,8 @@
 #include <sys/time.h>\r
 #include "AppViewIDs.h"\r
 #include "UiConfig.h"\r
-#include "flashlight/FlashLightPresenter.h"\r
-#include "flashlight/FlashlightUiResourceImage.h"\r
+#include "FlashLightPresenter.h"\r
+#include "ui_resource_flashlight.h"\r
 #ifndef _WIN32\r
 #include "time64.h"\r
 #endif\r
@@ -38,8 +38,8 @@ class FlashLightModel {
 public:\r
     static FlashLightModel &GetInstance(void);\r
     // 设置手电筒颜色;\r
-    FlashLightColorAttribute GetViewColor();\r
-    void SetViewColor(FlashLightColorAttribute color);\r
+    FlashLightColorAttribute GetViewColorId();\r
+    void SetViewColorId(FlashLightColorAttribute color);\r
     // 设置手电筒闪烁频率;\r
     FlashLightBlinkFrequency GetBlinkFrequency();\r
     void SetBlinkFrequency(FlashLightBlinkFrequency blinkFrequency);\r
index 629a2e8..0350136 100644 (file)
@@ -21,7 +21,7 @@
 #include "ChangeSliceListener.h"\r
 #include "UiConfig.h"\r
 #include "SlicePage.h"\r
-#include "flashlight/FlashLightPresenter.h"\r
+#include "FlashLightPresenter.h"\r
 #include "animator.h"\r
 \r
 namespace OHOS {\r
@@ -29,7 +29,7 @@ class FlashLightPage : public SlicePage<FlashLightPresenter>,
     public UIView::OnClickListener,\r
     public UIView::OnDragListener {\r
 public:\r
-    FlashLightPage(){};\r
+    FlashLightPage();\r
     ~FlashLightPage();\r
 \r
     void OnStart(void* data) override;\r
@@ -45,9 +45,9 @@ private:
     };\r
     TimeAnimatorCallback* timeCallback_ = nullptr;\r
     Animator* timeAnimator_ = nullptr;\r
-    UILabelButton* flashLightOn_ = nullptr;\r
+    UILabelButton* flashLightButtonOn_ = nullptr;\r
     UILabel* systemTime_ = nullptr;\r
-    UILabel* OnLabel_ = nullptr;\r
+    UILabel* tipsLabel_ = nullptr;\r
     UIImageView* imageArrow_ = nullptr;\r
     UIScrollView *container_ = nullptr;\r
 };\r
index b7fc365..b0bce0c 100644 (file)
 #include "components/ui_image_view.h"\r
 #include "components/ui_image_animator.h"\r
 #include "SlicePage.h"\r
-#include "flashlight/FlashLightPresenter.h"\r
-#include "flashlight/FlashLightModel.h"\r
+#include "FlashLightPresenter.h"\r
+#include "FlashLightModel.h"\r
 \r
 namespace OHOS {\r
+static constexpr uint8_t IMAGE_NUM = 2;\r
+\r
 class FlashLightPlayPage : public SlicePage<FlashLightPresenter>,\r
     public UIView::OnClickListener,\r
     public UIView::OnDragListener {\r
 public:\r
-    FlashLightPlayPage(){};\r
+    FlashLightPlayPage();\r
     ~FlashLightPlayPage();\r
     void OnStart(void* data) override;\r
     bool OnDrag(UIView& view, const DragEvent& event) override;\r
@@ -31,8 +33,8 @@ private:
     FlashLightPlayPage &operator=(FlashLightPlayPage &&) = delete;\r
 \r
     UIScrollView *container_ = nullptr;\r
-    UIImageAnimatorView *playImageAnimal = nullptr;\r
-    ImageAnimatorInfo playImageInfo[2];\r
+    UIImageAnimatorView *playImageAnimal_ = nullptr;\r
+    ImageAnimatorInfo playImageInfo_[IMAGE_NUM];\r
 };\r
 }  // namespace OHOS\r
 #endif /* FLASHLIGHT_PLAY_PAGE_H */\r
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/include/flashlight/FlashLightRecoverPage.h b/code/sdk/application/wearable/evb/nativeapp/nativeui/include/flashlight/FlashLightRecoverPage.h
new file mode 100644 (file)
index 0000000..62d6746
--- /dev/null
@@ -0,0 +1,39 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: FlashLightRecoverPage\r
+ * Create: 2025-04-24\r
+ */\r
+\r
+#ifndef FLASHLIGHT_RECOVER_PAGE_H\r
+#define FLASHLIGHT_RECOVER_PAGE_H\r
+#include "components/ui_view_group.h"\r
+#include "components/ui_label.h"\r
+#include "components/ui_label_button_ext.h"\r
+#include "components/ui_scroll_view.h"\r
+#include "SlicePage.h"\r
+#include "FlashLightPresenter.h"\r
+\r
+namespace OHOS {\r
+class FlashLightRecoverPage : public SlicePage<FlashLightPresenter>,\r
+    public UIView::OnClickListener,\r
+    public UIView::OnDragListener {\r
+public:\r
+    FlashLightRecoverPage();\r
+    ~FlashLightRecoverPage();\r
+    void OnStart(void* data) override;\r
+    bool OnDrag(UIView& view, const DragEvent& event) override;\r
+    bool OnClick(UIView& view, const ClickEvent& event) override;\r
+\r
+private:\r
+    FlashLightRecoverPage(const FlashLightRecoverPage &) = delete;\r
+    FlashLightRecoverPage &operator=(const FlashLightRecoverPage &) = delete;\r
+    FlashLightRecoverPage(FlashLightRecoverPage &&) = delete;\r
+    FlashLightRecoverPage &operator=(FlashLightRecoverPage &&) = delete;\r
+\r
+    UIScrollView *container_ = nullptr;\r
+    UILabel *recoverLabel_ = nullptr;\r
+    UILabelButtonExt *cancelButton_ = nullptr;\r
+    UILabelButtonExt *confirmButton_ = nullptr;\r
+};\r
+}  // namespace OHOS\r
+#endif /* FLASHLIGHT_RECOVER_PAGE_H */\r
index 1704f88..baf74a6 100644 (file)
@@ -13,7 +13,6 @@
 \r
 namespace OHOS {\r
 typedef struct {\r
-    uint8_t item;\r
     uint32_t resId;\r
     std::string label;\r
     std::string itemLabel;\r
@@ -25,14 +24,13 @@ public:
     FlashLightSetItemView();\r
     ~FlashLightSetItemView() override;\r
     virtual void SetItemInfo(const FlashLightSetItem itemInfo);\r
-    const char *GetViewId() const;\r
 \r
 private:\r
-    UIImageView sIcon;\r
-    UILabel sLabel;\r
-    UILabel itemLabel;\r
-    UIImageView sNextImage;\r
-    FlashLightSetItem sItemInfo = {0, 0, "", "", ""};\r
+    UIImageView sIcon_;\r
+    UILabel sLabel_;\r
+    UILabel itemLabel_;\r
+    UIImageView sNextImage_;\r
+    FlashLightSetItem itemInfo_ = {0, "", "", ""};\r
 };\r
 }\r
 #endif  // FLASHLIGHTSET_ITEM_VIEW_H
\ No newline at end of file
index d1f1b06..8c48bcd 100644 (file)
 #include "components/ui_label.h"\r
 #include "components/ui_label_button_ext.h"\r
 #include "components/ui_scroll_view.h"\r
-#include "components/ui_list.h"\r
+#include "components/ui_simple_list.h"\r
 #include "SlicePage.h"\r
-#include "flashlight/FlashLightPresenter.h"\r
-#include "flashlight/FlashLightSetItemAdapter.h"\r
-#include "flashlight/FlashLightSetItemView.h"\r
+#include "FlashLightPresenter.h"\r
+#include "FlashLightSetItemView.h"\r
 #include "UiConfig.h"\r
 #include "main/LoadImg.h"\r
-#include "flashlight/FlashlightUiResourceImage.h"\r
+#include "ui_resource_flashlight.h"\r
 \r
 namespace OHOS {\r
 class FlashLightSetPage : public SlicePage<FlashLightPresenter>,\r
     public UIView::OnClickListener,\r
     public UIView::OnDragListener {\r
 public:\r
-    FlashLightSetPage(){};\r
+    FlashLightSetPage();\r
     ~FlashLightSetPage();\r
     void OnStart(void* data) override;\r
     bool OnDrag(UIView& view, const DragEvent& event) override;\r
@@ -37,13 +36,9 @@ private:
     FlashLightSetPage &operator=(FlashLightSetPage &&) = delete;\r
 \r
     UIScrollView *container_ = nullptr;\r
-    UILabel *setLabel_ = nullptr;\r
+    UILabel *titleLabel_ = nullptr;\r
     UILabelButtonExt *recoverButton_ = nullptr;\r
-\r
-    UIList* setItemList_ = nullptr;\r
-    FlashLightSetItemAdapter *setItemAdapter_ = nullptr;\r
-    FlashLightSetItem colorItem_ = {1, IMAGE_CONVERTER_TOOL_COLORITEM, "灯光颜色"};\r
-    FlashLightSetItem blinkItem_ = {2, IMAGE_CONVERTER_TOOL_BLINKITEM, "闪烁频率"};\r
+    UISimpleList* setItemList_ = nullptr;\r
 };\r
 }  // namespace OHOS\r
 #endif /* FLASHLIGHT_SET_PAGE_H */\r
index 463a94e..c3e1783 100644 (file)
 namespace OHOS {\r
 \r
 enum FlashLightAllView {\r
-    FLASH_LIGTH_VIEW = 1,      // 手电筒主界面\r
+    FLASH_LIGHT_VIEW = 1,      // 手电筒主界面\r
     FLASH_LIGHT_PLAY_VIEW,     // 手电筒显示播放\r
     FLASH_LIGHT_SET_VIEW,      // 手电筒设置\r
     FLASH_LIGHT_COLOR_VIEW,    // 手电筒颜色\r
     FLASH_LIGHT_BLINK_VIEW,    // 手电筒闪烁\r
-    FLASH_LIGHT_DEFAULT_VIEW,  // 手电筒默认\r
+    FLASH_LIGHT_RECOVER_VIEW,  // 手电筒默认\r
     FLASH_LIGHT_ALL_VIEW,\r
 };\r
 \r
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/include/heartrate/HeartRateMainPage.h b/code/sdk/application/wearable/evb/nativeapp/nativeui/include/heartrate/HeartRateMainPage.h
new file mode 100644 (file)
index 0000000..08e23ab
--- /dev/null
@@ -0,0 +1,54 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: HeartRateMainPage\r
+ * Create: 2025-06\r
+ */\r
+\r
+#ifndef HEART_RATE_MAIN_PAGE_H\r
+#define HEART_RATE_MAIN_PAGE_H\r
+\r
+#include <sys/time.h>\r
+#include "components/root_view.h"\r
+#include "components/ui_view_group.h"\r
+#include "components/ui_scroll_view.h"\r
+#include "components/ui_digital_clock.h"\r
+#include "components/ui_label.h"\r
+#include "components/ui_image_animator.h"\r
+#include "components/ui_lite_surface_view.h"\r
+#include "layout/grid_layout.h"\r
+#include "ChangeSliceListener.h"\r
+#include "UiConfig.h"\r
+#include "ui_test.h"\r
+#include "View.h"\r
+#include "SlicePageFactory.h"\r
+#include "SlicePage.h"\r
+#include "video_play_wrapper.h"\r
+\r
+namespace OHOS {\r
+class HeartRatePresenter;\r
+class HeartRateMainPage : public SlicePage<HeartRatePresenter>,\r
+                            public UIView::OnClickListener,\r
+                            public UIView::OnDragListener {\r
+public:\r
+    HeartRateMainPage();\r
+    ~HeartRateMainPage() override;\r
+    void OnStart(void *data) override;\r
+    bool OnClick(UIView &view, const ClickEvent &event) override;\r
+    bool OnDrag(UIView &view, const DragEvent &event) override;\r
+    void OnResume() override;\r
+    void OnPause() override;\r
+    bool IsToday(const struct timeval &tv);\r
+    void SetTestTime();\r
+    void InitImageAnimator();\r
+\r
+private:\r
+    UIViewGroup *group_ = nullptr;\r
+    UILabelButton *button_ = nullptr;\r
+    UILabel *labelTitle_ = nullptr;\r
+    UILabel *labelPreTest_ = nullptr;\r
+    UILiteSurfaceView *surfaceView_ =  nullptr;\r
+    MediaVideoPlay *videoPlay_ = nullptr;\r
+    ColorType colorKey_;\r
+};\r
+}\r
+#endif // HEART_RATE_MAIN_PAGE_H
\ No newline at end of file
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/include/heartrate/HeartRateMeasurePage.h b/code/sdk/application/wearable/evb/nativeapp/nativeui/include/heartrate/HeartRateMeasurePage.h
new file mode 100644 (file)
index 0000000..a97835b
--- /dev/null
@@ -0,0 +1,77 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: HeartRateMeasurePage\r
+ * Create: 2025-06\r
+ */\r
+\r
+#ifndef HEART_RATE_MEASURE_PAGE_H\r
+#define HEART_RATE_MEASURE_PAGE_H\r
+\r
+#include <sys/time.h>\r
+#include "components/root_view.h"\r
+#include "components/ui_view_group.h"\r
+#include "components/ui_scroll_view.h"\r
+#include "components/ui_digital_clock.h"\r
+#include "components/ui_label.h"\r
+#include "components/ui_list.h"\r
+#include "components/ui_circle_progress.h"\r
+#include "components/ui_image_animator.h"\r
+#include "components/ui_lite_surface_view.h"\r
+#include "layout/grid_layout.h"\r
+#include "animator/animator.h"\r
+#include "ChangeSliceListener.h"\r
+#include "View.h"\r
+#include "ui_test.h"\r
+#include "SlicePageFactory.h"\r
+#include "SlicePage.h"\r
+#include "UiConfig.h"\r
+#include "video_play_wrapper.h"\r
+#include "HeartRateModel.h"\r
+#include "HeartRatePresenter.h"\r
+#include "HeartRateView.h"\r
+#include "HeartRateResultGroup.h"\r
+\r
+namespace OHOS {\r
+class HeartRatePresenter;\r
+class HeartRateMeasurePage : public SlicePage<HeartRatePresenter>,\r
+                        public UIView::OnClickListener,\r
+                        public UIView::OnDragListener {\r
+public:\r
+    HeartRateMeasurePage();\r
+    ~HeartRateMeasurePage() override;\r
+    void OnStart(void *data) override;\r
+    bool OnDrag(UIView &view, const DragEvent &event) override;\r
+    void InitAnimator();\r
+    void StopAnimator();\r
+    void InitVideoView();\r
+    void SetTimeAndResultText(std::string str);\r
+    void SetTestStatus(bool value);\r
+    void OnResume() override;\r
+    void OnPause() override;\r
+private:\r
+\r
+    // 心率线型图结果展示页面,通过setvisible进行显示隐藏操作\r
+    // 作用:线型图退出之后不会重新进入心率测量状态\r
+    HeartRateResultGroup *chartLineResultGroup_ = nullptr;\r
+    UIViewGroup *group_ = nullptr;\r
+    UILabel *labelTitle_ = nullptr;\r
+    UILabel *labelTimeOrResult_ = nullptr;\r
+    UILabel *labelTips_ = nullptr;\r
+    UILiteSurfaceView *surfaceView_ =  nullptr;\r
+    MediaVideoPlay *videoPlay_ = nullptr;\r
+    ColorType colorKey_;\r
+    struct timeval startTime_;\r
+    bool measureStatus_;\r
+    class HeartAnimatorCallback : public AnimatorCallback {\r
+    public:\r
+        explicit HeartAnimatorCallback(HeartRateMeasurePage *page) : page_(page) {}\r
+        ~HeartAnimatorCallback() override {}\r
+        void Callback(UIView *view) override;\r
+    private:\r
+        HeartRateMeasurePage *page_{nullptr};\r
+    };\r
+    Animator *animator_ = nullptr;\r
+    HeartAnimatorCallback *callBack_ = nullptr;\r
+};\r
+}\r
+#endif // HEART_RATE_MEASURE_PAGE_H
\ No newline at end of file
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/include/heartrate/HeartRateModel.h b/code/sdk/application/wearable/evb/nativeapp/nativeui/include/heartrate/HeartRateModel.h
new file mode 100644 (file)
index 0000000..6d8f6e5
--- /dev/null
@@ -0,0 +1,61 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: HeartRateModel\r
+ * Create: 2025-06\r
+ */\r
+\r
+#ifndef HREATE_RATE_ITEM_MODEL_H\r
+#define HREATE_RATE_ITEM_MODEL_H\r
+\r
+#include <string>\r
+#include <list>\r
+#include <sys/time.h>\r
+#include "graphic_timer.h"\r
+\r
+namespace OHOS {\r
+static constexpr uint16_t HEART_ALL_POINTS = 360;\r
+\r
+typedef struct {\r
+    uint16_t heartRate;\r
+    struct timeval time;\r
+} heartRateMeasurementInfo;\r
+\r
+typedef struct {\r
+    /** X coordinate */\r
+    uint16_t x;\r
+    /** Y coordinate */\r
+    uint16_t y;\r
+} HeartPoint;\r
+\r
+typedef struct {\r
+    uint16_t perSec;\r
+    uint16_t rest;\r
+    uint16_t minX;\r
+    uint16_t minValue;\r
+    uint16_t maxX;\r
+    uint16_t maxValue;\r
+    uint16_t index;\r
+    HeartPoint value[HEART_ALL_POINTS];\r
+} HeartDatas;\r
+\r
+class HeartRateModel {\r
+public:\r
+    static HeartRateModel &GetInstance(void);\r
+    void SetHeartRate(heartRateMeasurementInfo value)\r
+    {\r
+        heartRate = value;\r
+    };\r
+    heartRateMeasurementInfo GetHeartRate()\r
+    {\r
+        return heartRate;\r
+    };\r
+\r
+private:\r
+    HeartRateModel();\r
+    HeartRateModel(const HeartRateModel &);\r
+    HeartRateModel &operator=(const HeartRateModel &);\r
+    virtual ~HeartRateModel();\r
+    heartRateMeasurementInfo heartRate = {0, 0};\r
+};\r
+}\r
+#endif  // HREATE_RATE_ITEM_MODEL_H
\ No newline at end of file
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/include/heartrate/HeartRatePresenter.h b/code/sdk/application/wearable/evb/nativeapp/nativeui/include/heartrate/HeartRatePresenter.h
new file mode 100644 (file)
index 0000000..b989229
--- /dev/null
@@ -0,0 +1,20 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: HeartRatePresenter\r
+ * Create: 2025-06\r
+ */\r
+\r
+#ifndef HEART_RATE_PRESENTER_H\r
+#define HEART_RATE_PRESENTER_H\r
+\r
+#include "components/ui_view.h"\r
+#include "Presenter.h"\r
+\r
+namespace OHOS {\r
+class HeartRateView;\r
+class HeartRatePresenter : public Presenter<HeartRateView> {\r
+    HeartRatePresenter *GetInstance();\r
+};\r
+}\r
+\r
+#endif  // HEART_RATE_PRESENTER_H
\ No newline at end of file
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/include/heartrate/HeartRateReadyPage.h b/code/sdk/application/wearable/evb/nativeapp/nativeui/include/heartrate/HeartRateReadyPage.h
new file mode 100644 (file)
index 0000000..d613057
--- /dev/null
@@ -0,0 +1,69 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: HeartRateReadyPage\r
+ * Create: 2025-06\r
+ */\r
+\r
+#ifndef HEART_RATE_READY_PAGE_H\r
+#define HEART_RATE_READY_PAGE_H\r
+\r
+#include <sys/time.h>\r
+#include "components/root_view.h"\r
+#include "components/ui_view_group.h"\r
+#include "components/ui_scroll_view.h"\r
+#include "components/ui_digital_clock.h"\r
+#include "components/ui_label.h"\r
+#include "components/ui_list.h"\r
+#include "components/ui_circle_progress.h"\r
+#include "components/ui_image_animator.h"\r
+#include "components/ui_label_button.h"\r
+#include "layout/grid_layout.h"\r
+#include "animator/animator.h"\r
+#include "ChangeSliceListener.h"\r
+#include "View.h"\r
+#include "ui_test.h"\r
+#include "SlicePageFactory.h"\r
+#include "SlicePage.h"\r
+#include "UiConfig.h"\r
+#include "HeartRateModel.h"\r
+#include "HeartRatePresenter.h"\r
+#include "HeartRateView.h"\r
+\r
+namespace OHOS {\r
+class HeartRatePresenter;\r
+class HeartRateReadyPage : public SlicePage<HeartRatePresenter>,\r
+                        public UIView::OnClickListener,\r
+                        public UIView::OnDragListener {\r
+public:\r
+    HeartRateReadyPage();\r
+    ~HeartRateReadyPage() override;\r
+    void OnStart(void *data) override;\r
+    bool OnClick(UIView &view, const ClickEvent &event) override;\r
+    bool OnDrag(UIView &view, const DragEvent &event) override;\r
+    void InitAnimator();\r
+    void SetLabelProgressTime(int value);\r
+    void StopAnimator();\r
+    int InitCircleProgress();\r
+    void InitImageAnimator();\r
+\r
+private:\r
+    UILabel *labelTips_ = nullptr;\r
+    UIViewGroup *group_ = nullptr;\r
+    UILabelButton *button_ = nullptr;\r
+    UICircleProgress *timeProgress_ = nullptr;\r
+    UILabel *labelProgressTime_ = nullptr;\r
+    struct timeval startTime_;\r
+    class HeartAnimatorCallback : public AnimatorCallback {\r
+    public:\r
+        explicit HeartAnimatorCallback(HeartRateReadyPage *page) : page_(page) {}\r
+        ~HeartAnimatorCallback() override {}\r
+        void Callback(UIView *view) override;\r
+\r
+    private:\r
+        HeartRateReadyPage *page_{nullptr};\r
+    };\r
+    Animator *animator_ = nullptr;\r
+    HeartAnimatorCallback *callBack_ = nullptr;\r
+};\r
+}\r
+#endif // HEART_RATE_READY_PAGE_H\r
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/include/heartrate/HeartRateResultGroup.h b/code/sdk/application/wearable/evb/nativeapp/nativeui/include/heartrate/HeartRateResultGroup.h
new file mode 100644 (file)
index 0000000..8ef9096
--- /dev/null
@@ -0,0 +1,58 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: HeartRateResultGroup\r
+ * Create: 2025-06\r
+ */\r
+\r
+#ifndef HEARTRATE_RESULT_GROUP_H\r
+#define HEARTRATE_RESULT_GROUP_H\r
+\r
+#include <sys/time.h>\r
+#include "components/ui_scroll_view.h"\r
+#include "components/ui_image_view.h"\r
+#include "components/ui_swipe_view.h"\r
+#include "components/ui_label.h"\r
+#include "components/ui_chart.h"\r
+#include "components/ui_label_button.h"\r
+#include "components/ui_image_animator.h"\r
+#include "HeartRatePresenter.h"\r
+#include "SlicePage.h"\r
+#include "UiConfig.h"\r
+#include "HeartRateView.h"\r
+\r
+namespace OHOS {\r
+static constexpr uint16_t HEARTRATE_ANIMATOR_IMAGE_NUM = 30;\r
+static constexpr uint16_t HEARTRATE_ANIMATOR_IMAGE_UPDATE = 70;\r
+class HeartRatePresenter;\r
+class HeartRateResultGroup : public UIViewGroup {\r
+public:\r
+    HeartRateResultGroup();\r
+    ~HeartRateResultGroup() override;\r
+    void InitPage();\r
+    void InitImageAnimator();\r
+    UILabel *labelHeartRateValue_ = nullptr;\r
+private:\r
+    UIImageAnimatorView *imageAnimator_ = nullptr;\r
+    UILabel *labelTitle_ = nullptr;\r
+    UIChartPolyline *chartPolyline_ = nullptr;\r
+    UILabel *labelLastMeasureTime_ = nullptr;\r
+    UILabel *labelUnitText_ = nullptr;\r
+    UIChartDataSerial *dataSerial_{nullptr};\r
+    UIImageView *imageRedArrow_ = nullptr;\r
+    UILabel *labelMaxValue_ = nullptr;\r
+    UIImageView *imageBlackArrow_ = nullptr;\r
+    UILabel *labelMinValue_ = nullptr;\r
+    // X轴坐标三个点位\r
+    UILabel *labelXAxisPointOne_ = nullptr;\r
+    UILabel *labelXAxisPointTwo_ = nullptr;\r
+    UILabel *labelXAxisPointThree_ = nullptr;\r
+    // Y轴坐标四个点位\r
+    UILabel *labelYAxisPointOne_ = nullptr;\r
+    UILabel *labelYAxisPointTwo_ = nullptr;\r
+    UILabel *labelYAxisPointThree_ = nullptr;\r
+    UILabel *labelYAxisPointFour_ = nullptr;\r
+    UIImageView *mainImg_ = nullptr;\r
+    ImageAnimatorInfo imageAnimatorImageInfo_[HEARTRATE_ANIMATOR_IMAGE_NUM];\r
+};\r
+}\r
+#endif // HEARTRATE_RESULT_GROUP_H\r
index 152b812..3a125f8 100644 (file)
 /*\r
- * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved.\r
- * Description: heartRate view\r
- * Author:\r
- * Create: 2021-07-26\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: HeartRateView\r
+ * Create: 2025-06\r
  */\r
 \r
-#ifndef HEART_RATE_VIEW_H\r
-#define HEART_RATE_VIEW_H\r
+#ifndef HEART_RATE_ITEM_VIEW_H\r
+#define HEART_RATE_ITEM_VIEW_H\r
 \r
 #include "View.h"\r
-#include "components/ui_image_animator.h"\r
-#include "components/ui_chart.h"\r
-#include "wearable_log.h"\r
-#include "ohos_types.h"\r
-#include "components/ui_card_page.h"\r
-#include "heartrate/HeartModel.h"\r
 \r
 namespace OHOS {\r
-#define HEART_AVE_NUM 360\r
-#define HEART_RATE_LIMIT_UPPER 200\r
-#define HEART_RATE_LIMIT_LOWER 0\r
-#define INVALID_HEART_VALUE ((int16)0xFFFF)\r
-\r
-#define NUM_1 1\r
-#define NUM_2 2\r
-#define NUM_3 3\r
-#define NUM_4 4\r
-#define NUM_5 5\r
-#define NUM_7 7\r
-#define NUM_16 16\r
-#define NUM_99 99\r
-\r
-class HeartRateView : public UICardPage {\r
-public:\r
-    HeartRateView();\r
-    ~HeartRateView() override;\r
-    static HeartRateView *GetInstance(void);\r
-\r
-    bool InitView(void);\r
-    void PreLoad(void) override;\r
-    void UnLoad(void) override;\r
-    int32_t SetHeartRateData(Point *rateData, uint32 rateDataSize); // 设置心率数据,用于画心率曲线\r
-    void RefreshElectrocardiogram(void); // 刷新心率曲线\r
-    void ClearElectrocardiogram(void); // 清空心率曲线\r
-    void RefreshHeartRatePerSec(uint16_t value); // 刷新每秒心率\r
-    void RefreshHeartRateMax(uint16_t max); // 刷新心率最大值\r
-    void RefreshHeartRateMin(uint16_t min); // 刷新心率最小值\r
-    void RefreshRestHeartRate(uint16_t value); // 刷新静息心率\r
-    void HeartbeatImageAnimatorStart(void); // 心形动画启动\r
-    void HeartbeatImageAnimatorStop(void); // 心形动画停止\r
-    void InitRefreshInterface(void);\r
-\r
-private:\r
-    typedef struct {\r
-        uint8_t fontSize;\r
-        int16 x;\r
-        int16 y;\r
-        int16 width;\r
-        int16 height;\r
-    } LabelInfo;\r
-\r
-    int32_t InitHeartRateData(void);\r
-    void SetLabel(UILabel *label, LabelInfo labelInfo);\r
-    void HeartRateLabelDisplay(void);\r
-    void HeartRateCoordinate(void);\r
-    void HeartRateElectrocardiogram(void);\r
-    void InsertTopAndBottomRateImage(void);\r
-    void UpdataTopAndBottomRate(void);\r
-    void ElectrocardiogramOnePoint(Point *rateData, uint16_t index);\r
-    void ElectrocardiogramMultiPoint(Point *rateData, uint16_t rateDataNume);\r
-    int32_t HeartRateDataProc(void);\r
-    void HeartbeatImageAnimator(void);\r
-\r
-private:\r
-    Point heartRateData[HEART_AVE_NUM];\r
-    Point rateDataTmp[HEART_AVE_NUM];\r
-\r
-    bool viewiInitStatus{false};\r
-    bool resLoadStatus{false};\r
-    UIChartPolyline *chart{nullptr};\r
-    uint16_t dataNume; // 心率曲线记录数据总个数\r
-    uint16_t currIndex; // 当前已显示心率曲线心率个数\r
-    UIChartDataSerial *dataSerial[HEART_AVE_NUM]{nullptr};\r
-    UIChartDataSerial *dataTopAndbottom{nullptr};\r
-    UIImageView *imageViewTop{nullptr};\r
-    UIImageView *imageViewBottom{nullptr};\r
-    uint16_t serialIndex;\r
-    UIImageAnimatorView *imageAnimator{nullptr};\r
-    UIImageView *imageViewCoordinate{nullptr};\r
-\r
-    UILabel *topRate{nullptr};\r
-    UILabel *bottomRate{nullptr};\r
-    UILabel *ratePerSec{nullptr};\r
-    UILabel *ratePerSecText{nullptr};\r
-    UILabel *restRate{nullptr};\r
-    UILabel *restRateText1{nullptr};\r
-    UILabel *restRateText2{nullptr};\r
-\r
-    uint16_t maxRate;\r
-    uint16_t minRate;\r
+enum HeartRateAllView {\r
+    HEARTRATE_MAIN_PAGE = 1,  // 0 is invalid\r
+    HEARTRATE_READY_PAGE = 2,\r
+    HEARTRATE_MEASUREMENT_PAGE = 3,\r
 };\r
-} // namespace OHOS\r
-#endif // HEART_RATE_VIEW_H\r
+\r
+class HeartRatePresenter;\r
+class HeartRateView : public View<HeartRatePresenter> {};\r
+}\r
+#endif  // HEART_RATE_ITEM_VIEW_H\r
index 08529bd..2f9be05 100644 (file)
@@ -1,28 +1,28 @@
-/*
- * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved.
- * Description: APPVEIW
- * Author:
- * Create: 2021-10-15
- */
-
-#ifndef APP_GROUP_VIEW_H
-#define APP_GROUP_VIEW_H
-
-#include <string>
-#include "View.h"
-#include "components/ui_card_page.h"
-#include "common/screen.h"
-
-namespace OHOS {
-class AppGroupView : public UICardPage {
-public:
-    AppGroupView()
-    {
-        SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);
-    }
-    ~AppGroupView() override {}
-    virtual bool InitView(void *caller)=0;
-    bool initViewStatus{false};
-};
-} // namespace OHOS
-#endif // APP_GROUP_VIEW_H
+/*\r
+ * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved.\r
+ * Description: APPVEIW\r
+ * Author:\r
+ * Create: 2021-10-15\r
+ */\r
+\r
+#ifndef APP_GROUP_VIEW_H\r
+#define APP_GROUP_VIEW_H\r
+\r
+#include <string>\r
+#include "View.h"\r
+#include "components/ui_card_page.h"\r
+#include "common/screen.h"\r
+\r
+namespace OHOS {\r
+class AppGroupView : public UICardPage {\r
+public:\r
+    AppGroupView()\r
+    {\r
+        SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);\r
+    }\r
+    ~AppGroupView() override {}\r
+    virtual bool InitView(void *caller)=0;\r
+    bool initViewStatus{false};\r
+};\r
+} // namespace OHOS\r
+#endif // APP_GROUP_VIEW_H\r
index d49b354..07e92ba 100644 (file)
-/*
- * Copyright (c) CompanyNameMagicTag 2024-2024. All rights reserved.
- * Description: DialBinTypesV2
- * Author:
- * Create: 2024-10-30
- */
-
-#ifndef GRAPHIC_LITE_DIAL_BIN_TYPE_V2_H
-#define GRAPHIC_LITE_DIAL_BIN_TYPE_V2_H
-#include "main/DialBinTypes.h"
-
-namespace OHOS {
-enum class DisplayState {
-    NORMAL,
-    AOD,
-};
-static constexpr uint8_t DIAL_DISPLAY_CAPABILITY_NORMAL_ONLY = 0;
-static constexpr uint8_t DIAL_DISPLAY_CAPABILITY_AMBITIENT_ONLY = 1;
-static constexpr uint8_t DIAL_DISPLAY_CAPABILITY_AMBITIENT_NORMAL = 2;
-
-struct DialHeader_V2 {
-    char dialName[DIAL_NAME_MAX_LEN];
-    int16_t width;
-    int16_t height;
-    char version[DIAL_VERSION_MAX_LEN];
-    uint16_t previewImgId;
-    char description[DIAL_DESCRIPTION_MAX_LEN];
-    uint32_t imageOffset;
-    uint8_t freq;
-    uint8_t dialViewCount;
-    uint8_t displayCapabiliy;
-    uint8_t ambientFreq;
-};
-
-struct DialStaticImg_V2 {
-    Point pos;
-    Point center;
-    float rotate;
-    uint16_t imgId;
-    uint8_t displayMode;
-};
-
-struct DialSequenceImg_V2 {
-    Point pos;
-    uint16_t interval;
-    bool repeat;
-    uint8_t imgNum;
-    uint8_t displayMode;
-};
-
-struct DialRotateImg_V2 {
-    Point pos;
-    Point center;
-    int16_t rotateStart;
-    int16_t rotateEnd;
-    uint16_t imgId;
-    int16_t bindData;
-    bool isPeriod;
-    uint8_t displayMode;
-    bool isAmbientPeriodic;
-};
-
-struct DialOptionImg_V2 {
-    Point pos;
-    int16_t bindData;
-    bool isPeriod;
-    uint8_t count;
-    uint8_t displayMode;
-    bool isAmbientPeriodic;
-};
-
-struct DialDigitalImg_V2 {
-    uint8_t alignType : 4;
-    uint8_t integerLength : 4;
-    uint8_t decimalPrecision;
-    uint16_t imgIds[DIAL_DIGITALIMG_IMG_MAX_NUM];
-    int16_t signImgId;
-    int16_t decimalPointImgId;
-    uint16_t space;
-    Point alignPosition;
-    int16_t bindData;
-    bool isPeriod;
-    uint8_t displayMode;
-    bool isAmbientPeriodic;
-};
-
-struct DialLabel_V2 {
-    uint8_t breakMode;
-    uint8_t align;
-    uint8_t fontSize;
-    bool isPeriod;
-    DialRect rect;
-    uint32_t color;
-    char fontName[64];
-    char text[64];
-    int16_t bindData;
-    uint8_t displayMode;
-    bool isAmbientPeriodic;
-};
-
-struct DialArcLabel_V2 {
-    uint8_t align;
-    uint8_t fontSize;
-    Point center;
-    int16_t radius;
-    int16_t rotateStart;
-    int16_t rotateEnd;
-    uint32_t color;
-    char fontName[64];
-    char text[64];
-    int16_t bindData;
-    bool isPeriod;
-    uint8_t displayMode;
-    bool isAmbientPeriodic;
-};
-
-struct DialBoxProgress_V2 {
-    uint8_t cap;
-    uint8_t direction;
-    bool isPeriod;
-    int16_t bindData;
-    uint32_t bgColor;
-    DialProgressType typeData;
-    uint8_t displayMode;
-    bool isAmbientPeriodic;
-};
-
-struct DialArcProgress_V2 {
-    uint8_t cap;
-    bool isPeriod;
-    uint16_t radius;
-    uint16_t startAngle;
-    uint16_t endAngle;
-    uint16_t lineWidth;
-    int16_t bindData;
-    uint32_t bgColor;
-    DialProgressType typeData;
-    uint8_t displayMode;
-    bool isAmbientPeriodic;
-};
-
-struct DialVideo_V2 {
-    DialRect rect;
-    uint32_t offset;
-    Color32 colorKey;
-    uint32_t imgId;
-    uint8_t displayMode;
-};
-
-struct DialClick_V2 {
-    uint8_t type;
-    DialRect rect;
-    union {
-        uint32_t sliceId;
-        char bundleName[64];
-    };
-    uint8_t displayMode;
-};
-
-struct DialKaleidoscope_V2 {
-    uint16_t imgId;
-    float crownRotateStep;
-    float animatorRotateStep;
-    uint8_t displayMode;
-};
-} // namespace OHOS
-#endif // GRAPHIC_LITE_DIAL_BIN_TYPE_V2_H
+/*\r
+ * Copyright (c) CompanyNameMagicTag 2024-2024. All rights reserved.\r
+ * Description: DialBinTypesV2\r
+ * Author:\r
+ * Create: 2024-10-30\r
+ */\r
+\r
+#ifndef GRAPHIC_LITE_DIAL_BIN_TYPE_V2_H\r
+#define GRAPHIC_LITE_DIAL_BIN_TYPE_V2_H\r
+#include "main/DialBinTypes.h"\r
+\r
+namespace OHOS {\r
+enum class DisplayState {\r
+    NORMAL,\r
+    AOD,\r
+};\r
+static constexpr uint8_t DIAL_DISPLAY_CAPABILITY_NORMAL_ONLY = 0;\r
+static constexpr uint8_t DIAL_DISPLAY_CAPABILITY_AMBITIENT_ONLY = 1;\r
+static constexpr uint8_t DIAL_DISPLAY_CAPABILITY_AMBITIENT_NORMAL = 2;\r
+\r
+struct DialHeader_V2 {\r
+    char dialName[DIAL_NAME_MAX_LEN];\r
+    int16_t width;\r
+    int16_t height;\r
+    char version[DIAL_VERSION_MAX_LEN];\r
+    uint16_t previewImgId;\r
+    char description[DIAL_DESCRIPTION_MAX_LEN];\r
+    uint32_t imageOffset;\r
+    uint8_t freq;\r
+    uint8_t dialViewCount;\r
+    uint8_t displayCapabiliy;\r
+    uint8_t ambientFreq;\r
+};\r
+\r
+struct DialStaticImg_V2 {\r
+    Point pos;\r
+    Point center;\r
+    float rotate;\r
+    uint16_t imgId;\r
+    uint8_t displayMode;\r
+};\r
+\r
+struct DialSequenceImg_V2 {\r
+    Point pos;\r
+    uint16_t interval;\r
+    bool repeat;\r
+    uint8_t imgNum;\r
+    uint8_t displayMode;\r
+};\r
+\r
+struct DialRotateImg_V2 {\r
+    Point pos;\r
+    Point center;\r
+    int16_t rotateStart;\r
+    int16_t rotateEnd;\r
+    uint16_t imgId;\r
+    int16_t bindData;\r
+    bool isPeriod;\r
+    uint8_t displayMode;\r
+    bool isAmbientPeriodic;\r
+};\r
+\r
+struct DialOptionImg_V2 {\r
+    Point pos;\r
+    int16_t bindData;\r
+    bool isPeriod;\r
+    uint8_t count;\r
+    uint8_t displayMode;\r
+    bool isAmbientPeriodic;\r
+};\r
+\r
+struct DialDigitalImg_V2 {\r
+    uint8_t alignType : 4;\r
+    uint8_t integerLength : 4;\r
+    uint8_t decimalPrecision;\r
+    uint16_t imgIds[DIAL_DIGITALIMG_IMG_MAX_NUM];\r
+    int16_t signImgId;\r
+    int16_t decimalPointImgId;\r
+    uint16_t space;\r
+    Point alignPosition;\r
+    int16_t bindData;\r
+    bool isPeriod;\r
+    uint8_t displayMode;\r
+    bool isAmbientPeriodic;\r
+};\r
+\r
+struct DialLabel_V2 {\r
+    uint8_t breakMode;\r
+    uint8_t align;\r
+    uint8_t fontSize;\r
+    bool isPeriod;\r
+    DialRect rect;\r
+    uint32_t color;\r
+    char fontName[64];\r
+    char text[64];\r
+    int16_t bindData;\r
+    uint8_t displayMode;\r
+    bool isAmbientPeriodic;\r
+};\r
+\r
+struct DialArcLabel_V2 {\r
+    uint8_t align;\r
+    uint8_t fontSize;\r
+    Point center;\r
+    int16_t radius;\r
+    int16_t rotateStart;\r
+    int16_t rotateEnd;\r
+    uint32_t color;\r
+    char fontName[64];\r
+    char text[64];\r
+    int16_t bindData;\r
+    bool isPeriod;\r
+    uint8_t displayMode;\r
+    bool isAmbientPeriodic;\r
+};\r
+\r
+struct DialBoxProgress_V2 {\r
+    uint8_t cap;\r
+    uint8_t direction;\r
+    bool isPeriod;\r
+    int16_t bindData;\r
+    uint32_t bgColor;\r
+    DialProgressType typeData;\r
+    uint8_t displayMode;\r
+    bool isAmbientPeriodic;\r
+};\r
+\r
+struct DialArcProgress_V2 {\r
+    uint8_t cap;\r
+    bool isPeriod;\r
+    uint16_t radius;\r
+    uint16_t startAngle;\r
+    uint16_t endAngle;\r
+    uint16_t lineWidth;\r
+    int16_t bindData;\r
+    uint32_t bgColor;\r
+    DialProgressType typeData;\r
+    uint8_t displayMode;\r
+    bool isAmbientPeriodic;\r
+};\r
+\r
+struct DialVideo_V2 {\r
+    DialRect rect;\r
+    uint32_t offset;\r
+    Color32 colorKey;\r
+    uint32_t imgId;\r
+    uint8_t displayMode;\r
+};\r
+\r
+struct DialClick_V2 {\r
+    uint8_t type;\r
+    DialRect rect;\r
+    union {\r
+        uint32_t sliceId;\r
+        char bundleName[64];\r
+    };\r
+    uint8_t displayMode;\r
+};\r
+\r
+struct DialKaleidoscope_V2 {\r
+    uint16_t imgId;\r
+    float crownRotateStep;\r
+    float animatorRotateStep;\r
+    uint8_t displayMode;\r
+};\r
+} // namespace OHOS\r
+#endif // GRAPHIC_LITE_DIAL_BIN_TYPE_V2_H\r
index 9b60157..9b087ae 100644 (file)
@@ -18,7 +18,7 @@
 \r
 #include <cstdio>\r
 #include "gfx_utils/list.h"\r
-#include "main/UiServersMsg.h"\r
+#include "UiServersMsg.h"\r
 \r
 namespace OHOS {\r
 #define NUM_1 1\r
index b92e242..0804abc 100644 (file)
@@ -1,8 +1,9 @@
 /*\r
- * Copyright (c) CompanyNameMagicTag 2025-2025. All rights reserved.\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
  * Description: LoadImg\r
  * Create: 2025-06-05\r
  */\r
+\r
 #ifndef LOAD_IMG_H\r
 #define LOAD_IMG_H\r
 \r
@@ -18,6 +19,8 @@ namespace LOADIMG {
 void LoadBtnImage(UIButton *btn, std::string file, uint32_t resId1, uint32_t resId2);\r
 \r
 void LoadImageViewImg(UIImageView *view, std::string file, uint32_t resId);\r
+\r
+void LoadImageImg(Image *view, std::string file, uint32_t resId);\r
 }\r
 }\r
 #endif  // LOAD_IMG_H
\ No newline at end of file
index 4444361..6a1dd40 100644 (file)
@@ -1,87 +1,78 @@
-/*
- * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved.
- * Description: MainPresenterSample
- * Author:
- * Create:
- */
-
-#ifndef MAIN_PRESENTER_SAMPLE_H
-#define MAIN_PRESENTER_SAMPLE_H
-
-#include "Presenter.h"
-#include "main/ModelListenerSample.h"
-#include "components/root_view.h"
-#include "drag_event.h"
-#include "main/MainViewSample.h"
-#include "main/MainModel.h"
-#include "components/ui_swipe_view.h"
-#include "components/ui_view.h"
-#include "compass/MainCompassView.h"
-#include "compass/MainCompassPresenter.h"
-#include "player/PlayersView.h"
-#include "heartrate/HeartRateView.h"
-#include "swipe_effect/zoom_effect.h"
-
-namespace OHOS {
-static constexpr const char *MAIN_CLICK_WEATHER = "mainclickweather";
-static constexpr const char *MAIN_CLICK_ACTIVITY = "mainclickactivity";
-static constexpr const char *MAIN_CLICK_MESSAGE = "mainclickmessage";
-static constexpr const char *MAIN_CLICK_HEARTRATE = "mainclickheartrate";
-
-static constexpr const char *DROPDOWN_CLICK_DONOTDISTURB = "dropdownclickdonotdisturb";
-static constexpr const char *DROPDOWN_CLICK_BRIGHTENSCREEN = "dropdownclickbrightscreen";
-static constexpr const char *DROPDOWN_CLICK_FINDMYPHONE = "dropdownclickfindmyphone";
-static constexpr const char *DROPDOWN_CLICK_ALARM = "dropdownclickalarm";
-static constexpr const char *DROPDOWN_CLICK_SETTING = "dropdownclicksetting";
-constexpr uint16_t VERTICAL_STATUS = 1;
-constexpr uint16_t HORIZONTAL_STATUS = 0;
-enum class MainPresenterState {
-    START,
-    RESUME,
-    PAUSE,
-    STOP,
-};
-
-class MainViewSample;
-class MainPresenterSample : public Presenter<MainViewSample>, public ModelListenerSample,
-                            public UIView::OnClickListener, public UISwipeView::OnSwipeListener,
-                            public UIView::OnLongPressListener, public UISwipeView {
-public:
-    MainPresenterSample();
-    ~MainPresenterSample() override;
-    static MainPresenterSample *GetInstance(void);
-
-    void OnStart() override;
-    void OnPause() override;
-    void OnResume() override;
-    void OnStop() override;
-    void Notify() override;
-    bool OnClick(UIView& view, const ClickEvent& event) override;
-    bool OnLongPress(UIView& view, const LongPressEvent& event) override;
-    void OnSwipe(UISwipeView& view) override;
-    void SetPage(int8_t id, bool loadAdjacent = true);
-    void SetTaskPeroid(CardId cardId);
-
-    void InitCardSettings(void);
-    uint8_t GetCardSettingCount(void);
-    CardId *GetCardSettings(void);
-    void InitDialSettings(void);
-    DialSetting& GetDialSetting();
-    bool IsFromSetCardView(void) const;
-    void SetFromSetCardView(bool isFrom);
-    uint8_t GetFromCardId(void);
-    MainPresenterState GetMainPresenterState();
-
-private:
-    void ProcessDataNotify(void);
-    void SetCircleProgress(void);
-    uint8_t state_ = UICheckBox::UICheckBoxState::MAX_STATUS_NUM;
-    int64_t playerCurrentTime_{0};
-    int64_t playerMusicDuration_{0};
-    int64_t playerProgressValue_{0};
-    bool isCompassSensorOpened_{false};
-    MainPresenterState mainPresenterState_ = MainPresenterState::STOP;
-};
-}
-
-#endif // MAIN_PRESENTER_H
+/*\r
+ * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved.\r
+ * Description: MainPresenterSample\r
+ * Author:\r
+ * Create:\r
+ */\r
+\r
+#ifndef MAIN_PRESENTER_SAMPLE_H\r
+#define MAIN_PRESENTER_SAMPLE_H\r
+\r
+#include "Presenter.h"\r
+#include "components/root_view.h"\r
+#include "drag_event.h"\r
+#include "main/MainViewSample.h"\r
+#include "main/MainModel.h"\r
+#include "components/ui_swipe_view.h"\r
+#include "components/ui_view.h"\r
+#include "compass/MainCompassView.h"\r
+#include "compass/MainCompassPresenter.h"\r
+#include "player/PlayersView.h"\r
+#include "common/task.h"\r
+\r
+namespace OHOS {\r
+static constexpr const char *MAIN_CLICK_WEATHER = "mainclickweather";\r
+static constexpr const char *MAIN_CLICK_ACTIVITY = "mainclickactivity";\r
+static constexpr const char *MAIN_CLICK_MESSAGE = "mainclickmessage";\r
+\r
+static constexpr const char *DROPDOWN_CLICK_DONOTDISTURB = "dropdownclickdonotdisturb";\r
+static constexpr const char *DROPDOWN_CLICK_BRIGHTENSCREEN = "dropdownclickbrightscreen";\r
+static constexpr const char *DROPDOWN_CLICK_FINDMYPHONE = "dropdownclickfindmyphone";\r
+static constexpr const char *DROPDOWN_CLICK_ALARM = "dropdownclickalarm";\r
+static constexpr const char *DROPDOWN_CLICK_SETTING = "dropdownclicksetting";\r
+constexpr uint16_t VERTICAL_STATUS = 1;\r
+constexpr uint16_t HORIZONTAL_STATUS = 0;\r
+enum class MainPresenterState {\r
+    START,\r
+    RESUME,\r
+    PAUSE,\r
+    STOP,\r
+};\r
+\r
+class MainViewSample;\r
+class MainPresenterSample : public Presenter<MainViewSample>, public UIView::OnClickListener, public Task,\r
+    public UISwipeView::OnSwipeListener, public UIView::OnLongPressListener, public UISwipeView {\r
+public:\r
+    MainPresenterSample();\r
+    ~MainPresenterSample() override;\r
+    static MainPresenterSample *GetInstance(void);\r
+\r
+    void OnStart() override;\r
+    void OnPause() override;\r
+    void OnResume() override;\r
+    void OnStop() override;\r
+    bool OnClick(UIView& view, const ClickEvent& event) override;\r
+    bool OnLongPress(UIView& view, const LongPressEvent& event) override;\r
+    void OnSwipe(UISwipeView& view) override;\r
+    void SetPage(int8_t id, bool loadAdjacent = true);\r
+    void SetTaskPeroid(CardId cardId);\r
+    void InitCardSettings(void);\r
+    uint8_t GetCardSettingCount(void);\r
+    CardId *GetCardSettings(void);\r
+    void InitDialSettings(void);\r
+    DialSetting& GetDialSetting();\r
+    bool IsFromSetCardView(void) const;\r
+    void SetFromSetCardView(bool isFrom);\r
+    uint8_t GetFromCardId(void);\r
+    MainPresenterState GetMainPresenterState();\r
+\r
+private:\r
+    void ProcessDataNotify(void);\r
+    void Callback() override;\r
+    uint8_t state_ = UICheckBox::UICheckBoxState::MAX_STATUS_NUM;\r
+    bool isCompassSensorOpened_{false};\r
+    MainPresenterState mainPresenterState_ = MainPresenterState::STOP;\r
+};\r
+}\r
+\r
+#endif // MAIN_PRESENTER_H\r
index b1be728..eb0ae73 100644 (file)
-/*
- * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved.
- * Description: MainViewSample
- * Author:
- * Create:
- */
-
-#ifndef MAIN_VIEW_SAMPLE_H
-#define MAIN_VIEW_SAMPLE_H
-
-#include <string>
-#include "View.h"
-#include "components/root_view.h"
-#include "swipe_effect/zoom_effect.h"
-#include "ChangeSliceListener.h"
-#include "font/ui_font.h"
-#include "graphic_config.h"
-#include "main/ModelListenerSample.h"
-#include "screensetting/ScreenModels.h"
-#include "activity/ActivityWeekView.h"
-#include "compass/CompassControlView.h"
-#include "main/dial/DialViewGroup.h"
-#include "clock/MainClockView.h"
-#include "player/PlayersView.h"
-#include "main/MainPresenterSample.h"
-#include "heartrate/HeartRateView.h"
-#include "components/ui_card_page.h"
-#include "main/PullUpDownView.h"
-#include "components/ui_cross_view.h"
-#include "set_card/SetCardModel.h"
-#include "videocard/VideoCard.h"
-
-namespace OHOS {
-class MainPresenterSample;
-class MainViewSample : public View<MainPresenterSample> {
-public:
-    MainViewSample();
-    ~MainViewSample() override;
-    static MainViewSample *GetInstance(void);
-    void OnStart() override;
-    void OnStop() override;
-    UICardPage *InitWatchFacePage(void);
-    UICardPage *InitHeartRatePage(void);
-    UICardPage *InitActivityPage(void);
-    UICardPage *InitCompassPage(void);
-    UICardPage *InitMusicPlayerPage(void);
-    UICardPage *InitVideoCardPage1(void);
-    UICardPage *InitVideoCardPage2(void);
-    UICardPage *InitVideoCardPage3(void);
-    void AnimatorStart(int pageIndex);
-    void AnimatorStop(void);
-    CardId GetHorCurrentCard() const;
-    UIView* GetMainViewGroup(void) const
-    {
-        return mainSwipeGroup;
-    }
-
-    UICardPage* GetViewById(int16_t id) const
-    {
-        if (id >= MAX_CARD) {
-            return nullptr;
-        }
-        return recordCard[id];
-    }
-
-    void SwitchToClockPage(bool loadAdjacent = true)
-    {
-        if (mainClockView != nullptr) {
-            SetPage(mainClockView->GetViewIndex(), loadAdjacent);
-        }
-    }
-    void SwitchToCard(uint8_t cardId, bool loadAdjacent = true);
-    bool IsMainClockPage(void);
-    void SetPage(int16_t page, bool loadAdjacent = true);
-    void ReloadWatchFace();
-
-private:
-    PullUpDownView *dropDownView{nullptr};
-    UICardPage *messageView{nullptr};
-    UILabel *messageLable{nullptr};
-    UICardPage *mainClockView{nullptr};
-    ActivityWeekView *activityWeekView{nullptr};
-    PlayersView *playersView{nullptr};
-    CompassControlView *compassControlView{nullptr};
-    HeartRateView *heartRateView{nullptr};
-    UICardPage *recordCard[MAX_CARD]{nullptr};
-    bool pageStatus[MAX_CARD]{false};
-    UICrossView *mainSwipeGroup{nullptr};
-    ZoomEffect* callback{nullptr};
-    VideoCard *videoCard1{nullptr};
-    VideoCard *videoCard2{nullptr};
-    VideoCard *videoCard3{nullptr};
-
-    bool HorizontalViewInit(void);
-    void VerticalViewInit(void);
-    void VertViewLoad(void);
-    void HorViewLoad(void);
-    UICardPage *InitWatchOffDial(DialSetting &setting);
-    UICardPage *InitWatchDial(DialSetting &setting);
-    UICardPage *InitVideoCardPage(const std::string &video, const std::string &preview);
-};
-} // namespace OHOS
-#endif // MAIN_VIEW_SAMPLE_H
+/*\r
+ * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved.\r
+ * Description: MainViewSample\r
+ * Author:\r
+ * Create:\r
+ */\r
+\r
+#ifndef MAIN_VIEW_SAMPLE_H\r
+#define MAIN_VIEW_SAMPLE_H\r
+\r
+#include <string>\r
+#include "View.h"\r
+#include "components/root_view.h"\r
+#include "swipe_effect/zoom_effect.h"\r
+#include "ChangeSliceListener.h"\r
+#include "font/ui_font.h"\r
+#include "graphic_config.h"\r
+#include "screensetting/ScreenModels.h"\r
+#include "activity/ActivityWeekView.h"\r
+#include "compass/CompassControlView.h"\r
+#include "main/dial/DialViewGroup.h"\r
+#include "clock/MainClockView.h"\r
+#include "player/PlayersView.h"\r
+#include "main/MainPresenterSample.h"\r
+#include "components/ui_card_page.h"\r
+#include "main/PullUpDownView.h"\r
+#include "components/ui_cross_view.h"\r
+#include "settings/model/SettingCardModel.h"\r
+#include "settings/common/SettingCardEffectSample.h"\r
+#include "videocard/VideoCard.h"\r
+#include "main/MessageMainPage.h"\r
+\r
+namespace OHOS {\r
+class MainPresenterSample;\r
+class MainViewSample : public View<MainPresenterSample> {\r
+public:\r
+    MainViewSample();\r
+    ~MainViewSample() override;\r
+    static MainViewSample *GetInstance(void);\r
+    void OnStart() override;\r
+    void OnStop() override;\r
+    UICardPage *InitWatchFacePage(void);\r
+    UICardPage *InitActivityPage(void);\r
+    UICardPage *InitCompassPage(void);\r
+    UICardPage *InitMusicPlayerPage(void);\r
+    UICardPage *InitVideoCardPage1(void);\r
+    UICardPage *InitVideoCardPage2(void);\r
+    UICardPage *InitVideoCardPage3(void);\r
+    void AnimatorStart(int pageIndex);\r
+    void AnimatorStop(void);\r
+    CardId GetHorCurrentCard() const;\r
+    void GetVerCurrentCard() const;\r
+    UIView* GetMainViewGroup(void) const\r
+    {\r
+        return mainSwipeGroup;\r
+    }\r
+\r
+    UICardPage* GetViewById(int16_t id) const\r
+    {\r
+        if (id >= MAX_CARD) {\r
+            return nullptr;\r
+        }\r
+        return recordCard[id];\r
+    }\r
+\r
+    void SwitchToClockPage(bool loadAdjacent = true)\r
+    {\r
+        if (mainClockView != nullptr) {\r
+            SetPage(mainClockView->GetViewIndex(), loadAdjacent);\r
+        }\r
+    }\r
+    void SwitchToCard(uint8_t cardId, bool loadAdjacent = true);\r
+    bool IsMainClockPage(void);\r
+    void SetPage(int16_t page, bool loadAdjacent = true);\r
+    void ReloadWatchFace();\r
+\r
+private:\r
+    PullUpDownView *dropDownView{nullptr};\r
+    MessageMainPage *messageView{nullptr};\r
+    UICardPage *mainClockView{nullptr};\r
+    ActivityWeekView *activityWeekView{nullptr};\r
+    PlayersView *playersView{nullptr};\r
+    CompassControlView *compassControlView{nullptr};\r
+    UICardPage *recordCard[MAX_CARD]{nullptr};\r
+    bool pageStatus[MAX_CARD]{false};\r
+    UICrossView *mainSwipeGroup{nullptr};\r
+    CardSwipe* callback{nullptr};\r
+    VideoCard *videoCard1{nullptr};\r
+    VideoCard *videoCard2{nullptr};\r
+    VideoCard *videoCard3{nullptr};\r
+\r
+    bool HorizontalViewInit(void);\r
+    void VerticalViewInit(void);\r
+    void VertViewLoad(void);\r
+    void HorViewLoad(void);\r
+    UICardPage *InitWatchOffDial(DialSetting &setting);\r
+    UICardPage *InitWatchDial(DialSetting &setting);\r
+    UICardPage *InitVideoCardPage(const std::string &video, const std::string &preview);\r
+    bool SetCardEffect(CardEffectID style);\r
+};\r
+} // namespace OHOS\r
+#endif // MAIN_VIEW_SAMPLE_H\r
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/include/main/MessageDetailsGroup.h b/code/sdk/application/wearable/evb/nativeapp/nativeui/include/main/MessageDetailsGroup.h
new file mode 100644 (file)
index 0000000..006eda0
--- /dev/null
@@ -0,0 +1,35 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: MessageDetailsGroup\r
+ * Create: 2025-06-29\r
+ */\r
+\r
+#ifndef MESSAGE_DETAILS_GROUP_H\r
+#define MESSAGE_DETAILS_GROUP_H\r
+\r
+#include "graphic_types.h"\r
+#include "wearable_log.h"\r
+#include "components/ui_image_view.h"\r
+#include "components/ui_label.h"\r
+#include "components/ui_scroll_view.h"\r
+#include "ui_resource_message.h"\r
+#include "MessageModel.h"\r
+\r
+namespace OHOS {\r
+class DetailsGroup : public UIScrollView {\r
+public:\r
+    DetailsGroup();\r
+    ~DetailsGroup() override;\r
+    void InitDetailsPage();\r
+    void RefreshNotify();\r
+    MessageItem detailsMsg_;\r
+\r
+private:\r
+    UIImageView *detailsMsgIcon_{nullptr};\r
+    UILabel *detailsMsgTitle_{nullptr};\r
+    UILabel *detailsMsgContacts_{nullptr};\r
+    UILabel *detailsMsgContents_{nullptr};\r
+    UILabel *detailsMsgTime_{nullptr};\r
+};\r
+}\r
+#endif\r
index 73ec20a..743fc36 100644 (file)
@@ -1,11 +1,7 @@
 /*\r
- * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
- */\r
-/*\r
- * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved.\r
- * Description: weather/WeatherItemView.h\r
- * Author:\r
- * Create: 2021-11-23\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: MessageItemView\r
+ * Create: 2025-06-29\r
  */\r
 \r
 #ifndef MESSAGE_ITEM_VIEW_H\r
 #include "components/ui_view_group.h"\r
 #include "components/ui_image_view.h"\r
 #include "components/ui_canvas.h"\r
-\r
 #include "UiConfig.h"\r
 #include "main/MessageModel.h"\r
 \r
 namespace OHOS {\r
-class MessageItemView : public UIViewGroup {\r
+class MessageItemView : public UIViewGroup,\r
+                        public UIView::OnClickListener,\r
+                        public UIView::OnDragListener {\r
 public:\r
     explicit MessageItemView();\r
     ~MessageItemView() override;\r
     virtual void SetItemInfo(const MessageItem itemInfo);\r
-    virtual void SetUpChild();\r
+    bool OnDragStartEvent(const DragEvent& event) override;\r
+    bool OnDragEvent(const DragEvent& event) override;\r
+    bool OnDragEndEvent(const DragEvent& event) override;\r
+    bool OnClick(UIView &view, const ClickEvent &event) override;\r
+    void SetIndex(uint16_t index);\r
+    uint16_t GetIndex();\r
+    MessageItem GetItem();\r
+    void UpdateItemStatus();\r
+\r
+    int posX;\r
+    int x = 0;\r
 private:\r
-    UILabel sLabel_1;\r
-    UIImageView sIcon;\r
-    UILabel sLabel_2;\r
-    UILabel sLabel_3;\r
-    UIImageView sNextImage;\r
-    UILabel sback;\r
-    MessageItem sItemInfo = { nullptr, nullptr, nullptr, nullptr};\r
+    uint16_t itemIndex_;\r
+    UIViewGroup group_;\r
+    UILabel appName_;\r
+    UIImageView appIcon_;\r
+    UILabel appContact_;\r
+    UILabel appContents_;\r
+    UILabel msgTime_;\r
+    UIImageView bgImg_;\r
+    UIImageView deleteImg_;\r
+    MessageItem msgItemInfo_ = {"", "", "", "", 0, 0, false};\r
 };\r
 }\r
 \r
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/include/main/MessageMainPage.h b/code/sdk/application/wearable/evb/nativeapp/nativeui/include/main/MessageMainPage.h
new file mode 100644 (file)
index 0000000..7d0820d
--- /dev/null
@@ -0,0 +1,62 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: MessageMainPage\r
+ * Create: 2025-06-29\r
+ */\r
+\r
+#ifndef MESSAGE_MAIN_VIEW_H\r
+#define MESSAGE_MAIN_VIEW_H\r
+\r
+#include "graphic_types.h"\r
+#include "wearable_log.h"\r
+#include "components/ui_card_page.h"\r
+#include "components/ui_view_group.h"\r
+#include "components/ui_image_view.h"\r
+#include "components/ui_label.h"\r
+#include "components/ui_label_button.h"\r
+#include "components/ui_scroll_view.h"\r
+#include "components/ui_simple_list.h"\r
+#include "components/ui_list.h"\r
+#include "main/MessageDetailsGroup.h"\r
+#include "main/MessageModel.h"\r
+#include "MainModel.h"\r
+#include "main/MessageItemView.h"\r
+namespace OHOS {\r
+class MessageMainPage : public UICardPage,\r
+                        public UIView::OnClickListener,\r
+                        public UIView::OnDragListener {\r
+public:\r
+    MessageMainPage();\r
+    ~MessageMainPage() override;\r
+    bool OnClick(UIView &view, const ClickEvent &event) override;\r
+    bool OnDragStartEvent(const DragEvent& event) override;\r
+    bool OnDragEvent(const DragEvent& event) override;\r
+    bool OnDragEndEvent(const DragEvent& event) override;\r
+    static MessageMainPage *GetInstance(void);\r
+    bool InitView();\r
+    void PreLoad(void) override;\r
+    void VerticalViewInits(void);\r
+    void ConfirmDelete(void);\r
+    void CancelDelete(void);\r
+    void InitMsgList(void);\r
+    void DeleteView(void);\r
+    void NoNotify(void);\r
+    void NewNotify(void);\r
+    void RefreshMsgList(std::vector<MessageItem> &item);\r
+    bool InitScrollData();\r
+    void LoadDetailsView(void);\r
+    void DeleteDetailsView(void);\r
+    UISimpleList *msgList_{nullptr};\r
+private:\r
+    UILabel *noMsgLable_{nullptr};\r
+    UILabel *msgLable_{nullptr};\r
+    UIImageView *noMsgImage_{nullptr};\r
+    UIImageView *deleteImage_{nullptr};\r
+    UIScrollView *deleteGroup_{nullptr};\r
+    UILabel *deleteTips_{nullptr};\r
+    UIImageView *confirm_{nullptr};\r
+    UIImageView *cancel_{nullptr};\r
+    DetailsGroup *detailsGroup_{nullptr};\r
+};\r
+}\r
+#endif\r
index fd24ca3..2b13519 100644 (file)
@@ -1,8 +1,7 @@
 /*\r
- * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved.\r
- * Description: MainModel.h\r
- * Author:\r
- * Create: 2021-11-23\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: MessageModel\r
+ * Create: 2025-06-29\r
  */\r
 \r
 #ifndef MESSAGE_MODEL_H\r
 \r
 #include <string>\r
 #include <vector>\r
+#include <sys/time.h>\r
 #include "UiConfig.h"\r
 \r
 namespace OHOS {\r
 typedef struct {\r
-    std::string label_1;\r
-    std::string icon;\r
-    std::string label_2;\r
-    std::string label_3;\r
+    std::string appName;\r
+    std::string appContact;\r
+    std::string appContents;\r
+    std::string time;\r
+    uint16_t index;\r
+    long initialTime;\r
+    bool status;\r
 } MessageItem;\r
 \r
-    // static const uint16_t WEATHER_ITEM_COUNT = 10;\r
     class MessageModel {\r
     public:\r
         static MessageModel &GetInstance(void);\r
-        void InitMessageItem();\r
-        const std::vector<MessageItem> GetMessagelistItems() const;\r
+        void SaveMsgToModel(std::string app, std::string contact, std::string information);\r
+        void SetMsgListItems();\r
+        std::vector<MessageItem> &GetMsgListItems();\r
         void ClearListItem();\r
-        void GetMessageInfo(std::string app, std::string contact, std::string information);\r
         void SetViewStatus(bool viewStatus);\r
         bool GetViewStatus(void);\r
+        std::string UpdateTime(long time);\r
+        void SetTime(void);\r
+        void DeleteItem(MessageItem itemInfo);\r
+        void SetIndex(uint16_t itemIndex);\r
     private:\r
         MessageModel();\r
         MessageModel(const MessageModel &);\r
         MessageModel &operator=(const MessageModel &);\r
         virtual ~MessageModel();\r
-        std::vector<MessageItem> vecMsg;\r
-        MessageItem mes;\r
-        bool viewInitStatus{false};\r
+        std::vector<MessageItem> vecMsg_;\r
+        MessageItem mes_;\r
+        struct timeval currentTime_;\r
+        bool viewInitStatus_ = false;\r
+        bool indexAdd_ = true;\r
+        std::string durTime_;\r
+        uint16_t index_ = 0;\r
     };\r
 }\r
 \r
index 2e00170..695db8d 100644 (file)
@@ -1,56 +1,56 @@
-/*
- * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved.
- * Description: VolumeSettingView view
- * Create: 2021-09-5
- */
-
-#ifndef VOLUME_SETTING_PRESENTER_H
-#define VOLUME_SETTING_PRESENTER_H
-
-#include "components/ui_image_view.h"
-#include "components/ui_label_button.h"
-#include "components/ui_view_group.h"
-#include "components/ui_slider.h"
-#include "main/VolumeSettingView.h"
-#include "player/PlayersView.h"
-
-namespace OHOS {
-#define INCREASE_BUTTON "increaseButton"
-#define DECREASE_BUTTON "decreaseButton"
-#define VOLUME_PROGRESS "progress"
-#define VOLUME_VIEW "volumeview"
-
-typedef enum : uint16_t {
-    VOLUMEPHONE = 1,
-    VOLUMEPLAYERS = 3,
-    VOLUMEPHONENOTIFY = 4,
-} VolumeFactor;
-
-typedef enum : uint8_t {
-    VOLUMEDOWN = 0,
-    VOLUMEUP = 1,
-    VOLUMEDRAG = 2,
-} VolumeChangeStatus;
-
-class VolumeSettingView;
-class VolumeSliderEventListener : public UISlider::UISliderEventListener,
-                                  public UIView::OnClickListener,
-                                  public UIView::OnDragListener {
-public:
-    VolumeSliderEventListener(VolumeSettingView *volumeSetting);
-    ~VolumeSliderEventListener();
-    static VolumeSliderEventListener *GetInstance();
-    void OnChange(int32_t progress) override;
-    void OnRelease(int32_t progress) override;
-    void ChangeVolume(VolumeChangeStatus status);
-    bool OnClick(UIView& view, const ClickEvent& event) override;
-    bool OnDrag(UIView& view, const DragEvent& event) override;
-    void SetPlayerCoefficients(int16_t value);
-    void BtAndLocalVolumeSet(int16_t sounding);
-private:
-    int16_t preSound{0};
-    int16_t playerCoefficients{0};
-    VolumeSettingView *volumeSettingView{nullptr};
-};
-} // namespace OHOS
-#endif
+/*\r
+ * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved.\r
+ * Description: VolumeSettingView view\r
+ * Create: 2021-09-5\r
+ */\r
+\r
+#ifndef VOLUME_SETTING_PRESENTER_H\r
+#define VOLUME_SETTING_PRESENTER_H\r
+\r
+#include "components/ui_image_view.h"\r
+#include "components/ui_label_button.h"\r
+#include "components/ui_view_group.h"\r
+#include "components/ui_slider.h"\r
+#include "main/VolumeSettingView.h"\r
+#include "player/PlayersView.h"\r
+\r
+namespace OHOS {\r
+#define INCREASE_BUTTON "increaseButton"\r
+#define DECREASE_BUTTON "decreaseButton"\r
+#define VOLUME_PROGRESS "progress"\r
+#define VOLUME_VIEW "volumeview"\r
+\r
+typedef enum : uint16_t {\r
+    VOLUMEPHONE = 1,\r
+    VOLUMEPLAYERS = 3,\r
+    VOLUMEPHONENOTIFY = 4,\r
+} VolumeFactor;\r
+\r
+typedef enum : uint8_t {\r
+    VOLUMEDOWN = 0,\r
+    VOLUMEUP = 1,\r
+    VOLUMEDRAG = 2,\r
+} VolumeChangeStatus;\r
+\r
+class VolumeSettingView;\r
+class VolumeSliderEventListener : public UISlider::UISliderEventListener,\r
+                                  public UIView::OnClickListener,\r
+                                  public UIView::OnDragListener {\r
+public:\r
+    VolumeSliderEventListener(VolumeSettingView *volumeSetting);\r
+    ~VolumeSliderEventListener();\r
+    static VolumeSliderEventListener *GetInstance();\r
+    void OnChange(int32_t progress) override;\r
+    void OnRelease(int32_t progress) override;\r
+    void ChangeVolume(VolumeChangeStatus status);\r
+    bool OnClick(UIView& view, const ClickEvent& event) override;\r
+    bool OnDrag(UIView& view, const DragEvent& event) override;\r
+    void SetPlayerCoefficients(int16_t value);\r
+    void BtAndLocalVolumeSet(int16_t sounding);\r
+private:\r
+    int16_t preSound{0};\r
+    int16_t playerCoefficients{0};\r
+    VolumeSettingView *volumeSettingView{nullptr};\r
+};\r
+} // namespace OHOS\r
+#endif\r
index 8f16320..4bc17da 100644 (file)
@@ -143,6 +143,7 @@ enum class DialDataType : int16_t {
     // 结束:单个浮点数据,OH标准协议部分,禁止改动,到4095结束(包括4095)
 
     // 起始:单个浮点数据,私有可定制部分,从4096开始(包括4096,二进制格式为:0001,xxxx,xxxx,xxxx)
+    ARC_PROGRESS_TEST = 8189,     // arc progree test
     SWIVEL_GEAR_POSITIVE = 8190, // private data, clockwise
     SWIVEL_GEAR_NEGATIVE = 8191, // counterclockwise
     // 结束:单个浮点数据,私有可定制部分,到8191结束(包括8191)
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/include/main/dial/DialModelArcProgress.h b/code/sdk/application/wearable/evb/nativeapp/nativeui/include/main/dial/DialModelArcProgress.h
new file mode 100644 (file)
index 0000000..a1cb6af
--- /dev/null
@@ -0,0 +1,27 @@
+/*\r
+ * Copyright (c) CompanyNameMagicTag 2025. All rights reserved.\r
+ * Description: DialModelArcProgress\r
+ * Author: Hisi Graphic\r
+ * Create: 2025-08\r
+ */\r
+\r
+#ifndef DIAL_MODEL_ARC_PROGRESS_H\r
+#define DIAL_MODEL_ARC_PROGRESS_H\r
+\r
+#include "main/dial/DialBaseModel.h"\r
+\r
+namespace OHOS {\r
+class DialModelArcProgress : public DialBaseModel {\r
+public:\r
+    static DialModelArcProgress* GetInstance();\r
+    bool GetDialFloatData(DialDataType& type, float& out) override;\r
+private:\r
+    DialModelArcProgress() {}\r
+    ~DialModelArcProgress() override {}\r
+\r
+    DialModelArcProgress(const DialModelArcProgress &) = delete;\r
+    const DialModelArcProgress &operator=(const DialModelArcProgress &) = delete;\r
+    float data_ = 0.1; // 0.1: default heart value as reference\r
+};\r
+}\r
+#endif
\ No newline at end of file
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/include/monkey/MonkeyModel.h b/code/sdk/application/wearable/evb/nativeapp/nativeui/include/monkey/MonkeyModel.h
new file mode 100644 (file)
index 0000000..73e3d1c
--- /dev/null
@@ -0,0 +1,48 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: MonkeyModel\r
+ * Create: 2025-04-24\r
+ */\r
+#ifndef MONKEY_MODEL_H\r
+#define MONKEY_MODEL_H\r
+\r
+#include <iostream>\r
+#include <cstdint>\r
+#include <map>\r
+#include <vector>\r
+#include <string>\r
+#include <sys/time.h>\r
+#include "AppViewIDs.h"\r
+#include "UiConfig.h"\r
+#include "animator.h"\r
+\r
+namespace OHOS {\r
+typedef struct {\r
+    uint32_t sliceId;\r
+    uint32_t pageId;\r
+} SlicePageId;\r
+\r
+class MonkeyModel {\r
+public:\r
+    static MonkeyModel &GetInstance(void);\r
+    void SetStart(bool start);\r
+\r
+private:\r
+    MonkeyModel();\r
+    MonkeyModel(const MonkeyModel &);\r
+    MonkeyModel &operator=(const MonkeyModel &);\r
+    virtual ~MonkeyModel();\r
+    class TimeAnimatorCallback : public AnimatorCallback {\r
+    public:\r
+        TimeAnimatorCallback(uint32_t periol) : periol_(periol) {}\r
+        virtual ~TimeAnimatorCallback() override {}\r
+        void Callback(UIView* view) override;\r
+    private:\r
+        uint32_t periol_;\r
+    };\r
+    TimeAnimatorCallback* timeCallback_ = nullptr;\r
+    Animator* timeAnimator_ = nullptr;\r
+};\r
+}\r
+\r
+#endif  // MONKEY_MODEL_H
\ No newline at end of file
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/include/monkey/MonkeyPage.h b/code/sdk/application/wearable/evb/nativeapp/nativeui/include/monkey/MonkeyPage.h
new file mode 100644 (file)
index 0000000..65e97ec
--- /dev/null
@@ -0,0 +1,42 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: MonkeyPage\r
+ * Create: 2025-04-24\r
+ */\r
+#ifndef MONKEY_PAGE_H\r
+#define MONKEY_PAGE_H\r
+\r
+#include "components/ui_scroll_view.h"\r
+#include "components/ui_label.h"\r
+#include "components/ui_label_button_ext.h"\r
+#include "SlicePage.h"\r
+#include "MonkeyPresenter.h"\r
+\r
+namespace OHOS {\r
+enum MONKEY_PAGES {\r
+    MONKEY_MAIN_PAGE = 1, // 0 is invalid\r
+};\r
+\r
+class MonkeyPage : public SlicePage<MonkeyPresenter>,\r
+    public UIView::OnClickListener,\r
+    public UIView::OnDragListener {\r
+public:\r
+    MonkeyPage();\r
+    ~MonkeyPage();\r
+    void OnStart(void* data) override;\r
+    bool OnDrag(UIView& view, const DragEvent& event) override;\r
+    bool OnClick(UIView& view, const ClickEvent& event) override;\r
+\r
+private:\r
+    MonkeyPage(const MonkeyPage &) = delete;\r
+    MonkeyPage &operator=(const MonkeyPage &) = delete;\r
+    MonkeyPage(MonkeyPage &&) = delete;\r
+    MonkeyPage &operator=(MonkeyPage &&) = delete;\r
+\r
+    UIScrollView *container_ = nullptr;\r
+    UILabel* monkeyLabel_ = nullptr;\r
+    UILabelButtonExt* startMonkeyButton_ = nullptr;\r
+    UILabelButtonExt* endMonkeyButton_ = nullptr;\r
+};\r
+}  // namespace OHOS\r
+#endif /* MONKEY_PAGE_H */\r
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/include/monkey/MonkeyPresenter.h b/code/sdk/application/wearable/evb/nativeapp/nativeui/include/monkey/MonkeyPresenter.h
new file mode 100644 (file)
index 0000000..a49fe47
--- /dev/null
@@ -0,0 +1,16 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: MonkeyPresenter\r
+ * Create: 2025-04-24\r
+ */\r
+#ifndef MONKEY_PRESENTER_H\r
+#define MONKEY_PRESENTER_H\r
+\r
+#include "Presenter.h"\r
+\r
+namespace OHOS {\r
+class MonkeyView;\r
+class MonkeyPresenter : public Presenter<MonkeyView> {};\r
+}\r
+\r
+#endif  // MONKEY_PRESENTER_H
\ No newline at end of file
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/include/monkey/MonkeyView.h b/code/sdk/application/wearable/evb/nativeapp/nativeui/include/monkey/MonkeyView.h
new file mode 100644 (file)
index 0000000..9953243
--- /dev/null
@@ -0,0 +1,15 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: MonkeyView\r
+ * Create: 2025-04-24\r
+ */\r
+#ifndef MONKEY_VIEW_H\r
+#define MONKEY_VIEW_H\r
+\r
+#include "View.h"\r
+\r
+namespace OHOS {\r
+class MonkeyPresenter;\r
+class MonkeyView : public View<MonkeyPresenter> {};\r
+}\r
+#endif  // MONKEY_VIEW_H\r
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/include/phonemenu/PhoneMenuCallerLogItemView.h b/code/sdk/application/wearable/evb/nativeapp/nativeui/include/phonemenu/PhoneMenuCallerLogItemView.h
new file mode 100644 (file)
index 0000000..be0d54b
--- /dev/null
@@ -0,0 +1,31 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: PhoneMenuCallerLogItemView\r
+ * Create: 2025-07-12\r
+ */\r
+\r
+#ifndef PHONE_MENU_CALLER_LOG_ITEM_VIEW_H\r
+#define PHONE_MENU_CALLER_LOG_ITEM_VIEW_H\r
+\r
+#include "components/ui_label.h"\r
+#include "components/ui_view_group.h"\r
+#include "components/ui_image_view.h"\r
+#include "phoneservice/PhoneService.h"\r
+\r
+namespace OHOS {\r
+class PhoneMenuCallerLogItemView : public UIViewGroup {\r
+public:\r
+    PhoneMenuCallerLogItemView();\r
+    ~PhoneMenuCallerLogItemView() override;\r
+    void SetItemInfo(const CallLogInfo &itemInfo);\r
+    unsigned char *GetItemPhoneNumber();\r
+\r
+private:\r
+    UIViewGroup bg_;\r
+    UIImageView icon_;\r
+    UILabel phoneLabel_;\r
+    UILabel stutasLabel_;\r
+    unsigned char tel_[MAX_PHONE_NUM];\r
+};\r
+}\r
+#endif\r
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/include/phonemenu/PhoneMenuCallerLogModel.h b/code/sdk/application/wearable/evb/nativeapp/nativeui/include/phonemenu/PhoneMenuCallerLogModel.h
new file mode 100644 (file)
index 0000000..25efe03
--- /dev/null
@@ -0,0 +1,98 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: PhoneMenuCallerLogModel\r
+ * Create: 2025-07-12\r
+ */\r
+\r
+#ifndef PHONE_MENU_CALLER_LOG_MODEL_H\r
+#define PHONE_MENU_CALLER_LOG_MODEL_H\r
+\r
+#include "string"\r
+#include "AppViewIDs.h"\r
+#include "message.h"\r
+#include "msg_center.h"\r
+#include "phoneservice/PhoneService.h"\r
+#include "phonemenu/PhoneMenuSync.h"\r
+\r
+#ifdef __cplusplus\r
+extern "C" {\r
+#endif\r
+\r
+typedef enum { CHANGE_STATUS = 0, SCO_STATUS, ERROR_MESSAGE } MessageType;\r
+\r
+enum PhoneStatus { PHONE_MULTI_STATUS = 0, PHONE_SINGLE_STATUS };\r
+\r
+bool MulitplePhoneTextReplaces();\r
+bool FindCallListInfoAndSetPriorityNumber();\r
+void PhoneScoStatausCallback(hfp_sco_connect_state_t state);\r
+void PhoneChangeStatusCallback(const PhoneCallInfo *phoneCall);\r
+void PhoneErrorCallback(PhoneServiceErrorType type, int volume);\r
+void UsingPhoneScoStatausCallback(hfp_sco_connect_state_t state);\r
+void UsingPhoneChangeStatusCallback(const PhoneCallInfo *phoneCall);\r
+void UsingPhoneErrorCallback(PhoneServiceErrorType type);\r
+\r
+namespace OHOS {\r
+class VolumeSettingView;\r
+void HonrsViewChange(void);\r
+VolumeSettingView *GetvolumeSetting(void);\r
+class PhoneMenuCallerLogModel {\r
+public:\r
+    void InitPhoneService();\r
+    static PhoneMenuCallerLogModel *GetInstance(void);\r
+    std::string GetPhoneNumber(void);\r
+    void SetoperateNumber(const char *number, char number_len);\r
+    bool GetPhoneStatus();\r
+    void SetMakePhoneStatus(bool status);\r
+    bool GetVolumeScreenStatus();\r
+    void SetVolumeScreenStatus(bool status);\r
+    bool GetCallStatus();\r
+    void SetCallStatus(bool status);\r
+    bool GetWaitingStatus();\r
+    void SetWaitingStatus(bool status);\r
+    bool GetMulitplePhoneStatus();\r
+    void SetMulitplePhoneStatus(bool status);\r
+    std::string GetDialingStatus(void);\r
+    void SetDialingStatus(const char *text);\r
+    std::string InitDateHourTime();\r
+    std::string &DisplayCallDuration();\r
+    int CurrCallNum();\r
+    bool GetNotifyFlag(void);\r
+    void SetNotifyFlag(bool flag);\r
+    bool IsMulitplePhoneStatus(void);\r
+    std::list<Contacts> &GetContacts();\r
+    bool GetMicMute()\r
+    {\r
+        return isMicMute_;\r
+    }\r
+    void SetMicMute(bool isMicMute)\r
+    {\r
+        isMicMute_ = isMicMute;\r
+    }\r
+    void SaveCurPage();\r
+    void BackToPrePage();\r
+\r
+private:\r
+    PhoneMenuCallerLogModel();\r
+    PhoneMenuCallerLogModel(const PhoneMenuCallerLogModel &);\r
+    PhoneMenuCallerLogModel &operator=(const PhoneMenuCallerLogModel &);\r
+    virtual ~PhoneMenuCallerLogModel();\r
+\r
+    std::string dialingStatus_;\r
+    std::string timers_;\r
+    std::string callDuration_;\r
+    std::string phoneNumber_;\r
+    bool mulitplePhoneStatus_{false};\r
+    bool waitingStatus_{false};\r
+    bool volumeStatus_{false};\r
+    bool phoneStatus_{false};\r
+    bool callStatus_{false};\r
+    bool notifyFlag_{false};\r
+    bool isMicMute_{false};\r
+    uint16_t preSliceId_{VIEW_MAIN_SAMPLE};\r
+    uint16_t prePageId_{0};\r
+};\r
+}\r
+#ifdef __cplusplus\r
+}\r
+#endif\r
+#endif
\ No newline at end of file
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/include/phonemenu/PhoneMenuCallerLogPage.h b/code/sdk/application/wearable/evb/nativeapp/nativeui/include/phonemenu/PhoneMenuCallerLogPage.h
new file mode 100644 (file)
index 0000000..25b3a78
--- /dev/null
@@ -0,0 +1,37 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: PhoneMenuCallerLogPage\r
+ * Create: 2025-06-06\r
+ */\r
+\r
+#ifndef PHONE_MENU_CALLER_LOG_PAGE_H\r
+#define PHONE_MENU_CALLER_LOG_PAGE_H\r
+\r
+#include "components/ui_scroll_view.h"\r
+#include "components/ui_label.h"\r
+#include "components/ui_label_button.h"\r
+#include "components/ui_simple_list.h"\r
+#include "phoneservice/PhoneService.h"\r
+#include "SlicePage.h"\r
+#include "PhoneMenuPresenter.h"\r
+\r
+namespace OHOS {\r
+class PhoneMenuCallerLogPage : public SlicePage<PhoneMenuPresenter>,\r
+    public UIView::OnClickListener,\r
+    public UIView::OnDragListener {\r
+public:\r
+    PhoneMenuCallerLogPage();\r
+    ~PhoneMenuCallerLogPage();\r
+    void OnStart(void* data) override;\r
+    bool OnDrag(UIView& view, const DragEvent& event) override;\r
+    bool OnClick(UIView& view, const ClickEvent& event) override;\r
+private:\r
+    UIScrollView *group_{nullptr};\r
+    UILabel *titleLabel_{nullptr};\r
+    UILabel *noCallLabel_{nullptr};\r
+    UILabelButton *clearButton_{nullptr};\r
+    UISimpleList *callerLogList_{nullptr};\r
+    CallLogInfo *info_{nullptr};\r
+};\r
+}  // namespace OHOS\r
+#endif  // PHONE_MENU_CALLER_LOG_PAGE_H
\ No newline at end of file
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/include/phonemenu/PhoneMenuCallingPage.h b/code/sdk/application/wearable/evb/nativeapp/nativeui/include/phonemenu/PhoneMenuCallingPage.h
new file mode 100644 (file)
index 0000000..31f881e
--- /dev/null
@@ -0,0 +1,45 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: PhoneMenuCallingPage\r
+ * Create: 2025-06-06\r
+ */\r
+\r
+#ifndef PHONE_MENU_CALLING_PAGE_H\r
+#define PHONE_MENU_CALLING_PAGE_H\r
+\r
+#include "SlicePage.h"\r
+#include "components/ui_view_group.h"\r
+#include "components/ui_label.h"\r
+#include "components/ui_button.h"\r
+#include "components/ui_image_view.h"\r
+#include "PhoneMenuPresenter.h"\r
+\r
+namespace OHOS {\r
+class PhoneMenuCallingPage : public SlicePage<PhoneMenuPresenter>,\r
+    public UIView::OnClickListener,\r
+    public UIView::OnDragListener {\r
+public:\r
+    PhoneMenuCallingPage();\r
+    ~PhoneMenuCallingPage();\r
+    void OnStart(void* data) override;\r
+    bool OnDrag(UIView& view, const DragEvent& event) override;\r
+    bool OnClick(UIView& view, const ClickEvent& event) override;\r
+    static PhoneMenuCallingPage *GetInstance();\r
+    UILabel *GetCallingPhoneNumberLabel();\r
+    UILabel *GetCallingStateLabel();\r
+    enum class CallingState : uint8_t {SESSION, INCOMING, OUTGOING, WAITING};\r
+    CallingState GetCallingState();\r
+private:\r
+    CallingState state_;\r
+    void CreateUILabel(void);\r
+    void CreateUIButton(void);\r
+    UIViewGroup *group_{nullptr};\r
+    UIImageView *icon_{nullptr};\r
+    UILabel *phoneNumber_{nullptr};\r
+    UILabel *stateLabel_{nullptr};\r
+    UIButton *answerButton_{nullptr};\r
+    UIButton *hangUpButton_{nullptr};\r
+    UIButton *volumeButton_{nullptr};\r
+};\r
+}  // namespace OHOS\r
+#endif  // PHONE_MENU_CALLING_PAGE_H
\ No newline at end of file
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/include/phonemenu/PhoneMenuContactsItemView.h b/code/sdk/application/wearable/evb/nativeapp/nativeui/include/phonemenu/PhoneMenuContactsItemView.h
new file mode 100644 (file)
index 0000000..a977785
--- /dev/null
@@ -0,0 +1,37 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: PhoneMenuContactsItemView\r
+ * Create: 2025-07-12\r
+ */\r
+\r
+#ifndef PHONE_MENU_CONTACTS_ITEM_VIEW_H\r
+#define PHONE_MENU_CONTACTS_ITEM_VIEW_H\r
+\r
+#include "components/ui_view_group.h"\r
+#include "components/ui_image_view.h"\r
+#include "components/ui_label.h"\r
+\r
+namespace OHOS {\r
+typedef struct {\r
+    std::string cid;\r
+    std::string name;\r
+    std::string phoneNumber;\r
+} PhoneMenuContactsItem;\r
+\r
+class PhoneMenuContactsItemView : public UIViewGroup {\r
+public:\r
+    PhoneMenuContactsItemView();\r
+    ~PhoneMenuContactsItemView() override;\r
+    virtual void SetItemInfo(const PhoneMenuContactsItem &itemInfo);\r
+    const char *GetContactsName() const;\r
+    const char *GetContactsCid() const;\r
+    const char *GetContactsPhoneNumber() const;\r
+\r
+private:\r
+    UIViewGroup bg_;\r
+    UIImageView icon_;\r
+    UILabel label_;\r
+    PhoneMenuContactsItem itemInfo_;\r
+};\r
+}\r
+#endif  // PHONE_MENU_CONTACTS_ITEM_VIEW_H
\ No newline at end of file
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/include/phonemenu/PhoneMenuContactsPage.h b/code/sdk/application/wearable/evb/nativeapp/nativeui/include/phonemenu/PhoneMenuContactsPage.h
new file mode 100644 (file)
index 0000000..8a345ff
--- /dev/null
@@ -0,0 +1,37 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: PhoneMenuContactsPage\r
+ * Create: 2025-07-12\r
+ */\r
+\r
+#ifndef PHONE_MENU_CONTACTS_PAGE_H\r
+#define PHONE_MENU_CONTACTS_PAGE_H\r
+\r
+#include "components/ui_scroll_view.h"\r
+#include "components/ui_label.h"\r
+#include "components/ui_simple_list.h"\r
+#include "View.h"\r
+#include "SlicePage.h"\r
+#include "UiConfig.h"\r
+#include "PhoneMenuPresenter.h"\r
+#include "PhoneMenuContactsItemView.h"\r
+\r
+namespace OHOS {\r
+class PhoneMenuContactsPage : public SlicePage<PhoneMenuPresenter>,\r
+    public UIView::OnClickListener,\r
+    public UIView::OnDragListener {\r
+public:\r
+    PhoneMenuContactsPage();\r
+    ~PhoneMenuContactsPage() override;\r
+    void OnStart(void* data) override;\r
+    bool OnDrag(UIView& view, const DragEvent& event) override;\r
+    bool OnClick(UIView& view, const ClickEvent& event) override;\r
+\r
+private:\r
+    UIScrollView* container_ = nullptr;\r
+    UISimpleList* contactsList_ = nullptr;\r
+    UIImageView* image_ = nullptr;\r
+    UILabel* contactsLabel_ = nullptr;\r
+};\r
+}\r
+#endif  // PHONE_MENU_CONTACTS_PAGE_H\r
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/include/phonemenu/PhoneMenuDialPage.h b/code/sdk/application/wearable/evb/nativeapp/nativeui/include/phonemenu/PhoneMenuDialPage.h
new file mode 100644 (file)
index 0000000..de24c8c
--- /dev/null
@@ -0,0 +1,50 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: PhoneMenuDialPage\r
+ * Create: 2025-07-12\r
+ */\r
+\r
+#ifndef PHONE_MENU_DIAL_PAGE_H\r
+#define PHONE_MENU_DIAL_PAGE_H\r
+\r
+#include <string>\r
+#include "components/ui_label_button.h"\r
+#include "components/ui_scroll_view.h"\r
+#include "components/ui_label.h"\r
+#include "View.h"\r
+#include "UiConfig.h"\r
+#include "SlicePage.h"\r
+#include "PhoneMenuPresenter.h"\r
+\r
+namespace OHOS {\r
+class PhoneMenuDialPage : public SlicePage<PhoneMenuPresenter>,\r
+    public UIView::OnClickListener,\r
+    public UIView::OnDragListener {\r
+public:\r
+    PhoneMenuDialPage();\r
+    ~PhoneMenuDialPage() override;\r
+    void OnStart(void* data) override;\r
+    bool OnDrag(UIView& view, const DragEvent& event) override;\r
+    bool OnClick(UIView& view, const ClickEvent& event) override;\r
+\r
+private:\r
+    UIScrollView* container_ = nullptr;\r
+    UILabel* dialNumberLabel_ = nullptr;\r
+    UILabelButton* key0Button_ = nullptr;\r
+    UILabelButton* key1Button_ = nullptr;\r
+    UILabelButton* key2Button_ = nullptr;\r
+    UILabelButton* key3Button_ = nullptr;\r
+    UILabelButton* key4Button_ = nullptr;\r
+    UILabelButton* key5Button_ = nullptr;\r
+    UILabelButton* key6Button_ = nullptr;\r
+    UILabelButton* key7Button_ = nullptr;\r
+    UILabelButton* key8Button_ = nullptr;\r
+    UILabelButton* key9Button_ = nullptr;\r
+    UILabelButton* deleteButton_ = nullptr;\r
+    UILabelButton* keyStarButton_ = nullptr;\r
+    UILabelButton* keyPoundButton_ = nullptr;\r
+    UILabelButton* diagButton_ = nullptr;\r
+    std::string dialNumber_;\r
+};\r
+}\r
+#endif  // PHONE_MENU_DIAL_PAGE_H\r
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/include/phonemenu/PhoneMenuDisconnectPage.h b/code/sdk/application/wearable/evb/nativeapp/nativeui/include/phonemenu/PhoneMenuDisconnectPage.h
new file mode 100644 (file)
index 0000000..4bb124f
--- /dev/null
@@ -0,0 +1,37 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: PhoneMenuDisconnectPage\r
+ * Create: 2025-07-12\r
+ */\r
+\r
+#ifndef PHONE_MENU_DISCONNECT_PAGE_H\r
+#define PHONE_MENU_DISCONNECT_PAGE_H\r
+\r
+#include "components/ui_scroll_view.h"\r
+#include "components/ui_label.h"\r
+#include "components/ui_image_view.h"\r
+#include "View.h"\r
+#include "UiConfig.h"\r
+#include "SlicePage.h"\r
+#include "main/LoadImg.h"\r
+#include "ui_resource_phonemenu.h"\r
+#include "PhoneMenuPresenter.h"\r
+\r
+namespace OHOS {\r
+class PhoneMenuDisconnectPage : public SlicePage<PhoneMenuPresenter>,\r
+    public UIView::OnClickListener,\r
+    public UIView::OnDragListener {\r
+public:\r
+    PhoneMenuDisconnectPage();\r
+    ~PhoneMenuDisconnectPage() override;\r
+    void OnStart(void* data) override;\r
+    bool OnDrag(UIView& view, const DragEvent& event) override;\r
+    bool OnClick(UIView& view, const ClickEvent& event) override;\r
+\r
+private:\r
+    UIScrollView *container_{nullptr};\r
+    UIImageView *image_{nullptr};\r
+    UILabel *text_{nullptr};\r
+};\r
+}\r
+#endif
\ No newline at end of file
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/include/phonemenu/PhoneMenuMainItemView.h b/code/sdk/application/wearable/evb/nativeapp/nativeui/include/phonemenu/PhoneMenuMainItemView.h
new file mode 100644 (file)
index 0000000..6cc287e
--- /dev/null
@@ -0,0 +1,33 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: PhoneMenuMainItemView\r
+ * Create: 2025-07-12\r
+ */\r
+\r
+#ifndef PHONE_MENU_MAIN_ITEM_VIEW_H\r
+#define PHONE_MENU_MAIN_ITEM_VIEW_H\r
+\r
+#include "components/ui_view_group.h"\r
+#include "components/ui_image_view.h"\r
+#include "components/ui_label.h"\r
+\r
+namespace OHOS {\r
+typedef struct {\r
+    int iconResId;\r
+    const char *label;\r
+    const char *viewId;\r
+} PhoneMenuItem;\r
+\r
+class PhoneMenuMainItemView : public UIViewGroup {\r
+public:\r
+    PhoneMenuMainItemView();\r
+    ~PhoneMenuMainItemView() override;\r
+    virtual void SetItemInfo(const PhoneMenuItem &itemInfo);\r
+\r
+private:\r
+    UIImageView icon_;\r
+    UILabel label_;\r
+    UIViewGroup bg_;\r
+};\r
+}\r
+#endif  // PHONE_MENU_MAIN_ITEM_VIEW_H
\ No newline at end of file
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/include/phonemenu/PhoneMenuMainPage.h b/code/sdk/application/wearable/evb/nativeapp/nativeui/include/phonemenu/PhoneMenuMainPage.h
new file mode 100644 (file)
index 0000000..167a0ec
--- /dev/null
@@ -0,0 +1,48 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: PhoneMenuMainPage\r
+ * Create: 2025-07-12\r
+ */\r
+\r
+#ifndef PHONE_MENU_MAIN_PAGE_H\r
+#define PHONE_MENU_MAIN_PAGE_H\r
+\r
+#include "components/ui_scroll_view.h"\r
+#include "components/ui_label.h"\r
+#include "components/ui_simple_list.h"\r
+#include "View.h"\r
+#include "UiConfig.h"\r
+#include "main/LoadImg.h"\r
+#include "SlicePage.h"\r
+#include "ui_resource_phonemenu.h"\r
+#include "PhoneMenuPresenter.h"\r
+#include "PhoneMenuMainItemView.h"\r
+\r
+namespace OHOS {\r
+constexpr uint8_t PHOEN_MENU_ITEM_NUM = 3;\r
+const char *PHONE_MENU_ITEM_CONTACTS_BOOKS = "phoneMenuItemContactsBooks";\r
+const char *PHONE_MENU_ITEM_RECENT_CALL = "phoneMenuItemRecentCall";\r
+const char *PHONE_MENU_ITEM_DIAL = "phoneMenuItemDial";\r
+\r
+class PhoneMenuMainPage : public SlicePage<PhoneMenuPresenter>,\r
+                          public UIView::OnClickListener,\r
+                          public UIView::OnDragListener {\r
+public:\r
+    PhoneMenuMainPage();\r
+    ~PhoneMenuMainPage() override;\r
+    void OnStart(void *data) override;\r
+    bool OnDrag(UIView &view, const DragEvent &event) override;\r
+    bool OnClick(UIView &view, const ClickEvent &event) override;\r
+\r
+private:\r
+    UIScrollView *container_ = nullptr;\r
+    UILabel *titleLabel_ = nullptr;\r
+    UISimpleList *phoneMenuList_ = nullptr;\r
+    PhoneMenuItem phoneMenu_[PHOEN_MENU_ITEM_NUM] = {\r
+        {IMAGE_PHONEMENU_CONTACTS_BOOKS, "通讯录", PHONE_MENU_ITEM_CONTACTS_BOOKS},\r
+        {IMAGE_PHONEMENU_RECENT_CALL, "最近通话", PHONE_MENU_ITEM_RECENT_CALL},\r
+        {IMAGE_PHONEMENU_DIAL, "拨号", PHONE_MENU_ITEM_DIAL},\r
+    };\r
+};\r
+}  // namespace OHOS\r
+#endif  // PHONE_MENU_MAIN_PAGE_H\r
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/include/phonemenu/PhoneMenuPresenter.h b/code/sdk/application/wearable/evb/nativeapp/nativeui/include/phonemenu/PhoneMenuPresenter.h
new file mode 100644 (file)
index 0000000..3a3c9bd
--- /dev/null
@@ -0,0 +1,17 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: PhoneMenuPresenter\r
+ * Create: 2025-07-12\r
+ */\r
+\r
+#ifndef PHONE_MENU_PRESENTER_H\r
+#define PHONE_MENU_PRESENTER_H\r
+\r
+#include "Presenter.h"\r
+\r
+namespace OHOS {\r
+class PhoneMenuView;\r
+class PhoneMenuPresenter : public Presenter<PhoneMenuView> {};\r
+}\r
+\r
+#endif  // PHONE_MENU_PRESENTER_H
\ No newline at end of file
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/include/phonemenu/PhoneMenuSync.h b/code/sdk/application/wearable/evb/nativeapp/nativeui/include/phonemenu/PhoneMenuSync.h
new file mode 100644 (file)
index 0000000..518404e
--- /dev/null
@@ -0,0 +1,49 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: PhoneMenuSync\r
+ * Create: 2025-07-12\r
+ */\r
+\r
+#ifndef PHONE_MENU_SYNC_H\r
+#define PHONE_MENU_SYNC_H\r
+#include <string>\r
+#include <fstream>\r
+#include <sstream>\r
+#include <list>\r
+#include <iostream>\r
+#include "UiConfig.h"\r
+\r
+namespace OHOS {\r
+\r
+enum CONTACT_DATA_ERROE {\r
+    OK = 0,\r
+    JSON_CREATE_FAIL = 1,\r
+    JSON_PARSE_FAIL = 2,\r
+    JSON_TYPE_FAIL = 3,\r
+    JSON_KEY_FAIL = 4,\r
+    JSON_TO_STRING_FAIL = 5,\r
+    JSON_FILE_OPEN_FAIL = 6,\r
+};\r
+\r
+typedef struct {\r
+    std::string cid_;\r
+    std::string name_;\r
+    std::string phone_;\r
+} Contacts;\r
+\r
+const std::string CONTACTS_FILE_PATH = APP_RES_PATH "/contactsInfo.json";\r
+class PhoneMenuSync {\r
+public:\r
+    static uint32_t WriteFileContact(const std::string &filePath, std::string &content);\r
+    static uint32_t ReadFileContact(const std::string &filePath);\r
+    static uint32_t ParseContactsMsg(std::string &msgContent);\r
+    static std::list<Contacts> &GetContacts();\r
+    static uint32_t PrintContacts();\r
+    static uint32_t LookContacts(std::string &contacts);\r
+    static uint32_t CleanFileContacts(const std::string &filePath);\r
+\r
+private:\r
+    static std::list<Contacts> list_;\r
+};\r
+}\r
+#endif  // PHONE_MENU_SYNC_H\r
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/include/phonemenu/PhoneMenuView.h b/code/sdk/application/wearable/evb/nativeapp/nativeui/include/phonemenu/PhoneMenuView.h
new file mode 100644 (file)
index 0000000..a907d98
--- /dev/null
@@ -0,0 +1,24 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: PhoneMenuView\r
+ * Create: 2025-07-12\r
+ */\r
+\r
+#ifndef PHONE_MENU_VIEW_H\r
+#define PHONE_MENU_VIEW_H\r
+#include "View.h"\r
+#include "PhoneMenuPresenter.h"\r
+\r
+namespace OHOS {\r
+enum PhoneMenuPages : uint8_t {\r
+    PHONE_MENU_MAIN_PAGE = 1,\r
+    PHONE_MENU_CONTACTS_PAGE,\r
+    PHONE_MENU_DIAL_PAGE,\r
+    PHONE_MENU_DISCONNECT_PAGE,\r
+    PHONE_MENU_CALLER_LOG_PAGE,\r
+    PHONE_MENU_CALLING_PAGE,\r
+};\r
+\r
+class PhoneMenuView : public View<PhoneMenuPresenter> {};\r
+}\r
+#endif  // PHONE_MENU_VIEW_H
\ No newline at end of file
index f24dfce..131ed8d 100644 (file)
@@ -1,8 +1,7 @@
 /*
- * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved.
- * Description: Player view
- * Author:
- * Create: 2021-07-26
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.
+ * Description: PlayersModel
+ * Create: 2025-03-23
  */
 
 #ifndef PLAYERS_MODEL_H
 #include "main/UiServersMsg.h"
 #include "player.h"
 #include "source.h"
+#include "bts_br_gap.h"
+#include "bts_avrcp_controller.h"
+#include "bts_avrcp_target.h"
+#include "bts_a2dp_source.h"
 #include "audio_manager.h"
 #include "audio_base_type.h"
+#include "settings/model/SettingBluetoothModel.h"
 #include "player/PlayersPresenter.h"
-#include "bts_avrcp_controller.h"
 
 namespace OHOS {
 using OHOS::Media::Player;
@@ -93,6 +96,9 @@ public:
     void ConncetBtResetButton();
     void ClearActivateAudioInterrupt(void);
     void GetDuration(int64_t &duration);
+
+    void SetViewStatus(bool viewStatus) { viewInitStatus_ = viewStatus; };
+    bool GetViewStatus(void) { return viewInitStatus_;};
 private:
     int64_t duration_{0};
     bool isInterruptedPause_{false};
@@ -117,6 +123,7 @@ private:
     char *currentSongName{nullptr};
     bool isStopAndReset{false};
     bool isActivateAudioInterrupt{false};
+    bool viewInitStatus_;
 };
 }
 
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/include/player/PlayersMusicItemView.h b/code/sdk/application/wearable/evb/nativeapp/nativeui/include/player/PlayersMusicItemView.h
new file mode 100644 (file)
index 0000000..4b4365a
--- /dev/null
@@ -0,0 +1,33 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: PlayersMusicItemView\r
+ * Create: 2025-03-23\r
+ */\r
+\r
+#ifndef DATE_BUTTON_ITEM_VIEW_H\r
+#define DATE_BUTTON_ITEM_VIEW_H\r
+\r
+#include "UiConfig.h"\r
+#include "components/ui_canvas.h"\r
+#include "components/ui_image_view.h"\r
+#include "components/ui_label.h"\r
+#include "components/ui_label_button.h"\r
+#include "components/ui_view_group.h"\r
+#include "player/PlayersPresenter.h"\r
+#include "main/LoadImg.h"\r
+\r
+namespace OHOS {\r
+class PlayersMusicItemView : public UIViewGroup {\r
+public:\r
+    explicit PlayersMusicItemView();\r
+    ~PlayersMusicItemView() override;\r
+    virtual void SetItemInfo(const PlayerCaseInfo itemInfo);\r
+    PlayerCaseInfo GetItem();\r
+\r
+private:\r
+    UILabelButton labelButton_;\r
+    PlayerCaseInfo itemInfo_ = {"", 0};\r
+};\r
+}\r
+\r
+#endif\r
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/include/player/PlayersMusicListGroup.h b/code/sdk/application/wearable/evb/nativeapp/nativeui/include/player/PlayersMusicListGroup.h
new file mode 100644 (file)
index 0000000..a556afe
--- /dev/null
@@ -0,0 +1,40 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: PlayersMusicListGroup\r
+ * Create: 2025-06-29\r
+ */\r
+\r
+#ifndef PLAYER_MUSIC_LIST_GROUP_H\r
+#define PLAYER_MUSIC_LIST_GROUP_H\r
+\r
+#include "graphic_types.h"\r
+#include "wearable_log.h"\r
+#include "components/ui_card_page.h"\r
+#include "components/ui_image_view.h"\r
+#include "components/ui_label.h"\r
+#include "components/ui_scroll_view.h"\r
+#include "components/ui_radio_button.h"\r
+#include "components/ui_card_page.h"\r
+#include "components/ui_circle_progress.h"\r
+#include "components/ui_checkbox.h"\r
+\r
+namespace OHOS {\r
+class PlayersMusicListGroup : public UIViewGroup,\r
+                    public UIView::OnClickListener,\r
+                    public UIView::OnDragListener {\r
+public:\r
+    PlayersMusicListGroup();\r
+    ~PlayersMusicListGroup() override;\r
+    static PlayersMusicListGroup *GetInstance(void);\r
+    bool OnClick(UIView &view, const ClickEvent &event) override;\r
+    bool OnDrag(UIView &view, const DragEvent &event) override;\r
+    void RefreshMusicList();\r
+    void BtnOnListData(UIView& view);\r
+\r
+private:\r
+    UISimpleList *musicList_{nullptr};\r
+    char *sliceId_{nullptr};\r
+    int16_t index_{0};\r
+};\r
+}\r
+#endif\r
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/include/player/PlayersOptionGroup.h b/code/sdk/application/wearable/evb/nativeapp/nativeui/include/player/PlayersOptionGroup.h
new file mode 100644 (file)
index 0000000..bc05f4a
--- /dev/null
@@ -0,0 +1,47 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: PlayersOptionGroup\r
+ * Create: 2025-06-29\r
+ */\r
+\r
+#ifndef PLAYER_OPTION_GROUP_H\r
+#define PLAYER_OPTION_GROUP_H\r
+\r
+#include "graphic_types.h"\r
+#include "wearable_log.h"\r
+#include "components/ui_card_page.h"\r
+#include "components/ui_image_view.h"\r
+#include "components/ui_label.h"\r
+#include "components/ui_scroll_view.h"\r
+#include "components/ui_radio_button.h"\r
+#include "components/ui_card_page.h"\r
+#include "components/ui_circle_progress.h"\r
+#include "components/ui_checkbox.h"\r
+\r
+namespace OHOS {\r
+class PlayersOptionGroup : public UIViewGroup,\r
+                    public UIView::OnClickListener,\r
+                    public UIView::OnDragListener {\r
+public:\r
+    PlayersOptionGroup();\r
+    ~PlayersOptionGroup() override;\r
+    bool OnClick(UIView &view, const ClickEvent &event) override;\r
+    bool OnDrag(UIView &view, const DragEvent &event) override;\r
+    void InitButton();\r
+    void InitLabel();\r
+    void InitImage();\r
+\r
+private:\r
+    UILabel *watchLabel_{nullptr};\r
+    UILabel *phoneLabel_{nullptr};\r
+    UILabel *bluetoothLabel_{nullptr};\r
+    UIImageView *watchImage_{nullptr};\r
+    UIImageView *phoneImage_{nullptr};\r
+    UIImageView *bluetoothImage_{nullptr};\r
+    UIRadioButton *watchButton_{nullptr};\r
+    UIRadioButton *phoneButton_{nullptr};\r
+    UIButton *bluetoothButton_{nullptr};\r
+    UILabelButton *deleteButton{nullptr};\r
+};\r
+}\r
+#endif\r
index 07d0194..ca17833 100644 (file)
@@ -1,8 +1,7 @@
 /*
- * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved.
- * Description: Player view
- * Author:
- * Create: 2021-07-26
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.
+ * Description: PlayersPresenter
+ * Create: 2025-06-29
  */
 
 #ifndef PLAYERS_PRESENTER_H
 #include "player.h"
 #include "audio_manager.h"
 #include "audio_base_type.h"
-#include "player/BluetoothView.h"
 #include "main/VolumeSettingView.h"
 #include "main/VolumeSettingPresenter.h"
-#include "bluetooth/BluetoothModel.h"
-#include "bluetooth/BluetoothEarPhoneView.h"
-#include "bluetooth/BluetoothEarListView.h"
-#include "bluetooth/BluetoothOptionsView.h"
-#include "bluetooth/BluetoothReconnectView.h"
-#include "bluetooth/TipsSuccMessageView.h"
-#include "bluetooth/TipsConnFailMessageView.h"
-#include "bluetooth/TipsFailMessageView.h"
-#include "bluetooth/BluetoothDeviceListView.h"
-#include "bluetooth/BluetoothItemView.h"
+#include "AppViewIDs.h"
+#include "NativeAbility.h"
+#include "settings/model/SettingBluetoothModel.h"
 
 namespace OHOS {
 using OHOS::Media::Player;
@@ -34,37 +25,14 @@ using namespace::Audio;
 using Audio::AudioManager;
 class VolumeSettingView;
 #define DEC_NUM_256 256
-// 点击按钮视图ID
-#define BLUETOOTH_RESCAN_BUTTON "rescanButton"
-#define BLUETOOTH_NEWEQUIPMENT_BUTTON "newEquipmentButton"
-#define BLUETOOTH_CANCELCONNEDREQUEST_BUTTON "cancelConnedRequestButton"
-#define BLUETOOTH_UNPAIR_BUTTON "unpairButton"
-#define BLUETOOTH_OPTIONONE_BUTTON "optionsOneButton"
-#define BLUETOOTH_SETTING_BUTTON "settingButton"
-#define BLUETOOTH_DELETE_BUTTON "deleteButton"
-#define BLUETOOTH_SUCC_BACK_BUTTON "succBackButton"
-#define BLUETOOTH_FAIL_BACK_BUTTON "failBackButton" // 重试按钮
-#define BLUETOOTH_CONN_FAIL_BACK_BUTTON "connfailBackButton"
-// 视图滑动事件ID
-#define BLUETOOTH_EARLIST_VIEW "BluetoothEarListView"
-#define BLUETOOTH_DEVICE_LIST_VIEW "BluetoothDeviceListView"
-#define BLUETOOTH_EAR_PHONE_VIEW "BluetoothEarPhoneView"
-#define BLUETOOTH_OPTIONS_VIEW "BluetoothOptionsView"
-#define BLUETOOTH_RECONNECT_VIEW "BluetoothReconnectView"
-#define BLUETOOTH_VIEW "BluetoothView"
-#define TIPS_SUCC_MESSAGE_VIEW "TipsSuccMessageView"
-#define TIPS_FAIL_MESSAGE_VIEW "TipsFailMessageView"
-#define TIPS_CONN_FAIL_MESSAGE_VIEW "TipsConnFailMessageView"
-
-static constexpr uint8_t FONT_THIRTY_SIZE = 30; // 30:字体大小
-static constexpr uint8_t FONT_FORTY_SIZE = 40; // 40:字体大小
+static constexpr uint8_t FONT_THIRTY_SIZE = 30;
+static constexpr uint8_t FONT_FORTY_SIZE = 40;
 
 struct PlayerCaseInfo {
     char sliceId[DEC_NUM_256];
     int16_t index;
 };
 
-
 class PlayersListGroup {
 public:
     PlayersListGroup() {}
@@ -84,33 +52,6 @@ private:
     int GetAllFiles(List<PlayerCaseInfo> *playersCaseList);
 };
 
-// Button OnClick
-class ButtonOnClickListener : public UIView::OnClickListener {
-public:
-    enum VolumeSetState : uint8_t {
-        MUTE,
-        LOW,
-        MEDIUM,
-        LOUD,
-    };
-    ButtonOnClickListener() {}
-    ButtonOnClickListener(UIView *view) : view_(view) {}
-    ~ButtonOnClickListener();
-    static ButtonOnClickListener *GetInstance()
-    {
-        static ButtonOnClickListener instance;
-        return &instance;
-    }
-    bool OnClick(UIView& view, const ClickEvent& event) override;
-private:
-    UIView *view_{nullptr};
-    void PlayerButtonOnClick();
-    void SoundButtonOnClick();
-    void PlayerModelButtonOnClick();
-    void OptionsButtonOnClick();
-    VolumeSettingView *volumeSettingView{nullptr};
-};
-
 // 播放器回调
 class PlayerCallbackImpl : public OHOS::Media::PlayerCallback {
 public:
@@ -155,93 +96,12 @@ private:
     bool isInterruptedPause_{false};
 };
 
-// 滑动手势
-class PlayerOnDragListener : public UIView::OnDragListener {
-public:
-    PlayerOnDragListener();
-    ~PlayerOnDragListener();
-    bool OnDragEnd(UIView& view, const DragEvent& event) override;
-    bool OnDrag(UIView& view, const DragEvent& event) override;
-    static PlayerOnDragListener *GetInstance();
-private:
-    void OnDragChangView(const DragEvent& event, int16_t hideView, int16_t showView, bool isStopScan);
-    void OnDragChangBluetoothView(const DragEvent& event);
-    void DropEarPhoneView(const DragEvent& event);
-    void DropEarListView(const DragEvent& event);
-    void CorrespondingJump(const DragEvent& event, int16_t hideView);
-};
-
-// Bluetooth View redirection
-class BluetoothEarListView;
-class BluetoothOptionsView;
-class BluetoothDeviceListView;
-class JumpView {
-public:
-    enum BluetoothJumpViewNum : uint8_t {
-        BLUETOOTHEARPHONEVIEW = 0, // 扫描
-        BLUETOOTHEARLISTVIEW,  // 扫描列表
-        BLUETOOTHDEVICELISTVIEW, // 已配对设备列表
-        BLUETOOTHEOPTIONSVIEW,   // 选择界面
-        BLUETOOTHRECONNECTVIEW,
-        TIPSSUCCMESSAGEVIEW,  // 连接成功
-        TIPSCONNFAILMESSAGEVIEW,  // 连接失败
-        TIPSFAILMESSAGEVIEW,
-        BLUETOOTHEVIEW,   // 设置界面
-        BLUETOOTHEJUMP_MAX,
-    };
-    JumpView();
-    ~JumpView();
-    static JumpView *GetInstance();
-    void ChangeView(int16_t hideView, int16_t showView);
-private:
-    bool ChangeTipsFailMessageView(int16_t hideView, int16_t thisView);
-    bool ChangeTipsConnFailMessageView(int16_t hideView, int16_t thisView);
-    bool ChangeTipsSuccMessageView(int16_t hideView, int16_t thisView);
-    bool ChangeBluetoothEarPhoneView(int16_t hideView, int16_t thisView);
-    bool ChangeBluetoothEarListView(int16_t hideView, int16_t thisView);
-    bool ChangeBluetoothView(int16_t hideView, int16_t thisView);
-    bool ChangeBluetoothOptionsView(int16_t hideView, int16_t thisView);
-    bool ChangeBluetoothDeviceListView(int16_t hideView, int16_t thisView);
-    bool ChangeBluetoothReconnectView(int16_t hideView, int16_t thisView);
-    bool CheckViewParam(int16_t hideView, int16_t showView);
-    void ResetEarListView(int16_t hideView);
-    UIViewGroup *container[BLUETOOTHEJUMP_MAX]{nullptr}; // CONTAINER_NUM :蓝牙耳机连接的9个界面容器
-    BluetoothEarPhoneView *bluetoothEarPhoneView{nullptr};
-    BluetoothEarListView *bluetoothEarListView{nullptr};
-    BluetoothView *bluetoothView{nullptr};
-    BluetoothOptionsView *bluetoothOptionsView{nullptr};
-    BluetoothDeviceListView *bluetoothDeviceListView{nullptr};
-    BluetoothReconnectView *bluetoothReconnectView{nullptr};
-    TipsSuccMessageView *tipsSuccMessageView{nullptr};
-    TipsConnFailMessageView *tipsConnFailMessageView{nullptr};
-    TipsFailMessageView *tipsFailMessageView{nullptr};
-    typedef bool (JumpView::*PreprosssChangeView)(int16_t hideView, int16_t thisView);
-    PreprosssChangeView preProcessView[BLUETOOTHEJUMP_MAX];
-};
-
 class PlayersPresenter : public UIView::OnClickListener {
 public:
     PlayersPresenter();
     ~PlayersPresenter();
     static PlayersPresenter *GetInstance();
-    void OnClickRescanButton(void);
-    void OnClickNewEquipmentButton(void);
-    void OnClickCancelConnedRequestButton(void);
-    void OnClickButtonUnpair(void);
-    void OnClickButtonOptionOne(void);
-    void OnClickSetting(void);
-    void OnClickDelete(void);
-    void OnClickSuccBack(void);
-    void OnClickConnFailBack(void);
-    void OnClickFailBack(void);
-    void SetTitleSetText(const char *text);
-    void SetPlaybackProgress(int64_t value);
-    void SetPlayerState(bool value);
-    void PlayerbackReset(void);
-    void PlayerHeadsetReset(void);
-    void ShowPlayerListGroup(void);
 private:
-    bool OnClick(UIView& view, const ClickEvent& event) override;
 };
 } // namespace OHOS
 #endif
index 757fff5..cb0916f 100644 (file)
@@ -1,8 +1,7 @@
 /*\r
- * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved.\r
- * Description: Player view\r
- * Author:\r
- * Create: 2021-07-26\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: PlayersView\r
+ * Create: 2025-03-23\r
  */\r
 \r
 #ifndef PLAYERS_VIEW_H\r
 #include "components/ui_abstract_scroll.h"\r
 #include "components/ui_circle_progress.h"\r
 #include "components/ui_checkbox.h"\r
-#include "components/ui_list.h"\r
+#include "components/ui_simple_list.h"\r
 #include "font/ui_font_bitmap.h"\r
 #include "font/ui_font.h"\r
 #include "graphic_config.h"\r
 #include "components/ui_card_page.h"\r
+#include "main/VolumeSettingView.h"\r
 #include "player/PlayersPresenter.h"\r
+#include "player/PlayersOptionGroup.h"\r
+#include "player/PlayersMusicListGroup.h"\r
+#include "common/periodicupdate_interface.h"\r
 \r
 namespace OHOS {\r
 #define PLAY_PROGRESS_MIN 0\r
 #define PLAY_PROGRESS_MAX 100\r
-class JumpView;\r
 class PlayersPresenter;\r
-class PlayersCaseListAdapter;\r
-class PlayersView : public UICardPage {\r
+class VolumeSettingView;\r
+class VolumeSliderEventListener;\r
+class PlayersView : public UICardPage, public PeriodicUpdateInterface,\r
+                    public UIView::OnClickListener,\r
+                    public UIView::OnDragListener {\r
 public:\r
     PlayersView();\r
     ~PlayersView() override;\r
     static PlayersView *GetInstance(void);\r
+    bool OnClick(UIView &view, const ClickEvent &event) override;\r
+    bool OnDragEvent(const DragEvent& event) override;\r
     bool InitView(void);\r
     void PreLoad(void) override;\r
     void UnLoad(void) override;\r
-    bool OnDragEvent(const DragEvent& event) override;\r
-\r
-    void SetUpLabel(const char *title, int16_t x, int16_t y);\r
-    void ShowUpListView(void);\r
+    void OnInactive(void) override;\r
+    void InitButton();\r
+    void InitLabel();\r
+    void InitImage();\r
+    void InitCircleProgress();\r
+    void InitSoundAdjust();\r
+    void InitOption();\r
+    void InitListView(void);\r
+    void SetUpPlayerMode();\r
+    void PlayOrPauseButtonOnClick();\r
     void TitleSetText(const char *text);\r
     void PlayerModelButtonSetSrc(uint32_t playMode);\r
-    int16_t GetVolumeRank(void);\r
-    void SetVolumeRank(int16_t value);\r
-    void SetVolumeAddOne(void);\r
-    UILabelButton *GetBackButton(void);\r
-    UIButton *GetPullButton(void);\r
-    UIButton *GetOptionsButton(void);\r
-    UIButton *GetPreButton(void);\r
-    UIButton *GetNextButton(void);\r
-    UILabel *GetTitleLabel(void);\r
-    UICheckBox *GetPlayerButton(void);\r
-    UIImageView *GetSoundButton(void);\r
-    UIImageView *GetPlayerModelButton(void);\r
-    UICircleProgress *GetPlaybackProgress(void);\r
+    void SetPlaybackProgress(int8_t value);\r
     UICheckBox::UICheckBoxState GetPlayerButtonState(void);\r
+    void SetPlayerState(bool value);\r
     void SetPlayerButtonState(UICheckBox::UICheckBoxState state);\r
-    UIList *GetPlayerList(void);\r
-    void SetPlayerListGroupStatus(bool status);\r
+    void PlayerHeadsetReset();\r
+\r
     void SetPlayerCtrVolume(float leftVolume, float rightVolume);\r
-    void CreateJumpView(void);\r
-    void CreatePlayersPresenter(void);\r
-    void CreatePlayerOnDragListener(void);\r
+    int16_t GetVolumeRank(void);\r
+    void SetVolumeRank(int16_t value);\r
+    void SetVolumeAddOne(void);\r
+    void Update(void) override;\r
+    uint32_t GetPeriod(void) override;\r
 private:\r
-    bool InitBackGround(void);\r
-    void TearDownView();\r
-    void CreatePlayerMusicName();\r
-    int ShowUpCheckBoxButton();\r
-    int ShowUpButton();\r
-    int ShowUpButtonOptions();\r
-    int ShowUpButtonView();\r
-    int ShowUpCircleProgress();\r
-    bool ShowUpPlayerMode();\r
-    void SetUpButton(UIButton *btn, const Point& point, int16_t width, int16_t height,\r
-                     UIView::OnClickListener *listener);\r
-    bool LoadPlayerImage(UIImageView *View, uint32_t resId);\r
-    bool LoadPlayerImage(UIButton *button, uint32_t resId, uint32_t hlResId);\r
-\r
-    UIImageView *backGround{nullptr};\r
-    UILabel *subTitleLabel{nullptr};\r
-    PlayersCaseListAdapter *adapterText{nullptr};\r
-    UILabel *titleLabel{nullptr};\r
-    UILabelButton *backButton{nullptr};\r
-    UIButton *pullButton{nullptr};\r
-    UIButton *optionsButton{nullptr};\r
-    UIButton *preButton{nullptr};\r
-    UIButton *nextButton{nullptr};\r
-    UIViewGroup *listGroup{nullptr};\r
-    UIImageView *soundButton{nullptr};\r
-    UIImageView *playerModelButton{nullptr};\r
-    UICheckBox *playerButton{nullptr};\r
-    UICircleProgress *playbackProgress{nullptr};\r
+    UIImageView *bgImg_{nullptr};\r
+    UILabel *musicNameLabel_{nullptr};\r
+    UILabel *musicAuthorLabel_{nullptr};\r
+    UIImageView *optionsButton_{nullptr};\r
+    UIImageView *preButton_{nullptr};\r
+    UIImageView *nextButton_{nullptr};\r
+    UIImageView *soundButton_{nullptr};\r
+    UIImageView *playModelChangeButton_{nullptr};\r
+    UIImageView *pullButton_{nullptr};\r
+    UICheckBox *playerOrPauseButton_{nullptr};\r
+    UICircleProgress *playbackProgress_{nullptr};\r
+    VolumeSettingView *volumeSettingView_{nullptr};\r
+    VolumeSliderEventListener *volumeSliderEventListener_{nullptr};\r
+    PlayersMusicListGroup *playersMusicListGroup{nullptr};\r
+    PlayersOptionGroup *playerOptionGroup_{nullptr};\r
     int16_t volumeSet{0};\r
-    UIList *list{nullptr};\r
-    JumpView *jumpView{nullptr};\r
-    PlayersPresenter *playersPresenter{nullptr};\r
-    PlayerOnDragListener *playerOnDragListener{nullptr};\r
     uint8_t state_ = UICheckBox::UICheckBoxState::MAX_STATUS_NUM;\r
-    UIView::OnClickListener *playerlistener{nullptr};\r
-    UIView::OnClickListener *soundlistener{nullptr};\r
-    UIView::OnClickListener *nextlistener{nullptr};\r
-    UIView::OnClickListener *prelistener{nullptr};\r
-    UIView::OnClickListener *modellistener{nullptr};\r
-    UIView::OnClickListener *optionslistener{nullptr};\r
     bool viewiInitStatus{false};\r
+    int64_t playerCurrentTime_{0};\r
+    int64_t playerMusicDuration_{0};\r
+    int64_t playerProgressValue_{0};\r
 };\r
 } // namespace OHOS\r
 #endif // MAIN_VIEW_H\r
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/include/quickaccess/FloatAccessView.h b/code/sdk/application/wearable/evb/nativeapp/nativeui/include/quickaccess/FloatAccessView.h
new file mode 100644 (file)
index 0000000..fceeffd
--- /dev/null
@@ -0,0 +1,86 @@
+ /*
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025. All rights reserved.
+ * Description: FloatAccessView
+ * Author: Hisi Graphic Team
+ * Created: 2025-09
+ */
+
+#ifndef FLOAT_ACCESS_VIEW_H
+#define FLOAT_ACCESS_VIEW_H
+
+#include "components/ui_view_group.h"
+#include "components/ui_float_box_view.h"
+#include "applist/AppItemView.h"
+
+namespace OHOS {
+namespace {
+    constexpr uint16_t MAX_ITEM_SIZE = 3;
+}
+class FloatAnimatorCallback;
+class FloatAccessView : public UIViewGroup,
+            public UIFloatBoxView::OnItemClickListener,
+            public UIView::OnClickListener {
+public:
+    static FloatAccessView *GetInstance(void);
+    FloatAccessView(const FloatAccessView &) = delete;
+    FloatAccessView &operator=(const FloatAccessView &) = delete;
+    void AddItem(AppItem item, uint8_t index);
+    void DeleteItem(const char* label);
+    AppItem GetItem(uint8_t index);
+
+    void OnItemClick(const std::string& name) override;
+    bool OnClick(UIView& view, const ClickEvent& event) override;
+    
+    void ShowView();
+    void ExitView();
+    void CleanView();
+    bool IsShowView();
+    void LoadAppItemsData();
+private:
+    FloatAccessView() {}
+    ~FloatAccessView() {}
+    uint8_t GetItemSize();
+    void SaveAppItemsData();
+    void AddAppItemsData();
+    void InitView();
+    void EnterApp();
+    bool isInitView_{false};
+    bool isShowView_{false};
+    bool isLoadData_{false};
+    bool isClickItem_{false}; // 标记点击了快捷应用
+    UIFloatBoxView* floatBoxView_ = nullptr;
+    AppItem items_[MAX_ITEM_SIZE] = {};
+    FloatAnimatorCallback* enterCallback_ = nullptr;
+};
+
+class FloatAnimatorCallback : public AnimatorCallback {
+public:
+    explicit FloatAnimatorCallback(UIView* view)
+        : startPos_(0), endPos_(0), startTime_(0), passTime_(0), isExit_(false),
+          animator_(new Animator(this, view, 300, false)) {} // 300 ms: 动画持续时间
+
+    ~FloatAnimatorCallback() override
+    {
+        if (animator_ != nullptr) {
+            delete animator_;
+            animator_ = nullptr;
+        }
+    }
+    void Callback(UIView* view) override;
+    void OnStop(UIView& view) override;
+    void DoEnter();
+    void DoExit();
+    uint8_t GetState()
+    {
+        return animator_->GetState();
+    }
+protected:
+    int16_t startPos_;
+    int16_t endPos_;
+    uint32_t startTime_;
+    uint32_t passTime_;
+    bool isExit_;
+    Animator* animator_;
+};
+} // namespace OHOS
+#endif // LOADING_FRAGMENT_H
\ No newline at end of file
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/include/recent_app/LoadingFragment.h b/code/sdk/application/wearable/evb/nativeapp/nativeui/include/recent_app/LoadingFragment.h
new file mode 100644 (file)
index 0000000..5e5abd7
--- /dev/null
@@ -0,0 +1,27 @@
+/*
+ * Copyright (c) CompanyNameMagicTag 2025-2025. All rights reserved.
+ * Description: LoadingFragment.h
+ * Author:
+ * Create: 2025-07-17
+ */
+
+#ifndef LOADING_FRAGMENT_H
+#define LOADING_FRAGMENT_H
+
+#include "components/ui_fragment.h"
+#include "components/ui_label.h"
+
+namespace OHOS {
+
+class LoadingFragment : public UIFragment {
+public:
+
+protected:
+    void OnCreateView(void* data) override;
+    void OnDestroyView() override;
+
+private:
+    UILabel* loadingLabel_ = nullptr;
+};
+} // namespace OHOS
+#endif // LOADING_FRAGMENT_H
\ No newline at end of file
index ccc47e1..3f6bc5c 100644 (file)
 
 namespace OHOS {
 class RecentAppView;
-class RecentAppPresenter : public Presenter<RecentAppView>, public UIView::OnClickListener {
+class RecentAppPresenter : public Presenter<RecentAppView> {
 public:
-    RecentAppPresenter();
-    ~RecentAppPresenter() override;
+    RecentAppPresenter() {}
+    ~RecentAppPresenter() override {}
     void OnResume() override;
-    bool OnClick(UIView &view, const ClickEvent &event) override;
 };
 }
 
index 02dc694..1a82d68 100644 (file)
 #ifndef RECENT_APP_VIEW_H
 #define RECENT_APP_VIEW_H
 
-#include <string>
-#include "recent_app/RecentAppPresenter.h"
 #include "View.h"
+#include "RecentAppPresenter.h"
+#include "LoadingFragment.h"
 #include "animator/animator.h"
-#include "components/ui_label.h"
-#include "components/ui_label_button.h"
-#include "components/ui_roller_view.h"
 
 namespace OHOS {
-static constexpr const char* RECENT_APP_DELETE_BTN_ID = "RecentAppDeleteBtn";
-static std::string RECENT_ITEM_NATIVE_PREFIX = "NA_";
-static std::string RECENT_ITEM_JS_PREFIX = "JS_";
-static constexpr const uint8_t RECENT_ITEM_PREFIX_LEN = 3;
 class RecentAppView : public View<RecentAppPresenter> {
 public:
-    RecentAppView();
+    RecentAppView() {}
     ~RecentAppView() override;
+
     void OnStart() override;
-    void LoadContent();
-    UIRollerView* GetRollerView()
-    {
-        return roller_;
-    }
+    void OnResume();
+
 private:
     class LoadingAnimCb : public AnimatorCallback {
     public:
@@ -53,16 +44,12 @@ private:
         RecentAppView* recentAppView_;
     };
 
-    void AddRecentAppToRoller();
-    void LoadRecentAppContent();
-    void InitRecentApps();
-    UIRollerView* roller_ = nullptr;
-    Animator* loadingAnim_ = nullptr;
-    UILabel* loadingLabel_ = nullptr;
-    UILabel* noRecentAppLabel_ = nullptr;
-    UILabelButton* delBtn_ = nullptr;
-    LoadingAnimCb loadingAnimCb_;
+    void LoadContent();
     bool viewiInitStatus_ = false;
+    LoadingAnimCb loadingAnimCb_;
+    Animator* loadingAnim_ = nullptr;
+    LoadingFragment *loadingFragment_ = nullptr;
+    UIFragment *rencentAppFragment_ = nullptr;
 };
 } // namespace OHOS
 #endif // RECENT_APP_VIEW_H
\ No newline at end of file
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/include/recent_app/RollerRecentAppFragment.h b/code/sdk/application/wearable/evb/nativeapp/nativeui/include/recent_app/RollerRecentAppFragment.h
new file mode 100644 (file)
index 0000000..2d2fc15
--- /dev/null
@@ -0,0 +1,43 @@
+/*
+ * Copyright (c) CompanyNameMagicTag 2025-2025. All rights reserved.
+ * Description: RollerRecentAppFragment.h
+ * Author:
+ * Create: 2025-07-17
+ */
+
+#ifndef ROLLER_RECENT_APP_FRAGMENT_H
+#define ROLLER_RECENT_APP_FRAGMENT_H
+
+#include <string>
+#include "animator/animator.h"
+#include "components/ui_fragment.h"
+#include "components/ui_label.h"
+#include "components/ui_label_button.h"
+#include "components/ui_roller_view.h"
+#include "gfx_utils/vector.h"
+
+namespace OHOS {
+static constexpr const char* RECENT_APP_DELETE_BTN_ID = "RecentAppDeleteBtn";
+static std::string RECENT_ITEM_NATIVE_PREFIX = "NA_";
+static std::string RECENT_ITEM_JS_PREFIX = "JS_";
+static constexpr const uint8_t RECENT_ITEM_PREFIX_LEN = 3;
+
+class RollerRecentAppFragment : public UIFragment, public UIView::OnClickListener {
+public:
+    bool OnClick(UIView &view, const ClickEvent &event) override;
+
+protected:
+    void OnCreateView(void* data) override;
+    void OnDestroyView() override;
+
+private:
+    void LoadRecentAppContent();
+    void InitRecentApps();
+    void AddRecentAppToRoller();
+
+    UILabel* noRecentAppLabel_ = nullptr;
+    UIRollerView* rollerContainer_ = nullptr;
+    UILabelButton* delBtn_ = nullptr;
+};
+} // namespace OHOS
+#endif // ROLLER_RECENT_APP_FRAGMENT_H
\ No newline at end of file
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/include/recent_app/SlipFlowRecentAppFragment.h b/code/sdk/application/wearable/evb/nativeapp/nativeui/include/recent_app/SlipFlowRecentAppFragment.h
new file mode 100644 (file)
index 0000000..9fdfec7
--- /dev/null
@@ -0,0 +1,49 @@
+/*
+ * Copyright (c) CompanyNameMagicTag 2025-2025. All rights reserved.
+ * Description: SlipFlowRecentAppFragment.h
+ * Author:
+ * Create: 2025-07-17
+ */
+
+#ifndef SLIPFLOW_RECENT_APP_FRAGMENT_H
+#define SLIPFLOW_RECENT_APP_FRAGMENT_H
+
+#include <string>
+#include "animator/animator.h"
+#include "components/ui_fragment.h"
+#include "components/ui_label.h"
+#include "components/ui_label_button.h"
+#include "components/ui_slipflow_view.h"
+#include "gfx_utils/vector.h"
+
+namespace OHOS {
+static std::string RECENT_ITEM_NATIVE_PREFIX = "NA_";
+static std::string RECENT_ITEM_JS_PREFIX = "JS_";
+static constexpr const uint8_t RECENT_ITEM_PREFIX_LEN = 3;
+
+class SlipFlowRecentAppFragment : public UIFragment, public UIView::OnClickListener,
+                                  public UISlipflowView::OnSlipflowScrollListener {
+public:
+    bool OnClick(UIView &view, const ClickEvent &event) override;
+    void OnScrollUpStart() override;
+    void OnScrollUpEnd() override;
+    bool OnRemove(UIView* view) override;
+
+protected:
+    void OnCreateView(void* data) override;
+    void OnDestroyView() override;
+
+private:
+    void LoadRecentAppContent();
+    void InitRecentApps();
+    void AddRecentAppToSlipFlow();
+    void AddImageToSlipFlow(int index);
+
+    UILabel* noRecentAppLabel_ = nullptr;
+    UISlipflowView* slipFlowContainer_ = nullptr;
+    UILabel* slipUpNoticeLabel_ = nullptr;
+    Graphic::Vector<std::string> appNames_;
+    Graphic::Vector<ImageInfo*> appImgInfos_;
+};
+} // namespace OHOS
+#endif // SLIPFLOW_RECENT_APP_FRAGMENT_H
\ No newline at end of file
index 16595d2..8950372 100644 (file)
@@ -1,19 +1,18 @@
-/*
- * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved.
- * Description: SettingPresenter.h
- * Author:
- * Create: 2021-11-23
- */
-
-#ifndef SETTING_PRESENTER_H
-#define SETTING_PRESENTER_H
-
-#include "Presenter.h"
-
-namespace OHOS {
-class SettingView;
-class SettingPresenter : public Presenter<SettingView> {
-};
-}
-
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SettingPresenter\r
+ * Create: 2025-06-01\r
+ */\r
+#ifndef SETTING_PRESENTER_H\r
+#define SETTING_PRESENTER_H\r
+\r
+#include "Presenter.h"\r
+\r
+namespace OHOS {\r
+class SettingView;\r
+class SettingPresenter : public Presenter<SettingView> {\r
+public:\r
+    virtual ~SettingPresenter();\r
+};\r
+}\r
 #endif // SETTING_PRESENTER_H
\ No newline at end of file
index 2f79acf..b8e7dc9 100644 (file)
@@ -1,22 +1,16 @@
-/*
- * Copyright (c) CompanyNameMagicTag 2025. All rights reserved.
- * Description: SettingPage.h
- * Author:
- * Create: 2025-04-14
- */
-
-#ifndef SETTING_VIEW_H
-#define SETTING_VIEW_H
-
-#include "View.h"
-namespace OHOS {
-enum SETTING_PAGES {
-    SETTING_MAIN_PAGE = 1, // 0 is invalid
-    SETTING_DESKTOP_PAGE = 2,
-};
-
-class SettingPresenter;
-class SettingView : public View<SettingPresenter> {
-};
-}
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SettingView\r
+ * Create: 2025-06-01\r
+ */\r
+#ifndef SETTING_VIEW_H\r
+#define SETTING_VIEW_H\r
+\r
+#include "View.h"\r
+\r
+namespace OHOS {\r
+class SettingPresenter;\r
+class SettingView : public View<SettingPresenter> {\r
+};\r
+}\r
 #endif // SETTING_VIEW_H
\ No newline at end of file
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/include/settings/common/SettingBluetoothItemGroup.h b/code/sdk/application/wearable/evb/nativeapp/nativeui/include/settings/common/SettingBluetoothItemGroup.h
new file mode 100644 (file)
index 0000000..2d51066
--- /dev/null
@@ -0,0 +1,40 @@
+/*
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.
+ * Description: SettingBluetoothItemGroup
+ * Created: 2025-06-05
+ */
+#ifndef SETTING_BLUETOOTH_ITEM_GROUP_H
+#define SETTING_BLUETOOTH_ITEM_GROUP_H
+
+#include "components/ui_label.h"
+#include "components/ui_view_group.h"
+#include "components/ui_image_view.h"
+#include "components/ui_canvas.h"
+#include "UiConfig.h"
+#include "bts_def.h"
+#include "bts_br_gap.h"
+#include "settings/model/SettingBluetoothModel.h"
+
+namespace OHOS {
+
+class SettingBluetoothItemGroup : public UIViewGroup {
+public:
+    explicit SettingBluetoothItemGroup();
+    ~SettingBluetoothItemGroup() override;
+    void SetItemInfo(const BtCaseInfo* itemInfo);
+    void SetUpChild();
+    BtCaseInfo& GetItem();
+private:
+    UIImageView background_;
+    UIImageView icon_;
+    UIImageView conn_;
+    UILabel deviceName_;
+    unsigned char addr_[BD_ADDR_LEN];
+    UILabel connectStatus_;
+    uint32_t index_;
+    int16_t temp_;
+    BtCaseInfo itemInfo_ = {{}, {}, "", 0};
+};
+}
+
+#endif
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/include/settings/common/SettingCardAddItemGroup.h b/code/sdk/application/wearable/evb/nativeapp/nativeui/include/settings/common/SettingCardAddItemGroup.h
new file mode 100644 (file)
index 0000000..dbaf092
--- /dev/null
@@ -0,0 +1,30 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SettingCardAddItemGroup\r
+ * Create: 2025-06-01\r
+ */\r
+#ifndef SETTING_CARD_ADD_ITEM_GROUP_H\r
+#define SETTING_CARD_ADD_ITEM_GROUP_H\r
+\r
+#include "components/ui_view_group.h"\r
+#include "components/ui_image_view.h"\r
+#include "components/ui_button.h"\r
+#include "UiConfig.h"\r
+#include "settings/common/SettingCommon.h"\r
+#include "settings/common/SettingCardMgrItemGroup.h"\r
+\r
+namespace OHOS {\r
+class SettingCardAddItemGroup : public ItemGroupImageCache,\r
+                                public UIViewGroup {\r
+public:\r
+    explicit SettingCardAddItemGroup();\r
+    virtual ~SettingCardAddItemGroup();\r
+    void UpdateItemGroup(SettingCardItemData* itemData);\r
+private:\r
+    const char*   imageSrc_ = nullptr;\r
+    ImageInfo*    imageData_ = nullptr;\r
+    UIImageView   image_;\r
+    UIButton      button_;\r
+};\r
+}\r
+#endif
\ No newline at end of file
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/include/settings/common/SettingCardEffectItemGroup.h b/code/sdk/application/wearable/evb/nativeapp/nativeui/include/settings/common/SettingCardEffectItemGroup.h
new file mode 100644 (file)
index 0000000..5f0a869
--- /dev/null
@@ -0,0 +1,46 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SettingCardEffectItemGroup\r
+ * Create: 2025-04\r
+ */\r
+#ifndef SETTING_CARD_EFFECT_ITEM_GROUP_H\r
+#define SETTING_CARD_EFFECT_ITEM_GROUP_H\r
+\r
+#include "components/ui_label.h"\r
+#include "components/ui_view_group.h"\r
+#include "components/ui_image_view.h"\r
+#include "components/ui_image_animator.h"\r
+#include "SettingCardEffectSample.h"\r
+\r
+namespace OHOS {\r
+class SettingCardEffectItemGroup : public UIViewGroup {\r
+public:\r
+    explicit SettingCardEffectItemGroup();\r
+    ~SettingCardEffectItemGroup() override;\r
+    virtual void SetItemInfo(const SettingCardEffectSample& leftItemInfo,\r
+        const SettingCardEffectSample& rightItemInfo);\r
+    virtual void SetUpChild();\r
+    CardEffectID GetViewId(const ClickEvent& event);\r
+    void SelectedChange();\r
+    void Reset();\r
+private:\r
+    void InitializeAnimator(UIImageAnimatorView& animator, int x, int y, int size);\r
+    void InitializeIcon(UIImageView& icon, int x, int y, int size);\r
+    void InitializeLabel(UILabel& label, int x, int y, int width, int height);\r
+    bool LoadMultiImages(SettingCardEffectSample& itemInfo, bool right);\r
+\r
+    UIImageAnimatorView leftAnimator_;\r
+    UILabel leftLabel_;\r
+    UIImageView leftSelectIcon_;\r
+    UIImageView leftPreviewIcon_;\r
+\r
+    UIImageAnimatorView rightAnimator_;\r
+    UILabel rightLabel_;\r
+    UIImageView rightSelectIcon_;\r
+    UIImageView rightPreviewIcon_;\r
+\r
+    SettingCardEffectSample leftItemInfo_;\r
+    SettingCardEffectSample rightItemInfo_;\r
+};\r
+}\r
+#endif\r
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/include/settings/common/SettingCardEffectResourceImage.h b/code/sdk/application/wearable/evb/nativeapp/nativeui/include/settings/common/SettingCardEffectResourceImage.h
new file mode 100644 (file)
index 0000000..b7563f0
--- /dev/null
@@ -0,0 +1,181 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SettingCardEffectResourceImage\r
+ * Create: 2025-04\r
+ */\r
+#ifndef SETTING_CARD_EFFECT_RESOURCE_IMAGE_H\r
+#define SETTING_CARD_EFFECT_RESOURCE_IMAGE_H\r
+#include <cstdint>\r
+#include <vector>\r
+#include "ui_resource_settings.h"\r
+\r
+namespace OHOS {\r
+    static std::vector<int> UI_3D_FOLD_RESIDS = {\r
+        IMAGE_TRAINSTION_START,\r
+        IMAGE_3D_FOLD_01,\r
+        IMAGE_3D_FOLD_02,\r
+        IMAGE_3D_FOLD_03,\r
+        IMAGE_3D_FOLD_04,\r
+        IMAGE_3D_FOLD_05,\r
+        IMAGE_3D_FOLD_06,\r
+        IMAGE_3D_FOLD_07,\r
+        IMAGE_3D_FOLD_08,\r
+        IMAGE_3D_FOLD_09,\r
+        IMAGE_3D_FOLD_10,\r
+        IMAGE_TRAINSTION_END,\r
+        IMAGE_TRAINSTION_END,\r
+        IMAGE_TRAINSTION_END,\r
+        IMAGE_3D_FOLD_10,\r
+        IMAGE_3D_FOLD_09,\r
+        IMAGE_3D_FOLD_08,\r
+        IMAGE_3D_FOLD_07,\r
+        IMAGE_3D_FOLD_06,\r
+        IMAGE_3D_FOLD_05,\r
+        IMAGE_3D_FOLD_04,\r
+        IMAGE_3D_FOLD_03,\r
+        IMAGE_3D_FOLD_02,\r
+        IMAGE_3D_FOLD_01,\r
+        IMAGE_TRAINSTION_START,\r
+    };\r
+\r
+    static std::vector<int> UI_CARD_FLIP_RESIDS = {\r
+        IMAGE_TRAINSTION_START,\r
+        IMAGE_CARD_FLIP_01,\r
+        IMAGE_CARD_FLIP_02,\r
+        IMAGE_CARD_FLIP_03,\r
+        IMAGE_CARD_FLIP_04,\r
+        IMAGE_CARD_FLIP_05,\r
+        IMAGE_CARD_FLIP_06,\r
+        IMAGE_CARD_FLIP_07,\r
+        IMAGE_CARD_FLIP_08,\r
+        IMAGE_CARD_FLIP_09,\r
+        IMAGE_CARD_FLIP_10,\r
+        IMAGE_TRAINSTION_END,\r
+        IMAGE_TRAINSTION_END,\r
+        IMAGE_TRAINSTION_END,\r
+        IMAGE_CARD_FLIP_10,\r
+        IMAGE_CARD_FLIP_09,\r
+        IMAGE_CARD_FLIP_08,\r
+        IMAGE_CARD_FLIP_07,\r
+        IMAGE_CARD_FLIP_06,\r
+        IMAGE_CARD_FLIP_05,\r
+        IMAGE_CARD_FLIP_04,\r
+        IMAGE_CARD_FLIP_03,\r
+        IMAGE_CARD_FLIP_02,\r
+        IMAGE_CARD_FLIP_01,\r
+        IMAGE_TRAINSTION_START,\r
+    };\r
+\r
+    static std::vector<int> UI_PUSH_PRESS_RESIDS = {\r
+        IMAGE_TRAINSTION_START,\r
+        IMAGE_PUSH_PRESS_01,\r
+        IMAGE_PUSH_PRESS_02,\r
+        IMAGE_PUSH_PRESS_03,\r
+        IMAGE_PUSH_PRESS_04,\r
+        IMAGE_PUSH_PRESS_05,\r
+        IMAGE_PUSH_PRESS_06,\r
+        IMAGE_PUSH_PRESS_07,\r
+        IMAGE_PUSH_PRESS_08,\r
+        IMAGE_PUSH_PRESS_09,\r
+        IMAGE_PUSH_PRESS_10,\r
+        IMAGE_TRAINSTION_END,\r
+        IMAGE_TRAINSTION_END,\r
+        IMAGE_TRAINSTION_END,\r
+        IMAGE_PUSH_PRESS_10,\r
+        IMAGE_PUSH_PRESS_09,\r
+        IMAGE_PUSH_PRESS_08,\r
+        IMAGE_PUSH_PRESS_07,\r
+        IMAGE_PUSH_PRESS_06,\r
+        IMAGE_PUSH_PRESS_05,\r
+        IMAGE_PUSH_PRESS_04,\r
+        IMAGE_PUSH_PRESS_03,\r
+        IMAGE_PUSH_PRESS_02,\r
+        IMAGE_PUSH_PRESS_01,\r
+        IMAGE_TRAINSTION_START,\r
+    };\r
+\r
+    static std::vector<int> UI_TURN_PAGE_RESIDS = {\r
+        IMAGE_TRAINSTION_START,\r
+        IMAGE_TURN_PAGE_01,\r
+        IMAGE_TURN_PAGE_02,\r
+        IMAGE_TURN_PAGE_03,\r
+        IMAGE_TURN_PAGE_04,\r
+        IMAGE_TURN_PAGE_05,\r
+        IMAGE_TURN_PAGE_06,\r
+        IMAGE_TURN_PAGE_07,\r
+        IMAGE_TURN_PAGE_08,\r
+        IMAGE_TURN_PAGE_09,\r
+        IMAGE_TURN_PAGE_10,\r
+        IMAGE_TRAINSTION_END,\r
+        IMAGE_TRAINSTION_END,\r
+        IMAGE_TRAINSTION_END,\r
+        IMAGE_TURN_PAGE_10,\r
+        IMAGE_TURN_PAGE_09,\r
+        IMAGE_TURN_PAGE_08,\r
+        IMAGE_TURN_PAGE_07,\r
+        IMAGE_TURN_PAGE_06,\r
+        IMAGE_TURN_PAGE_05,\r
+        IMAGE_TURN_PAGE_04,\r
+        IMAGE_TURN_PAGE_03,\r
+        IMAGE_TURN_PAGE_02,\r
+        IMAGE_TURN_PAGE_01,\r
+        IMAGE_TRAINSTION_START,\r
+    };\r
+\r
+    static std::vector<int> UI_WINDMILL_RESIDS = {\r
+        IMAGE_TRAINSTION_START,\r
+        IMAGE_WINDMILL_01,\r
+        IMAGE_WINDMILL_02,\r
+        IMAGE_WINDMILL_03,\r
+        IMAGE_WINDMILL_04,\r
+        IMAGE_WINDMILL_05,\r
+        IMAGE_WINDMILL_06,\r
+        IMAGE_WINDMILL_07,\r
+        IMAGE_WINDMILL_08,\r
+        IMAGE_WINDMILL_09,\r
+        IMAGE_WINDMILL_10,\r
+        IMAGE_TRAINSTION_END,\r
+        IMAGE_TRAINSTION_END,\r
+        IMAGE_TRAINSTION_END,\r
+        IMAGE_WINDMILL_10,\r
+        IMAGE_WINDMILL_09,\r
+        IMAGE_WINDMILL_08,\r
+        IMAGE_WINDMILL_07,\r
+        IMAGE_WINDMILL_06,\r
+        IMAGE_WINDMILL_05,\r
+        IMAGE_WINDMILL_04,\r
+        IMAGE_WINDMILL_03,\r
+        IMAGE_WINDMILL_02,\r
+        IMAGE_WINDMILL_01,\r
+        IMAGE_TRAINSTION_START,\r
+    };\r
+\r
+    static std::vector<int> UI_ZOOM_RESIDS = {\r
+        IMAGE_TRAINSTION_START,\r
+        IMAGE_ZOOM_01,\r
+        IMAGE_ZOOM_02,\r
+        IMAGE_ZOOM_03,\r
+        IMAGE_ZOOM_04,\r
+        IMAGE_ZOOM_05,\r
+        IMAGE_ZOOM_06,\r
+        IMAGE_ZOOM_07,\r
+        IMAGE_ZOOM_08,\r
+        IMAGE_ZOOM_09,\r
+        IMAGE_ZOOM_10,\r
+        IMAGE_TRAINSTION_END,\r
+        IMAGE_TRAINSTION_END,\r
+        IMAGE_TRAINSTION_END,\r
+        IMAGE_ZOOM_10,\r
+        IMAGE_ZOOM_09,\r
+        IMAGE_ZOOM_08,\r
+        IMAGE_ZOOM_07,\r
+        IMAGE_ZOOM_06,\r
+        IMAGE_ZOOM_05,\r
+        IMAGE_ZOOM_04,\r
+        IMAGE_ZOOM_03,\r
+        IMAGE_ZOOM_02,\r
+        IMAGE_ZOOM_01,\r
+        IMAGE_TRAINSTION_START,\r
+    };\r
+} // OHOS\r
+#endif\r
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/include/settings/common/SettingCardEffectSample.h b/code/sdk/application/wearable/evb/nativeapp/nativeui/include/settings/common/SettingCardEffectSample.h
new file mode 100644 (file)
index 0000000..d673759
--- /dev/null
@@ -0,0 +1,42 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SettingCardEffectSample\r
+ * Create: 2025-04\r
+ */\r
+#ifndef SETTING_CARD_EFFECT_SAMPLE_H\r
+#define SETTING_CARD_EFFECT_SAMPLE_H\r
+#include <cstdint>\r
+#include <vector>\r
+\r
+namespace OHOS {\r
+enum class CardEffectID {\r
+    UI_INVALIDE = -1,\r
+    UI_ZOOM = 0,\r
+    UI_CARD_FLIP = 1,\r
+    UI_CUBE = 2,\r
+    UI_TURN_PAGE = 3,\r
+    UI_PUSH_PRESS = 4,\r
+    UI_WINDMILL = 5,\r
+};\r
+\r
+struct SettingCardEffectSample {\r
+    CardEffectID viewId;\r
+    std::vector<int> resIds;\r
+    const char* label;\r
+    int backgroundImageId;\r
+    const char* resourceImage;\r
+    bool selected;\r
+\r
+    explicit SettingCardEffectSample(CardEffectID viewId = CardEffectID::UI_INVALIDE, std::vector<int> resIds = {},\r
+               const char* label = nullptr, const int backgroundImageId = 0, const char* resourceImage = nullptr,\r
+               bool selected = false)\r
+        : viewId(viewId),\r
+          resIds(std::move(resIds)),\r
+          label(label),\r
+          backgroundImageId(backgroundImageId),\r
+          resourceImage(resourceImage),\r
+          selected(selected)\r
+    {}\r
+};\r
+}\r
+#endif
\ No newline at end of file
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/include/settings/common/SettingCardMgrItemGroup.h b/code/sdk/application/wearable/evb/nativeapp/nativeui/include/settings/common/SettingCardMgrItemGroup.h
new file mode 100644 (file)
index 0000000..2702b7b
--- /dev/null
@@ -0,0 +1,33 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SettingCardMgrItemGroup\r
+ * Create: 2025-06-01\r
+ */\r
+#ifndef SETTING_CARD_MGR_ITEM_GROUP_H\r
+#define SETTING_CARD_MGR_ITEM_GROUP_H\r
+\r
+#include "components/ui_view_group.h"\r
+#include "components/ui_image_view.h"\r
+#include "UiConfig.h"\r
+\r
+namespace OHOS {\r
+struct SettingCardItemData {\r
+    uint8_t index;\r
+    uint8_t id;\r
+    const char* image = nullptr;\r
+    bool isSelect;\r
+    void* contextPtr = nullptr;\r
+};\r
+\r
+class SettingCardMgrItemGroup : public UIViewGroup {\r
+public:\r
+    explicit SettingCardMgrItemGroup();\r
+    virtual ~SettingCardMgrItemGroup() override;\r
+    void UpdateItemGroup(SettingCardItemData* itemData);\r
+private:\r
+    const char*   imageSrc_ = nullptr;\r
+    ImageInfo*    imageData_ = nullptr;\r
+    UIImageView   image_;\r
+};\r
+}\r
+#endif
\ No newline at end of file
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/include/settings/common/SettingCommon.h b/code/sdk/application/wearable/evb/nativeapp/nativeui/include/settings/common/SettingCommon.h
new file mode 100644 (file)
index 0000000..95f92a5
--- /dev/null
@@ -0,0 +1,90 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SettingCommon\r
+ * Create: 2025-06-01\r
+ */\r
+#ifndef SETTING_COMMON_H\r
+#define SETTING_COMMON_H\r
+\r
+#include <cstdint>\r
+#include <vector>\r
+#include "gfx_utils/vector.h"\r
+#include "components/ui_view.h"\r
+#include "components/ui_toggle_button.h"\r
+#include "common/image_cache_manager.h"\r
+#include "wearable_log.h"\r
+#include "AppViewIDs.h"\r
+#include "UiConfig.h"\r
+#include "ui_resource_settings.h"\r
+\r
+namespace OHOS {\r
+enum SettingPageId : uint16_t {\r
+    INVAILPAGE = 0,                     // 无效页面\r
+    MAIN_PAGE = 1,                      // 主页面\r
+    BLUETOOTH_PAGE = 2,                 // 蓝牙界面\r
+    DISPLAY_PAGE  = 3,                  // 显示与亮度界面\r
+    DESKTOP_PAGE = 4,                   // 表盘与桌面界面\r
+    POWER_PAGE = 5,                     // 电池界面\r
+    CARD_PAGE = 6,                      // 卡片界面\r
+    SYSTEM_PAGE = 7,                    // 系统与升级界面\r
+    ABOUT_PAGE = 8,                     // 关于界面\r
+    DISPLAY_BRIGHTNESS_PAGE = 9,        // 显示与亮度 调节亮度界面\r
+    DISPLAY_SCREEN_OFF_PAGE = 10,       // 显示与亮度 熄屏时间界面\r
+    DISPLAY_STEADY_ON_PAGE = 11,        // 显示与亮度 长亮时刻界面\r
+    DESKTOP_HOME_PAGE = 12,             // 表盘与桌面 桌面界面\r
+    DESKTOP_DIAL_PAGE = 13,             // 表盘与桌面 表盘界面\r
+    DESKTOP_DIAL_STYLE_PAGE = 14,       // 表盘与桌面 表盘风格界面\r
+    CARD_EFFECT_PAGE = 15,              // 卡片管理   卡片动效页面\r
+    CARD_MGR_PAGE = 16,                 // 卡片管理   卡片管理页面\r
+    CARD_ADD_PAGE = 17,                 // 卡片管理   卡片添加页面\r
+    SYSTEM_OPERATION_PAGE = 18,         // 系统与升级 关机、重启、恢复出厂设置界面\r
+    SYSTEM_OTA_PAGE = 19,               // 系统与升级 OTA界面\r
+    CONNECT_NEW_PHONE_PAGE = 20,        // 蓝牙  连接新手机界面\r
+    CONNECT_OPEN_PAGE = 21,             // 蓝牙  连接新手机连接已打开界面\r
+    CONNECT_BLUE_SUCCESS_PAGE = 22,     // 蓝牙  连接耳机蓝牙成功界面\r
+    CONNECT_BLUE_FAIL_PAGE = 23,        // 蓝牙  连接耳机蓝牙失败界面\r
+    RECONNECTION_PAGE = 24,             // 蓝牙  重连耳机和取消配对界面\r
+    RECONNECT_SECOND_CONFIRM_PAGE = 25, // 蓝牙  重连耳机二次确认界面\r
+    UNPAIR_SECOND_CONFIRM_PAGE = 26,    // 蓝牙  取消配对耳机二次确认界面\r
+    QRCODE_CONN_PAGE = 27,              // 蓝牙  二维码连接\r
+};\r
+\r
+#define SETTING_LIST_DEFAULT_BG_COLOR    Color::GetColorFromRGB(32, 32, 32)     // 0xFF202020\r
+#define SETTING_LIST_BLUETOOTH_BG_COLOR  Color::GetColorFromRGB(2, 142, 247)    // 0xFF028EF7\r
+#define SETTING_LIST_DISPLAY_BG_COLOR    Color::GetColorFromRGB(253, 200, 42)   // 0xFFFDC82A\r
+#define SETTING_LIST_DESKTOP_BG_COLOR    Color::GetColorFromRGB(98, 87, 251)    // 0xFF6257FB\r
+#define SETTING_LIST_POWER_BG_COLOR      Color::GetColorFromRGB(102, 192, 94)   // 0xFF66C05\r
+#define SETTING_LIST_CARD_BG_COLOR       Color::GetColorFromRGB(255, 128, 102)  // 0xFFFF8066\r
+#define SETTING_LIST_SYSTEM_BG_COLOR     Color::GetColorFromRGB(0, 210, 185)    // 0xFF00D2B9\r
+#define SETTING_LIST_ABOUT_BG_COLOR      Color::GetColorFromRGB(255, 255, 255)  // 0xFFFFFFFF\r
+\r
+#define SETTING_LIST_DEFAULT_BG_COLOR_OPA   255 // 100%\r
+#define SETTING_LIST_BLUETOOTH_BG_COLOR_OPA 63  // 24.61\r
+#define SETTING_LIST_DISPLAY_BG_COLOR_OPA   63  // 24.85%\r
+#define SETTING_LIST_DESKTOP_BG_COLOR_OPA   65  // 25.42%\r
+#define SETTING_LIST_POWER_BG_COLOR_OPA     65  // 25.33%\r
+#define SETTING_LIST_CARD_BG_COLOR_OPA      64  // 25.24%\r
+#define SETTING_LIST_SYSTEM_BG_COLOR_OPA    63  // 24.66%\r
+#define SETTING_LIST_ABOUT_BG_COLOR_OPA     38  // 14.85%\r
+\r
+// 记录ItemGroup类中所有加载过的图片, 确保所有图片资源释放\r
+class ItemGroupImageCache {\r
+public:\r
+    inline virtual ~ItemGroupImageCache()\r
+    {\r
+        for (auto imageId: imageIdList) {\r
+            ImageCacheManager::GetInstance().UnloadOneInMultiRes(imageId, SETTING_IMAGE);\r
+        }\r
+    }\r
+\r
+    inline ImageInfo* CacheImage(uint32_t imageId)\r
+    {\r
+        imageIdList.push_back(imageId);\r
+        return ImageCacheManager::GetInstance().LoadOneInMultiRes(imageId, SETTING_IMAGE);\r
+    }\r
+private:\r
+    std::vector<uint32_t> imageIdList;\r
+};\r
+\r
+}\r
+#endif
\ No newline at end of file
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/include/settings/common/SettingDesktopHomeItemGroup.h b/code/sdk/application/wearable/evb/nativeapp/nativeui/include/settings/common/SettingDesktopHomeItemGroup.h
new file mode 100644 (file)
index 0000000..2cf1fc4
--- /dev/null
@@ -0,0 +1,37 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SettingDesktopHomeItemGroup\r
+ * Create: 2025-06-01\r
+ */\r
+#ifndef SETTING_DESKTOP_HOME_ITEM_GROUP_H\r
+#define SETTING_DESKTOP_HOME_ITEM_GROUP_H\r
+\r
+#include "components/ui_view_group.h"\r
+#include "components/ui_image_view.h"\r
+#include "components/ui_label.h"\r
+#include "components/ui_radio_button.h"\r
+#include "settings/common/SettingCommon.h"\r
+\r
+namespace OHOS {\r
+struct SettingDesktopHomeItemData {\r
+    uint8_t style;         // 风格\r
+    uint32_t selectIcon;   // 选中图标\r
+    uint32_t unSelectIcon; // 未选中图标\r
+    const char* label;     // 文本内容\r
+    bool isSelect;         // 是否选中\r
+    void* contextPtr;      // 上下文指针,内部使用\r
+};\r
+\r
+class SettingDesktopHomeItemGroup : public ItemGroupImageCache,\r
+                                    public UIViewGroup {\r
+public:\r
+    explicit SettingDesktopHomeItemGroup();\r
+    ~SettingDesktopHomeItemGroup() override;\r
+    void UpdateItemGroup(SettingDesktopHomeItemData* itemData);\r
+private:\r
+    UIImageView   image_;\r
+    UILabel       label_;\r
+    UIRadioButton button_;\r
+};\r
+}\r
+#endif
\ No newline at end of file
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/include/settings/common/SettingRefSingleton.h b/code/sdk/application/wearable/evb/nativeapp/nativeui/include/settings/common/SettingRefSingleton.h
new file mode 100644 (file)
index 0000000..1e07c6e
--- /dev/null
@@ -0,0 +1,25 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SettingRefSingleton\r
+ * Create: 2025-06-01\r
+ */\r
+#ifndef SETTING_REF_SINGLETON_H\r
+#define SETTING_REF_SINGLETON_H\r
+\r
+namespace OHOS {\r
+template<typename T>\r
+class SettingRefSingleton {\r
+public:\r
+    static T& GetInstance()\r
+    {\r
+        static T instance;\r
+        return instance;\r
+    }\r
+protected:\r
+    SettingRefSingleton() = default;\r
+    virtual ~SettingRefSingleton() = default;\r
+    SettingRefSingleton(const SettingRefSingleton&) = delete;\r
+    SettingRefSingleton& operator=(const SettingRefSingleton&) = delete;\r
+};\r
+} // OHOS\r
+#endif
\ No newline at end of file
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/include/settings/common/SettingToggleButton.h b/code/sdk/application/wearable/evb/nativeapp/nativeui/include/settings/common/SettingToggleButton.h
new file mode 100644 (file)
index 0000000..730ba75
--- /dev/null
@@ -0,0 +1,38 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SettingToggleButton\r
+ * Create: 2025-06-01\r
+ */\r
+#ifndef SETTING_TOGGLE_BUTTON_H\r
+#define SETTING_TOGGLE_BUTTON_H\r
+\r
+#include "components/ui_toggle_button.h"\r
+\r
+namespace OHOS {\r
+/*\r
+ * UIToggleButton的宽高比绑定, SettingToggleButton通过重写UIToggleButton的方法提供松散的宽高比\r
+ */\r
+class SettingToggleButton : public UIToggleButton {\r
+public:\r
+    SettingToggleButton();\r
+    virtual ~SettingToggleButton() = default;\r
+    void SetTrackPadding(int16_t padding);\r
+    void OnDraw(BufferInfo& gfxDstBuffer, const Rect& invalidatedArea) override;\r
+protected:\r
+    void CalculateSize() override;\r
+#if DEFAULT_ANIMATION\r
+    void Callback(UIView* view) override;\r
+    void OnStop(UIView& view) override;\r
+#endif\r
+private:\r
+    uint16_t trackCorner_ = 0;          // 轨道圆角半径\r
+    int16_t  trackPadding_ = 0;         // 轨道内边距\r
+    uint16_t thumbRadius_ = 0;          // 滑块半径\r
+    Point leftCenter_ = {0, 0};\r
+    Point rightCenter_ = {0, 0};\r
+    Point currentCenter_ = {0, 0};\r
+    ColorType bgColor_ = Color::White();\r
+    Rect rectMid_ = {0, 0, 0, 0};\r
+};\r
+}\r
+#endif\r
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/include/settings/common/SettingUnionItemGroup.h b/code/sdk/application/wearable/evb/nativeapp/nativeui/include/settings/common/SettingUnionItemGroup.h
new file mode 100644 (file)
index 0000000..0b5c7dd
--- /dev/null
@@ -0,0 +1,101 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SettingUnionItemGroup\r
+ * Create: 2025-06-01\r
+ */\r
+#ifndef SETTING_UNION_ITEM_GROUP_H\r
+#define SETTING_UNION_ITEM_GROUP_H\r
+\r
+#include <vector>\r
+#include <unordered_map>\r
+#include "components/ui_label.h"\r
+#include "components/ui_view_group.h"\r
+#include "components/ui_image_view.h"\r
+#include "UiConfig.h"\r
+#include "AppViewIDs.h"\r
+#include "settings/common/SettingCommon.h"\r
+#include "settings/common/SettingToggleButton.h"\r
+\r
+namespace OHOS {\r
+enum SettingUnionItemType : uint16_t {\r
+    PLAIN_TEXT,           // 纯文本类型的item\r
+    ICON_TEXT_TOGGLE,     // 按钮切换类型item\r
+    ICON_TEXT_NAVIGATION, // 页面切换类型item\r
+};\r
+\r
+struct PlainTextItemData {\r
+    const char* textContent;  // 文本内容\r
+};\r
+\r
+struct IconTextToggleItemData {\r
+    uint32_t icon;           // 图标\r
+    const char* textContent; // 文本内容\r
+    bool selected;           // 是否选择\r
+    ColorType bgColor;       // item背景色\r
+    uint8_t bgOpa;           // item背景透明度\r
+};\r
+\r
+struct IconTextNavigationItemData {\r
+    SettingPageId pageId;    // 页面ID\r
+    uint32_t icon;           // 图标\r
+    const char* textContent; // 固定文本内容\r
+    const char* dataContent; // 动态数据内容\r
+    bool hasSecondMenu;      // 是否有二级页面\r
+    ColorType bgColor;       // item背景色\r
+    uint8_t bgOpa;           // item背景透明度\r
+};\r
+\r
+class SettingUnionItemData {\r
+public:\r
+    SettingUnionItemType GetUnionItemType();\r
+    void* GetUnionItemData();\r
+    \r
+    // 新增加到union的data类型请在这里注册\r
+    SettingUnionItemData(const PlainTextItemData& itemData);\r
+    SettingUnionItemData(const IconTextToggleItemData& itemData);\r
+    SettingUnionItemData(const IconTextNavigationItemData& itemData);\r
+\r
+    // 新增加到union的data类型请在这里注册\r
+    union {\r
+        PlainTextItemData plainTextItemData;\r
+        IconTextToggleItemData iconTextToggleItemData;\r
+        IconTextNavigationItemData iconTextNavigationItemData;\r
+    } unionItemData_;\r
+private:\r
+    SettingUnionItemType type_;\r
+    void* contextPtr_ = nullptr; // 用于SimpleList的Create和Update静态函数中使用\r
+};\r
+\r
+class PlainTextItemView : public UIViewGroup, public ItemGroupImageCache {\r
+public:\r
+    explicit PlainTextItemView();\r
+    ~PlainTextItemView() override;\r
+    void UpdateViewData(PlainTextItemData* data);\r
+private:\r
+    UILabel label_;\r
+};\r
+\r
+class IconTextToggleItemView : public UIViewGroup, public ItemGroupImageCache {\r
+public:\r
+    explicit IconTextToggleItemView();\r
+    ~IconTextToggleItemView() override;\r
+    void UpdateViewData(IconTextToggleItemData* data);\r
+private:\r
+    UIImageView icon_;\r
+    UILabel label_;\r
+    SettingToggleButton toggleButton_;\r
+};\r
+\r
+class IconTextNavigationItemView : public UIViewGroup, public ItemGroupImageCache {\r
+public:\r
+    explicit IconTextNavigationItemView();\r
+    ~IconTextNavigationItemView() override;\r
+    void UpdateViewData(IconTextNavigationItemData* data);\r
+private:\r
+    UIImageView icon_;\r
+    UILabel textLabel_;\r
+    UILabel dataLabel_;\r
+    UIImageView nextImage_;\r
+};\r
+}\r
+#endif\r
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/include/settings/model/SettingAboutModel.h b/code/sdk/application/wearable/evb/nativeapp/nativeui/include/settings/model/SettingAboutModel.h
new file mode 100644 (file)
index 0000000..6c4fde5
--- /dev/null
@@ -0,0 +1,20 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SettingAboutModel\r
+ * Create: 2025-06-01\r
+ */\r
+#ifndef SETTING_ABOUT_MODEL_H\r
+#define SETTING_ABOUT_MODEL_H\r
+\r
+#include <cstdint>\r
+#include <string>\r
+#include "settings/common/SettingRefSingleton.h"\r
+\r
+namespace OHOS {\r
+class SettingAboutModel : public SettingRefSingleton<SettingAboutModel> {\r
+public:\r
+    std::string GetSystemName();\r
+    std::string GetSystemType();\r
+};\r
+} // OHOS\r
+#endif
\ No newline at end of file
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/include/settings/model/SettingBluetoothHeadsetEvent.h b/code/sdk/application/wearable/evb/nativeapp/nativeui/include/settings/model/SettingBluetoothHeadsetEvent.h
new file mode 100644 (file)
index 0000000..360a344
--- /dev/null
@@ -0,0 +1,45 @@
+/*
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.
+ * Description: SettingBluetoothHeadsetEvent.
+ */
+#ifndef SETTING_BLUETOOTH_HEADSET_EVENT_H
+#define SETTING_BLUETOOTH_HEADSET_EVENT_H
+
+#include "bts_def.h"
+#include "bts_br_gap.h"
+#include "td_type.h"
+#include "bt_audio.h"
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+enum {
+    SETTING_AVRCP_SRV_PRESS_VALUE,
+    SETTING_AVRCP_SRV_RELEASED_VALUE,
+    SETTING_AVRCP_SRV_INIT_VALUE
+};
+
+typedef struct {
+    td_pvoid stream_hdl;
+    uint8_t loc_volume;
+    uint8_t play_stat;
+    uint8_t dir_forward;
+    uint8_t avrcp_button_flag;
+    bd_addr_t bd_addr;
+    uint8_t reg_cap_auto;
+    uint8_t resrv;
+    profile_connect_state_t avrcp_srv_conn_stat;
+} SettingBtAvrcpTgInf;
+
+void SettingUsingPressButtonStatusCallback(td_u32 keyOperation, td_u32 keyValue);
+void SettingMediaStatusCallback(bt_avrcp_tg_evt_status_param *eventStatusParam);
+void SettingPressButtonStatusCallback(td_u32 keyOperation, td_u32 keyValue);
+void SettingConnCtStateChangedCallback(const bd_addr_t *bdAddr, profile_connect_state_t state);
+void SettingConnectTgStateChangedCallback(const bd_addr_t *bdAddr, profile_connect_state_t state);
+void SettingInitBtHeadsetEvent(void);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif // SETTING_BLUETOOTH_HEADSET_EVENT_H
\ No newline at end of file
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/include/settings/model/SettingBluetoothModel.h b/code/sdk/application/wearable/evb/nativeapp/nativeui/include/settings/model/SettingBluetoothModel.h
new file mode 100644 (file)
index 0000000..657f7c7
--- /dev/null
@@ -0,0 +1,130 @@
+/*
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.
+ * Description: SettingBuletoothModel
+ * Create: 2025-06-01
+ */
+#ifndef SETTING_BLUETOOTH_MODEL_H
+#define SETTING_BLUETOOTH_MODEL_H
+
+#include <string>
+#include <cstring>
+#include <list>
+#include <cstdio>
+#include "gfx_utils/list.h"
+#include "bts_def.h"
+#include "bts_br_gap.h"
+#include "settings/common/SettingUnionItemGroup.h"
+#include "settings/common/SettingRefSingleton.h"
+
+namespace OHOS {
+typedef struct {
+    unsigned char deviceName[BD_NAME_LEN]; /* Name of the device record, must be in UTF-8 */
+    unsigned char addr[BD_ADDR_LEN];
+    std::string connect_status;
+    int16_t rssi; // 蓝牙信号强弱
+} BtCaseInfo;
+
+typedef enum {
+    BT_MAIN_PAGE = 0,
+    RECONNECT_FRAGMENT,
+    RECONNECT_SECOND_CONFIRM_FRAGMENT,
+    UNPAIR_CONFIRM_FRAGMENT,
+    CONNECT_NEW_PHONE_FRAGMENT,
+    CONNECT_OPEN_FRAGMENT,
+    CONNECT_BLUETOOTH_SUCCESS_FRAGMENT,
+    CONNECT_BLUETOOTH_FAIL_FRAGMENT,
+} BtGroupId;
+
+class SettingBluetoothModel {
+public:
+    ~SettingBluetoothModel(){};
+    static SettingBluetoothModel *GetInstance(void);
+    void Init();
+    std::list<BtCaseInfo>& GetScansDevicesList(); // 获取扫描到的设备列表
+    void ScansDevicesListAddCase(BtCaseInfo caseInfo); // 设备列表新增数据
+    void SetScansCaseRssi(const bd_addr_t *bdAddr, int rssi); // 设置设备的信号值
+    void SortScansCaseRssi(); // 根据信号值对设备列表进行排序
+    void ClearScansDevicesList();
+    bool CheckExistScanList(BtCaseInfo caseInfo); // 去重检查
+    void ResetScanDevicesCase(const BtCaseInfo& caseInfo); // 刷新名称变化的设备信息
+    // 已配对蓝牙设备
+    void SetPairedDevicesListClear();
+    void AddPairedDevicesCase(BtCaseInfo caseInfo);
+    bool CheckExistPairedList(BtCaseInfo caseInfo);
+    List<BtCaseInfo>& GetPairedDevicesCase();
+    // 被选中的设备信息
+    void SetSelectedDeviceInfo(BtCaseInfo *caseInfo);
+    BtCaseInfo *GetSelectedDeviceInfo(void);
+    // 最后连接的设备地址
+    void SetLastConnedAddr(const bd_addr_t *addr);
+    bd_addr_t *GetLastConnedAddr(void);
+    void SetAclConnected(bool tag);
+    bool GetAclConnected(void);
+    void UpdateAclConnectStatus(bool status);
+    void SettingBtGapDiscoveryResultCallbakHandle(const bd_addr_t &bdAddr);
+    void SettingBtGapAclStateChangedHandle(gap_acl_state_t state, unsigned int reason, const bd_addr_t &bdAddr);
+    bool GetAdvStartState(void);
+    void SetAdvStartState(bool state);
+    int ConnectRemoteDevice(const bd_addr_t *addr);
+    bool ConnectRemoteCheck(const bd_addr_t *addr);
+    char* GetWatchName(void);
+    void ChangeBleConnectToMax();
+    void ChangeBleConnectToDefault();
+    // 耳机蓝牙连接状态
+    void SetBlueToothConnectStatus(bool status);
+    bool GetBlueToothConnectStatus();
+    void SetDeviceName(std::string deviceName_);
+    std::string GetDeviceName();
+    void SetEarPhoneListHasData(bool status);
+    uint32_t GetEarPhoneListHasData();
+    void MoveMatchingDeviceToFront();
+    //  更新UI上设备列表的信息
+    void UpdateConnectStatusForDevice();
+    void UpdateDisconnectStatusForDevice(const bd_addr_t &bdAddr);
+    void UpdateConnectedStatusForDevice(const bd_addr_t &bdAddr);
+    // 设置是否展示成功或失败的页面
+    void SetConnectResultPage(bool redirct);
+    bool GetConnectResultPage();
+    // 取消配对
+    void HandleUnpairRequest(void);
+    void AddNodeFromPairListToScanList(const bd_addr_t &bdAddr);
+    void SetConnectFragmentStatus(bool status);
+    bool GetConnectFragmentStatus();
+private:
+    SettingBluetoothModel();
+    void SetUpPairedDevicesList();
+    void InitBluetoothInfo(void);
+    bool aclConnected_{false};
+    BtCaseInfo selectedDeviceInfo_{};
+    bd_addr_t lastConnedAddr_{0};
+    bd_addr_t remoteConnectAddr_{0};
+    std::list<BtCaseInfo> btScansDevicesList_{};
+    List<BtCaseInfo> *btPairedDevicesList_{nullptr};
+    bool advStartState_{false};
+    char watchName_[BD_NAME_LEN] = { 0 };
+    bool btConnectStatus_{false};
+    std::string deviceName_;
+    uint32_t EarPhoneListHasData_ = 0;
+    bool redirct_ = false;
+    bool connectFragmentStatus_ = false;
+};
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+void SettingBtGapReadRemoteRssiEventCallback(const bd_addr_t *bdAddr, int rssi, int status);
+void SettingBtGapDiscoveryStateChangedCallback(int status);
+void SettingBtGapAclStateChangedCallback(const bd_addr_t *bdAddr, gap_acl_state_t state, unsigned int reason);
+void SettingBtRemoteNameChangedCallback(const bd_addr_t *bdAddr, const unsigned char *deviceName, unsigned char length);
+void SettingBtIsAcceptConnOnSafeModeCallback(const bd_addr_t *bd_addr, bool *res);
+void SettingBtInitCallBacks(void);
+void SettingBtInitCallBacksEx(void);
+void SettingBtInitGatts(void);
+void SettingBtInitSpp(void);
+void BleSettingAdvStart(void);
+#ifdef __cplusplus
+}
+#endif
+}
+
+#endif
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/include/settings/model/SettingCardModel.h b/code/sdk/application/wearable/evb/nativeapp/nativeui/include/settings/model/SettingCardModel.h
new file mode 100644 (file)
index 0000000..74127fa
--- /dev/null
@@ -0,0 +1,41 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SettingCardModel\r
+ * Create: 2025-06-01\r
+ */\r
+#ifndef SETTING_CARD_MODEL_H\r
+#define SETTING_CARD_MODEL_H\r
+\r
+#include <cstdint>\r
+#include <map>\r
+#include "settings/common/SettingCardEffectSample.h"\r
+#include "settings/common/SettingUnionItemGroup.h"\r
+#include "settings/common/SettingCardAddItemGroup.h"\r
+#include "settings/common/SettingCardMgrItemGroup.h"\r
+#include "settings/common/SettingRefSingleton.h"\r
+\r
+namespace OHOS {\r
+class SettingCardModel : public SettingRefSingleton<SettingCardModel> {\r
+public:\r
+    SettingCardModel();\r
+    std::vector<SettingUnionItemData>& GetCardUnionData();\r
+    std::vector<SettingCardItemData>& GetCardData();\r
+    void RefreshCardData();\r
+    void AddCard(uint8_t cardId);\r
+    void DeleteCard(uint8_t cardId);\r
+    void SetSelectedCard(uint8_t cardId);\r
+    uint8_t GetSelectedCard(void);\r
+    // 卡片动效\r
+    CardEffectID GetSwipeEffectStyle(void);\r
+    void SetSwipeEffectStyle(CardEffectID style);\r
+    void InitEffectItem(void);\r
+    std::map<CardEffectID, SettingCardEffectSample>& GetEffectListItems(void);\r
+private:\r
+    std::vector<SettingUnionItemData> cardUnionData_;\r
+    std::vector<SettingCardItemData> cardData_;\r
+    uint8_t selectedCardId_ = MAX_CARD;\r
+    std::map<CardEffectID, SettingCardEffectSample> effects_;\r
+    CardEffectID selectStyle_;\r
+};\r
+} // OHOS\r
+#endif
\ No newline at end of file
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/include/settings/model/SettingDesktopModel.h b/code/sdk/application/wearable/evb/nativeapp/nativeui/include/settings/model/SettingDesktopModel.h
new file mode 100644 (file)
index 0000000..70584d5
--- /dev/null
@@ -0,0 +1,85 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SettingDesktopModel\r
+ * Create: 2025-06-01\r
+ */\r
+#ifndef SETTING_DESKTOP_MODEL_H\r
+#define SETTING_DESKTOP_MODEL_H\r
+\r
+#include <cstdint>\r
+#include <string>\r
+#include "gfx_utils/image_info.h"\r
+#include "main/MainModel.h"\r
+#include "settings/common/SettingDesktopHomeItemGroup.h"\r
+#include "settings/common/SettingUnionItemGroup.h"\r
+#include "settings/common/SettingRefSingleton.h"\r
+\r
+typedef enum {\r
+    APPLIST_STYLE,\r
+    HEXAGONS_STYLE,\r
+    FOOTBALL_STYLE,\r
+    WATERFALL_STYLE,\r
+    PLANET_STYLE,\r
+    SPHERE_STYLE\r
+} DesktopStyle;\r
+\r
+namespace OHOS {\r
+typedef struct {\r
+    uint8_t     dialFlag;      /* 1:离线表盘 0:预制表盘 */\r
+    uint8_t     id;            /* 仅预制表盘使用 */\r
+    uint32_t    resId;         /* 仅离线表盘使用 */\r
+    std::string dialFullName;  /* 仅离线表盘使用 */\r
+    std::string imageFullName; /* 仅预制表盘使用 */\r
+    std::string dialName;\r
+    std::string description;   /* 仅离线表盘使用 */\r
+    ImageInfo*  preImageInfo;\r
+    uint8_t     capability;\r
+} SetDialInfo;\r
+\r
+enum class DialStyle {\r
+    COVERFLOW = 0,\r
+    ROLLER,\r
+    STYLE_NUM\r
+};\r
+\r
+class SettingDesktopModel : public SettingRefSingleton<SettingDesktopModel> {\r
+public:\r
+    SettingDesktopModel();\r
+    std::vector<SettingUnionItemData>& GetDesktopUnionData();\r
+    std::vector<SettingDesktopHomeItemData>& GetDesktopHomeData();\r
+    std::vector<SettingUnionItemData>& GetDialStyleUnionData();\r
+    void RefreshDialStyleUnionDataForStyle();\r
+    void RefreshDialStyleUnionDataForAod();\r
+    // 桌面\r
+    DesktopStyle GetDesktopStyle(void);\r
+    void SetDesktopStyle(DesktopStyle style);\r
+    uint8_t GetDesktopHomeDataSelect();\r
+    void SetDesktopHomeDataSelect(DesktopStyle style);\r
+    // 表盘风格\r
+    DialStyle GetDialStyle();\r
+    void SetDialStyle(DialStyle style);\r
+    void SetDialStyleDataSelect(const char* DialStyleName);\r
+    // 表盘\r
+    void LoadAllDial(void);\r
+    std::vector<SetDialInfo>& GetDialInfo(void);            // 表盘信息\r
+    std::vector<SetDialInfo>& GetAmbientDialInfo(void);     // 息屏显示表盘信息 AOD(always-on display)\r
+    void SaveDialSetting(uint8_t pageIndex);\r
+    void SetSpecifyDialSetting(const DialSetting &setting); // 设置指定的dial\r
+    void ClearDialInfo(void);\r
+    uint8_t GetPageIndex(void);\r
+protected:\r
+    void LoadAllDialFromRam();\r
+    void LoadAllDialFromFs();\r
+    int32_t ParseDialHeader(const std::string &dialFileName, SetDialInfo &dialInfo);\r
+private:\r
+    std::vector<SettingUnionItemData> desktopUnionData_;\r
+    std::vector<SettingDesktopHomeItemData> desktopHomeData_;\r
+    std::vector<SettingUnionItemData> dialStyleUnionData_;\r
+    std::vector<SetDialInfo> dialInfos_;\r
+    std::vector<SetDialInfo> aodDialInfos_;\r
+    bool hasSpecificDial_ = false;\r
+    DialSetting specificDialSetting_;\r
+};\r
+}\r
+\r
+#endif // SET_DESKTOP_MODEL_H
\ No newline at end of file
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/include/settings/model/SettingDisplayModel.h b/code/sdk/application/wearable/evb/nativeapp/nativeui/include/settings/model/SettingDisplayModel.h
new file mode 100644 (file)
index 0000000..775037f
--- /dev/null
@@ -0,0 +1,69 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SettingDisplayModel\r
+ * Create: 2025-06-01\r
+ */\r
+#ifndef SETTING_DISPLAY_MODEL_H\r
+#define SETTING_DISPLAY_MODEL_H\r
+\r
+#include <cstdint>\r
+#include "settings/common/SettingUnionItemGroup.h"\r
+#include "settings/common/SettingRefSingleton.h"\r
+\r
+namespace OHOS {\r
+// 息屏时间 (单位:ms)\r
+enum class ScreenOffTime : uint32_t {\r
+    SECONDS_5 = 5000u,\r
+    SECONDS_10 = 10000u,\r
+    SECONDS_15 = 15000u,\r
+    SECONDS_30 = 30000u,\r
+    MINUTE_1 = 60000u,\r
+    MINUTE_5 = 300000u,\r
+};\r
+\r
+// 常亮时间 (单位:ms)\r
+enum class SteadyOnTime : uint32_t {\r
+    MINUTE_5 = 300000u,\r
+    MINUTE_10 = 600000u,\r
+    MINUTE_20 = 1200000u,\r
+    MINUTE_30 = 1800000u,\r
+    HOUR_1 = 3600000u,\r
+    HOUR_2 = 7200000u,\r
+};\r
+\r
+class SettingDisplayModel : public SettingRefSingleton<SettingDisplayModel> {\r
+public:\r
+    SettingDisplayModel();\r
+    std::vector<SettingUnionItemData>& GetDisplayUnionData();\r
+    void RefreshDisplayUnionDataForAutoAdjustBrightness();\r
+    void RefreshDisPlayUnionDataForScreenOffDataContext();\r
+    void RefreshDisplayUnionDataForSteadyOnDataContext();\r
+    void InitDisplayModel();\r
+    void EnableSteadyOn();      // 打开常亮\r
+    void DisableSteadyOn();     // 关闭常亮\r
+    bool GetAutoAdjustBrightness();\r
+    uint8_t GetBrightness();\r
+    ScreenOffTime GetScreenOffTime();\r
+    SteadyOnTime GetSteadyOnTime();\r
+    void SetAutoAdjustBrightness(bool isAuto);\r
+    void SetBrightness(uint8_t brightness);\r
+    void SetScreenOffTime(ScreenOffTime blinkFrequency);\r
+    void SetSteadyOnTime(SteadyOnTime blinkFrequency);\r
+    const char** GetScreenOffTimeAllStr();\r
+    const char** GetSteadyOnTimeAllStr();\r
+    uint8_t GetScreenOffTimeAllStrSize();\r
+    uint8_t GetSteadyOnTimeAllStrSize();\r
+    uint8_t GetScreenOffTimeIndex();\r
+    uint8_t GetSteadyOnTimeIndex();\r
+    void SetScreenOffTimeIndex(uint8_t index);\r
+    void SetSteadyOnTimeIndex(uint8_t index);\r
+protected:\r
+    const char* GetScreenOffTimeShortStr(ScreenOffTime screenOffTime);\r
+    const char* GetSteadyOnTimeShortStr(SteadyOnTime steadyOnTime);\r
+    uint8_t TransBriValueToPercent(uint8_t value);\r
+    uint8_t TransBriPercentToValue(uint8_t percent);\r
+private:\r
+    std::vector<SettingUnionItemData> displayUnionData_;\r
+};\r
+} // OHOS\r
+#endif
\ No newline at end of file
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/include/settings/model/SettingMainModel.h b/code/sdk/application/wearable/evb/nativeapp/nativeui/include/settings/model/SettingMainModel.h
new file mode 100644 (file)
index 0000000..b45ff4d
--- /dev/null
@@ -0,0 +1,24 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SettingMainModel\r
+ * Create: 2025-06-01\r
+ */\r
+#ifndef SETTING_MAIN_MODEL_H\r
+#define SETTING_MAIN_MODEL_H\r
+\r
+#include <cstdint>\r
+#include "settings/common/SettingUnionItemGroup.h"\r
+#include "settings/common/SettingRefSingleton.h"\r
+\r
+namespace OHOS {\r
+class SettingMainModel : public SettingRefSingleton<SettingMainModel> {\r
+public:\r
+    SettingMainModel();\r
+    void InitSettingsData();\r
+    std::vector<SettingUnionItemData>& GetMainUnionData();\r
+    static UIView* OnSimpleListCreate(uint8_t type);\r
+private:\r
+    std::vector<SettingUnionItemData> mainUnionData_;\r
+};\r
+}\r
+#endif\r
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/include/settings/model/SettingPowerModel.h b/code/sdk/application/wearable/evb/nativeapp/nativeui/include/settings/model/SettingPowerModel.h
new file mode 100644 (file)
index 0000000..70bd803
--- /dev/null
@@ -0,0 +1,50 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SettingPowerModel\r
+ * Create: 2025-06-01\r
+ */\r
+#ifndef SETTING_POWER_MODEL_H\r
+#define SETTING_POWER_MODEL_H\r
+\r
+#include <cstdint>\r
+#if !defined(_WIN32)\r
+#include "adc.h"\r
+#include "tcxo.h"\r
+#include "pinctrl.h"\r
+#include "hal_adc.h"\r
+#endif\r
+#include "settings/common/SettingRefSingleton.h"\r
+\r
+namespace OHOS {\r
+#if !defined(_WIN32)\r
+class SettingPowerModel : public SettingRefSingleton<SettingPowerModel> {\r
+public:\r
+    SettingPowerModel();\r
+    ~SettingPowerModel();\r
+    uint8_t GetBatteryPowerLevel();\r
+    const char* GetPowerModelNotify();\r
+protected:\r
+    bool adc_context_init();\r
+    bool adc_context_startup();\r
+    void adc_context_shutdown();\r
+    uint8_t calc_percentage(uint32_t voltage);\r
+    uint32_t calc_voltage();\r
+    uint32_t adc_trans_sytick_to_voltages(uint32_t sytick);\r
+private:\r
+    adc_channel_t channel_;        // ADC信道\r
+    pin_t analog_pin_;             // ADC输入引脚\r
+    pin_mode_t mode_;              // ADC管脚工作模式\r
+    uint32_t samples_to_keep_;     // 总采样次数\r
+    uint32_t samples_to_discard_;  // 丢弃的初始样本数\r
+    uint32_t adc_max_range_mv_;    // ADC原始值上限(单位:毫伏)\r
+    uint32_t adc_min_range_mv_;    // ADC原始值下限(单位:毫伏)\r
+};\r
+#else\r
+class SettingPowerModel : public SettingRefSingleton<SettingPowerModel> {\r
+public:\r
+    uint8_t GetBatteryPowerLevel();\r
+    const char* GetPowerModelNotify();\r
+};\r
+#endif\r
+} // OHOS\r
+#endif
\ No newline at end of file
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/include/settings/model/SettingQrcodeConnModel.h b/code/sdk/application/wearable/evb/nativeapp/nativeui/include/settings/model/SettingQrcodeConnModel.h
new file mode 100644 (file)
index 0000000..cc1ff26
--- /dev/null
@@ -0,0 +1,27 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SettingQrcodeConnModel\r
+ * Create: 2025-06-01\r
+ */\r
+#ifndef SETTING_QRCODE_CONN_MODEL_H\r
+#define SETTING_QRCODE_CONN_MODEL_H\r
+\r
+#include <cstdint>\r
+#include <map>\r
+#include "AppViewIDs.h"\r
+#include "settings/common/SettingRefSingleton.h"\r
+#include "UiConfig.h"\r
+\r
+namespace OHOS {\r
+class SettingQrcodeConnModel : public SettingRefSingleton<SettingQrcodeConnModel> {\r
+public:\r
+    static SettingQrcodeConnModel &GetInstance(void);\r
+private:\r
+    SettingQrcodeConnModel();\r
+    SettingQrcodeConnModel(const SettingQrcodeConnModel &);\r
+    SettingQrcodeConnModel &operator=(const SettingQrcodeConnModel &);\r
+    virtual ~SettingQrcodeConnModel();\r
+};\r
+}\r
+\r
+#endif  // SETTING_QRCODE_CONN_MODEL_H
\ No newline at end of file
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/include/settings/model/SettingSystemModel.h b/code/sdk/application/wearable/evb/nativeapp/nativeui/include/settings/model/SettingSystemModel.h
new file mode 100644 (file)
index 0000000..63a023c
--- /dev/null
@@ -0,0 +1,50 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SettingSystemModel\r
+ * Create: 2025-06-01\r
+ */\r
+#ifndef SETTING_SYSTEM_MODEL_H\r
+#define SETTING_SYSTEM_MODEL_H\r
+\r
+#include <cstdint>\r
+#include <mutex>\r
+#include <string>\r
+#ifndef _WIN32\r
+#include "osal_task.h"\r
+#endif\r
+#include "settings/common/SettingUnionItemGroup.h"\r
+#include "settings/common/SettingRefSingleton.h"\r
+\r
+namespace OHOS {\r
+class SettingSystemModel : public SettingRefSingleton<SettingSystemModel> {\r
+public:\r
+    SettingSystemModel();\r
+    virtual ~SettingSystemModel();\r
+    std::vector<SettingUnionItemData>& GetSystemUnionData();\r
+    void SystemOperation(const char* operationName);\r
+    // OTA\r
+    bool GetOtaIsUpgrade();\r
+    uint32_t GetOtaPackageSize();\r
+    void StartOtaNativeUpgrade();\r
+    void StopOtaNativeUpgrade();\r
+    uint8_t GetOtaNativeUpgradePercent();\r
+    std::string GetOtaNativeUpgradeMessage();\r
+protected:\r
+    void RestoreJSApplication();\r
+    void RestoreNativeApplication();\r
+    void RestoreKvstore();\r
+    void SetOtaNativeUpgradePercent(uint8_t percent);\r
+    void SetOtaNativeUpgradeMessage(std::string message);\r
+    static int SystemOta(void *data);\r
+    static void UninstallCallback(const uint8_t resultCode, const void *resultMessage);\r
+private:\r
+    std::vector<SettingUnionItemData> systemUnionData_;\r
+    std::mutex otaOSALMtx_;\r
+#ifndef _WIN32\r
+    osal_task* systemOtaTask_ = nullptr;\r
+#endif\r
+    uint8_t otaUpgradePrecent_ = 0;\r
+    std::string otaUpgradeMessage_;\r
+};\r
+} // OHOS\r
+#endif
\ No newline at end of file
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/include/settings/page/SettingAboutPage.h b/code/sdk/application/wearable/evb/nativeapp/nativeui/include/settings/page/SettingAboutPage.h
new file mode 100644 (file)
index 0000000..dac649f
--- /dev/null
@@ -0,0 +1,33 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SettingAboutPage\r
+ * Create: 2025-06-01\r
+ */\r
+#ifndef SETTING_ABOUT_PAGE_H\r
+#define SETTING_ABOUT_PAGE_H\r
+\r
+#include "components/ui_label.h"\r
+#include "components/ui_scroll_view_nested.h"\r
+#include "SlicePage.h"\r
+#include "settings/SettingPresenter.h"\r
+#include "settings/common/SettingCommon.h"\r
+\r
+namespace OHOS {\r
+class SettingAboutPage : public SlicePage<SettingPresenter> {\r
+public:\r
+    void OnStart(void* data) override;\r
+    void OnResume() override;\r
+    void OnStop() override;\r
+protected:\r
+    void InitTitle();\r
+    void InitDeviceTypeView();\r
+    void InitDeviceNameView();\r
+private:\r
+    UILabel* title_ = nullptr;\r
+    UILabel* deviceNameTitle_ = nullptr;\r
+    UILabel* deviceTypeTitle_ = nullptr;\r
+    UILabel* deviceName_ = nullptr;\r
+    UILabel* deviceType_ = nullptr;\r
+};\r
+} // OHOS\r
+#endif
\ No newline at end of file
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/include/settings/page/SettingBluetoothPage.h b/code/sdk/application/wearable/evb/nativeapp/nativeui/include/settings/page/SettingBluetoothPage.h
new file mode 100644 (file)
index 0000000..7a05318
--- /dev/null
@@ -0,0 +1,97 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SettingBuletoothPage\r
+ * Created: 2025-06-05\r
+ */\r
+#ifndef SETTING_BLUETOOTH_PAGE_H\r
+#define SETTING_BLUETOOTH_PAGE_H\r
+\r
+#include "components/ui_scroll_view_nested.h"\r
+#include "components/ui_simple_list.h"\r
+#include "components/ui_button.h"\r
+#include "components/ui_label.h"\r
+#include "SlicePage.h"\r
+#include "common/image_cache_manager.h"\r
+#include "components/ui_label_button.h"\r
+#include "components/ui_image_animator.h"\r
+#include "graphic_timer.h"\r
+#include "settings/common/SettingCommon.h"\r
+#include "settings/SettingPresenter.h"\r
+#include "settings/model/SettingBluetoothModel.h"\r
+#include "settings/page/SettingConnectNewPhone.h"\r
+#include "settings/page/SettingReconnection.h"\r
+#include "settings/page/SettingConnectBlueFail.h"\r
+#include "settings/page/SettingConnectBlueSuccess.h"\r
+\r
+namespace OHOS {\r
+static constexpr uint16_t SEARCH_IMAGE_COUNT = 31;\r
+\r
+class SettingBluetoothPage : public SlicePage<SettingPresenter>,\r
+                             public UIView::OnClickListener,\r
+                             public UIView::OnDragListener {\r
+public:\r
+    SettingBluetoothPage();\r
+    ~SettingBluetoothPage() override;\r
+    void OnStart(void* data) override;\r
+    bool OnClick(UIView &view, const ClickEvent &event) override;\r
+    static SettingBluetoothPage *GetInstance(void);\r
+    void InitSearchAni(void);\r
+    void InitImageAnimator();\r
+    void InitContentList();\r
+    void BtScan();\r
+    void StartBtScan();\r
+    void StopBtScan();\r
+    bool GetScanStatus(void);\r
+    void BtAnimatorStart();\r
+    void BtAnimatorStop();\r
+    void SetScanStatus(bool value);\r
+    void InitPageView();\r
+    void DestoryPageView();\r
+    void NotFindDevice();\r
+    void LoadFindDeviceList();\r
+    void UpdataImageAnimatorAndList();\r
+    void TimerFindDevice();\r
+    void UpdateBtListContent(int16_t viewIndex);\r
+    bool IsDeviceConnect();\r
+    bool GetImageAnimatorState();\r
+    void ChangeView(int16_t value);\r
+    void ShowResultGroup(int16_t value);\r
+\r
+protected:\r
+    static UIView* CreateForContent(uint8_t type);\r
+    static void UpdateForContent(UIView* view, void* data, uint8_t type);\r
+    static UIView* CreateForBtList(uint8_t type);\r
+    static void UpdateForBtList(UIView* view, void* data, uint8_t type);\r
+\r
+private:\r
+    bool scanStart_{0};\r
+    UIScrollViewNested *scroll_ = nullptr;\r
+    UILabel *titleLabel_ = nullptr;\r
+    UILabel *noDeviceLabel_ = nullptr;\r
+    UILabel *availableDeviceLabel_ = nullptr;\r
+    UILabel *searchBtnTextLabel_ = nullptr;\r
+    UILabelButton *resetResearchButton_ = nullptr;\r
+    UIImageAnimatorView *imageAnimator_;\r
+    ImageAnimatorInfo searchImageInfo_[SEARCH_IMAGE_COUNT];\r
+    UISimpleList *optionList_ = nullptr;\r
+    UISimpleList *btEarPhoneList_ = nullptr;\r
+    SettingConnectNewPhone *connectNewPhoneFragment_ = nullptr;\r
+    SettingConnectionOpen* connectOpenFragment_ = nullptr;\r
+    SettingReconnection *reconnectionFragment_ = nullptr;\r
+    SettingReconnectSecondConfirm* secondConfirmFragment_ = nullptr;\r
+    UnPairSecondConfirm* unPairFragment_ = nullptr;\r
+    SettingConnectBlueSuccess *successFragment_ = nullptr;\r
+    SettingConnectBlueFail *failFragment_ = nullptr;\r
+};\r
+\r
+#ifdef __cplusplus\r
+extern "C" {\r
+#endif\r
+void ScanTimerCallback(int data);\r
+void SettingCancelBrScanHandle(void);\r
+void SettingEndScanHandle(void);\r
+#ifdef __cplusplus\r
+}\r
+#endif\r
+} // OHOS\r
+#endif
\ No newline at end of file
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/include/settings/page/SettingCardAddPage.h b/code/sdk/application/wearable/evb/nativeapp/nativeui/include/settings/page/SettingCardAddPage.h
new file mode 100644 (file)
index 0000000..de918e5
--- /dev/null
@@ -0,0 +1,32 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SettingCardAddPage\r
+ * Create: 2025-06-01\r
+ */\r
+#ifndef SETTING_CARD_ADD_PAGE_H\r
+#define SETTING_CARD_ADD_PAGE_H\r
+\r
+#include "components/ui_scroll_view_nested.h"\r
+#include "components/ui_simple_list.h"\r
+#include "components/ui_label.h"\r
+#include "SlicePage.h"\r
+#include "settings/SettingPresenter.h"\r
+#include "settings/common/SettingCommon.h"\r
+\r
+namespace OHOS {\r
+class SettingCardAddPage : public SlicePage<SettingPresenter>,\r
+                           public UIView::OnClickListener {\r
+public:\r
+    void OnStart(void* data) override;\r
+    void OnResume() override;\r
+    void OnStop() override;\r
+    bool OnClick(UIView& view, const ClickEvent& event) override;\r
+protected:\r
+    static UIView* OnSimpleListCreate(uint8_t type);\r
+    static void OnSimpleListUpdate(UIView* view, void* data, uint8_t type);\r
+private:\r
+    UISimpleList* list_ = nullptr;\r
+    UILabel* title_ = nullptr;\r
+};\r
+} // OHOS\r
+#endif
\ No newline at end of file
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/include/settings/page/SettingCardEffectPage.h b/code/sdk/application/wearable/evb/nativeapp/nativeui/include/settings/page/SettingCardEffectPage.h
new file mode 100644 (file)
index 0000000..fb9693d
--- /dev/null
@@ -0,0 +1,44 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SettingCardEffectPage\r
+ * Create: 2025-04\r
+ */\r
+#ifndef SETTING_CARD_EFFECT_PAGE_H\r
+#define SETTING_CARD_EFFECT_PAGE_H\r
+\r
+#include <list>\r
+#include "View.h"\r
+#include "components/ui_label.h"\r
+#include "components/ui_image_view.h"\r
+#include "components/ui_simple_list.h"\r
+#include "SlicePage.h"\r
+#include "settings/SettingPresenter.h"\r
+#include "settings/common/SettingCardEffectSample.h"\r
+#include "settings/model/SettingCardModel.h"\r
+#include "settings/common/SettingCardEffectItemGroup.h"\r
+\r
+namespace OHOS {\r
+using CardEffectPair = std::pair<SettingCardEffectSample, SettingCardEffectSample>;\r
+\r
+class SettingCardEffecPage : public SlicePage<SettingPresenter>,\r
+                              public UIView::OnClickListener,\r
+                              public ListScrollListener {\r
+public:\r
+    SettingCardEffecPage();\r
+    ~SettingCardEffecPage() override;\r
+    void OnStart(void* data) override;\r
+    bool OnClick(UIView& view, const ClickEvent& event) override;\r
+    void OnItemSelected(int16 index, UIView* view) override;\r
+    void SetCardEffectListData(const std::map<CardEffectID, SettingCardEffectSample> &effectMap);\r
+protected:\r
+    static UIView* OnSimpleListCreate(uint8_t type);\r
+    static void OnSimpleListUpdate(UIView* view, void* data, uint8_t type);\r
+private:\r
+    UILabel* titleText_{nullptr};\r
+    UISimpleList* contentList_{nullptr};\r
+    std::list<CardEffectPair> effectListDatas_;\r
+    SettingCardEffectItemGroup* itemGroupSele_{nullptr};\r
+    SettingCardEffectItemGroup* preItemGroupSele_{nullptr};\r
+};\r
+}\r
+#endif
\ No newline at end of file
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/include/settings/page/SettingCardMgrPage.h b/code/sdk/application/wearable/evb/nativeapp/nativeui/include/settings/page/SettingCardMgrPage.h
new file mode 100644 (file)
index 0000000..ede9431
--- /dev/null
@@ -0,0 +1,35 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SettingCardMgrPage\r
+ * Create: 2025-06-01\r
+ */\r
+#ifndef SETTING_CARD_MGR_PAGE_H\r
+#define SETTING_CARD_MGR_PAGE_H\r
+\r
+#include "components/ui_scroll_view_nested.h"\r
+#include "components/ui_simple_list.h"\r
+#include "components/ui_label.h"\r
+#include "SlicePage.h"\r
+#include "settings/SettingPresenter.h"\r
+#include "settings/common/SettingCommon.h"\r
+\r
+namespace OHOS {\r
+class SettingCardMgrPage : public SlicePage<SettingPresenter>,\r
+                           public UIView::OnClickListener {\r
+public:\r
+    void OnStart(void* data) override;\r
+    void OnResume() override;\r
+    void OnStop() override;\r
+    bool OnClick(UIView& view, const ClickEvent& event) override;\r
+protected:\r
+    void InitListView();\r
+    void InitButtonView();\r
+    static UIView* OnSimpleListCreate(uint8_t type);\r
+    static void OnSimpleListUpdate(UIView* view, void* data, uint8_t type);\r
+private:\r
+    UISimpleList* list_ = nullptr;\r
+    UIButton* addButton_ = nullptr;\r
+    UIButton* delButton_ = nullptr;\r
+};\r
+} // OHOS\r
+#endif
\ No newline at end of file
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/include/settings/page/SettingCardPage.h b/code/sdk/application/wearable/evb/nativeapp/nativeui/include/settings/page/SettingCardPage.h
new file mode 100644 (file)
index 0000000..71a72ab
--- /dev/null
@@ -0,0 +1,30 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SettingCardPage\r
+ * Create: 2025-06-01\r
+ */\r
+#ifndef SETTING_CARD_PAGE_H\r
+#define SETTING_CARD_PAGE_H\r
+\r
+#include "components/ui_scroll_view_nested.h"\r
+#include "components/ui_simple_list.h"\r
+#include "SlicePage.h"\r
+#include "settings/SettingPresenter.h"\r
+#include "settings/common/SettingCommon.h"\r
+\r
+namespace OHOS {\r
+class SettingCardPage : public SlicePage<SettingPresenter>,\r
+                        public UIView::OnClickListener {\r
+public:\r
+    void OnStart(void* data) override;\r
+    void OnResume() override;\r
+    void OnStop() override;\r
+    bool OnClick(UIView& view, const ClickEvent& event) override;\r
+protected:\r
+    static void OnSimpleListUpdate(UIView* view, void* data, uint8_t type);\r
+private:\r
+    UIScrollViewNested* scroll_ = nullptr;\r
+    UISimpleList* content_ = nullptr;\r
+};\r
+} // OHOS\r
+#endif
\ No newline at end of file
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/include/settings/page/SettingConnectBlueFail.h b/code/sdk/application/wearable/evb/nativeapp/nativeui/include/settings/page/SettingConnectBlueFail.h
new file mode 100644 (file)
index 0000000..58a8429
--- /dev/null
@@ -0,0 +1,38 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SettingConnectBlueFail\r
+ * Created: 2025-06-05\r
+ */\r
+#ifndef SETTING_CONNECT_BLUE_FAIL_H\r
+#define SETTING_CONNECT_BLUE_FAIL_H\r
+\r
+#include "components/ui_label.h"\r
+#include "components/ui_label_button.h"\r
+#include "components/ui_fragment.h"\r
+#include "settings/SettingPresenter.h"\r
+#include "settings/common/SettingCommon.h"\r
+\r
+namespace OHOS {\r
+class SettingConnectBlueFail : public UIFragment,\r
+                               public UIView::OnClickListener,\r
+                               public UIView::OnDragListener {\r
+public:\r
+    void RefreshFragment();\r
+    bool OnClick(UIView &view, const ClickEvent &event) override;\r
+    bool OnDragStart(UIView& view, const DragEvent& event) override;\r
+    bool OnDrag(UIView& view, const DragEvent& event) override;\r
+    bool OnDragEnd(UIView& view, const DragEvent& event) override;\r
+\r
+protected:\r
+    void OnCreateView(void* data) override;\r
+    void OnDestroyView() override;\r
+\r
+private:\r
+    void InitFailFragment();\r
+    UIImageView* img_ = nullptr;\r
+    UILabel* watchNameLabel_ = nullptr;\r
+    UILabel* connectStatusLabel_ = nullptr;\r
+    UILabelButton* confirmButton_ = nullptr;\r
+};\r
+} // OHOS\r
+#endif
\ No newline at end of file
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/include/settings/page/SettingConnectBlueSuccess.h b/code/sdk/application/wearable/evb/nativeapp/nativeui/include/settings/page/SettingConnectBlueSuccess.h
new file mode 100644 (file)
index 0000000..4f3daa8
--- /dev/null
@@ -0,0 +1,38 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SettingConnectBlueSuccess\r
+ * Created: 2025-06-05\r
+ */\r
+#ifndef SETTING_CONNECT_BLUE_SUCCESS_H\r
+#define SETTING_CONNECT_BLUE_SUCCESS_H\r
+\r
+#include "components/ui_label.h"\r
+#include "components/ui_label_button.h"\r
+#include "components/ui_fragment.h"\r
+#include "settings/common/SettingCommon.h"\r
+#include "settings/SettingPresenter.h"\r
+\r
+namespace OHOS {\r
+class SettingConnectBlueSuccess : public UIFragment,\r
+                                  public UIView::OnClickListener,\r
+                                  public UIView::OnDragListener {\r
+public:\r
+    void RefreshFragment();\r
+    bool OnClick(UIView &view, const ClickEvent &event) override;\r
+    bool OnDragStart(UIView& view, const DragEvent& event) override;\r
+    bool OnDrag(UIView& view, const DragEvent& event) override;\r
+    bool OnDragEnd(UIView& view, const DragEvent& event) override;\r
+\r
+protected:\r
+    void OnCreateView(void* data) override;\r
+    void OnDestroyView() override;\r
+\r
+private:\r
+    void InitSuccessFragment();\r
+    UIImageView* img_ = nullptr;\r
+    UILabel* watchNameLabel_ = nullptr;\r
+    UILabel* connectStatusLabel_ = nullptr;\r
+    UILabelButton* confirmButton_ = nullptr;\r
+};\r
+} // OHOS\r
+#endif
\ No newline at end of file
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/include/settings/page/SettingConnectNewPhone.h b/code/sdk/application/wearable/evb/nativeapp/nativeui/include/settings/page/SettingConnectNewPhone.h
new file mode 100644 (file)
index 0000000..e65849f
--- /dev/null
@@ -0,0 +1,39 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SettingConnectNewPhone\r
+ * Created: 2025-06-05\r
+ */\r
+#ifndef SETTING_CONNECT_NEW_PHONE_H\r
+#define SETTING_CONNECT_NEW_PHONE_H\r
+\r
+#include "components/ui_label.h"\r
+#include "components/ui_button.h"\r
+#include "components/ui_fragment.h"\r
+#include "settings/common/SettingCommon.h"\r
+#include "settings/SettingPresenter.h"\r
+#include "settings/page/SettingConnectionOpen.h"\r
+\r
+namespace OHOS {\r
+class SettingConnectNewPhone : public UIFragment,\r
+                               public UIView::OnClickListener,\r
+                               public UIView::OnDragListener {\r
+public:\r
+    bool OnClick(UIView &view, const ClickEvent &event);\r
+    bool OnDragStart(UIView& view, const DragEvent& event) override;\r
+    bool OnDrag(UIView& view, const DragEvent& event) override;\r
+    bool OnDragEnd(UIView& view, const DragEvent& event) override;\r
+\r
+protected:\r
+    void OnCreateView(void* data) override;\r
+    void OnDestroyView() override;\r
+\r
+private:\r
+    void InitNewPhoneFragment();\r
+    UILabel* textFirst_ = nullptr;\r
+    UILabel* textSecond_ = nullptr;\r
+    UILabel* textThird_ = nullptr;\r
+    UIImageView* cancel_ = nullptr;\r
+    UIButton* confirm_ = nullptr;\r
+};\r
+} // OHOS\r
+#endif
\ No newline at end of file
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/include/settings/page/SettingConnectionOpen.h b/code/sdk/application/wearable/evb/nativeapp/nativeui/include/settings/page/SettingConnectionOpen.h
new file mode 100644 (file)
index 0000000..f5cc3c7
--- /dev/null
@@ -0,0 +1,39 @@
+/*
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.
+ * Description: SettingConnectionOpen
+ * Created: 2025-06-05
+ */
+#ifndef SETTING_CONNECTION_OPEN_H
+#define SETTING_CONNECTION_OPEN_H
+
+#include "components/ui_label.h"
+#include "components/ui_button.h"
+#include "components/ui_label_button.h"
+#include "components/ui_fragment.h"
+#include "settings/common/SettingCommon.h"
+#include "settings/SettingPresenter.h"
+
+namespace OHOS {
+class SettingConnectionOpen : public UIFragment,
+                                                         public UIView::OnClickListener,
+                              public UIView::OnDragListener {
+public:
+    void RefreshFragment();
+    bool OnClick(UIView &view, const ClickEvent &event);
+    bool OnDragStart(UIView& view, const DragEvent& event) override;
+    bool OnDrag(UIView& view, const DragEvent& event) override;
+    bool OnDragEnd(UIView& view, const DragEvent& event) override;
+
+protected:
+    void OnCreateView(void* data) override;
+    void OnDestroyView() override;
+
+private:
+    void InitConnectionOpenFragment();
+    UIImageView* img_ = nullptr;
+    UILabel* watchNameLabel_ = nullptr;
+    UILabel* connectStatusLabel_ = nullptr;
+    UILabelButton* confirmButton_ = nullptr;
+};
+} // OHOS
+#endif
\ No newline at end of file
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/include/settings/page/SettingDesktopDialPage.h b/code/sdk/application/wearable/evb/nativeapp/nativeui/include/settings/page/SettingDesktopDialPage.h
new file mode 100644 (file)
index 0000000..eba25f5
--- /dev/null
@@ -0,0 +1,43 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SettingDesktopDialPage\r
+ * Create: 2025-06-01\r
+ */\r
+#ifndef SETTING_DESKTOP_DIAL_PAGE_H\r
+#define SETTING_DESKTOP_DIAL_PAGE_H\r
+\r
+#include <vector>\r
+#include "components/ui_label.h"\r
+#include "components/ui_button.h"\r
+#include "components/ui_scroll_view_nested.h"\r
+#include "components/ui_coverflow_view.h"\r
+#include "components/ui_roller_view.h"\r
+#include "SlicePage.h"\r
+#include "settings/SettingPresenter.h"\r
+#include "settings/common/SettingCommon.h"\r
+\r
+namespace OHOS {\r
+class SettingDesktopDialPage : public SlicePage<SettingPresenter>,\r
+                               public UIView::OnClickListener,\r
+                               public UICoverflowView::OnCoverflowScrollListener,\r
+                               public UIRollerView::OnScrollListener {\r
+public:\r
+    void OnStart(void* data) override;\r
+    void OnResume() override;\r
+    void OnPause() override;\r
+    void OnStop() override;\r
+    bool OnClick(UIView& view, const ClickEvent& event) override;\r
+    bool OnScroll() override;\r
+    void OnScroll(UIRollerView* roller, std::string currentItemName, float currentItemAngle) override;\r
+protected:\r
+    void InitDialView();\r
+    void InitCtrlView();\r
+private:\r
+    UILabel* itemLabel_ = nullptr;\r
+    UICoverflowView* coverflow_ = nullptr;\r
+    UIRollerView* rollerView_ = nullptr;\r
+    uint8_t itemCount_ = 0;\r
+    uint8_t itemIndex_ = 0;\r
+};\r
+} // OHOS\r
+#endif
\ No newline at end of file
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/include/settings/page/SettingDesktopDialStylePage.h b/code/sdk/application/wearable/evb/nativeapp/nativeui/include/settings/page/SettingDesktopDialStylePage.h
new file mode 100644 (file)
index 0000000..99882c7
--- /dev/null
@@ -0,0 +1,31 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SettingDesktopDialStylePage\r
+ * Create: 2025-06-01\r
+ */\r
+#ifndef SETTING_DESKTOP_DIAL_STYLE_PAGE_H\r
+#define SETTING_DESKTOP_DIAL_STYLE_PAGE_H\r
+\r
+#include "components/ui_scroll_view_nested.h"\r
+#include "components/ui_simple_list.h"\r
+#include "SlicePage.h"\r
+#include "settings/SettingPresenter.h"\r
+#include "settings/common/SettingCommon.h"\r
+\r
+namespace OHOS {\r
+class SettingDesktopDialStylePage : public SlicePage<SettingPresenter>,\r
+                                    public UIView::OnClickListener {\r
+public:\r
+    void OnStart(void* data) override;\r
+    void OnResume() override;\r
+    void OnStop() override;\r
+    bool OnClick(UIView& view, const ClickEvent& event) override;\r
+protected:\r
+    void DestoryPageView();\r
+    static void OnSimpleListUpdate(UIView* view, void* data, uint8_t type);\r
+private:\r
+    UIScrollViewNested* scroll_ = nullptr;\r
+    UISimpleList* content_ = nullptr;\r
+};\r
+}\r
+#endif\r
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/include/settings/page/SettingDesktopHomePage.h b/code/sdk/application/wearable/evb/nativeapp/nativeui/include/settings/page/SettingDesktopHomePage.h
new file mode 100644 (file)
index 0000000..1b79a59
--- /dev/null
@@ -0,0 +1,32 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SettingDesktopHomePage\r
+ * Create: 2025-06-01\r
+ */\r
+#ifndef SETTING_DESKTOP_HOME_PAGE_H\r
+#define SETTING_DESKTOP_HOME_PAGE_H\r
+\r
+#include "components/ui_scroll_view_nested.h"\r
+#include "components/ui_simple_list.h"\r
+#include "components/ui_label.h"\r
+#include "SlicePage.h"\r
+#include "settings/SettingPresenter.h"\r
+#include "settings/common/SettingCommon.h"\r
+\r
+namespace OHOS {\r
+class SettingDesktopHomePage : public SlicePage<SettingPresenter>,\r
+                               public UIView::OnClickListener {\r
+public:\r
+    void OnStart(void* data) override;\r
+    void OnResume() override;\r
+    void OnStop() override;\r
+    bool OnClick(UIView& view, const ClickEvent& event) override;\r
+protected:\r
+    static UIView* OnSimpleListCreate(uint8_t type);\r
+    static void OnSimpleListUpdate(UIView* view, void* data, uint8_t type);\r
+private:\r
+    UISimpleList* list_ = nullptr;\r
+    UILabel* title_ = nullptr;\r
+};\r
+} // OHOS\r
+#endif
\ No newline at end of file
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/include/settings/page/SettingDesktopPage.h b/code/sdk/application/wearable/evb/nativeapp/nativeui/include/settings/page/SettingDesktopPage.h
new file mode 100644 (file)
index 0000000..ddb164f
--- /dev/null
@@ -0,0 +1,31 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SettingDesktopPage\r
+ * Create: 2025-06-01\r
+ */\r
+#ifndef SETTING_DESKTOP_PAGE_H\r
+#define SETTING_DESKTOP_PAGE_H\r
+\r
+#include "components/ui_scroll_view_nested.h"\r
+#include "components/ui_simple_list.h"\r
+#include "SlicePage.h"\r
+#include "settings/SettingPresenter.h"\r
+#include "settings/common/SettingCommon.h"\r
+\r
+namespace OHOS {\r
+class SettingDesktopPage : public SlicePage<SettingPresenter>,\r
+                           public UIView::OnClickListener,\r
+                           public UIView::OnDragListener {\r
+public:\r
+    void OnStart(void* data) override;\r
+    void OnResume() override;\r
+    void OnStop() override;\r
+    bool OnClick(UIView& view, const ClickEvent& event) override;\r
+protected:\r
+    static void OnSimpleListUpdate(UIView* view, void* data, uint8_t type);\r
+private:\r
+    UIScrollViewNested* scroll_ = nullptr;\r
+    UISimpleList* content_ = nullptr;\r
+};\r
+}\r
+#endif // SETTING_DESKTOP_PAGE_H\r
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/include/settings/page/SettingDisplayBrightnessPage.h b/code/sdk/application/wearable/evb/nativeapp/nativeui/include/settings/page/SettingDisplayBrightnessPage.h
new file mode 100644 (file)
index 0000000..54d1540
--- /dev/null
@@ -0,0 +1,51 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SettingDisplayBrightnessPage\r
+ * Create: 2025-06-01\r
+ */\r
+#ifndef SETTING_DISPLAY_BRIGHTNESS_PAGE_H\r
+#define SETTING_DISPLAY_BRIGHTNESS_PAGE_H\r
+\r
+#include "components/ui_view_group.h"\r
+#include "components/ui_circle_progress.h"\r
+#include "components/ui_scroll_view_nested.h"\r
+#include "components/ui_label.h"\r
+#include "components/ui_button.h"\r
+#include "animator/animator.h"\r
+#include "SlicePage.h"\r
+#include "settings/SettingPresenter.h"\r
+#include "settings/common/SettingCommon.h"\r
+\r
+namespace OHOS {\r
+class SettingDisplayBrightnessPage : public SlicePage<SettingPresenter>,\r
+                                     public UIView::OnClickListener,\r
+                                     public UIView::OnLongPressListener,\r
+                                     public UIView::OnTouchListener,\r
+                                     public UIView::OnDragListener,\r
+                                     public AnimatorCallback {\r
+public:\r
+    using SlicePage<SettingPresenter>::OnStop;\r
+    using AnimatorCallback::OnStop;\r
+    void OnStart(void* data) override;\r
+    void OnResume() override;\r
+    void OnPause() override;\r
+    void OnStop() override;\r
+    bool OnClick(UIView &view, const ClickEvent &event) override;\r
+    void Callback(UIView* view) override;\r
+    bool OnLongPress(UIView& view, const LongPressEvent& event) override;\r
+    bool OnRelease(UIView& view, const ReleaseEvent& event) override;\r
+    bool OnDragEnd(UIView& view, const DragEvent& event) override;\r
+protected:\r
+    void InitProgressView();\r
+    void InitButtonView();\r
+private:\r
+    UILabel* title_ = nullptr;\r
+    UICircleProgress* progress_ = nullptr;\r
+    UILabel* progressNum_ = nullptr;\r
+    UIButton* add_ = nullptr;\r
+    UIButton* sub_ = nullptr;\r
+    Animator* animator_ = nullptr;\r
+    UIButton* curLongPressButton_ = nullptr;\r
+};\r
+}\r
+#endif
\ No newline at end of file
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/include/settings/page/SettingDisplayPage.h b/code/sdk/application/wearable/evb/nativeapp/nativeui/include/settings/page/SettingDisplayPage.h
new file mode 100644 (file)
index 0000000..d19f4c5
--- /dev/null
@@ -0,0 +1,30 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SettingDisplayPage\r
+ * Create: 2025-06-01\r
+ */\r
+#ifndef SETTING_DISPLAY_PAGE_H\r
+#define SETTING_DISPLAY_PAGE_H\r
+\r
+#include "components/ui_scroll_view_nested.h"\r
+#include "components/ui_simple_list.h"\r
+#include "SlicePage.h"\r
+#include "settings/SettingPresenter.h"\r
+#include "settings/common/SettingCommon.h"\r
+\r
+namespace OHOS {\r
+class SettingDisplayPage : public SlicePage<SettingPresenter>,\r
+                           public UIView::OnClickListener {\r
+public:\r
+    void OnStart(void* data) override;\r
+    void OnResume() override;\r
+    void OnStop() override;\r
+    bool OnClick(UIView& view, const ClickEvent& event) override;\r
+protected:\r
+    static void OnSimpleListUpdate(UIView* view, void* data, uint8_t type);\r
+private:\r
+    UIScrollViewNested* scroll_ = nullptr;\r
+    UISimpleList* content_ = nullptr;\r
+};\r
+} // OHOS\r
+#endif
\ No newline at end of file
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/include/settings/page/SettingDisplayScreenOffPage.h b/code/sdk/application/wearable/evb/nativeapp/nativeui/include/settings/page/SettingDisplayScreenOffPage.h
new file mode 100644 (file)
index 0000000..71c902d
--- /dev/null
@@ -0,0 +1,31 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SettingDisplayScreenOffPage\r
+ * Create: 2025-06-01\r
+ */\r
+#ifndef SETTING_DISPLAY_SCREEN_OFF_PAGE_H\r
+#define SETTING_DISPLAY_SCREEN_OFF_PAGE_H\r
+\r
+#include "components/ui_scroll_view_nested.h"\r
+#include "components/ui_label.h"\r
+#include "components/ui_button.h"\r
+#include "components/ui_picker.h"\r
+#include "SlicePage.h"\r
+#include "settings/SettingPresenter.h"\r
+#include "settings/common/SettingCommon.h"\r
+\r
+namespace OHOS {\r
+class SettingDisplayScreenOffPage : public SlicePage<SettingPresenter>,\r
+                                    public UIView::OnClickListener {\r
+public:\r
+    void OnStart(void* data) override;\r
+    void OnResume() override;\r
+    void OnStop() override;\r
+    bool OnClick(UIView &view, const ClickEvent &event) override;\r
+private:\r
+    UILabel* title_ = nullptr;\r
+    UIPicker* picker_ = nullptr;\r
+    UIButton* button_ = nullptr;\r
+};\r
+} // OHOS\r
+#endif
\ No newline at end of file
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/include/settings/page/SettingDisplaySteadyOnPage.h b/code/sdk/application/wearable/evb/nativeapp/nativeui/include/settings/page/SettingDisplaySteadyOnPage.h
new file mode 100644 (file)
index 0000000..9d6d0eb
--- /dev/null
@@ -0,0 +1,31 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SettingDisplaySteadyOnPage\r
+ * Create: 2025-06-01\r
+ */\r
+#ifndef SETTING_DISPLAY_STEADY_ON_PAGE_H\r
+#define SETTING_DISPLAY_STEADY_ON_PAGE_H\r
+\r
+#include "components/ui_scroll_view_nested.h"\r
+#include "components/ui_label.h"\r
+#include "components/ui_button.h"\r
+#include "components/ui_picker.h"\r
+#include "SlicePage.h"\r
+#include "settings/SettingPresenter.h"\r
+#include "settings/common/SettingCommon.h"\r
+\r
+namespace OHOS {\r
+class SettingDisplaySteadyOnPage : public SlicePage<SettingPresenter>,\r
+                                   public UIView::OnClickListener {\r
+public:\r
+    void OnStart(void* data) override;\r
+    void OnResume() override;\r
+    void OnStop() override;\r
+    bool OnClick(UIView &view, const ClickEvent &event) override;\r
+private:\r
+    UILabel* title_ = nullptr;\r
+    UIPicker* picker_ = nullptr;\r
+    UIButton* button_ = nullptr;\r
+};\r
+}\r
+#endif
\ No newline at end of file
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/include/settings/page/SettingMainPage.h b/code/sdk/application/wearable/evb/nativeapp/nativeui/include/settings/page/SettingMainPage.h
new file mode 100644 (file)
index 0000000..e4fda23
--- /dev/null
@@ -0,0 +1,34 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SettingMainPage\r
+ * Create: 2025-06-01\r
+ */\r
+#ifndef SETTING_MAIN_PAGE_H\r
+#define SETTING_MAIN_PAGE_H\r
+\r
+#include "components/ui_scroll_view_nested.h"\r
+#include "components/ui_simple_list.h"\r
+#include "components/ui_list.h"\r
+#include "SlicePage.h"\r
+#include "settings/SettingPresenter.h"\r
+#include "settings/common/SettingCommon.h"\r
+\r
+namespace OHOS {\r
+class SettingMainPage : public SlicePage<SettingPresenter>,\r
+                        public UIView::OnDragListener,\r
+                        public UIView::OnClickListener {\r
+public:\r
+    void OnStart(void* data) override;\r
+    void OnResume() override;\r
+    void OnStop() override;\r
+    bool OnDrag(UIView& view, const DragEvent& event) override;\r
+    bool OnClick(UIView& view, const ClickEvent& event) override;\r
+protected:\r
+    void InitPageView();\r
+    static void OnSimpleListUpdate(UIView* view, void* data, uint8_t type);\r
+private:\r
+    UIScrollViewNested* scrollView_ = nullptr;\r
+    UISimpleList* simpleList_ = nullptr;\r
+};\r
+}\r
+#endif // SETTING_MAIN_PAGE_H
\ No newline at end of file
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/include/settings/page/SettingPowerPage.h b/code/sdk/application/wearable/evb/nativeapp/nativeui/include/settings/page/SettingPowerPage.h
new file mode 100644 (file)
index 0000000..163ac8e
--- /dev/null
@@ -0,0 +1,45 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SettingPowerPage\r
+ * Create: 2025-06-01\r
+ */\r
+#ifndef SETTING_POWER_PAGE_H\r
+#define SETTING_POWER_PAGE_H\r
+\r
+#include "components/ui_scroll_view_nested.h"\r
+#include "components/ui_label.h"\r
+#include "components/ui_view_group.h"\r
+#include "animator/animator.h"\r
+#include "SlicePage.h"\r
+#include "settings/SettingPresenter.h"\r
+#include "settings/common/SettingCommon.h"\r
+\r
+namespace OHOS {\r
+class SettingPowerPage : public SlicePage<SettingPresenter>,\r
+                         public AnimatorCallback {\r
+public:\r
+    using SlicePage<SettingPresenter>::OnStop;\r
+    using AnimatorCallback::OnStop;\r
+    void OnStart(void* data) override;\r
+    void OnResume() override;\r
+    void OnPause() override;\r
+    void OnStop() override;\r
+    void Callback(UIView* view) override;\r
+protected:\r
+    void InitPowerView();\r
+    void InitBatteryStatusView();\r
+    void InitNotify();\r
+private:\r
+    UIScrollView* scrollView_ = nullptr;\r
+    UILabel* title_ = nullptr;\r
+    UILabel* powerDesc_ = nullptr;\r
+    UILabel* batteryPercentage_ = nullptr;\r
+    UILabel* timeLabel_ = nullptr;\r
+    UIViewGroup* batteryStatusGroup_ = nullptr;\r
+    UILabel* batteryLabel_ = nullptr;\r
+    UILabel* batteryLevel_ = nullptr;\r
+    UILabel* detailsDesc_ = nullptr;\r
+    Animator* timeAnimator_ = nullptr;\r
+};\r
+} // OHOS\r
+#endif
\ No newline at end of file
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/include/settings/page/SettingQrcodeConnPage.h b/code/sdk/application/wearable/evb/nativeapp/nativeui/include/settings/page/SettingQrcodeConnPage.h
new file mode 100644 (file)
index 0000000..75e6140
--- /dev/null
@@ -0,0 +1,41 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SettingQrcodeConnPage\r
+ * Created: 2025-06-05\r
+ */\r
+#ifndef SETTING_QRCODE_CONN_PAGE_H\r
+#define SETTING_QRCODE_CONN_PAGE_H\r
+\r
+#include <string>\r
+#include "View.h"\r
+#include "SlicePage.h"\r
+#include "components/root_view.h"\r
+#include "components/ui_view_group.h"\r
+#include "components/ui_scroll_view_nested.h"\r
+#include "components/ui_label.h"\r
+#include "UiConfig.h"\r
+#include "components/ui_view_group.h"\r
+#include "components/ui_label.h"\r
+#include "components/ui_button.h"\r
+#include "components/ui_label_button.h"\r
+#include "components/ui_image_view.h"\r
+#include "components/ui_qrcode.h"\r
+#include "components/ui_label.h"\r
+#include "settings/SettingPresenter.h"\r
+\r
+namespace OHOS {\r
+\r
+class SettingQrcodeConnPage : public SlicePage<SettingPresenter>,\r
+                              public UIView::OnDragListener {\r
+public:\r
+    SettingQrcodeConnPage();\r
+    ~SettingQrcodeConnPage() override;\r
+    void OnStart(void* data) override;\r
+    void InitView();\r
+private:\r
+    UIScrollViewNested *group_ = nullptr;\r
+    UIQrcode *qrcode_ = nullptr;\r
+    UILabel *content_ = nullptr;\r
+};\r
+}\r
+#endif // SETTING_QRCODE_CONN_PAGE_H\r
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/include/settings/page/SettingReconnectSecondConfirm.h b/code/sdk/application/wearable/evb/nativeapp/nativeui/include/settings/page/SettingReconnectSecondConfirm.h
new file mode 100644 (file)
index 0000000..6ebda6c
--- /dev/null
@@ -0,0 +1,40 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SettingReconnectSecondConfirm\r
+ * Created: 2025-06-05\r
+ */\r
+#ifndef SETTING_RECONNECT_SECOND_CONFIRM_H\r
+#define SETTING_RECONNECT_SECOND_CONFIRM_H\r
+\r
+#include "components/ui_label.h"\r
+#include "components/ui_label_button.h"\r
+#include "components/ui_fragment.h"\r
+#include "settings/common/SettingCommon.h"\r
+#include "settings/SettingPresenter.h"\r
+\r
+namespace OHOS {\r
+class SettingReconnectSecondConfirm : public UIFragment,\r
+                                      public UIView::OnClickListener,\r
+                                      public UIView::OnDragListener {\r
+public:\r
+    void RefreshFragment();\r
+    bool OnClick(UIView &view, const ClickEvent &event);\r
+    bool OnDragStart(UIView& view, const DragEvent& event) override;\r
+    bool OnDrag(UIView& view, const DragEvent& event) override;\r
+    bool OnDragEnd(UIView& view, const DragEvent& event) override;\r
+\r
+protected:\r
+    void OnCreateView(void* data) override;\r
+    void OnDestroyView() override;\r
+\r
+private:\r
+    void InitSecondConfirmFragment();\r
+    UILabel* title_ = nullptr;\r
+    UILabel* contentFirst_ = nullptr;\r
+    UILabel* contentSecond_ = nullptr;\r
+    UILabel* contentThird_ = nullptr;\r
+    UIImageView* cancel_ = nullptr;\r
+    UILabelButton* confirm_ = nullptr;\r
+};\r
+} // OHOS\r
+#endif
\ No newline at end of file
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/include/settings/page/SettingReconnection.h b/code/sdk/application/wearable/evb/nativeapp/nativeui/include/settings/page/SettingReconnection.h
new file mode 100644 (file)
index 0000000..8ef1a53
--- /dev/null
@@ -0,0 +1,40 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SettingReconnection\r
+ * Created: 2025-06-05\r
+ */\r
+#ifndef SETTING_RECONNECTION_H\r
+#define SETTING_RECONNECTION_H\r
+\r
+#include "components/ui_label.h"\r
+#include "components/ui_label_button.h"\r
+#include "components/ui_fragment.h"\r
+#include "settings/common/SettingCommon.h"\r
+#include "settings/SettingPresenter.h"\r
+#include "settings/page/SettingReconnectSecondConfirm.h"\r
+#include "settings/page/UnPairSecondConfirm.h"\r
+\r
+namespace OHOS {\r
+class SettingReconnection : public UIFragment,\r
+                            public UIView::OnClickListener,\r
+                            public UIView::OnDragListener {\r
+public:\r
+    void RefreshFragment();\r
+    bool OnClick(UIView &view, const ClickEvent &event);\r
+    bool OnDragStart(UIView& view, const DragEvent& event) override;\r
+    bool OnDrag(UIView& view, const DragEvent& event) override;\r
+    bool OnDragEnd(UIView& view, const DragEvent& event) override;\r
+\r
+protected:\r
+    void OnCreateView(void* data) override;\r
+    void OnDestroyView() override;\r
+\r
+private:\r
+    void InitReconnectionFragment();\r
+    UILabel* watchNameLabel_ = nullptr;\r
+    UILabel* connectStatusLabel_ = nullptr;\r
+    UILabelButton* reconnectionButton_ = nullptr;\r
+    UIImageView* unpair_ = nullptr;\r
+};\r
+} // OHOS\r
+#endif
\ No newline at end of file
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/include/settings/page/SettingSystemOperationPage.h b/code/sdk/application/wearable/evb/nativeapp/nativeui/include/settings/page/SettingSystemOperationPage.h
new file mode 100644 (file)
index 0000000..d69af8b
--- /dev/null
@@ -0,0 +1,51 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SettingSystemOperationPage\r
+ * Create: 2025-06-01\r
+ */\r
+#ifndef SETTING_SYSTEM_OPERATION_PAGE_H\r
+#define SETTING_SYSTEM_OPERATION_PAGE_H\r
+\r
+#include <map>\r
+#include <string>\r
+#include "components/ui_scroll_view_nested.h"\r
+#include "components/ui_label.h"\r
+#include "components/ui_button.h"\r
+#include "components/ui_slider.h"\r
+#include "components/ui_view_group.h"\r
+#include "SlicePage.h"\r
+#include "settings/SettingPresenter.h"\r
+#include "settings/common/SettingCommon.h"\r
+\r
+namespace OHOS {\r
+struct OperationData {\r
+    ColorType sliderBgColor;\r
+    uint32_t  sliderKnobImage;\r
+};\r
+\r
+class SettingSystemOperationPage : public SlicePage<SettingPresenter>,\r
+                                   public UIView::OnClickListener,\r
+                                   public UISlider::UISliderEventListener {\r
+public:\r
+    SettingSystemOperationPage();\r
+    void OnStart(void* data) override;\r
+    void OnResume() override;\r
+    void OnStop() override;\r
+    bool OnClick(UIView &view, const ClickEvent &event) override;\r
+    void OnChange(int32_t value) override;\r
+    void OnRelease(int32_t value) override;\r
+protected:\r
+    void InitSliderView();\r
+    void InitButtonView();\r
+    void RefreshSlider();\r
+private:\r
+    UISlider* slider_ = nullptr;\r
+    UILabel* sliderLabel_ = nullptr;\r
+    UIButton* button_ = nullptr;\r
+    UILabel* buttonDescription_ = nullptr;\r
+    std::string operationName_;\r
+    std::map<std::string, OperationData> operationData_;\r
+    bool sliderBegin_ = false;\r
+};\r
+} // OHOS\r
+#endif
\ No newline at end of file
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/include/settings/page/SettingSystemOtaPage.h b/code/sdk/application/wearable/evb/nativeapp/nativeui/include/settings/page/SettingSystemOtaPage.h
new file mode 100644 (file)
index 0000000..b68e3cf
--- /dev/null
@@ -0,0 +1,49 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SettingSystemOTAPage\r
+ * Create: 2025-06-01\r
+ */\r
+#ifndef SETTING_SYSTEM_OTA_PAGE_H\r
+#define SETTING_SYSTEM_OTA_PAGE_H\r
+\r
+#include "components/ui_scroll_view_nested.h"\r
+#include "components/ui_label.h"\r
+#include "components/ui_button.h"\r
+#include "components/ui_slider.h"\r
+#include "components/ui_view_group.h"\r
+#include "components/ui_circle_progress.h"\r
+#include "animator/animator.h"\r
+#include "SlicePage.h"\r
+#include "settings/SettingPresenter.h"\r
+#include "settings/common/SettingCommon.h"\r
+\r
+namespace OHOS {\r
+class SettingSystemOtaPage : public SlicePage<SettingPresenter>,\r
+                             public UIView::OnClickListener,\r
+                             public AnimatorCallback {\r
+public:\r
+    using SlicePage<SettingPresenter>::OnStop;\r
+    using AnimatorCallback::OnStop;\r
+    void OnStart(void* data) override;\r
+    void OnResume() override;\r
+    void OnPause() override;\r
+    void OnStop() override;\r
+    bool OnClick(UIView &view, const ClickEvent &event) override;\r
+    void Callback(UIView* view) override;\r
+protected:\r
+    void InitPreGroupView();\r
+    void InitMidCircleView();\r
+    void InitMidMessageView();\r
+private:\r
+    Animator* upgradeAnimator_ = nullptr;\r
+    UIViewGroup* preUpgradeGroup_ = nullptr;\r
+    UIViewGroup* midUpgradeGroup_ = nullptr;\r
+    UIButton* preUpgradeButton_ = nullptr;\r
+    UILabel* preUpgradeLabel_ = nullptr;\r
+    UICircleProgress* midUpgradeProress_ = nullptr;\r
+    UILabel* midUpgradeLabel_ = nullptr;\r
+    UILabel* midUpgradePercent_ = nullptr;\r
+    UILabel* midUpgradeMessage_ = nullptr;\r
+};\r
+} // OHOS\r
+#endif
\ No newline at end of file
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/include/settings/page/SettingSystemPage.h b/code/sdk/application/wearable/evb/nativeapp/nativeui/include/settings/page/SettingSystemPage.h
new file mode 100644 (file)
index 0000000..e6322bc
--- /dev/null
@@ -0,0 +1,30 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SettingSystemPage\r
+ * Create: 2025-06-01\r
+ */\r
+#ifndef SETTING_SYSTEM_PAGE_H\r
+#define SETTING_SYSTEM_PAGE_H\r
+\r
+#include "components/ui_scroll_view_nested.h"\r
+#include "components/ui_simple_list.h"\r
+#include "SlicePage.h"\r
+#include "settings/SettingPresenter.h"\r
+#include "settings/common/SettingCommon.h"\r
+\r
+namespace OHOS {\r
+class SettingSystemPage : public SlicePage<SettingPresenter>,\r
+                          public UIView::OnClickListener {\r
+public:\r
+    void OnStart(void* data) override;\r
+    void OnResume() override;\r
+    void OnStop() override;\r
+    bool OnClick(UIView& view, const ClickEvent& event) override;\r
+protected:\r
+    static void OnSimpleListUpdate(UIView* view, void* data, uint8_t type);\r
+private:\r
+    UIScrollViewNested* scroll_ = nullptr;\r
+    UISimpleList* content_ = nullptr;\r
+};\r
+} // OHOS\r
+#endif
\ No newline at end of file
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/include/settings/page/UnPairSecondConfirm.h b/code/sdk/application/wearable/evb/nativeapp/nativeui/include/settings/page/UnPairSecondConfirm.h
new file mode 100644 (file)
index 0000000..4eaa0cd
--- /dev/null
@@ -0,0 +1,40 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: UnPairSecondConfirm\r
+ * Created: 2025-06-05\r
+ */\r
+#ifndef UNPAIR_SECOND_CONFIRM_H\r
+#define UNPAIR_SECOND_CONFIRM_H\r
+\r
+#include "components/ui_label.h"\r
+#include "components/ui_label_button.h"\r
+#include "components/ui_fragment.h"\r
+#include "settings/common/SettingCommon.h"\r
+#include "settings/SettingPresenter.h"\r
+\r
+namespace OHOS {\r
+class UnPairSecondConfirm : public UIFragment,\r
+                            public UIView::OnClickListener,\r
+                            public UIView::OnDragListener {\r
+public:\r
+    void RefreshFragment();\r
+    bool OnClick(UIView &view, const ClickEvent &event);\r
+    bool OnDragStart(UIView& view, const DragEvent& event) override;\r
+    bool OnDrag(UIView& view, const DragEvent& event) override;\r
+    bool OnDragEnd(UIView& view, const DragEvent& event) override;\r
+\r
+protected:\r
+    void OnCreateView(void* data) override;\r
+    void OnDestroyView() override;\r
+\r
+private:\r
+    void InitUnpairFragment();\r
+    UILabel* title_ = nullptr;\r
+    UILabel* contentFirst_ = nullptr;\r
+    UILabel* contentSecond_ = nullptr;\r
+    UILabel* watchNameLabel_ = nullptr;\r
+    UIImageView* cancel_ = nullptr;\r
+    UILabelButton* confirm_ = nullptr;\r
+};\r
+} // OHOS\r
+#endif
\ No newline at end of file
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/include/sleep/SleepDetailsPage.h b/code/sdk/application/wearable/evb/nativeapp/nativeui/include/sleep/SleepDetailsPage.h
new file mode 100644 (file)
index 0000000..142d713
--- /dev/null
@@ -0,0 +1,74 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SleepDetailsPage\r
+ * Created: 2025-06-05\r
+ */\r
+#ifndef SLEEP_DETAILS_PAGE_H\r
+#define SLEEP_DETAILS_PAGE_H\r
+\r
+#include "View.h"\r
+#include "wearable_log.h"\r
+#include "UiConfig.h"\r
+#include "components/ui_label.h"\r
+#include "components/ui_button.h"\r
+#include "components/ui_label_button.h"\r
+#include "components/ui_image_animator.h"\r
+#include "components/ui_circle_progress.h"\r
+#include "components/ui_view_group.h"\r
+#include "components/ui_scroll_view.h"\r
+#include "SlicePage.h"\r
+#include "main/LoadImg.h"\r
+#include "ui_resource_sleep.h"\r
+#include "sleep/SleepPresenter.h"\r
+#include "sleep/SleepView.h"\r
+#include "sleep/SleepModel.h"\r
+\r
+namespace OHOS {\r
+class SleepPresenter;\r
+class SleepDetailsPage : public SlicePage<SleepPresenter>,\r
+                             public UIView::OnDragListener {\r
+public:\r
+    SleepDetailsPage();\r
+    ~SleepDetailsPage() override;\r
+\r
+    void OnStart(void* data) override;\r
+    void InitPage();\r
+    void InitNoDeatilPage();\r
+    void InitDetailPage();\r
+    void InitSoberingTime();\r
+    void InitRapidEyeMovement();\r
+    void InitLightSleepTime();\r
+    void InitDeepSleepTime();\r
+    bool OnDrag(UIView &view, const DragEvent &event) override;\r
+    bool GetRecord();\r
+    std::string SetTimeUnit(std::tuple<uint32_t, uint32_t> timeTuple);\r
+    void InitActualSleepTime(std::tuple<uint32_t, uint32_t> timeTuple);\r
+    void LoadDeatilActualSleepTime();\r
+\r
+private:\r
+    UIScrollView *group_{nullptr};\r
+    UILabel *sleepTitleLabel_{nullptr};\r
+    UILabel *actualSleepNorecordTimeLabel_{nullptr}; // norecord\r
+    UILabel *actualSleepTimeHoursLabel_{nullptr};\r
+    UILabel *actualSleepTimeHoursUnitLabel_{nullptr};\r
+    UILabel *actualSleepTimeMinutesLabel_{nullptr};\r
+    UILabel *actualSleepTimeMinutesUnitLabel_{nullptr};\r
+\r
+    UIImageView *bgImg_{nullptr};\r
+    UIImageView *grayBgImg_{nullptr};\r
+    UIImageView *redPointImg_{nullptr};\r
+    UILabel *soberingTimeLabel_{nullptr};\r
+    UILabel *soberingTimeUnitLabel_{nullptr};\r
+    UIImageView *orangePointImg_{nullptr};\r
+    UILabel *rapidEyeMovementLabel_ {nullptr};\r
+    UILabel *rapidEyeMovementUnitLabel_{nullptr};\r
+    UIImageView *greenPointImg_{nullptr};\r
+    UILabel *lightSleepTimeLabel_{nullptr};\r
+    UILabel *lightSleepTimeUnitLabel_{nullptr};\r
+    UIImageView *bluePointImg_{nullptr};\r
+    UILabel *deepSleepTimeLabel_{nullptr};\r
+    UILabel *deepSleepTimeUnitLabel_{nullptr};\r
+};\r
+}\r
+\r
+#endif // SLEEP_DETAILS_PAGE_H
\ No newline at end of file
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/include/sleep/SleepMainPage.h b/code/sdk/application/wearable/evb/nativeapp/nativeui/include/sleep/SleepMainPage.h
new file mode 100644 (file)
index 0000000..99469f1
--- /dev/null
@@ -0,0 +1,79 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SleepMainPage\r
+ * Created: 2025-06-05\r
+ */\r
+#ifndef SLEEP_MAIN_PAGE_H\r
+#define SLEEP_MAIN_PAGE_H\r
+\r
+#include "View.h"\r
+#include "wearable_log.h"\r
+#include "UiConfig.h"\r
+#include "components/ui_label.h"\r
+#include "components/ui_button.h"\r
+#include "components/ui_label_button.h"\r
+#include "components/ui_image_animator.h"\r
+#include "components/ui_circle_progress.h"\r
+#include "components/ui_view_group.h"\r
+#include "components/ui_circle_progress.h"\r
+#include "components/ui_scroll_view.h"\r
+#include "ui_resource_sleep.h"\r
+#include "main/LoadImg.h"\r
+#include "sleep/SleepTargetTime.h"\r
+#include "sleep/SleepPresenter.h"\r
+#include "sleep/SleepView.h"\r
+#include "sleep/SleepModel.h"\r
+\r
+\r
+namespace OHOS {\r
+class SleepPresenter;\r
+class SleepMainPage : public SlicePage<SleepPresenter>,\r
+                             public UIView::OnClickListener,\r
+                             public UIView::OnDragListener {\r
+public:\r
+    SleepMainPage();\r
+    ~SleepMainPage() override;\r
+\r
+    void OnStart(void* data) override;\r
+    void InitNoRecordPage();\r
+    void InitRecordPage();\r
+    void LoadActualSleepTime(std::tuple<uint32_t, uint32_t> timeTuple);\r
+    void LoadTargetTimeButton(std::tuple<uint32_t, uint32_t> timeTuple);\r
+    bool OnClick(UIView &view, const ClickEvent &event) override;\r
+    bool OnDrag(UIView &view, const DragEvent &event) override;\r
+    void InitCircleProgress();\r
+    uint32_t GetSleepingScores();\r
+    void InitSleepTimeLabel();\r
+    void ScoreDisplay();\r
+    bool GetRecord();\r
+    void InitScoreDisplayPicture();\r
+private:\r
+    UIScrollView *group_{nullptr};\r
+    UIImageView *imageViewMain_{nullptr};\r
+    // noRecord页面控件\r
+    UILabel *sleepTitleLabel_{nullptr};\r
+    UIImageView *moonNoRecordImg_{nullptr};\r
+    UILabel *noRecordLabel_{nullptr};\r
+    UILabel *tipsLabel_{nullptr};\r
+    // Record页面控件\r
+    UIImageView *moonImg_{nullptr};\r
+    UILabel *sleepScoreTextLabel_{nullptr};\r
+    UILabel *sleepScoresLabel_{nullptr};\r
+    UILabel *scoreUnitLabel_{nullptr};\r
+    UIImageView *scoreStarImg1_{nullptr};\r
+    UIImageView *scoreStarImg2_{nullptr};\r
+    UIImageView *scoreStarImg3_{nullptr};\r
+    UIImageView *scoreStarImg4_{nullptr};\r
+    UIImageView *scoreStarImg5_{nullptr};\r
+    UILabel *targetSleepTimeHoursLabel_{nullptr};\r
+    UILabel *targetSleepTimeHoursUnitLabel_{nullptr};\r
+    UILabel *targetSleepTimeMinutesLabel_{nullptr};\r
+    UILabel *targetSleepTimeMinutesUnitLabel_{nullptr};\r
+    UILabel *targetTimeLabel_{nullptr};\r
+    UILabelButton *targetTimeButton_{nullptr};\r
+    UIImageView *settingImg_{nullptr};\r
+    UICircleProgress* circleProgress_{nullptr};\r
+};\r
+}\r
+\r
+#endif // SLEEP_MAIN_PAGE_H\r
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/include/sleep/SleepModel.h b/code/sdk/application/wearable/evb/nativeapp/nativeui/include/sleep/SleepModel.h
new file mode 100644 (file)
index 0000000..78b9e7d
--- /dev/null
@@ -0,0 +1,107 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SleepModel\r
+ * Created: 2025-06-05\r
+ */\r
+#ifndef SLEEP_MODEL_H\r
+#define SLEEP_MODEL_H\r
+\r
+#include <cstdint>\r
+#include <map>\r
+#include <vector>\r
+#include <string>\r
+#include <sstream>\r
+#include <ctime>\r
+#include <iomanip>\r
+#include "AppViewIDs.h"\r
+#include "UiConfig.h"\r
+#include "graphic_timer.h"\r
+#include "ohos_timer.h"\r
+#include "wearable_log.h"\r
+#include "diag_service.h"\r
+#include "msg_center_device.h"\r
+#include "diag_common.h"\r
+#include "sleep/SleepPresenter.h"\r
+\r
+namespace OHOS {\r
+    enum SleepType : uint8_t {\r
+        SLEEP_TYPE_DEEP = 1,             // 深睡\r
+        SLEEP_TYPE_LIGHT = 2,            // 浅睡\r
+        SLEEP_TYPE_EYEMOVE = 3,          // 快速动眼\r
+        SLEEP_TYPE_SOBER = 4,            // 清醒\r
+    };\r
+    static const uint16_t SLEEP_DATA_DATE_RANGE = 11;\r
+    static const uint16_t SLEEP_DATA_START_DATA_RANGE = 20;\r
+\r
+    #pragma pack(1)\r
+    struct SleepData {\r
+        bool isSended;\r
+        char date[SLEEP_DATA_DATE_RANGE];\r
+        SleepType type;\r
+        char typeSleepStart[SLEEP_DATA_START_DATA_RANGE];\r
+        char typeSleepEnd[SLEEP_DATA_START_DATA_RANGE];\r
+        char sleepStart[SLEEP_DATA_START_DATA_RANGE];\r
+        char sleepEnd[SLEEP_DATA_START_DATA_RANGE];\r
+\r
+        SleepData(\r
+            bool isSended,\r
+            const char* date,\r
+            SleepType type,\r
+            const char* typeSleepStart,\r
+            const char* typeSleepEnd,\r
+            const char* sleepStart,\r
+            const char* sleepEnd)\r
+        {\r
+            this->isSended = isSended;\r
+            strncpy_s(this->date, SLEEP_DATA_DATE_RANGE, date, SLEEP_DATA_DATE_RANGE - 1);\r
+            this->type = type;\r
+            strncpy_s(this->typeSleepStart, SLEEP_DATA_START_DATA_RANGE, typeSleepStart,\r
+                SLEEP_DATA_START_DATA_RANGE - 1);\r
+            strncpy_s(this->typeSleepEnd, SLEEP_DATA_START_DATA_RANGE, typeSleepEnd, SLEEP_DATA_START_DATA_RANGE - 1);\r
+            strncpy_s(this->sleepStart, SLEEP_DATA_START_DATA_RANGE, sleepStart, SLEEP_DATA_START_DATA_RANGE - 1);\r
+            strncpy_s(this->sleepEnd, SLEEP_DATA_START_DATA_RANGE, sleepEnd, SLEEP_DATA_START_DATA_RANGE - 1);\r
+        }\r
+    };\r
+    #pragma pack()\r
+\r
+    class SleepModel {\r
+    public:\r
+        static SleepModel &GetInstance(void);\r
+        void SendData();\r
+        uint8_t* SerializeSleepData(const SleepData* sleepData, size_t* outSize);\r
+        void SetSleepDataVec(); // 存入睡眠数据接口\r
+        void SetTargetTime(uint32_t minute);\r
+        std::tuple<uint32_t, uint32_t> GetTargetTime();\r
+        void SetData();\r
+        std::tuple<uint32_t, uint32_t> GetSoberingTime();\r
+        std::tuple<uint32_t, uint32_t> GetRapidEyeMovementTime();\r
+        std::tuple<uint32_t, uint32_t> GetLightSleepTime();\r
+        std::tuple<uint32_t, uint32_t> GetDeepSleepTime();\r
+        std::tuple<uint32_t, uint32_t> GetSleepTime();\r
+        void SetSoberingTime();\r
+        void SetRapidEyeMovementTime();\r
+        void SetLightSleepTime();\r
+        void SetDeepSleepTime();\r
+        bool GetRecord();\r
+        uint32_t GetSleepTimeHours();\r
+        uint32_t GetSleepTimeMinutes();\r
+        std::tuple<uint32_t, uint32_t> MinutesToHours(uint32_t minutes);\r
+        uint32_t TimeDiffInMinutes(const std::string& timeStr1, const std::string& timeStr2);\r
+        uint32_t GetDetailData(int type);\r
+        uint32_t GetTotalSleepTime();\r
+        void LoadData();\r
+        std::string GetTodayDate();\r
+        \r
+    private:\r
+        SleepModel();\r
+        virtual ~SleepModel();\r
+        uint32_t sleepTarget_ = 0;\r
+        std::vector<SleepData> sleepDataVector_;\r
+        uint32_t soberingTime_;\r
+        uint32_t eyeMoveTime_;\r
+        uint32_t lightTime_;\r
+        uint32_t deepTime_;\r
+    };\r
+}\r
+\r
+#endif // SLEEP_MODEL_H\r
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/include/sleep/SleepPresenter.h b/code/sdk/application/wearable/evb/nativeapp/nativeui/include/sleep/SleepPresenter.h
new file mode 100644 (file)
index 0000000..7e8d0e5
--- /dev/null
@@ -0,0 +1,18 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SleepPresenter\r
+ * Created: 2025-06-05\r
+ */\r
+\r
+#ifndef SLEEP_PRESENTER_H\r
+#define SLEEP_PRESENTER_H\r
+\r
+#include "Presenter.h"\r
+\r
+namespace OHOS {\r
+class SleepView;\r
+class SleepPresenter : public Presenter<SleepView> {\r
+};\r
+}\r
+\r
+#endif // SLEEP_PRESENTER_H
\ No newline at end of file
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/include/sleep/SleepSleepingPage.h b/code/sdk/application/wearable/evb/nativeapp/nativeui/include/sleep/SleepSleepingPage.h
new file mode 100644 (file)
index 0000000..5abcd7b
--- /dev/null
@@ -0,0 +1,72 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SleepSleepingPage\r
+ * Created: 2025-06-05\r
+ */\r
+#ifndef SLEEP_SLEEPING_PAGE_H\r
+#define SLEEP_SLEEPING_PAGE_H\r
+\r
+#include <sys/time.h>\r
+#include "View.h"\r
+#include "wearable_log.h"\r
+#include "UiConfig.h"\r
+#include "components/ui_label.h"\r
+#include "components/ui_button.h"\r
+#include "components/ui_label_button.h"\r
+#include "components/ui_image_animator.h"\r
+#include "components/ui_circle_progress.h"\r
+#include "components/ui_view_group.h"\r
+#include "components/ui_circle_progress.h"\r
+#include "components/ui_scroll_view.h"\r
+#include "ui_resource_sleep.h"\r
+#include "main/LoadImg.h"\r
+#include "sleep/SleepTargetTime.h"\r
+#include "sleep/SleepPresenter.h"\r
+#include "sleep/SleepView.h"\r
+#include "sleep/SleepModel.h"\r
+\r
+\r
+namespace OHOS {\r
+class SleepPresenter;\r
+class SleepSleepingPage : public SlicePage<SleepPresenter>,\r
+                             public UIView::OnClickListener,\r
+                             public UIView::OnDragListener {\r
+public:\r
+    SleepSleepingPage();\r
+    ~SleepSleepingPage() override;\r
+\r
+    void OnStart(void* data) override;\r
+    void OnPause() override;\r
+    void InitCircleProgress();\r
+    void InitSleepTimeLabel();\r
+    void LoadTargetTimeForHourAndMin(std::tuple<uint32_t, uint32_t> timeTuple);\r
+    void StopAnimator();\r
+private:\r
+    UIScrollView *group_{nullptr};\r
+    UIImageView *bgImg_{nullptr};\r
+    UIImageView *moonImg_{nullptr};\r
+    UILabel *sleepTitleLabel_{nullptr};\r
+    UILabel *sleepingLabel_{nullptr};\r
+    UILabel *targetSleepTimeHoursLabel_{nullptr};\r
+    UILabel *targetSleepTimeHoursUnitLabel_{nullptr};\r
+    UILabel *targetSleepTimeMinutesLabel_{nullptr};\r
+    UILabel *targetSleepTimeMinutesUnitLabel_{nullptr};\r
+    UIImageView *sleepTimeBgImg_{nullptr};\r
+    UICircleProgress* circleProgress_{nullptr};\r
+\r
+class SleepAnimatorCallback : public AnimatorCallback {\r
+public:\r
+    explicit SleepAnimatorCallback(SleepSleepingPage* page) : page_(page) {}\r
+    ~SleepAnimatorCallback() override {}\r
+    void Callback(UIView *view) override;\r
+\r
+private:\r
+    SleepSleepingPage* page_{nullptr};\r
+};\r
+    Animator *animator_ = nullptr;\r
+    SleepAnimatorCallback *callBack_ = nullptr;\r
+    struct timeval startTime_ = {0};\r
+};\r
+}\r
+\r
+#endif // SLEEP_SLEEPING_PAGE_H\r
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/include/sleep/SleepTargetTime.h b/code/sdk/application/wearable/evb/nativeapp/nativeui/include/sleep/SleepTargetTime.h
new file mode 100644 (file)
index 0000000..fea6476
--- /dev/null
@@ -0,0 +1,51 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SleepTargetTime\r
+ * Created: 2025-06-05\r
+ */\r
+\r
+#ifndef SLEEP_TARGET_TIME_H\r
+#define SLEEP_TARGET_TIME_H\r
+\r
+#include "View.h"\r
+#include "wearable_log.h"\r
+#include "UiConfig.h"\r
+#include "components/ui_label.h"\r
+#include "components/ui_button.h"\r
+#include "components/ui_label_button.h"\r
+#include "components/ui_image_animator.h"\r
+#include "components/ui_circle_progress.h"\r
+#include "components/ui_view_group.h"\r
+#include "components/ui_picker.h"\r
+#include "components/ui_scroll_view.h"\r
+#include "main/LoadImg.h"\r
+#include "sleep/SleepPresenter.h"\r
+#include "sleep/SleepView.h"\r
+namespace OHOS {\r
+static constexpr int16_t PICKER_COUNT = 2;\r
+\r
+class SleepTargetTime : public SlicePage<SleepPresenter>,\r
+                        public UIPicker::SelectedListener,\r
+                        public UIView::OnClickListener,\r
+                        public UIView::OnDragListener {\r
+public:\r
+    SleepTargetTime();\r
+    ~SleepTargetTime() override;\r
+\r
+    void OnStart(void* data) override;\r
+    bool OnClick(UIView &view, const ClickEvent &event) override;\r
+    bool OnDrag(UIView &view, const DragEvent &event) override;\r
+    void OnPickerStoped(UIPicker& picker) override;\r
+    void InitStartButton();\r
+    void CreatePicker();\r
+    void CreateLabel();\r
+    void SetPickerTime();\r
+private:\r
+    UIScrollView *group_{nullptr};\r
+    UILabel* targetTitleLabel_{nullptr};\r
+    UILabel* timerUnitLabel_{nullptr};\r
+    UILabelButton *startButton_{nullptr};\r
+    UIPicker* timerPicker_[PICKER_COUNT]{nullptr};\r
+};\r
+}\r
+#endif // TARGET_SLEEP_TIME_H
\ No newline at end of file
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/include/sleep/SleepView.h b/code/sdk/application/wearable/evb/nativeapp/nativeui/include/sleep/SleepView.h
new file mode 100644 (file)
index 0000000..01c9a7f
--- /dev/null
@@ -0,0 +1,22 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SleepView\r
+ * Created: 2025-06-05\r
+ */\r
+\r
+#ifndef SLEEP_VIEW_H\r
+#define SLEEP_VIEW_H\r
+\r
+#include "View.h"\r
+namespace OHOS {\r
+enum SLEEPING_PAGES {\r
+    SLEEPING_MAIN_PAGE = 1, // 0 is invalid\r
+    SLEEPING_DEATIL_PAGE = 2,\r
+    SLEEPING_TARGET_PAGE = 3,\r
+    SLEEPING_SLEEP_PAGE = 4,\r
+};\r
+class SleepPresenter;\r
+class SleepView : public View<SleepPresenter> {\r
+};\r
+}\r
+#endif // SLEEP_VIEW_H
\ No newline at end of file
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/include/sport/SportCountdownPage.h b/code/sdk/application/wearable/evb/nativeapp/nativeui/include/sport/SportCountdownPage.h
new file mode 100644 (file)
index 0000000..5a94db8
--- /dev/null
@@ -0,0 +1,48 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SportCountdownPage\r
+ * Create: 2025-06-06\r
+ */\r
+\r
+#ifndef SPORT_COUNTDOWN_PAGE_H\r
+#define SPORT_COUNTDOWN_PAGE_H\r
+\r
+#include "animator/animator.h"\r
+#include "components/ui_label.h"\r
+#include "components/ui_circle_progress.h"\r
+#include "components/ui_view_group.h"\r
+#include "SlicePage.h"\r
+#include "SportPresenter.h"\r
+#include "SportModel.h"\r
+\r
+namespace OHOS {\r
+class SportCountdownPage : public SlicePage<SportPresenter>,\r
+    public UIView::OnClickListener,\r
+    public UIView::OnDragListener {\r
+public:\r
+    SportCountdownPage() {}\r
+    ~SportCountdownPage();\r
+    void OnStart(void* data) override;\r
+    void OnPause() override;\r
+    void OnResume() override;\r
+    bool OnDrag(UIView& view, const DragEvent& event) override;\r
+    bool OnClick(UIView& view, const ClickEvent& event) override;\r
+private:\r
+    void UpdateCountdownView(uint64_t time);\r
+    class SportCountdownAnimatorCallback : public AnimatorCallback {\r
+    public:\r
+        SportCountdownAnimatorCallback(SportCountdownPage* page):page_(page) {}\r
+        virtual ~SportCountdownAnimatorCallback() override {}\r
+        void Callback(UIView* view) override;\r
+    private:\r
+        SportCountdownPage* page_{nullptr};\r
+    };\r
+    Animator* animator_{nullptr};\r
+    SportCountdownAnimatorCallback* callback_{nullptr};\r
+    UIViewGroup *group_{nullptr};\r
+    UILabel *countdownText_{nullptr};\r
+    UICircleProgress *countdownProgress_{nullptr};\r
+    struct timeval startTime_{0};\r
+};\r
+}  // namespace OHOS\r
+#endif  // SPORT_COUNTDOWN_PAGE_H
\ No newline at end of file
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/include/sport/SportDataPage.h b/code/sdk/application/wearable/evb/nativeapp/nativeui/include/sport/SportDataPage.h
new file mode 100644 (file)
index 0000000..ae650c8
--- /dev/null
@@ -0,0 +1,71 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SportDataPage\r
+ * Create: 2025-06-06\r
+ */\r
+\r
+#ifndef SPORT_DATA_PAGE_H\r
+#define SPORT_DATA_PAGE_H\r
+\r
+#include "components/ui_label.h"\r
+#include "components/ui_canvas.h"\r
+#include "components/ui_image_view.h"\r
+#include "components/ui_sweep_clock.h"\r
+#include "animator/animator.h"\r
+#include "SlicePage.h"\r
+#include "SportPresenter.h"\r
+#include "SportModel.h"\r
+\r
+namespace OHOS {\r
+class SportDataPage : public SlicePage<SportPresenter>,\r
+    public UIView::OnClickListener,\r
+    public UIView::OnDragListener {\r
+public:\r
+    SportDataPage() {}\r
+    ~SportDataPage();\r
+    void OnStart(void* data) override;\r
+    void OnPause() override;\r
+    void OnResume() override;\r
+    bool OnDrag(UIView& view, const DragEvent& event) override;\r
+    bool OnClick(UIView& view, const ClickEvent& event) override;\r
+private:\r
+    void InitBatteryView();\r
+    void InitTimeLableVIew();\r
+    void ShowUpHeartRate();\r
+    void ShowUpTopView();\r
+    void ShowUpLeftView();\r
+    void ShowUpRightView();\r
+    void ShowUpBottomView();\r
+    void ShowUpSeparateLine();\r
+    void UpdateDataViewByType();\r
+    void CheckTarget();\r
+    void CheckRemind();\r
+    class SportDataAnimatorCallback : public AnimatorCallback {\r
+    public:\r
+        SportDataAnimatorCallback(SportDataPage* page):page_(page) {}\r
+        virtual ~SportDataAnimatorCallback() override {}\r
+        void Callback(UIView* view) override;\r
+    private:\r
+        SportDataPage* page_{nullptr};\r
+    };\r
+    Animator* animator_{nullptr};\r
+    SportDataAnimatorCallback* callback_{nullptr};\r
+    Image *secondHand_{nullptr};\r
+    UISweepClock *sweepClock_{nullptr};\r
+    UIImageView *heartRateScale_{nullptr};\r
+    UIImageView *heartRatePointer_{nullptr};\r
+    UICanvas *separateLine_{nullptr};\r
+    UILabel *topValueLabel_{nullptr};\r
+    UILabel *topUnitLabel_{nullptr};\r
+    UILabel *leftValueLabel_{nullptr};\r
+    UILabel *leftUnitLabel_{nullptr};\r
+    UILabel *rightValueLabel_{nullptr};\r
+    UILabel *rightUnitLabel_{nullptr};\r
+    UILabel *bottomValueLabel_{nullptr};\r
+    UILabel *bottomUnitLabel_{nullptr};\r
+    UILabel *timeLabel_{nullptr};\r
+    UIImageView *batteryIcon_{nullptr};\r
+    UILabel *batteryLabel_{nullptr};\r
+};\r
+}  // namespace OHOS\r
+#endif  // SPORT_DATA_PAGE_H
\ No newline at end of file
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/include/sport/SportHeartRateRangeItemView.h b/code/sdk/application/wearable/evb/nativeapp/nativeui/include/sport/SportHeartRateRangeItemView.h
new file mode 100644 (file)
index 0000000..b4e20f7
--- /dev/null
@@ -0,0 +1,36 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SportHeartRateRangeItemView\r
+ * Create: 2025-06-06\r
+ */\r
+\r
+#ifndef SPORT_HEART_RATE_RANGE_ITEM_VIEW_H\r
+#define SPORT_HEART_RATE_RANGE_ITEM_VIEW_H\r
+\r
+#include "components/ui_view_group.h"\r
+#include "components/ui_image_view.h"\r
+#include "components/ui_radio_button.h"\r
+#include "components/ui_label.h"\r
+\r
+namespace OHOS {\r
+typedef struct {\r
+    uint8_t itemId;\r
+    const char *title;\r
+    const char *viewId;\r
+} SportHeartRateRangeItem;\r
+\r
+class SportHeartRateRangeItemView : public UIViewGroup {\r
+public:\r
+    SportHeartRateRangeItemView();\r
+    ~SportHeartRateRangeItemView() override;\r
+\r
+    virtual void SetItemInfo(const SportHeartRateRangeItem &itemInfo);\r
+\r
+private:\r
+    UIImageView bgImage_;\r
+    UILabel title_;\r
+    UILabel range_;\r
+    UIRadioButton button_;\r
+};\r
+}\r
+#endif
\ No newline at end of file
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/include/sport/SportHeartRateRangePage.h b/code/sdk/application/wearable/evb/nativeapp/nativeui/include/sport/SportHeartRateRangePage.h
new file mode 100644 (file)
index 0000000..a71eac7
--- /dev/null
@@ -0,0 +1,47 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SportHeartRateRangePage\r
+ * Create: 2025-06-06\r
+ */\r
+\r
+#ifndef SPORT_HEART_RATE_RANGE_PAGE_H\r
+#define SPORT_HEART_RATE_RANGE_PAGE_H\r
+\r
+#include "components/ui_label.h"\r
+#include "components/ui_simple_list.h"\r
+#include "components/ui_scroll_view.h"\r
+#include "SlicePage.h"\r
+#include "UiConfig.h"\r
+#include "SportPresenter.h"\r
+#include "SportModel.h"\r
+#include "SportHeartRateRangeItemView.h"\r
+\r
+namespace OHOS {\r
+const char* SPORT_HEARTRATE_RANGE_ITEM_1 = "sportHeartRateRangeItem1";\r
+const char* SPORT_HEARTRATE_RANGE_ITEM_2 = "sportHeartRateRangeItem2";\r
+const char* SPORT_HEARTRATE_RANGE_ITEM_3 = "sportHeartRateRangeItem3";\r
+const char* SPORT_HEARTRATE_RANGE_ITEM_4 = "sportHeartRateRangeItem4";\r
+\r
+class SportHeartRateRangePage : public SlicePage<SportPresenter>,\r
+    public UIView::OnClickListener,\r
+    public UIView::OnDragListener {\r
+public:\r
+    SportHeartRateRangePage();\r
+    ~SportHeartRateRangePage();\r
+    void OnStart(void* data) override;\r
+    bool OnDrag(UIView& view, const DragEvent& event) override;\r
+    bool OnClick(UIView& view, const ClickEvent& event) override;\r
+private:\r
+    void CreateUILabel(void);\r
+    void CreateUIList(void);\r
+    UIScrollView *group_{nullptr};\r
+    UILabel *titleLabel_{nullptr};\r
+    UISimpleList *heartRateRangeList_{nullptr};\r
+    SportHeartRateRangeItem heartRateRanges_[SPORT_HEARTRATE_RANGE_MAX] = {\r
+        {SPORT_HEARTRATE_RANGE_ITEM1, "热身燃脂", SPORT_HEARTRATE_RANGE_ITEM_1},\r
+        {SPORT_HEARTRATE_RANGE_ITEM2, "有氧耐力", SPORT_HEARTRATE_RANGE_ITEM_2},\r
+        {SPORT_HEARTRATE_RANGE_ITEM3, "无氧耐力", SPORT_HEARTRATE_RANGE_ITEM_3},\r
+        {SPORT_HEARTRATE_RANGE_ITEM4, "极限训练", SPORT_HEARTRATE_RANGE_ITEM_4}};\r
+};\r
+}  // namespace OHOS\r
+#endif  // SPORT_HEART_RATE_RANGE_PAGE_H
\ No newline at end of file
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/include/sport/SportMenuItemView.h b/code/sdk/application/wearable/evb/nativeapp/nativeui/include/sport/SportMenuItemView.h
new file mode 100644 (file)
index 0000000..0ed753d
--- /dev/null
@@ -0,0 +1,36 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SportMenuItemView\r
+ * Create: 2025-06-06\r
+ */\r
+\r
+#ifndef SPORT_MENU_ITEM_VIEW_H\r
+#define SPORT_MENU_ITEM_VIEW_H\r
+\r
+#include "components/ui_view_group.h"\r
+#include "components/ui_image_view.h"\r
+#include "components/ui_label.h"\r
+\r
+namespace OHOS {\r
+typedef struct {\r
+    int bgId;\r
+    int iconId;\r
+    const char *label;\r
+    const char *viewId;\r
+} SportMenuItem;\r
+\r
+class SportMenuItemView : public UIViewGroup {\r
+public:\r
+    SportMenuItemView();\r
+    ~SportMenuItemView() override;\r
+\r
+    virtual void SetItemInfo(const SportMenuItem &itemInfo);\r
+\r
+private:\r
+    UIImageView bgImage_;\r
+    UIImageView icon_;\r
+    UILabel label_;\r
+    UIImageView settingImage_;\r
+};\r
+}\r
+#endif
\ No newline at end of file
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/include/sport/SportMenuPage.h b/code/sdk/application/wearable/evb/nativeapp/nativeui/include/sport/SportMenuPage.h
new file mode 100644 (file)
index 0000000..95e9f30
--- /dev/null
@@ -0,0 +1,54 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SportMenuPage\r
+ * Create: 2025-06-06\r
+ */\r
+\r
+#ifndef SPORT_MENU_PAGE_H\r
+#define SPORT_MENU_PAGE_H\r
+\r
+#include "components/ui_label.h"\r
+#include "components/ui_simple_list.h"\r
+#include "components/ui_image_view.h"\r
+#include "components/ui_scroll_view.h"\r
+#include "ui_resource_sport.h"\r
+#include "SlicePage.h"\r
+#include "SportPresenter.h"\r
+#include "SportModel.h"\r
+#include "SportMenuItemView.h"\r
+\r
+namespace OHOS {\r
+const char* SPORT_ITEM_OUTDOOR_RUNNING = "sportItemOutdoorRunning";\r
+const char* SPORT_ITEM_INDOOR_RUNNING = "sportItemIndoorRunning";\r
+const char* SPORT_ITEM_CYCLING = "sportItemCycling";\r
+const char* SPORT_ITEM_CLIMBING = "sportItemClimbing";\r
+const char* SPORT_ITEM_INDOOR_SWIMMING = "sportItemIndoorSwimming";\r
+const char* SPORT_ITEM_OUTDOOR_SWIMMING = "sportItemOutdoorSwimming";\r
+\r
+class SportMenuPage : public SlicePage<SportPresenter>,\r
+    public UIView::OnClickListener,\r
+    public UIView::OnDragListener {\r
+public:\r
+    SportMenuPage();\r
+    ~SportMenuPage();\r
+    void OnStart(void* data) override;\r
+    bool OnDrag(UIView& view, const DragEvent& event) override;\r
+    bool OnClick(UIView& view, const ClickEvent& event) override;\r
+private:\r
+    void InitBackgroundView();\r
+    void CreateUILabel(void);\r
+    void CreateUIList(void);\r
+    UIScrollView *group_{nullptr};\r
+    UIImageView *background_{nullptr};\r
+    UILabel *titleLabel_{nullptr};\r
+    UISimpleList *sportList_{nullptr};\r
+    SportMenuItem sportMenu_[SPORT_TYPE_MAX] = {\r
+        {IMAGE_SPORT_ITEMBG1, IMAGE_SPORT_OUTDOOR_RUNNING1, "户外跑步", SPORT_ITEM_OUTDOOR_RUNNING},\r
+        {IMAGE_SPORT_ITEMBG2, IMAGE_SPORT_INDOOR_RUNNING1, "室内跑步", SPORT_ITEM_INDOOR_RUNNING},\r
+        {IMAGE_SPORT_ITEMBG3, IMAGE_SPORT_CYCLING1, "骑行", SPORT_ITEM_CYCLING},\r
+        {IMAGE_SPORT_ITEMBG4, IMAGE_SPORT_CLIMBING1, "登山", SPORT_ITEM_CLIMBING},\r
+        {IMAGE_SPORT_ITEMBG6, IMAGE_SPORT_INDOOR_SWIMMING1, "室内游泳", SPORT_ITEM_INDOOR_SWIMMING},\r
+        {IMAGE_SPORT_ITEMBG5, IMAGE_SPORT_OUTDOOR_SWIMMING1, "户外游泳", SPORT_ITEM_OUTDOOR_SWIMMING}};\r
+};\r
+}  // namespace OHOS\r
+#endif  // SPORT_MENU_PAGE_H
\ No newline at end of file
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/include/sport/SportMistouchPage.h b/code/sdk/application/wearable/evb/nativeapp/nativeui/include/sport/SportMistouchPage.h
new file mode 100644 (file)
index 0000000..6dbea19
--- /dev/null
@@ -0,0 +1,46 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SportMistouchPage\r
+ * Create: 2025-06-06\r
+ */\r
+\r
+#ifndef SPORT_MISTOUCH_PAGE_H\r
+#define SPORT_MISTOUCH_PAGE_H\r
+\r
+#include "components/ui_label.h"\r
+#include "components/ui_toggle_button.h"\r
+#include "components/ui_image_view.h"\r
+#include "components/ui_scroll_view.h"\r
+#include "SlicePage.h"\r
+#include "SportPresenter.h"\r
+#include "SportModel.h"\r
+\r
+namespace OHOS {\r
+const char* SPORT_MISTOUCH_SCREEN_BUTTON = "sportMistouchScreenButton";\r
+const char* SPORT_MISTOUCH_CROWN_BUTTON = "sportMistouchCrownButton";\r
+\r
+class SportMistouchPage : public SlicePage<SportPresenter>,\r
+    public UIView::OnClickListener,\r
+    public UIView::OnDragListener {\r
+public:\r
+    SportMistouchPage() {}\r
+    ~SportMistouchPage();\r
+    void OnStart(void* data) override;\r
+    bool OnDrag(UIView& view, const DragEvent& event) override;\r
+    bool OnClick(UIView& view, const ClickEvent& event) override;\r
+private:\r
+    UIScrollView* group_ = nullptr;\r
+    UILabel* title_ = nullptr;\r
+    UIImageView* bgScreen_ = nullptr;\r
+    UIToggleButton* buttonScreen_ = nullptr;\r
+    UILabel* titleScreen_ = nullptr;\r
+    UIImageView* imageScreen_ = nullptr;\r
+    UIImageView* bgCrown_ = nullptr;\r
+    UIToggleButton* buttonCrown_ = nullptr;\r
+    UILabel* titleCrown_ = nullptr;\r
+    UIImageView* imageCrown_ = nullptr;\r
+    UILabel* textScreen_ = nullptr;\r
+    UILabel* textCrown_ = nullptr;\r
+};\r
+}  // namespace OHOS\r
+#endif  // SPORT_MISTOUCH_PAGE_H
\ No newline at end of file
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/include/sport/SportModel.h b/code/sdk/application/wearable/evb/nativeapp/nativeui/include/sport/SportModel.h
new file mode 100644 (file)
index 0000000..6832bdd
--- /dev/null
@@ -0,0 +1,199 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SportModel\r
+ * Create: 2025-06-06\r
+ */\r
+\r
+#ifndef SPORT_MODEL_H\r
+#define SPORT_MODEL_H\r
+\r
+#include <vector>\r
+#if defined(_WIN32)\r
+#include "animator/animator.h"\r
+#define SPORT_CONFIG_PATH\r
+#else\r
+#define SPORT_CONFIG_PATH "/user/data/"\r
+#include "ohos_timer.h"\r
+#include "graphic_timer.h"\r
+#endif\r
+\r
+namespace OHOS {\r
+enum SportType : uint8_t {\r
+    SPORT_TYPE_OUTDOOR_RUNNING = 0,\r
+    SPORT_TYPE_INDOOR_RUNNING,\r
+    SPORT_TYPE_CYCLING,\r
+    SPORT_TYPE_CLIMBING,\r
+    SPORT_TYPE_INDOOR_SWIMMING,\r
+    SPORT_TYPE_OUTDOOR_SWIMMING,\r
+    SPORT_TYPE_MAX,\r
+};\r
+\r
+enum SportSetType : uint8_t {\r
+    SPORT_SET_TYPE_TARGET = 0,  // 设置项(目标)和提示类型共用\r
+    SPORT_SET_TYPE_REMIND,      // 设置项(提醒)和提示类型共用\r
+    SPORT_SET_TYPE_MISTOUCH,    // 设置项(防误触)\r
+    SPORT_SET_TYPE_MAX = 3,     // 设置项最大值\r
+    SPORT_SET_TYPE_HEARTRATE,   // 只用于心率提示类型\r
+};\r
+\r
+enum SportTarget : uint8_t {\r
+    SPORT_TARGET_DISTANCE = 0,\r
+    SPORT_TARGET_TIME,\r
+    SPORT_TARGET_CALORIE,\r
+    SPORT_TARGET_MAX,\r
+};\r
+\r
+enum SportRemind : uint8_t {\r
+    SPORT_REMIND_INTERVAL = 0,\r
+    SPORT_REMIND_HEARTRATE,\r
+    SPORT_REMIND_MAX,\r
+};\r
+\r
+enum SportRemindInterval : uint8_t {\r
+    SPORT_REMIND_INTERVAL_NONE = 0,\r
+    SPORT_REMIND_INTERVAL_DISTANCE,\r
+    SPORT_REMIND_INTERVAL_TIME,\r
+    SPORT_REMIND_INTERVAL_MAX,\r
+};\r
+\r
+enum SportRemindHeartRate : uint8_t {\r
+    SPORT_REMIND_HEARTRATE_ENABLE = 0,\r
+    SPORT_REMIND_HEARTRATE_RANGE,\r
+    SPORT_REMIND_HEARTRATE_MAX,\r
+};\r
+\r
+enum SportHeartRateRange : uint8_t {\r
+    SPORT_HEARTRATE_RANGE_ITEM1 = 0,\r
+    SPORT_HEARTRATE_RANGE_ITEM2,\r
+    SPORT_HEARTRATE_RANGE_ITEM3,\r
+    SPORT_HEARTRATE_RANGE_ITEM4,\r
+    SPORT_HEARTRATE_RANGE_MAX,\r
+};\r
+\r
+enum GpsSignal : uint8_t {\r
+    SPORT_GPS_SIGNAL0 = 0,\r
+    SPORT_GPS_SIGNAL1,\r
+    SPORT_GPS_SIGNAL2,\r
+    SPORT_GPS_SIGNAL3,\r
+};\r
+\r
+enum SportAction : uint8_t {\r
+    SPORT_ACTION_START = 1,\r
+    SPORT_ACTION_PAUSE = 2,\r
+    SPORT_ACTION_RESUME = 3,\r
+    SPORT_ACTION_STOP = 4,\r
+};\r
+\r
+enum SportConfig : uint8_t {\r
+    SPORT_CONFIG_INFO = 1,\r
+    SPORT_CONFIG_RECORD = 2,\r
+};\r
+\r
+typedef struct sport_control {\r
+    uint8_t action;\r
+    uint8_t type;\r
+} sport_control_t;\r
+\r
+typedef struct sport_data {\r
+    uint8_t type;          // 运动类型\r
+    uint16_t heartRate;    // 心率\r
+    uint16_t calorie;      // 卡路里\r
+    uint16_t altitude;     // 高度\r
+    uint16_t ascent;       // 海拔上升\r
+    uint16_t descent;      // 海拔下降\r
+    uint32_t distance;     // 运动距离\r
+    uint32_t lap;          // 室内游泳趟数\r
+    uint32_t startTime;    // 运动开始时间\r
+    uint32_t endTime;      // 运动结束时间\r
+    uint32_t elapsedTime;  // 运动总耗时\r
+} sport_data_t;\r
+\r
+typedef struct sport_info {\r
+    SportSetType setType;                // 当前设置项类型(目标或提醒)\r
+    SportSetType promptType;             // 当前提醒项类型\r
+    bool isTargetSetted;                 // 是否已设置过目标\r
+    SportTarget targetType;              // 目标类型\r
+    SportTarget targetTypeTemp;          // 临时目标类型,用于恢复没有成功设置目标类型时\r
+    uint16_t targetValue;                // 设置的目标值,在Picker中选择的值\r
+    bool targetHalf;                     // 是否达到一半目标\r
+    bool targetComplete;                 // 是否达成半目标\r
+    bool isRemindSetted;                 // 是否已设置过提醒\r
+    SportRemindInterval remindType;      // 提醒类型\r
+    SportRemindInterval remindTypeTemp;  // 临时提醒类型,用于恢复没有成功设置提醒类型时\r
+    uint16_t remindIndex;                // 提醒的索引值,在Picker中的索引值\r
+    uint16_t remindValue;                // 设置的提醒值,在Picker中选择的值\r
+    uint16_t remindTimes;                // 已经提醒的次数\r
+    bool enableHeartRemind;              // 是否开启心率提醒\r
+    bool isHeartReminded;                // 同区间的心率值是否已经提醒过\r
+    SportHeartRateRange heartRange;      // 设置的心率提醒区间\r
+    bool enableScreenLock;               // 是否开启屏幕锁定\r
+    bool enableCrownLock;                // 是否开启表冠锁定\r
+    uint32_t startTimeTemp;              // 用于暂停时再继续运动时计算运动耗时\r
+    sport_data_t data;                   // 各项运动数据\r
+} sport_info_t;\r
+\r
+std::string GetCurrentTimeStr();\r
+std::string ConvertDistance(uint32_t distance);\r
+std::string FormatSportTime(uint32_t uiSportTime);\r
+std::string CalculateSpeed(uint32_t distance, uint32_t time);\r
+const char *GetHeartRateRangeDescription(uint8_t range);\r
+uint16_t GetHeartRateRangeBounder(uint8_t index);\r
+\r
+class SportModel {\r
+public:\r
+    enum class SportState : uint8_t { STOPPED, RUNNING, PAUSED };\r
+    static SportModel &GetInstance(void);\r
+    void SetSportType(SportType sportType);\r
+    SportType GetSportType(void);\r
+    void SetTargetValue(uint16_t index);\r
+    void SetRemindValue(uint16_t index);\r
+    void SetGpsSignal(GpsSignal gpsSignal);\r
+    GpsSignal GetGpsSignal(void);\r
+    uint16_t GetHeartRate(void);\r
+    sport_info_t *GetSportInfo(SportType type);\r
+    sport_info_t *GetCurrSportInfo();\r
+    uint32_t GetElapsedTime();\r
+    void StartSport(bool startedByWatch);\r
+    void PauseAndReport(bool isReport);\r
+    void ResumeAndReport(bool isReport);\r
+    void StopAndReport(bool isReport);\r
+    void AddRecord();\r
+    void ClearRecord();\r
+    std::vector<sport_data_t> &GetRecord();\r
+    bool IsStartByWatch();\r
+    void LoadConfig();\r
+    void SaveConfig(uint8_t config);\r
+    void ClearData();\r
+\r
+private:\r
+    SportModel();\r
+    SportModel(const SportModel &);\r
+    SportModel &operator=(const SportModel &);\r
+    virtual ~SportModel();\r
+    SportType curSport_;\r
+    sport_info_t info_[SPORT_TYPE_MAX];\r
+    GpsSignal gpsSignal_;\r
+    bool isStartByWatch_{false};\r
+    SportState state_;\r
+    std::vector<sport_data_t> records_;\r
+#if defined(_WIN32)\r
+    class SportAnimatorCallback : public AnimatorCallback {\r
+    public:\r
+        SportAnimatorCallback() {}\r
+        virtual ~SportAnimatorCallback() override {}\r
+        void Callback(UIView *view) override;\r
+\r
+    private:\r
+    };\r
+    SportAnimatorCallback *callback_{nullptr};\r
+    Animator *animator_{nullptr};\r
+#else\r
+    GraphicTimer *generateDataHandle_{nullptr};\r
+    void InitGenerateSportData();\r
+    void StartGenerateSportData();\r
+    void StopGenerateSportData();\r
+#endif\r
+};\r
+}\r
+\r
+#endif  // SPORT_MODEL_H
\ No newline at end of file
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/include/sport/SportPausePage.h b/code/sdk/application/wearable/evb/nativeapp/nativeui/include/sport/SportPausePage.h
new file mode 100644 (file)
index 0000000..232b06a
--- /dev/null
@@ -0,0 +1,51 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SportPausePage\r
+ * Create: 2025-06-06\r
+ */\r
+\r
+#ifndef SPORT_PAUSE_PAGE_H\r
+#define SPORT_PAUSE_PAGE_H\r
+\r
+#include "components/ui_label.h"\r
+#include "components/ui_label_button.h"\r
+#include "components/ui_view_group.h"\r
+#include "animator/animator.h"\r
+#include "SlicePage.h"\r
+#include "SportPresenter.h"\r
+#include "SportModel.h"\r
+\r
+namespace OHOS {\r
+const char* SPORT_PAUSE_CONTINUE_BUTTON = "sportPauseContinueButton";\r
+const char* SPORT_PAUSE_FINISH_BUTTON = "sportPauseFinishButton";\r
+\r
+class SportPausePage : public SlicePage<SportPresenter>,\r
+    public UIView::OnClickListener,\r
+    public UIView::OnDragListener {\r
+public:\r
+    SportPausePage() {}\r
+    ~SportPausePage();\r
+    void OnStart(void* data) override;\r
+    void OnPause() override;\r
+    void OnResume() override;\r
+    bool OnDrag(UIView& view, const DragEvent& event) override;\r
+    bool OnClick(UIView& view, const ClickEvent& event) override;\r
+private:\r
+    void CreateUILabel(void);\r
+    void CreateUIButton(void);\r
+    class SportPauseAnimatorCallback : public AnimatorCallback {\r
+    public:\r
+        SportPauseAnimatorCallback() {}\r
+        virtual ~SportPauseAnimatorCallback() override {}\r
+        void Callback(UIView* view) override;\r
+    };\r
+    SportPauseAnimatorCallback* callback_{nullptr};\r
+    Animator* animator_{nullptr};\r
+    UIViewGroup *group_{nullptr};\r
+    UILabel *timeLabel_{nullptr};\r
+    UILabel *textLabel_{nullptr};\r
+    UILabelButton *continueButton_{nullptr};\r
+    UILabelButton *finishButton_{nullptr};\r
+};\r
+}  // namespace OHOS\r
+#endif  // SPORT_PAUSE_PAGE_H
\ No newline at end of file
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/include/sport/SportPreparePage.h b/code/sdk/application/wearable/evb/nativeapp/nativeui/include/sport/SportPreparePage.h
new file mode 100644 (file)
index 0000000..20756b5
--- /dev/null
@@ -0,0 +1,69 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SportPreparePage\r
+ * Create: 2025-06-06\r
+ */\r
+\r
+#ifndef SPORT_PREPARE_PAGE_H\r
+#define SPORT_PREPARE_PAGE_H\r
+\r
+#include "components/ui_label.h"\r
+#include "components/ui_image_view.h"\r
+#include "components/ui_label_button.h"\r
+#include "components/ui_view_group.h"\r
+#include "animator/animator.h"\r
+#include "SlicePage.h"\r
+#include "SportPresenter.h"\r
+#include "SportModel.h"\r
+\r
+namespace OHOS {\r
+const char* SPORT_PREPARE_GO_BUTTON = "sportPrepareGoButton";\r
+\r
+class SportPreparePage : public SlicePage<SportPresenter>,\r
+    public UIView::OnClickListener,\r
+    public UIView::OnDragListener {\r
+public:\r
+    SportPreparePage() {}\r
+    ~SportPreparePage();\r
+    void OnStart(void* data) override;\r
+    void OnPause() override;\r
+    void OnResume() override;\r
+    bool OnDrag(UIView& view, const DragEvent& event) override;\r
+    bool OnClick(UIView& view, const ClickEvent& event) override;\r
+private:\r
+    void InitGpsSignalImage();\r
+    void InitBackgroundView();\r
+    void InitBatteryView();\r
+    void InitHeartbeatView();\r
+    void InitTimeLableVIew();\r
+    void InitCenterView();\r
+    void InitGPSView();\r
+    void InitHeartRateView();\r
+    void InitGoButtonView();\r
+    class SportPrepareAnimatorCallback : public AnimatorCallback {\r
+    public:\r
+        SportPrepareAnimatorCallback(SportPreparePage* page):page_(page) {}\r
+        virtual ~SportPrepareAnimatorCallback() override {}\r
+        void Callback(UIView* view) override;\r
+    private:\r
+        SportPreparePage* page_{nullptr};\r
+    };\r
+    SportPrepareAnimatorCallback* callback_{nullptr};\r
+    Animator* animator_{nullptr};\r
+    UIViewGroup *group_{nullptr};\r
+    UIImageView *background_{nullptr};\r
+    UILabel *timeLabel_{nullptr};\r
+    UIImageView *batteryIcon_{nullptr};\r
+    UILabel *batteryLabel_{nullptr};\r
+    UILabel *locatingLabel_{nullptr};\r
+    UIImageView *gpsImageView_{nullptr};\r
+    UIImageView *gpsSignalView_{nullptr};\r
+    UIImageView *heartRateImageView_{nullptr};\r
+    UILabel *heartRateLabel_{nullptr};\r
+    UILabelButton *goButton_{nullptr};\r
+    UIImageView *iconImageView_{nullptr};\r
+    time_t startTime_{0};\r
+    bool isOverTime_{false};\r
+};\r
+}  // namespace OHOS\r
+#endif  // SPORT_PREPARE_PAGE_H
\ No newline at end of file
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/include/sport/SportPresenter.h b/code/sdk/application/wearable/evb/nativeapp/nativeui/include/sport/SportPresenter.h
new file mode 100644 (file)
index 0000000..bad4570
--- /dev/null
@@ -0,0 +1,17 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SportPresenter\r
+ * Create: 2025-06-06\r
+ */\r
+\r
+#ifndef SPORT_PRESENTER_H\r
+#define SPORT_PRESENTER_H\r
+\r
+#include "Presenter.h"\r
+\r
+namespace OHOS {\r
+class SportView;\r
+class SportPresenter : public Presenter<SportView> {};\r
+}\r
+\r
+#endif  // SPORT_PRESENTER_H
\ No newline at end of file
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/include/sport/SportPromptPage.h b/code/sdk/application/wearable/evb/nativeapp/nativeui/include/sport/SportPromptPage.h
new file mode 100644 (file)
index 0000000..cbd9fef
--- /dev/null
@@ -0,0 +1,40 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SportPromptPage\r
+ * Create: 2025-06-06\r
+ */\r
+\r
+#ifndef SPORT_PROMPT_PAGE_H\r
+#define SPORT_PROMPT_PAGE_H\r
+\r
+#include "components/ui_label.h"\r
+#include "components/ui_button.h"\r
+#include "components/ui_image_view.h"\r
+#include "components/ui_view_group.h"\r
+#include "SlicePage.h"\r
+#include "SportPresenter.h"\r
+\r
+namespace OHOS {\r
+const char* SPORT_PROMPT_CANCEL_BUTTON = "sportPromptCancelButton";\r
+const char* SPORT_PROMPT_CONFIRM_BUTTON = "sportPromptConfirmButton";\r
+\r
+class SportPromptPage : public SlicePage<SportPresenter>,\r
+    public UIView::OnClickListener,\r
+    public UIView::OnDragListener {\r
+public:\r
+    SportPromptPage() {}\r
+    ~SportPromptPage();\r
+    void OnStart(void* data) override;\r
+    bool OnDrag(UIView& view, const DragEvent& event) override;\r
+    bool OnClick(UIView& view, const ClickEvent& event) override;\r
+private:\r
+    void CreateUILabel(void);\r
+    void CreateUIButton(void);\r
+    UIViewGroup *group_{nullptr};\r
+    UIImageView *promptIcon_{nullptr};\r
+    UILabel *promptLabel_{nullptr};\r
+    UIButton *cancelButton_{nullptr};\r
+    UIButton *confirmButton_{nullptr};\r
+};\r
+}  // namespace OHOS\r
+#endif  // SPORT_PROMPT_PAGE_H
\ No newline at end of file
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/include/sport/SportRemindHeartRateItemView.h b/code/sdk/application/wearable/evb/nativeapp/nativeui/include/sport/SportRemindHeartRateItemView.h
new file mode 100644 (file)
index 0000000..12e7d90
--- /dev/null
@@ -0,0 +1,39 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SportRemindHeartRateItemView\r
+ * Create: 2025-06-06\r
+ */\r
+\r
+#ifndef SPORT_REMIND_HEART_RATE_ITEM_VIEW_H\r
+#define SPORT_REMIND_HEART_RATE_ITEM_VIEW_H\r
+\r
+#include "components/ui_view_group.h"\r
+#include "components/ui_image_view.h"\r
+#include "components/ui_toggle_button.h"\r
+#include "components/ui_label.h"\r
+\r
+namespace OHOS {\r
+typedef struct {\r
+    uint8_t itemId;\r
+    int iconId;\r
+    const char *label;\r
+    const char *viewId;\r
+} SportRemindHeartRateItem;\r
+\r
+class SportRemindHeartRateItemView : public UIViewGroup {\r
+public:\r
+    SportRemindHeartRateItemView();\r
+    ~SportRemindHeartRateItemView() override;\r
+\r
+    virtual void SetItemInfo(const SportRemindHeartRateItem &itemInfo);\r
+\r
+private:\r
+    UIImageView bgImage_;\r
+    UIImageView icon_;\r
+    UILabel label_;\r
+    UILabel hits_;\r
+    UIToggleButton button_;\r
+    UIImageView nextImage_;\r
+};\r
+}\r
+#endif
\ No newline at end of file
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/include/sport/SportRemindHeartRatePage.h b/code/sdk/application/wearable/evb/nativeapp/nativeui/include/sport/SportRemindHeartRatePage.h
new file mode 100644 (file)
index 0000000..34ebec7
--- /dev/null
@@ -0,0 +1,44 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SportRemindHeartRatePage\r
+ * Create: 2025-06-06\r
+ */\r
+\r
+#ifndef SPORT_REMIND_HEART_RATE_PAGE_H\r
+#define SPORT_REMIND_HEART_RATE_PAGE_H\r
+\r
+#include "components/ui_label.h"\r
+#include "components/ui_simple_list.h"\r
+#include "components/ui_view_group.h"\r
+#include "UiConfig.h"\r
+#include "ui_resource_sport.h"\r
+#include "SlicePage.h"\r
+#include "SportPresenter.h"\r
+#include "SportModel.h"\r
+#include "SportRemindHeartRateItemView.h"\r
+\r
+namespace OHOS {\r
+const char* SPORT_REMIND_HEARTRATE_ITEM_ENABLE = "sportRemindHeartRateItemEnable";\r
+const char* SPORT_REMIND_HEARTRATE_ITEM_RANGE = "sportRemindHeartRateItemRange";\r
+\r
+class SportRemindHeartRatePage : public SlicePage<SportPresenter>,\r
+    public UIView::OnClickListener,\r
+    public UIView::OnDragListener {\r
+public:\r
+    SportRemindHeartRatePage();\r
+    ~SportRemindHeartRatePage();\r
+    void OnStart(void* data) override;\r
+    bool OnDrag(UIView& view, const DragEvent& event) override;\r
+    bool OnClick(UIView& view, const ClickEvent& event) override;\r
+private:\r
+    void CreateUILabel(void);\r
+    void CreateUIList(void);\r
+    UIViewGroup *group_{nullptr};\r
+    UILabel *titleLabel_{nullptr};\r
+    UISimpleList *remindHeartRateList_{nullptr};\r
+    SportRemindHeartRateItem remindHeartRates_[SPORT_REMIND_HEARTRATE_MAX] = {\r
+        {SPORT_REMIND_HEARTRATE_ENABLE, IMAGE_SPORT_HEARTRATE, "心率提醒", SPORT_REMIND_HEARTRATE_ITEM_ENABLE},\r
+        {SPORT_REMIND_HEARTRATE_RANGE, IMAGE_SPORT_HEARTRATE, "心率范围", SPORT_REMIND_HEARTRATE_ITEM_RANGE}};\r
+};\r
+}  // namespace OHOS\r
+#endif  // SPORT_REMIND_HEART_RATE_PAGE_H
\ No newline at end of file
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/include/sport/SportRemindIntervalItemView.h b/code/sdk/application/wearable/evb/nativeapp/nativeui/include/sport/SportRemindIntervalItemView.h
new file mode 100644 (file)
index 0000000..4ad204c
--- /dev/null
@@ -0,0 +1,36 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SportRemindIntervalItemView\r
+ * Create: 2025-06-06\r
+ */\r
+\r
+#ifndef SPORT_REMIND_INTERVAL_ITEM_VIEW_H\r
+#define SPORT_REMIND_INTERVAL_ITEM_VIEW_H\r
+\r
+#include "components/ui_view_group.h"\r
+#include "components/ui_image_view.h"\r
+#include "components/ui_label.h"\r
+\r
+namespace OHOS {\r
+typedef struct {\r
+    uint8_t itemId;\r
+    int iconId;\r
+    const char *label;\r
+    const char *viewId;\r
+} SportRemindIntervalItem;\r
+\r
+class SportRemindIntervalItemView : public UIViewGroup {\r
+public:\r
+    SportRemindIntervalItemView();\r
+    ~SportRemindIntervalItemView() override;\r
+\r
+    virtual void SetItemInfo(const SportRemindIntervalItem &itemInfo);\r
+\r
+private:\r
+    UIImageView bgImage_;\r
+    UIImageView icon_;\r
+    UILabel label_;\r
+    UIImageView nextImage_;\r
+};\r
+}\r
+#endif
\ No newline at end of file
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/include/sport/SportRemindIntervalPage.h b/code/sdk/application/wearable/evb/nativeapp/nativeui/include/sport/SportRemindIntervalPage.h
new file mode 100644 (file)
index 0000000..08d7f50
--- /dev/null
@@ -0,0 +1,48 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SportRemindIntervalPage\r
+ * Create: 2025-06-06\r
+ */\r
+\r
+#ifndef SPORT_REMIND_INTERVAL_PAGE_H\r
+#define SPORT_REMIND_INTERVAL_PAGE_H\r
+\r
+#include "components/ui_label.h"\r
+#include "components/ui_simple_list.h"\r
+#include "components/ui_image_view.h"\r
+#include "components/ui_scroll_view.h"\r
+#include "SlicePage.h"\r
+#include "ui_resource_sport.h"\r
+#include "SportPresenter.h"\r
+#include "SportModel.h"\r
+#include "SportRemindIntervalItemView.h"\r
+\r
+namespace OHOS {\r
+const char* SPORT_REMIND_INTERVAL_ITEM_DISTANCE = "sportRemindIntervalItemDistance";\r
+const char* SPORT_REMIND_INTERVAL_ITEM_TIME = "sportRemindIntervalItemTime";\r
+const char* SPORT_REMIND_INTERVAL_ITEM_NONE = "sportRemindIntervalItemNone";\r
+\r
+class SportRemindIntervalPage : public SlicePage<SportPresenter>,\r
+    public UIView::OnClickListener,\r
+    public UIView::OnDragListener {\r
+public:\r
+    SportRemindIntervalPage();\r
+    ~SportRemindIntervalPage();\r
+    void OnStart(void* data) override;\r
+    bool OnDrag(UIView& view, const DragEvent& event) override;\r
+    bool OnClick(UIView& view, const ClickEvent& event) override;\r
+private:\r
+    void InitBackgroundView();\r
+    void CreateUILabel(void);\r
+    void CreateUIList(void);\r
+    UIScrollView *group_{nullptr};\r
+    UIImageView *background_{nullptr};\r
+    UILabel *titleLabel_{nullptr};\r
+    UISimpleList *remindIntervalList_{nullptr};\r
+    SportRemindIntervalItem remindIntervals_[SPORT_REMIND_INTERVAL_MAX] = {\r
+        {SPORT_REMIND_INTERVAL_DISTANCE, IMAGE_SPORT_DISTANCE, "距离", SPORT_REMIND_INTERVAL_ITEM_DISTANCE},\r
+        {SPORT_REMIND_INTERVAL_TIME, IMAGE_SPORT_TIME, "时间", SPORT_REMIND_INTERVAL_ITEM_TIME},\r
+        {SPORT_REMIND_INTERVAL_NONE, IMAGE_SPORT_NONE, "无提醒", SPORT_REMIND_INTERVAL_ITEM_NONE}};\r
+};\r
+}  // namespace OHOS\r
+#endif  // SPORT_REMIND_INTERVAL_PAGE_H
\ No newline at end of file
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/include/sport/SportRemindItemView.h b/code/sdk/application/wearable/evb/nativeapp/nativeui/include/sport/SportRemindItemView.h
new file mode 100644 (file)
index 0000000..9c3368e
--- /dev/null
@@ -0,0 +1,37 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SportRemindItemView\r
+ * Create: 2025-06-06\r
+ */\r
+\r
+#ifndef SPORT_REMIND_ITEM_VIEW_H\r
+#define SPORT_REMIND_ITEM_VIEW_H\r
+\r
+#include "components/ui_view_group.h"\r
+#include "components/ui_image_view.h"\r
+#include "components/ui_label.h"\r
+\r
+namespace OHOS {\r
+typedef struct {\r
+    uint8_t itemId;\r
+    int iconId;\r
+    const char *label;\r
+    const char *viewId;\r
+} SportRemindItem;\r
+\r
+class SportRemindItemView : public UIViewGroup {\r
+public:\r
+    SportRemindItemView();\r
+    ~SportRemindItemView() override;\r
+\r
+    virtual void SetItemInfo(const SportRemindItem &itemInfo);\r
+\r
+private:\r
+    UIImageView bgImage_;\r
+    UIImageView icon_;\r
+    UILabel label_;\r
+    UILabel hits_;\r
+    UIImageView nextImage_;\r
+};\r
+}\r
+#endif
\ No newline at end of file
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/include/sport/SportRemindPage.h b/code/sdk/application/wearable/evb/nativeapp/nativeui/include/sport/SportRemindPage.h
new file mode 100644 (file)
index 0000000..7b5b4d0
--- /dev/null
@@ -0,0 +1,46 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SportRemindPage\r
+ * Create: 2025-06-06\r
+ */\r
+\r
+#ifndef SPORT_REMIND_PAGE_H\r
+#define SPORT_REMIND_PAGE_H\r
+\r
+#include "components/ui_label.h"\r
+#include "components/ui_simple_list.h"\r
+#include "components/ui_image_view.h"\r
+#include "components/ui_view_group.h"\r
+#include "SlicePage.h"\r
+#include "ui_resource_sport.h"\r
+#include "SportPresenter.h"\r
+#include "SportModel.h"\r
+#include "SportRemindItemView.h"\r
+\r
+namespace OHOS {\r
+const char* SPORT_REMIND_ITEM_INTERVAL = "sportRemindItemInterval";\r
+const char* SPORT_REMIND_ITEM_HEARTRATE = "sportRemindItemHeartRate";\r
+\r
+class SportRemindPage : public SlicePage<SportPresenter>,\r
+    public UIView::OnClickListener,\r
+    public UIView::OnDragListener {\r
+public:\r
+    SportRemindPage();\r
+    ~SportRemindPage();\r
+    void OnStart(void* data) override;\r
+    bool OnDrag(UIView& view, const DragEvent& event) override;\r
+    bool OnClick(UIView& view, const ClickEvent& event) override;\r
+private:\r
+    void InitBackgroundView();\r
+    void CreateUILabel(void);\r
+    void CreateUIList(void);\r
+    UIViewGroup *group_{nullptr};\r
+    UIImageView *background_{nullptr};\r
+    UILabel *titleLabel_{nullptr};\r
+    UISimpleList *remindList_{nullptr};\r
+    SportRemindItem reminds_[SPORT_REMIND_MAX] = {\r
+        {SPORT_REMIND_INTERVAL, IMAGE_SPORT_INTERVAL, "间隔提醒", SPORT_REMIND_ITEM_INTERVAL},\r
+        {SPORT_REMIND_HEARTRATE, IMAGE_SPORT_HEARTRATE, "心率提醒", SPORT_REMIND_ITEM_HEARTRATE}};\r
+};\r
+}  // namespace OHOS\r
+#endif  // SPORT_REMIND_PAGE_H
\ No newline at end of file
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/include/sport/SportSettingsItemView.h b/code/sdk/application/wearable/evb/nativeapp/nativeui/include/sport/SportSettingsItemView.h
new file mode 100644 (file)
index 0000000..124719e
--- /dev/null
@@ -0,0 +1,37 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SportSettingsItemView\r
+ * Create: 2025-06-06\r
+ */\r
+\r
+#ifndef SPORT_SETTINGS_ITEM_VIEW_H\r
+#define SPORT_SETTINGS_ITEM_VIEW_H\r
+\r
+#include "components/ui_view_group.h"\r
+#include "components/ui_image_view.h"\r
+#include "components/ui_label.h"\r
+\r
+namespace OHOS {\r
+typedef struct {\r
+    uint8_t itemId;\r
+    int iconId;\r
+    const char *label;\r
+    const char *viewId;\r
+} SportSettingsItem;\r
+\r
+class SportSettingsItemView : public UIViewGroup {\r
+public:\r
+    SportSettingsItemView();\r
+    ~SportSettingsItemView() override;\r
+\r
+    virtual void SetItemInfo(const SportSettingsItem &itemInfo);\r
+\r
+private:\r
+    UIImageView bgImage_;\r
+    UIImageView icon_;\r
+    UILabel label_;\r
+    UILabel hits_;\r
+    UIImageView nextImage_;\r
+};\r
+}\r
+#endif
\ No newline at end of file
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/include/sport/SportSettingsPage.h b/code/sdk/application/wearable/evb/nativeapp/nativeui/include/sport/SportSettingsPage.h
new file mode 100644 (file)
index 0000000..50f41dd
--- /dev/null
@@ -0,0 +1,49 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SportSettingsPage\r
+ * Create: 2025-06-06\r
+ */\r
+\r
+#ifndef SPORT_SETTINGS_PAGE_H\r
+#define SPORT_SETTINGS_PAGE_H\r
+\r
+#include "components/ui_label.h"\r
+#include "components/ui_simple_list.h"\r
+#include "components/ui_image_view.h"\r
+#include "components/ui_scroll_view.h"\r
+#include "SlicePage.h"\r
+#include "ui_resource_sport.h"\r
+#include "SportPresenter.h"\r
+#include "SportModel.h"\r
+#include "SportSettingsItemView.h"\r
+\r
+namespace OHOS {\r
+const char* SETTINGS_ITEM_TARGET = "settingsItemTarget";\r
+const char* SETTINGS_ITEM_REMIND = "settingsItemTargetRemind";\r
+const char* SETTINGS_ITEM_MISTOUCH = "settingsItemTargetMistouch";\r
+\r
+class SportSettingsPage : public SlicePage<SportPresenter>,\r
+    public UIView::OnClickListener,\r
+    public UIView::OnDragListener {\r
+public:\r
+    SportSettingsPage();\r
+    ~SportSettingsPage();\r
+    void OnStart(void* data) override;\r
+    bool OnDrag(UIView& view, const DragEvent& event) override;\r
+    bool OnClick(UIView& view, const ClickEvent& event) override;\r
+private:\r
+    void InitBackgroundView();\r
+    void CreateUILabel(void);\r
+    void CreateUIList(void);\r
+    UIScrollView *group_{nullptr};\r
+    UIImageView *background_{nullptr};\r
+    UILabel *titleLabel_{nullptr};\r
+    UISimpleList *settingList_{nullptr};\r
+    SportSettingsItem settings_[SPORT_SET_TYPE_MAX] = {\r
+        {SPORT_SET_TYPE_TARGET, IMAGE_SPORT_TARGET, "目标", SETTINGS_ITEM_TARGET},\r
+        {SPORT_SET_TYPE_REMIND, IMAGE_SPORT_REMIND, "提醒", SETTINGS_ITEM_REMIND},\r
+        {SPORT_SET_TYPE_MISTOUCH, IMAGE_SPORT_MISTOUCH, "防误触", SETTINGS_ITEM_MISTOUCH},\r
+        };\r
+};\r
+}  // namespace OHOS\r
+#endif  // SPORT_SETTINGS_PAGE_H
\ No newline at end of file
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/include/sport/SportTargetItemView.h b/code/sdk/application/wearable/evb/nativeapp/nativeui/include/sport/SportTargetItemView.h
new file mode 100644 (file)
index 0000000..e36075a
--- /dev/null
@@ -0,0 +1,36 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SportTargetItemView\r
+ * Create: 2025-06-06\r
+ */\r
+\r
+#ifndef SPORT_TARGET_ITEM_VIEW_H\r
+#define SPORT_TARGET_ITEM_VIEW_H\r
+\r
+#include "components/ui_view_group.h"\r
+#include "components/ui_image_view.h"\r
+#include "components/ui_label.h"\r
+\r
+namespace OHOS {\r
+typedef struct {\r
+    uint8_t itemId;\r
+    int iconId;\r
+    const char *label;\r
+    const char *viewId;\r
+} SportTargetItem;\r
+\r
+class SportTargetItemView : public UIViewGroup {\r
+public:\r
+    SportTargetItemView();\r
+    ~SportTargetItemView() override;\r
+\r
+    virtual void SetItemInfo(const SportTargetItem &itemInfo);\r
+\r
+private:\r
+    UIImageView bgImage_;\r
+    UIImageView icon_;\r
+    UILabel label_;\r
+    UIImageView nextImage_;\r
+};\r
+}\r
+#endif
\ No newline at end of file
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/include/sport/SportTargetPage.h b/code/sdk/application/wearable/evb/nativeapp/nativeui/include/sport/SportTargetPage.h
new file mode 100644 (file)
index 0000000..00e7fd8
--- /dev/null
@@ -0,0 +1,48 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SportTargetPage\r
+ * Create: 2025-06-06\r
+ */\r
+\r
+#ifndef SPORT_TARGET_PAGE_H\r
+#define SPORT_TARGET_PAGE_H\r
+\r
+#include "components/ui_label.h"\r
+#include "components/ui_simple_list.h"\r
+#include "components/ui_image_view.h"\r
+#include "components/ui_scroll_view.h"\r
+#include "SlicePage.h"\r
+#include "ui_resource_sport.h"\r
+#include "SportPresenter.h"\r
+#include "SportModel.h"\r
+#include "SportTargetItemView.h"\r
+\r
+namespace OHOS {\r
+const char* SPORT_TARGET_ITEM_DISTANCE = "sportTargetItemDistance";\r
+const char* SPORT_TARGET_ITEM_TIME = "sportTargetItemTime";\r
+const char* SPORT_TARGET_ITEM_CALORIE = "sportTargetItemCalorie";\r
+\r
+class SportTargetPage : public SlicePage<SportPresenter>,\r
+    public UIView::OnClickListener,\r
+    public UIView::OnDragListener {\r
+public:\r
+    SportTargetPage();\r
+    ~SportTargetPage();\r
+    void OnStart(void* data) override;\r
+    bool OnDrag(UIView& view, const DragEvent& event) override;\r
+    bool OnClick(UIView& view, const ClickEvent& event) override;\r
+private:\r
+    void InitBackgroundView();\r
+    void CreateUILabel(void);\r
+    void CreateUIList(void);\r
+    UIScrollView *group_{nullptr};\r
+    UIImageView *background_{nullptr};\r
+    UILabel *titleLabel_{nullptr};\r
+    UISimpleList *targetList_{nullptr};\r
+    SportTargetItem targets_[SPORT_TARGET_MAX] = {\r
+        {SPORT_TARGET_DISTANCE, IMAGE_SPORT_DISTANCE, "距离", SPORT_TARGET_ITEM_DISTANCE},\r
+        {SPORT_TARGET_TIME, IMAGE_SPORT_TIME, "时间", SPORT_TARGET_ITEM_TIME},\r
+        {SPORT_TARGET_CALORIE, IMAGE_SPORT_CALORIE, "热量", SPORT_TARGET_ITEM_CALORIE}};\r
+};\r
+}  // namespace OHOS\r
+#endif  // SPORT_TARGET_PAGE_H
\ No newline at end of file
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/include/sport/SportTargetPromptPage.h b/code/sdk/application/wearable/evb/nativeapp/nativeui/include/sport/SportTargetPromptPage.h
new file mode 100644 (file)
index 0000000..964a590
--- /dev/null
@@ -0,0 +1,49 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SportTargetPromptPage\r
+ * Create: 2025-06-06\r
+ */\r
+\r
+#ifndef SPORT_TARGET_PROMPT_PAGE_H\r
+#define SPORT_TARGET_PROMPT_PAGE_H\r
+\r
+#include "components/ui_label.h"\r
+#include "components/ui_image_view.h"\r
+#include "components/ui_view_group.h"\r
+#include "animator/animator.h"\r
+#include "SlicePage.h"\r
+#include "SportPresenter.h"\r
+#include "SportModel.h"\r
+\r
+namespace OHOS {\r
+\r
+class SportTargetPromptPage : public SlicePage<SportPresenter>,\r
+    public UIView::OnClickListener,\r
+    public UIView::OnDragListener {\r
+public:\r
+    SportTargetPromptPage() {}\r
+    ~SportTargetPromptPage();\r
+    void OnStart(void* data) override;\r
+    void OnPause() override;\r
+    void OnResume() override;\r
+    bool OnDrag(UIView& view, const DragEvent& event) override;\r
+    bool OnClick(UIView& view, const ClickEvent& event) override;\r
+private:\r
+    void CreatePromptView(void);\r
+    class SportPromptAnimatorCallback : public AnimatorCallback {\r
+    public:\r
+        SportPromptAnimatorCallback(SportTargetPromptPage* page):page_(page) {}\r
+        virtual ~SportPromptAnimatorCallback() override {}\r
+        void Callback(UIView* view) override;\r
+    private:\r
+        SportTargetPromptPage* page_{nullptr};\r
+    };\r
+    SportPromptAnimatorCallback* callback_{nullptr};\r
+    Animator* animator_{nullptr};\r
+    UIViewGroup *group_{nullptr};\r
+    UIImageView *promptIcon_{nullptr};\r
+    UILabel *promptLabel_{nullptr};\r
+    time_t startTime_{0};\r
+};\r
+}  // namespace OHOS\r
+#endif  // SPORT_TARGET_PROMPT_PAGE_H
\ No newline at end of file
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/include/sport/SportTargetSettingPage.h b/code/sdk/application/wearable/evb/nativeapp/nativeui/include/sport/SportTargetSettingPage.h
new file mode 100644 (file)
index 0000000..3fec391
--- /dev/null
@@ -0,0 +1,43 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SportTargetSettingPage\r
+ * Create: 2025-06-06\r
+ */\r
+\r
+#ifndef SPORT_TARGET_SETTING_PAGE_H\r
+#define SPORT_TARGET_SETTING_PAGE_H\r
+\r
+#include "components/ui_label.h"\r
+#include "components/ui_label_button.h"\r
+#include "components/ui_view_group.h"\r
+#include "components/ui_picker.h"\r
+#include "SlicePage.h"\r
+#include "SportPresenter.h"\r
+#include "SportModel.h"\r
+\r
+namespace OHOS {\r
+const char* TARGET_SETTING_CONFIRM_BUTTON = "targetSettingConfirmButton";\r
+\r
+class SportTargetSettingPage : public SlicePage<SportPresenter>,\r
+    public UIView::OnClickListener,\r
+    public UIView::OnDragListener,\r
+    public UIPicker::SelectedListener {\r
+public:\r
+    SportTargetSettingPage() {}\r
+    ~SportTargetSettingPage();\r
+    void OnStart(void* data) override;\r
+    bool OnDrag(UIView& view, const DragEvent& event) override;\r
+    bool OnClick(UIView& view, const ClickEvent& event) override;\r
+private:\r
+    void UpdateViewByTargetType();\r
+    void UpdateViewByRemindType();\r
+    void CreateUILabel(void);\r
+    void CreateUIPicker(void);\r
+    void CreateUIButton(void);\r
+    UIViewGroup *group_{nullptr};\r
+    UILabel *titleLabel_{nullptr};\r
+    UIPicker *picker_{nullptr};\r
+    UILabelButton *confirmButton_{nullptr};\r
+};\r
+}  // namespace OHOS\r
+#endif  // SPORT_TARGET_SETTING_PAGE_H
\ No newline at end of file
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/include/sport/SportView.h b/code/sdk/application/wearable/evb/nativeapp/nativeui/include/sport/SportView.h
new file mode 100644 (file)
index 0000000..96bbf81
--- /dev/null
@@ -0,0 +1,35 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SportView\r
+ * Create: 2025-06-06\r
+ */\r
+\r
+#ifndef SPORT_VIEW_H\r
+#define SPORT_VIEW_H\r
+\r
+#include "View.h"\r
+\r
+namespace OHOS {\r
+enum SportPages : uint8_t {\r
+    SPORT_PAGE_MENU = 1,\r
+    SPORT_PAGE_PREPARE,\r
+    SPORT_PAGE_COUNTDOWN,\r
+    SPORT_PAGE_DATA,\r
+    SPORT_PAGE_PAUSE,\r
+    SPORT_PAGE_PROMPT,\r
+    SPORT_PAGE_SETTINGS,\r
+    SPORT_PAGE_TARGET,\r
+    SPORT_PAGE_TARGET_SETTING,\r
+    SPORT_PAGE_TARGET_PROMPT,\r
+    SPORT_PAGE_REMIND,\r
+    SPORT_PAGE_REMIND_INTERVAL,\r
+    SPORT_PAGE_REMIND_HEARTRATE,\r
+    SPORT_PAGE_HEARTRATE_RANGE,\r
+    SPORT_PAGE_MISTOUCH,\r
+    SPORT_PAGE_MAX,\r
+};\r
+\r
+class SportPresenter;\r
+class SportView : public View<SportPresenter> {};\r
+}\r
+#endif  // SPORT_VIEW_H\r
index b4a48db..11c891e 100644 (file)
@@ -13,6 +13,7 @@
 \r
 namespace OHOS {\r
 typedef struct {\r
+    uint8_t index;\r
     std::string record;\r
     bool isLatest;\r
 } StopwatchItem;\r
@@ -21,7 +22,7 @@ class StopwatchItemView : public UIViewGroup {
 public:\r
     explicit StopwatchItemView();\r
     virtual ~StopwatchItemView() override;\r
-    void SetItemInfo(int16_t index, const StopwatchItem &itemInfo);\r
+    void SetItemInfo(const StopwatchItem &itemInfo);\r
 \r
 private:\r
     UILabel nameLabel_;\r
index 41c75f0..faaad09 100644 (file)
@@ -7,11 +7,11 @@
 #ifndef STOPWATCH_MODEL_H\r
 #define STOPWATCH_MODEL_H\r
 \r
-#include "stopwatch/StopwatchItemView.h"\r
 #include "gfx_utils/list.h"\r
 #ifndef _WIN32\r
 #include "time64.h"\r
 #endif\r
+#include "StopwatchItemView.h"\r
 \r
 namespace OHOS {\r
 class StopwatchModel {\r
@@ -24,37 +24,28 @@ public:
     uint64_t GetElapsedTime();\r
     uint64_t UpdateElapsedTime();\r
     void ResetCounter();\r
-    bool GetActiveState();\r
-    void SetActiveState();\r
-    void SetInactiveState();\r
+    bool GetRunningState();\r
+    void SetRunningState(bool isRunning);\r
+    bool GetRecordListVisible();\r
+    void SetRecordListVisible(bool isVisible);\r
+    bool GetTimeOverRangeState();\r
+    void SetTimeOverRangeState(bool isTimeOverRange);\r
     List<StopwatchItem> &GetRecordsList();\r
     void AddRecordToList(const StopwatchItem &record);\r
-    void ClearData();\r
-    bool IsInRecordView();\r
-    void SetRecordViewState(bool state);\r
-    bool GetOverflowState()\r
-    {\r
-        return isOverflow_;\r
-    }\r
-    void SetOverflowState(bool state)\r
-    {\r
-        isOverflow_ = state;\r
-    }\r
-\r
 private:\r
     StopwatchModel();\r
     StopwatchModel(const StopwatchModel &);\r
     StopwatchModel &operator=(const StopwatchModel &);\r
 #ifdef _WIN32\r
-    struct timeval startTime_ {0};\r
+    struct timeval startTime_{0};\r
 #else\r
-    struct timeval64 startTime_ {0};\r
+    struct timeval64 startTime_{0};\r
 #endif\r
-    bool isOverflow_{false};\r
-    uint64_t uiElapsedTime_{0};\r
-    uint64_t uiSavedElapsedTime_{0};\r
-    bool bIsActive_{false};\r
-    bool bIsRecordView_{false};\r
+    uint64_t elapsedTime_{0};\r
+    uint64_t savedElapsedTime_{0};\r
+    bool isTimeOverRange_{false};\r
+    bool isRunning_{false};\r
+    bool isRecordListVisible_{false};\r
     List<StopwatchItem> records_;\r
 };\r
 }\r
index 9568a30..00ba729 100644 (file)
@@ -7,23 +7,19 @@
 #ifndef STOPWATCH_PAGE_H\r
 #define STOPWATCH_PAGE_H\r
 \r
-#include "UiConfig.h"\r
-#include "SlicePage.h"\r
-#include "stopwatch/StopwatchPresenter.h"\r
-#include "stopwatch/StopwatchAdapter.h"\r
-#include "NativeRegisterManager.h"\r
 #include "components/ui_view_group.h"\r
 #include "components/ui_label.h"\r
-#include "components/ui_list.h"\r
+#include "components/ui_simple_list.h"\r
 #include "components/ui_label_button.h"\r
 #include "components/ui_image_view.h"\r
 #include "components/ui_sweep_clock.h"\r
 #include "animator/animator.h"\r
+#include "UiConfig.h"\r
+#include "SlicePage.h"\r
+#include "NativeRegisterManager.h"\r
+#include "StopwatchPresenter.h"\r
 \r
 namespace OHOS {\r
-\r
-#define STOPWATCH_APP_NAME "秒表"\r
-\r
 class StopwatchPresenter;\r
 class StopwatchPage : public SlicePage<StopwatchPresenter>,\r
                            public UIView::OnClickListener,\r
@@ -38,20 +34,18 @@ public:
     void OnResume() override;\r
     bool OnClick(UIView &view, const ClickEvent &event) override;\r
     bool OnDrag(UIView &view, const DragEvent &event) override;\r
-    void Overflowing(void);\r
-    UISweepClock* GetSweepClock(){return sweepClock_;}\r
-    UILabel* GetElapsedTimeLabel(){return elapsedTime_;}\r
 private:\r
-    void DrawButtonStatusView(bool isActive);\r
-    void DrawContainRecordListView(bool isContainRecordList);\r
+    void TimeOverRange(void);\r
+    void DrawButtonStatusView(bool isRunning);\r
+    void DrawRecordListVisibleView(bool isRecordListVisible);\r
     void RefreshRecordsList(void);\r
     class StopwatchAnimatorCallback : public AnimatorCallback {\r
     public:\r
-        StopwatchAnimatorCallback(StopwatchPage* page) : stopwatchPage(page) {}\r
+        StopwatchAnimatorCallback(StopwatchPage* page) : page_(page) {}\r
         virtual ~StopwatchAnimatorCallback() override {}\r
         void Callback(UIView* view) override;\r
     private:\r
-        StopwatchPage* stopwatchPage{nullptr};\r
+        StopwatchPage* page_{nullptr};\r
     };\r
     class TimeAnimatorCallback : public AnimatorCallback {\r
     public:\r
@@ -59,17 +53,16 @@ private:
         virtual ~TimeAnimatorCallback() override {}\r
         void Callback(UIView* view) override;\r
     };\r
-    Animator* animator_{nullptr};\r
-    StopwatchAnimatorCallback* animatorCallback_{nullptr};\r
-    TimeAnimatorCallback* timeCallback_{nullptr};\r
+    Animator* stopwatchAnimator_{nullptr};\r
+    StopwatchAnimatorCallback* stopwatchAnimatorCallback_{nullptr};\r
     Animator* timeAnimator_{nullptr};\r
+    TimeAnimatorCallback* timeCallback_{nullptr};\r
     UISweepClock *sweepClock_{nullptr};\r
     Image *secondHand_{nullptr};\r
     UILabel *currentTime_{nullptr};\r
     UILabel *appName_{nullptr};\r
     UILabel *elapsedTime_{nullptr};\r
-    UIList *recordsList_{nullptr};\r
-    StopwatchAdapter *listAdapter_{nullptr};\r
+    UISimpleList *recordsList_{nullptr};\r
     UILabelButton *startButton_{nullptr};\r
     UILabelButton *resetButton_{nullptr};\r
     UIImageView *backGround_{nullptr};\r
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/include/stopwatch/StopwatchRecordPage.h b/code/sdk/application/wearable/evb/nativeapp/nativeui/include/stopwatch/StopwatchRecordPage.h
new file mode 100644 (file)
index 0000000..4678ce1
--- /dev/null
@@ -0,0 +1,39 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: StopwatchRecordPage\r
+ * Create: 2025-06-06\r
+ */\r
+\r
+#ifndef STOPWATCH_RECORD_PAGE_H\r
+#define STOPWATCH_RECORD_PAGE_H\r
+\r
+#include "components/ui_label.h"\r
+#include "components/ui_simple_list.h"\r
+#include "components/ui_image_view.h"\r
+#include "components/ui_view_group.h"\r
+#include "SlicePage.h"\r
+#include "ui_resource_stopwatch.h"\r
+#include "StopwatchPresenter.h"\r
+#include "StopwatchModel.h"\r
+\r
+namespace OHOS {\r
+class StopwatchRecordPage : public SlicePage<StopwatchPresenter>,\r
+    public UIView::OnClickListener,\r
+    public UIView::OnDragListener {\r
+public:\r
+    StopwatchRecordPage() {}\r
+    ~StopwatchRecordPage();\r
+    void OnStart(void* data) override;\r
+    bool OnDrag(UIView& view, const DragEvent& event) override;\r
+    bool OnClick(UIView& view, const ClickEvent& event) override;\r
+private:\r
+    void InitBackgroundView();\r
+    void CreateUILabel(void);\r
+    void CreateUIList(void);\r
+    UIViewGroup *group_{nullptr};\r
+    UIImageView *background_{nullptr};\r
+    UILabel *titleLabel_{nullptr};\r
+    UISimpleList *recordList_{nullptr};\r
+};\r
+}  // namespace OHOS\r
+#endif  // STOPWATCH_RECORD_PAGE_H
\ No newline at end of file
index c35a570..b9d468f 100644 (file)
@@ -10,7 +10,8 @@
 #include "View.h"\r
 namespace OHOS {\r
 enum STOPWATCH_PAGES {\r
-    STOPWATCH_MAIN_PAGE = 1,  // 0 is invalid\r
+    STOPWATCH_MAIN_PAGE = 1,\r
+    STOPWATCH_RECORD_PAGE,\r
 };\r
 \r
 class StopwatchPresenter;\r
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/include/timers/TimerCountDown.h b/code/sdk/application/wearable/evb/nativeapp/nativeui/include/timers/TimerCountDown.h
new file mode 100644 (file)
index 0000000..dbfe8d1
--- /dev/null
@@ -0,0 +1,80 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: TimerCountDown\r
+ * Create: 2025-06-09\r
+ */\r
+\r
+#ifndef TIMER_COUNT_DOWN_H\r
+#define TIMER_COUNT_DOWN_H\r
+\r
+#include <sys/time.h>\r
+#include "View.h"\r
+#include "components/ui_button.h"\r
+#include "components/ui_label.h"\r
+#include "components/ui_fragment.h"\r
+#include "components/ui_scroll_view.h"\r
+#include "components/ui_digital_clock.h"\r
+#include "components/ui_image_view.h"\r
+#include "components/ui_circle_progress.h"\r
+#include "UiConfig.h"\r
+#include "TimerModel.h"\r
+#include "TimerPresenter.h"\r
+#include "SlicePage.h"\r
+#include "ChangeSliceListener.h"\r
+#include "components/ui_sweep_clock.h"\r
+#include "main/LoadImg.h"\r
+#include "ui_resource_timer.h"\r
+\r
+namespace OHOS {\r
+class TimerCountDown : public UIFragment,\r
+                        public UIView::OnClickListener,\r
+                        public UIView::OnDragListener {\r
+public:\r
+    void OnResume();\r
+    void OnPause();\r
+    bool OnClick(UIView &view, const ClickEvent &event) override;\r
+    bool OnDragStart(UIView& view, const DragEvent& event) override;\r
+    bool OnDrag(UIView& view, const DragEvent& event) override;\r
+    bool OnDragEnd(UIView& view, const DragEvent& event) override;\r
+    void CreateButton();\r
+    void CreateTimerTime();\r
+    void CircleProgress();\r
+    void SetTimerTime(int64_t durationTime);\r
+    void InitAnimator();\r
+    void SetAnimatorStatus(bool status);\r
+    void RefreshFragment();\r
+\r
+private:\r
+    void OnCreateView(void* data) override;\r
+    void OnDestroyView() override;\r
+    class TimeAnimatorCallback : public AnimatorCallback {\r
+    public:\r
+        TimeAnimatorCallback() {}\r
+        virtual ~TimeAnimatorCallback() override {}\r
+        void Callback(UIView *view) override;\r
+    };\r
+\r
+    class TimerCountDownCallback : public AnimatorCallback {\r
+    public:\r
+        explicit TimerCountDownCallback(TimerCountDown *page) : page_(page) {}\r
+        ~TimerCountDownCallback() override {}\r
+        void Callback(UIView *view) override;\r
+\r
+    private:\r
+        TimerCountDown *page_{nullptr};\r
+    };\r
+\r
+    UILabel *labelTitle_{nullptr};\r
+    UIDigitalClock *timerClock_{nullptr};\r
+    UIImageView *startOrPauseImg_{nullptr};\r
+    UIImageView *resetOrExitImg_{nullptr};\r
+    UICircleProgress *circleProgress_{nullptr};\r
+    UILabel *currentTime_{nullptr};\r
+    TimeAnimatorCallback *currentTimeCallback_{nullptr};\r
+    Animator *currentTimeAnimator_{nullptr};\r
+    TimerCountDownCallback *countDownTimecallBack_ = nullptr;\r
+    Animator *countDownTimeanimator_ = nullptr;\r
+    UIImageView *bgImg_{nullptr};\r
+};\r
+}\r
+#endif // TIMER_TIMING_PAGE_H
\ No newline at end of file
index 417b92b..8472f05 100644 (file)
 #include "UiConfig.h"\r
 #include "ChangeSliceListener.h"\r
 #include "components/ui_image_view.h"\r
-#include "timers/TimerPresenter.h"\r
-#include "timers/TimerModel.h"\r
+#include "TimerPresenter.h"\r
+#include "TimerModel.h"\r
 #include "SlicePage.h"\r
 #include "common/image_cache_manager.h"\r
+#include "main/LoadImg.h"\r
 #include "ui_resource_timer.h"\r
+#include "timers/TimerCountDown.h"\r
 \r
 namespace OHOS {\r
+static constexpr uint8_t SELECT_IMAGE_COUNT = 4;\r
+\r
     class TimerMainPage : public SlicePage<TimerPresenter>,\r
                           public UIView::OnClickListener,\r
                           public UIView::OnDragListener {\r
     public:\r
-        TimerMainPage() = default;\r
+        TimerMainPage();\r
         ~TimerMainPage() override;\r
-\r
+        void OnResume() override;\r
+        void OnPause() override;\r
         void OnStart(void *data) override;\r
         bool OnClick(UIView &view, const ClickEvent &event) override;\r
         bool OnDrag(UIView &view, const DragEvent &event) override;\r
+        static TimerMainPage *GetInstance(void);\r
+        void ShowMainPage();\r
         void LabelTitle();\r
         void CreateButton();\r
         void InitView();\r
 \r
     private:\r
-        UIScrollView *group{nullptr};\r
-        UIImageView *selectMin[4]{nullptr}; // 分钟计时\r
-        UIImageView *addButton{nullptr};  // 自定义按钮\r
-        UILabel *title{nullptr};            // 计时器\r
-        UIImageView *backround{nullptr};\r
+        UIScrollView *group_{nullptr};\r
+        UIImageView *selectMin_[SELECT_IMAGE_COUNT]{nullptr};\r
+        UIImageView *addButton_{nullptr};\r
+        UILabel *labelTitle_{nullptr};\r
+        UIImageView *bgImg_{nullptr};\r
+        TimerCountDown *countDownFragment_{nullptr};\r
     };\r
 }\r
 #endif // TIMER_MAIN_PAGE_H
\ No newline at end of file
index fee8cd6..9b5a601 100644 (file)
 #include <mutex>\r
 #include "AppViewIDs.h"\r
 #include "UiConfig.h"\r
-#include "timers/TimerPresenter.h"\r
+#include "TimerPresenter.h"\r
 #include "graphic_timer.h"\r
 #include "ohos_timer.h"\r
 \r
 namespace OHOS {\r
-    class TimerModel {\r
-    public:\r
-        static TimerModel &GetInstance(void);\r
+class TimerModel {\r
+public:\r
+    static TimerModel &GetInstance(void);\r
 \r
-        void SetDurationTime(uint32_t time); // 设置计时器的总时间\r
-        uint32_t GetDurationTime();          // 获取计时器的总时间\r
-        bool GetIsTiming() { return isTiming; }\r
-        void SetIsTiming(bool value) { isTiming = value; }\r
-        bool GetIsPause() { return isPause; }\r
-        void SetIsPause(bool value) { isPause = value; }\r
-        uint32_t GetStartTime() { return start_time; };\r
-        void SetStartTime(uint32_t value) { start_time = value; };\r
-        uint32_t GetSaveTime();\r
-        void SetSaveTime(bool falg, uint32_t value);\r
-\r
-        void InitTimer();\r
-        void DisableTimer();\r
-        bool GetExistTimer() { return haveTimer; };\r
-        void SetExistTimer(bool value) { haveTimer = value; };\r
+    void SetTotalTime(uint64_t time);  // 设置计时器的总时间\r
+    uint64_t GetTotalTime();           // 获取计时器的总时间\r
+    bool GetIsShowFragment()\r
+    {\r
+        return isShowFragment_;\r
+    }\r
+    void SetIsShowFragment(bool value)\r
+    {\r
+        isShowFragment_ = value;\r
+    }\r
+    bool GetIsCountDown()\r
+    {\r
+        return isCountDown_;\r
+    }\r
+    void SetIsCountDown(bool value)\r
+    {\r
+        isCountDown_ = value;\r
+    }\r
+    bool GetIsPause()\r
+    {\r
+        return isPause_;\r
+    }\r
+    void SetIsPause(bool value)\r
+    {\r
+        isPause_ = value;\r
+    }\r
+    uint64_t GetStartTime()\r
+    {\r
+        return startTime_;\r
+    };\r
+    void SetStartTime(uint64_t value)\r
+    {\r
+        startTime_ = value;\r
+    };\r
+    uint64_t GetEclipseTime();\r
+    void SetEclipseTime(bool flag, uint64_t value);\r
 \r
-    private:\r
-        TimerModel();\r
-        virtual ~TimerModel();\r
-        TimerModel(const TimerModel &) = delete;\r
-        TimerModel &operator=(const TimerModel &) = delete;\r
-        uint32_t start_time;\r
-        uint32_t save_time;\r
-        uint32_t durationTime = 0;\r
-        GraphicTimer *g_startCounting = nullptr; // 定时器\r
-        bool haveTimer = false;\r
-        bool isTiming = false;\r
-        bool isPause = false;\r
+    void InitTimer();\r
+    void DisableTimer();\r
+    bool GetExistTimer()\r
+    {\r
+        return haveTimer_;\r
     };\r
+    void SetExistTimer(bool value)\r
+    {\r
+        haveTimer_ = value;\r
+    };\r
+\r
+private:\r
+    TimerModel();\r
+    virtual ~TimerModel();\r
+    TimerModel(const TimerModel &) = delete;\r
+    TimerModel &operator=(const TimerModel &) = delete;\r
+    uint64_t startTime_;\r
+    uint64_t eclipseTime_;\r
+    uint64_t totalTime_ = 0;\r
+    GraphicTimer *startCounting_ = nullptr;  // 定时器\r
+    bool haveTimer_ = false;\r
+    bool isCountDown_ = false;\r
+    bool isPause_ = false;\r
+    bool isShowFragment_ = false;\r
+};\r
 }\r
 \r
 #endif // TIMER_MODEL_H
\ No newline at end of file
index e2d42ae..216373c 100644 (file)
 #include "components/ui_view.h"\r
 \r
 namespace OHOS {\r
-\r
-#define SETTING_TIMER "setting_timer"\r
-#define STOPWATCH_RESET "stopwatch_reset"\r
-#define ONE_MIN "onemine"\r
-#define THREE_MIN "threemine"\r
-#define FIFTY_MIN "fiftymine"\r
-#define THIRTY_MIN "thirtymine"\r
-#define BACK_TIMER "backtimer"\r
-#define RESET "reset"\r
-#define START_PAUSE "start_pause"\r
-#define START_TIMING "start_timing"\r
-\r
-    class TimerView;\r
-    class TimerPresenter : public Presenter<TimerView> {\r
-    };\r
+class TimerView;\r
+class TimerPresenter : public Presenter<TimerView> {};\r
 }\r
 \r
-#endif // TIMER_PRESENTER_H
\ No newline at end of file
+#endif  // TIMER_PRESENTER_H
\ No newline at end of file
index 1ede0c7..a8af96b 100644 (file)
 #include "components/ui_label_button.h"\r
 #include "components/ui_scroll_view.h"\r
 #include "UiConfig.h"\r
-#include "timers/TimerPresenter.h"\r
-#include "timers/TimerModel.h"\r
+#include "TimerPresenter.h"\r
+#include "TimerModel.h"\r
 #include "SlicePage.h"\r
 #include "ChangeSliceListener.h"\r
+#include "main/LoadImg.h"\r
 #include "ui_resource_timer.h"\r
 \r
 namespace OHOS {\r
+static constexpr uint8_t PICKER_COUNT = 3;\r
     class TimerSettingPage : public UIPicker::SelectedListener,\r
                              public SlicePage<TimerPresenter>,\r
                              public UIView::OnClickListener,\r
                              public UIView::OnDragListener {\r
     public:\r
-        TimerSettingPage() = default;\r
+        TimerSettingPage();\r
         ~TimerSettingPage() override;\r
 \r
         void OnStart(void *data) override;\r
@@ -40,15 +42,11 @@ namespace OHOS {
         void OnPickerStoped(UIPicker& picker) override;\r
 \r
     private:\r
-        UIScrollView *group{nullptr};\r
-        UIButton *back{nullptr};\r
-        UILabel *title{nullptr};\r
-        UIImageView *start{nullptr};\r
-\r
-        UILabel *timerLabel{nullptr};\r
-        UIPicker *timerPicker[3]{nullptr};\r
-        ImageInfo *image1 = nullptr;\r
-        ImageInfo *image2 = nullptr;\r
+        UIScrollView *group_{nullptr};\r
+        UILabel *labelTitle_{nullptr};\r
+        UIImageView *startImg_{nullptr};\r
+        UILabel *labelUnit_{nullptr};\r
+        UIPicker *timerPicker_[PICKER_COUNT]{nullptr};\r
     };\r
 }\r
 #endif // TIMER_SETTING_PAGE_H
\ No newline at end of file
index 2849c44..951a6a0 100644 (file)
 #include "View.h"\r
 \r
 namespace OHOS {\r
-    enum TIMER_PAGES {\r
-        TIMER_MAIN_PAGE = 1, // 主页面\r
-        TIMER_SETTING_PAGE,  // 自定义页面\r
-        TIMER_TIMING_PAGE,   // 显示计时页面\r
-        TIMER_ALL_VIEW,\r
-    };\r
+enum TIMER_PAGES {\r
+    TIMER_MAIN_PAGE = 1,  // 主页面\r
+    TIMER_SETTING_PAGE,   // 自定义页面\r
+    TIMER_TIMING_PAGE,    // 显示计时页面\r
+    TIMER_ALL_VIEW,\r
+};\r
 \r
-    class TimerPresenter;\r
-    class TimerView : public View<TimerPresenter> {\r
-    };\r
+class TimerPresenter;\r
+class TimerView : public View<TimerPresenter> {};\r
 }\r
-#endif // TIMER_VIEW_H\r
+#endif  // TIMER_VIEW_H\r
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/include/uisample/UISampleMainPage.h b/code/sdk/application/wearable/evb/nativeapp/nativeui/include/uisample/UISampleMainPage.h
new file mode 100644 (file)
index 0000000..2252f23
--- /dev/null
@@ -0,0 +1,44 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025. All rights reserved.\r
+ * Description: TestCase\r
+ * Author: Hisi Graphic Team\r
+ * Created: 2025-7\r
+ */\r
+\r
+#ifndef UISAMPLE_MAIN_PAGE_H\r
+#define UISAMPLE_MAIN_PAGE_H\r
+\r
+#include <sys/time.h>\r
+#include "ChangeSliceListener.h"\r
+#include "components/root_view.h"\r
+#include "components/ui_label.h"\r
+#include "components/ui_scroll_view.h"\r
+#include "components/ui_simple_list.h"\r
+#include "SlicePage.h"\r
+#include "UiConfig.h"\r
+#include "ui_resource_timer.h"\r
+#include "uisample/UISamplePresenter.h"\r
+#include "ui_test_group.h"\r
+#include "View.h"\r
+\r
+namespace OHOS {\r
+class UISampleMainPage : public SlicePage<UISamplePresenter>, public UIView::OnClickListener,\r
+    public UIView::OnDragListener {\r
+public:\r
+    UISampleMainPage();\r
+    ~UISampleMainPage() override;\r
+    static UISampleMainPage* GetInstance(void);\r
+\r
+    void OnStart(void *data) override;;\r
+    bool OnClick(UIView& view, const ClickEvent& event) override;\r
+    bool OnDrag(UIView& view, const DragEvent& event) override;\r
+private:\r
+    void CreateTitle();\r
+    void CreateMainList();\r
+\r
+    UIScrollView* container_ = nullptr;\r
+    UILabel *title_ = nullptr;\r
+    UISimpleList* mainList_ = nullptr;\r
+};\r
+} // OHOS\r
+#endif // UISAMPLE_MAIN_PAGE_H
\ No newline at end of file
index ea285b5..4c9d172 100644 (file)
@@ -1,30 +1,30 @@
-/*
- * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved.
- * Description: SettingModel.h
- * Author:
- * Create: 2021-11-23
- */
-
-#ifndef UISAMPLE_MODEL_H
-#define UISAMPLE_MODEL_H
-
-#include <cstdint>
-#include <map>
-#include "AppViewIDs.h"
-#include "UiConfig.h"
-#include "uisample/UISamplePresenter.h"
-
-namespace OHOS {
-    class UISampleModel {
-    public:
-        static UISampleModel &GetInstance(void);
-
-    private:
-        UISampleModel();
-        UISampleModel(const UISampleModel &);
-        UISampleModel &operator=(const UISampleModel &);
-        virtual ~UISampleModel();
-    };
-}
-
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025. All rights reserved.\r
+ * Description: TestCase\r
+ * Author: Hisi Graphic Team\r
+ * Created: 2025-7\r
+ */\r
+\r
+#ifndef UISAMPLE_MODEL_H\r
+#define UISAMPLE_MODEL_H\r
+\r
+#include <cstdint>\r
+#include <map>\r
+#include "AppViewIDs.h"\r
+#include "UiConfig.h"\r
+#include "uisample/UISamplePresenter.h"\r
+\r
+namespace OHOS {\r
+    class UISampleModel {\r
+    public:\r
+        static UISampleModel &GetInstance(void);\r
+\r
+    private:\r
+        UISampleModel();\r
+        UISampleModel(const UISampleModel &);\r
+        UISampleModel &operator=(const UISampleModel &);\r
+        virtual ~UISampleModel();\r
+    };\r
+}\r
+\r
 #endif // UISAMPLE_MODEL_H
\ No newline at end of file
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/include/uisample/UISampleNativeTestCasePage.h b/code/sdk/application/wearable/evb/nativeapp/nativeui/include/uisample/UISampleNativeTestCasePage.h
new file mode 100644 (file)
index 0000000..2025bf1
--- /dev/null
@@ -0,0 +1,48 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025. All rights reserved.\r
+ * Description: TestCase\r
+ * Author: Hisi Graphic Team\r
+ * Created: 2025-7\r
+ */\r
+\r
+#ifndef UISAMPLE_OPEN_HARMONY_PAGE_H\r
+#define UISAMPLE_OPEN_HARMONY_PAGE_H\r
+\r
+#include <sys/time.h>\r
+#include "ChangeSliceListener.h"\r
+#include "components/ui_label.h"\r
+#include "components/ui_button.h"\r
+#include "components/ui_scroll_view.h"\r
+#include "components/ui_simple_list.h"\r
+#include "SlicePage.h"\r
+#include "UiConfig.h"\r
+#include "ui_resource_timer.h"\r
+#include "uisample/UISamplePresenter.h"\r
+#include "ui_test_group.h"\r
+#include "View.h"\r
+\r
+namespace OHOS {\r
+class UISampleNativeTestCasePage : public SlicePage<UISamplePresenter>, public UIView::OnClickListener,\r
+    public UIView::OnDragListener {\r
+public:\r
+    UISampleNativeTestCasePage();\r
+    ~UISampleNativeTestCasePage() override;\r
+    static UISampleNativeTestCasePage *GetInstance(void);\r
+    void OnStart(void *data) override;\r
+    bool OnClick(UIView& view, const ClickEvent& event) override;\r
+    bool OnDrag(UIView& view, const DragEvent& event) override;\r
+\r
+private:\r
+    void CreateTitle();\r
+    void CreateMainList();\r
+    void CreateBackButton();\r
+    bool BackMenuPage(UIView& view);\r
+\r
+    UIScrollView* container_ = nullptr;\r
+    UILabel *title_{nullptr};\r
+    UISimpleList* mainList_ = nullptr;\r
+    UIButton* backBtn_{nullptr};\r
+    bool isInTestCase_ = false;\r
+};\r
+} // OHOS\r
+#endif // UISAMPLE_OPEN_HARMONY_PAGE_H
\ No newline at end of file
index 03d4e13..9f07180 100644 (file)
@@ -1,30 +1,30 @@
-/*
- * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved.
- * Description: SettingPresenter.h
- * Author:
- * Create: 2021-11-23
- */
-
-#ifndef UISAMPLE_PRESENTER_H
-#define UISAMPLE_PRESENTER_H
-
-#include "Presenter.h"
-#include "components/ui_view.h"
-
-namespace OHOS {
-class UISampleView;
-class UISampleModel;
-class UISamplePresenter : public Presenter<UISampleView> {
-public:
-    UISamplePresenter();
-    ~UISamplePresenter() override;
-
-    void OnResume() override;
-    void OnPause() override;
-
-private:
-    UISampleModel *uisampleModel;
-};
-}
-
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025. All rights reserved.\r
+ * Description: TestCase\r
+ * Author: Hisi Graphic Team\r
+ * Created: 2025-7\r
+ */\r
+\r
+#ifndef UISAMPLE_PRESENTER_H\r
+#define UISAMPLE_PRESENTER_H\r
+\r
+#include "Presenter.h"\r
+#include "components/ui_view.h"\r
+\r
+namespace OHOS {\r
+class UISampleView;\r
+class UISampleModel;\r
+class UISamplePresenter : public Presenter<UISampleView> {\r
+public:\r
+    UISamplePresenter();\r
+    ~UISamplePresenter() override;\r
+\r
+    void OnResume() override;\r
+    void OnPause() override;\r
+\r
+private:\r
+    UISampleModel *uisampleModel_;\r
+};\r
+}\r
+\r
 #endif // UISAMPLE_PRESENTER_H
\ No newline at end of file
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/include/uisample/UISampleProprietaryTestCasePage.h b/code/sdk/application/wearable/evb/nativeapp/nativeui/include/uisample/UISampleProprietaryTestCasePage.h
new file mode 100644 (file)
index 0000000..28814f5
--- /dev/null
@@ -0,0 +1,46 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025. All rights reserved.\r
+ * Description: TestCase\r
+ * Author: Hisi Graphic Team\r
+ * Created: 2025-7\r
+ */\r
+\r
+#ifndef UISAMPLE_HISI_PAGE_H\r
+#define UISAMPLE_HISI_PAGE_H\r
+\r
+#include <sys/time.h>\r
+#include "ChangeSliceListener.h"\r
+#include "components/ui_label.h"\r
+#include "components/ui_button.h"\r
+#include "components/ui_simple_list.h"\r
+#include "SlicePage.h"\r
+#include "ui_resource_timer.h"\r
+#include "uisample/UISamplePresenter.h"\r
+#include "ui_test_group.h"\r
+#include "View.h"\r
+\r
+namespace OHOS {\r
+class UISampleProprietaryTestCasePage : public SlicePage<UISamplePresenter>, public UIView::OnClickListener,\r
+    public UIView::OnDragListener {\r
+public:\r
+    UISampleProprietaryTestCasePage();\r
+    ~UISampleProprietaryTestCasePage() override;\r
+    static UISampleProprietaryTestCasePage *GetInstance(void);\r
+    void OnStart(void *data) override;\r
+    bool OnClick(UIView& view, const ClickEvent& event) override;\r
+    bool OnDrag(UIView& view, const DragEvent& event) override;\r
+\r
+private:\r
+    void CreateTitle();\r
+    void CreateMainList();\r
+    void CreateBackButton();\r
+    bool BackMenuPage(UIView& view);\r
+\r
+    UIViewGroup* container_ = nullptr;\r
+    UILabel *title_ = nullptr;\r
+    UISimpleList* mainList_ = nullptr;\r
+    UIButton* backBtn_ = nullptr;\r
+    bool isInTestCase_ = false;\r
+};\r
+} // OHOS\r
+#endif // UISAMPLE_HISI_PAGE_H
\ No newline at end of file
index 4a9b74c..ccff650 100644 (file)
@@ -1,60 +1,24 @@
-/*
- * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved.
- * Description: SettingView.h
- * Author:
- * Create: 2021-11-23
- */
-
-#ifndef UISAMPLE_VIEW_H
-#define UISAMPLE_VIEW_H
-
-#include "View.h"
-#include "components/root_view.h"
-#include "components/ui_view_group.h"
-#include "components/ui_scroll_view.h"
-#include "components/ui_label.h"
-#include "components/ui_list.h"
-#include "ChangeSliceListener.h"
-#include "test_case_list_adapter.h"
-#include "UiConfig.h"
-
-namespace OHOS {
-
-class UISamplePresenter;
-
-class UISampleOnDragListener : public UIView::OnDragListener {
-public:
-    UISampleOnDragListener() {}
-    ~UISampleOnDragListener() override {}
-
-    bool OnDrag(UIView& view, const DragEvent& event) override
-    {
-        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "UISampleOnDragListener::OnDrag");
-        UNUSED(view);
-        if ((event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT) &&
-            (event.GetDeltaX() > X_DRAG_OFFSET) && (event.GetDeltaX() > (DOUBLES * MATH_ABS(event.GetDeltaY())))) {
-            WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "UISampleOnDragListener::OnDrag ChangeSlice(VIEW_APPLIST)");
-            NativeAbility::GetInstance().ChangeSlice(VIEW_APPLIST);
-        }
-        return false;
-    }
-};
-
-class UISampleView : public View<UISamplePresenter> {
-public:
-    UISampleView();
-    ~UISampleView() override;
-
-    static UISampleView *GetInstance();
-
-    void OnStart() override;
-    void OnStop() override;
-    void InitView();
-
-private:
-    UIView::OnDragListener *dragListener_ = nullptr;
-    UIList* mainList_ = nullptr;
-    TestCaseListAdapter* adapter_ = nullptr;
-};
-}
-#endif // UISAMPLE_VIEW_H
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025. All rights reserved.\r
+ * Description: TestCase\r
+ * Author: Hisi Graphic Team\r
+ * Created: 2025-7\r
+ */\r
+\r
+#ifndef UISAMPLE_VIEW_H\r
+#define UISAMPLE_VIEW_H\r
+\r
+#include "View.h"\r
+\r
+namespace OHOS {\r
+enum SAMPLE_PAGES {\r
+    SAMPLE_MAIN_PAGE = 1,\r
+    SAMPLE_PROPRIETARY_TESTCASE_PAGE = 2,\r
+    SAMPLE_NATIVE_TESTCASE_PAGE = 3,\r
+};\r
+\r
+class UISamplePresenter;\r
+class UISampleView : public View<UISamplePresenter> {\r
+};\r
+}\r
+#endif // UISAMPLE_VIEW_H\r
index 13c19fa..d2a6bf0 100644 (file)
@@ -11,9 +11,8 @@
 #include "components/ui_view_group.h"\r
 #include "components/ui_image_view.h"\r
 #include "components/ui_canvas.h"\r
-\r
 #include "UiConfig.h"\r
-#include "weather/WeatherModel.h"\r
+#include "WeatherModel.h"\r
 \r
 namespace OHOS {\r
 class WeatherItemView : public UIViewGroup {\r
@@ -21,15 +20,13 @@ public:
     explicit WeatherItemView();\r
     ~WeatherItemView() override;\r
     virtual void SetItemInfo(const WeatherItem itemInfo);\r
-    virtual void SetUpChild();\r
 \r
 private:\r
-    UILabel sLabel_1;\r
-    UIImageView sIcon;\r
-    UILabel sLabel_2;\r
-    UICanvas chartLine;\r
-    UIImageView sNextImage;\r
-    WeatherItem sItemInfo = {nullptr, nullptr, nullptr, false};\r
+    UILabel labelDay_;\r
+    UIImageView icon_;\r
+    UILabel labelTmp_;\r
+    UICanvas chartLine_;\r
+    UIImageView bgImg_;\r
 };\r
 }\r
 \r
index 31a9ea0..e88f4d8 100644 (file)
 #include "components/ui_scroll_view.h"\r
 #include "components/ui_label.h"\r
 #include "components/ui_list.h"\r
-#include "weather/WeatherAdapter.h"\r
-#include "weather/WeatherPresenter.h"\r
+#include "WeatherPresenter.h"\r
 #include "SlicePage.h"\r
 #include "UiConfig.h"\r
-#include "weather/WeatherView.h"\r
+#include "WeatherView.h"\r
+\r
 namespace OHOS {\r
+static constexpr int16_t LABEL_ADDRESS = 0;\r
+static constexpr int16_t LABEL_TEMP = 1;\r
+static constexpr int16_t LABEL_AIR = 2;\r
+static constexpr int16_t LABEL_HUMIDITY = 3;\r
+static constexpr int16_t LABEL_UPDATETIME = 4;\r
+static constexpr int16_t LABEL_CURRENT_TEMP = 5;\r
 static constexpr int16_t LABEL_COUNT = 6;\r
+\r
 class WeatherPresenter;\r
 class WeatherMainPage : public SlicePage<WeatherPresenter>,\r
                         public UIView::OnClickListener,\r
@@ -26,29 +33,31 @@ class WeatherMainPage : public SlicePage<WeatherPresenter>,
 public:\r
     WeatherMainPage();\r
     ~WeatherMainPage() override;\r
-\r
+    static WeatherMainPage *GetInstance();\r
     void OnStart(void* data) override;\r
     bool OnClick(UIView &view, const ClickEvent &event) override;\r
     bool OnDrag(UIView& view, const DragEvent& event) override;\r
-    std::string FormatTime(bool falg, const std::string& inputStr);\r
-    void InitLabel();\r
-    void InitImage();\r
-    void InitWeatherImage();\r
+    std::string FormatTime(const std::string& inputStr);\r
+    void InitWeatherImage1();\r
+    void InitWeatherImage2();\r
+    void InitWeatherLabel1();\r
+    void InitWeatherLabel2();\r
+    uint8_t GetConnectStatus();\r
+    void ReloadPage();\r
 private:\r
-    bool flag = false;\r
-    int curWeather_code = 0;\r
-    CurWeather cur{nullptr};\r
-    UIViewGroup *group = nullptr;\r
-    WeatherModel *weatherModel = nullptr;\r
-    UILabel *title[LABEL_COUNT]{nullptr};\r
-    UILabel *labelTitle{nullptr};\r
-    UIImageView *mainImg{nullptr};\r
-    UIImageView *addressImg{nullptr};\r
-    UIImageView *aroundImg = nullptr;\r
-    UIImageView *weatherImg{nullptr};\r
-    UIImageView *ImageAir{nullptr};\r
-    UIImageView *ImageHumidity{nullptr};\r
-    UIImageView *ImagePageKey{nullptr};\r
+    bool flag_ = false;\r
+    int curWeatherCode_ = 0;\r
+    CurWeather cur_{nullptr};\r
+    UIViewGroup *group_ = nullptr;\r
+    UILabel *title_[LABEL_COUNT]{nullptr};\r
+    UILabel *labelTitle_{nullptr};\r
+    UIImageView *bgImg_{nullptr};\r
+    UIImageView *addressImg_{nullptr};\r
+    UIImageView *airQualityAndHumidityBgImg_{nullptr};\r
+    UIImageView *weatherImg_{nullptr};\r
+    UIImageView *airQulityImgIcon_{nullptr};\r
+    UIImageView *humidityImgIcon_{nullptr};\r
+    UIImageView *pageIdxImg_{nullptr};\r
 };\r
 }\r
 #endif // SETTING_MAIN_PAGE_H
\ No newline at end of file
index 55d135a..886b2bf 100644 (file)
 #include <fstream>\r
 #include <sstream>\r
 #include <cstdint>\r
+#include <iomanip>\r
 #include <map>\r
 #include <iostream>\r
 #include <random>\r
 #include <chrono>\r
 #include <ctime>\r
-#include <hal_tick.h>\r
+#include <string>\r
+#include "hal_tick.h"\r
 #include "AppViewIDs.h"\r
 #include "UiConfig.h"\r
 #include "cJSON.h"\r
 #include "components/ui_image_view.h"\r
+#include "components/ui_label.h"\r
 #include "common/image_cache_manager.h"\r
 #include "main/LoadImg.h"\r
 #include "ui_resource_weather.h"\r
 #ifndef _WIN32\r
 #include "time64.h"\r
+#define WEATHER_PATH "/user/app/user/ace/data/com.vendor.Weather/"\r
+#else\r
+#define WEATHER_PATH APP_RES_PATH\r
 #endif\r
+\r
 namespace OHOS {\r
 static constexpr int16_t MIN_TO_HOUR = 60;\r
 static constexpr int16_t HOURLY_SYSTEM = 24;\r
-static constexpr int16_t WEATHER_COUNT = 24;\r
+static constexpr int16_t ALL_HOURS_WEATHER_COUNT = 24;\r
 static constexpr int16_t WEATHER_HOUR = 12;\r
-static constexpr int16_t SET_ZERO = 0;\r
-static constexpr int16_t SET_ONE = 1;\r
-static constexpr int16_t SET_TWO = 2;\r
-static constexpr int16_t SET_THREE = 3;\r
-static constexpr int16_t SET_FOUR = 4;\r
-static constexpr int16_t SET_FIVE = 5;\r
-static constexpr int16_t SET_SIX = 6;\r
-static constexpr int16_t SET_SEVEN = 7;\r
-static constexpr int16_t SET_EIGHT = 8;\r
-static constexpr int16_t SET_NINE = 9;\r
-static constexpr int16_t SET_TEN = 10;\r
-static constexpr int16_t SET_TWELVE = 12;\r
-static constexpr int16_t SET_FOURTEEN = 14;\r
-static constexpr int16_t SET_HUNDRED = 100;\r
 static constexpr int16_t START_YEAR = 1900;\r
-static constexpr int16_t ARRAY_SIZE = 31;\r
-static const uint16_t WEATHER_ITEM_COUNT = 10;\r
+static constexpr int16_t ARRAY_SIZE = 32;\r
+static constexpr uint16_t WEATHER_ITEM_COUNT = 10;\r
+static constexpr uint16_t ONE_WEEK_DYAS = 7;\r
+static constexpr int16_t INDEX_0 = 0;\r
+static constexpr int16_t INDEX_1 = 1;\r
+static constexpr int16_t INDEX_2 = 2;\r
+static constexpr int16_t INDEX_3 = 3;\r
+static constexpr int16_t INDEX_4 = 4;\r
+static constexpr int16_t INDEX_5 = 5;\r
+static constexpr int16_t INDEX_6 = 6;\r
+static constexpr int16_t INDEX_7 = 7;\r
+static constexpr int16_t INDEX_8 = 8;\r
+static constexpr int16_t INDEX_12 = 12;\r
+static constexpr int16_t NUMBER_10 = 10;\r
 \r
 const int bigWeatherImage[ARRAY_SIZE] = {\r
-    IMAGE_CONVERTER_TOOL_WEATHER00,  // 0\r
-    IMAGE_CONVERTER_TOOL_WEATHER01,  // 1\r
-    IMAGE_CONVERTER_TOOL_WEATHER02,  // 2\r
-    IMAGE_CONVERTER_TOOL_WEATHER03,  // 3\r
-    IMAGE_CONVERTER_TOOL_WEATHER04,  // 4\r
-    IMAGE_CONVERTER_TOOL_WEATHER05,  // 5\r
-    IMAGE_CONVERTER_TOOL_WEATHER06,  // 6\r
-    IMAGE_CONVERTER_TOOL_WEATHER07,  // 7\r
-    IMAGE_CONVERTER_TOOL_WEATHER08,  // 8\r
-    IMAGE_CONVERTER_TOOL_WEATHER09,  // 9\r
-    IMAGE_CONVERTER_TOOL_WEATHER10,  // 10\r
-    IMAGE_CONVERTER_TOOL_WEATHER11,  // 11\r
-    IMAGE_CONVERTER_TOOL_WEATHER12,  // 12\r
-    IMAGE_CONVERTER_TOOL_WEATHER13,  // 13\r
-    IMAGE_CONVERTER_TOOL_WEATHER14,  // 14\r
-    IMAGE_CONVERTER_TOOL_WEATHER15,  // 15\r
-    IMAGE_CONVERTER_TOOL_WEATHER16,  // 16\r
-    IMAGE_CONVERTER_TOOL_WEATHER17,  // 17\r
-    IMAGE_CONVERTER_TOOL_WEATHER18,  // 18\r
-    IMAGE_CONVERTER_TOOL_WEATHER19,  // 19\r
-    IMAGE_CONVERTER_TOOL_WEATHER20,  // 20\r
-    IMAGE_CONVERTER_TOOL_WEATHER21,  // 21\r
-    IMAGE_CONVERTER_TOOL_WEATHER22,  // 22\r
-    IMAGE_CONVERTER_TOOL_WEATHER23,  // 23\r
-    IMAGE_CONVERTER_TOOL_WEATHER24,  // 24\r
-    IMAGE_CONVERTER_TOOL_WEATHER25,  // 25\r
-    IMAGE_CONVERTER_TOOL_WEATHER26,  // 26\r
-    IMAGE_CONVERTER_TOOL_WEATHER27,  // 27\r
-    IMAGE_CONVERTER_TOOL_WEATHER28,  // 28\r
-    IMAGE_CONVERTER_TOOL_WEATHER29,  // 29\r
-    IMAGE_CONVERTER_TOOL_WEATHER31   // 30\r
-};\r
+    IMAGE_WEATHER_WEATHER00, IMAGE_WEATHER_WEATHER01, IMAGE_WEATHER_WEATHER02, IMAGE_WEATHER_WEATHER03,\r
+    IMAGE_WEATHER_WEATHER04, IMAGE_WEATHER_WEATHER05, IMAGE_WEATHER_WEATHER06, IMAGE_WEATHER_WEATHER07,\r
+    IMAGE_WEATHER_WEATHER08, IMAGE_WEATHER_WEATHER09, IMAGE_WEATHER_WEATHER10, IMAGE_WEATHER_WEATHER11,\r
+    IMAGE_WEATHER_WEATHER12, IMAGE_WEATHER_WEATHER13, IMAGE_WEATHER_WEATHER14, IMAGE_WEATHER_WEATHER15,\r
+    IMAGE_WEATHER_WEATHER16, IMAGE_WEATHER_WEATHER17, IMAGE_WEATHER_WEATHER18, IMAGE_WEATHER_WEATHER19,\r
+    IMAGE_WEATHER_WEATHER20, IMAGE_WEATHER_WEATHER21, IMAGE_WEATHER_WEATHER22, IMAGE_WEATHER_WEATHER23,\r
+    IMAGE_WEATHER_WEATHER24, IMAGE_WEATHER_WEATHER25, IMAGE_WEATHER_WEATHER26, IMAGE_WEATHER_WEATHER27,\r
+    IMAGE_WEATHER_WEATHER28, IMAGE_WEATHER_WEATHER29, IMAGE_WEATHER_WEATHER30, IMAGE_WEATHER_WEATHER31};\r
 \r
 const int smallWeatherImage[ARRAY_SIZE] = {\r
-    IMAGE_CONVERTER_TOOL_WEATHER32,  // 32\r
-    IMAGE_CONVERTER_TOOL_WEATHER33,  // 33\r
-    IMAGE_CONVERTER_TOOL_WEATHER34,  // 34\r
-    IMAGE_CONVERTER_TOOL_WEATHER35,  // 35\r
-    IMAGE_CONVERTER_TOOL_WEATHER36,  // 36\r
-    IMAGE_CONVERTER_TOOL_WEATHER37,  // 37\r
-    IMAGE_CONVERTER_TOOL_WEATHER38,  // 38\r
-    IMAGE_CONVERTER_TOOL_WEATHER39,  // 39\r
-    IMAGE_CONVERTER_TOOL_WEATHER40,  // 40\r
-    IMAGE_CONVERTER_TOOL_WEATHER41,  // 41\r
-    IMAGE_CONVERTER_TOOL_WEATHER42,  // 42\r
-    IMAGE_CONVERTER_TOOL_WEATHER43,  // 43\r
-    IMAGE_CONVERTER_TOOL_WEATHER44,  // 44\r
-    IMAGE_CONVERTER_TOOL_WEATHER45,  // 45\r
-    IMAGE_CONVERTER_TOOL_WEATHER46,  // 46\r
-    IMAGE_CONVERTER_TOOL_WEATHER47,  // 47\r
-    IMAGE_CONVERTER_TOOL_WEATHER48,  // 48\r
-    IMAGE_CONVERTER_TOOL_WEATHER49,  // 49\r
-    IMAGE_CONVERTER_TOOL_WEATHER50,  // 50\r
-    IMAGE_CONVERTER_TOOL_WEATHER51,  // 51\r
-    IMAGE_CONVERTER_TOOL_WEATHER52,  // 52\r
-    IMAGE_CONVERTER_TOOL_WEATHER53,  // 53\r
-    IMAGE_CONVERTER_TOOL_WEATHER54,  // 54\r
-    IMAGE_CONVERTER_TOOL_WEATHER55,  // 55\r
-    IMAGE_CONVERTER_TOOL_WEATHER56,  // 56\r
-    IMAGE_CONVERTER_TOOL_WEATHER57,  // 57\r
-    IMAGE_CONVERTER_TOOL_WEATHER58,  // 58\r
-    IMAGE_CONVERTER_TOOL_WEATHER59,  // 59\r
-    IMAGE_CONVERTER_TOOL_WEATHER60,  // 60\r
-    IMAGE_CONVERTER_TOOL_WEATHER61,  // 61\r
-    IMAGE_CONVERTER_TOOL_WEATHER62   // 62\r
-};\r
+    IMAGE_WEATHER_WEATHER32, IMAGE_WEATHER_WEATHER33, IMAGE_WEATHER_WEATHER34, IMAGE_WEATHER_WEATHER35,\r
+    IMAGE_WEATHER_WEATHER36, IMAGE_WEATHER_WEATHER37, IMAGE_WEATHER_WEATHER38, IMAGE_WEATHER_WEATHER39,\r
+    IMAGE_WEATHER_WEATHER40, IMAGE_WEATHER_WEATHER41, IMAGE_WEATHER_WEATHER42, IMAGE_WEATHER_WEATHER43,\r
+    IMAGE_WEATHER_WEATHER44, IMAGE_WEATHER_WEATHER45, IMAGE_WEATHER_WEATHER46, IMAGE_WEATHER_WEATHER47,\r
+    IMAGE_WEATHER_WEATHER48, IMAGE_WEATHER_WEATHER49, IMAGE_WEATHER_WEATHER50, IMAGE_WEATHER_WEATHER51,\r
+    IMAGE_WEATHER_WEATHER52, IMAGE_WEATHER_WEATHER53, IMAGE_WEATHER_WEATHER54, IMAGE_WEATHER_WEATHER55,\r
+    IMAGE_WEATHER_WEATHER56, IMAGE_WEATHER_WEATHER57, IMAGE_WEATHER_WEATHER58, IMAGE_WEATHER_WEATHER59,\r
+    IMAGE_WEATHER_WEATHER60, IMAGE_WEATHER_WEATHER61, IMAGE_WEATHER_WEATHER62, IMAGE_WEATHER_WEATHER63};\r
 \r
 typedef struct {\r
-    const char *label_1;\r
-    const ImageInfo *icon;\r
-    const char *label_2;\r
+    const char *weatherWeek;\r
+    int image;\r
+    const char *weatherTemp;\r
     bool hasSecondMenu;\r
 } WeatherItem;\r
 \r
 typedef struct {\r
-    const char *min_degree;\r
-    const char *max_degree;\r
+    const char *min_temp;\r
+    const char *max_temp;\r
     const char *address;\r
     const char *weather_code;\r
-    const char *degree;\r
+    const char *temp;\r
     const char *updateTime;\r
     const char *humidity;\r
     std::string sunSet;\r
@@ -139,47 +96,82 @@ typedef struct {
 \r
 typedef struct {\r
     const char *hour;\r
-    const char *degree;\r
+    const char *temp;\r
     const char *weather;\r
 } HourWeather;\r
+\r
+typedef struct {\r
+    const char *sunRise;\r
+    const char *sunSet;\r
+    const char *weekTime;\r
+} SunStruct;\r
+\r
+typedef struct {\r
+    const char *monthRise;\r
+    const char *monthSet;\r
+    const char *weekTime;\r
+} MonthStruct;\r
+\r
+typedef struct {\r
+    const char *phase;\r
+    int image;\r
+    const char *lightTime;\r
+    const char *monthDay;\r
+    const char *weekTime;\r
+} LunarPhaseStruct;\r
+\r
 class WeatherModel {\r
 public:\r
     static WeatherModel &GetInstance(void);\r
+    virtual ~WeatherModel();\r
     bool InitWeatherItem();\r
-    WeatherItem *GetWeatherlistItems();\r
-    uint8_t GetWeatherListNum();\r
-    CurWeather GetCurWeather();\r
-    std::vector<HourWeather> GetHourWeather();\r
-    void InitFirstPageData();\r
-    void InitSecondPageData();\r
-    void InitThirdPageData();\r
+    void InitMainPageData();\r
+    void InitHoursPageData();\r
+    void InitDaysPageData();\r
     void UpdateTemp();\r
+    void InitStringData();\r
     bool InitVecForecast(cJSON *root);\r
     bool InitVecObserve(cJSON *root);\r
     bool InitVecRise(cJSON *root);\r
     bool InitVecWeek(cJSON *root);\r
     bool InitVecAddress(cJSON *root);\r
-    virtual ~WeatherModel();\r
+    WeatherItem *GetWeatherlistItems();\r
+    uint8_t GetWeatherListNum();\r
+    CurWeather GetCurWeather();\r
+    SunStruct *GetSunData();\r
+    MonthStruct *GetMonthData();\r
+    LunarPhaseStruct *GetLunarPhaseData();\r
+    std::vector<HourWeather> GetHourWeather();\r
     void SetDayStatus(const std::string &timeRise, const std::string &timeSet);\r
-    bool GetDayStatus();\r
+    void ClearData();\r
+    int index_ = 0;\r
+    void LoadImageOfDayNight(UIImageView *view, uint32_t resDayId, uint32_t resNightId);\r
+    void LoadTextColorOfDayNight(UILabel *view, uint32_t colorDay, uint32_t colorNight);\r
 \r
 private:\r
     WeatherModel();\r
     WeatherModel(const WeatherModel &);\r
     WeatherModel &operator=(const WeatherModel &);\r
-    int usedLen{0};\r
-    int tempMinArray[WEATHER_ITEM_COUNT] = {0};\r
-    int tempMaxArray[WEATHER_ITEM_COUNT] = {0};\r
-    bool isDay;\r
-    CurWeather curWeather{nullptr};\r
-    std::vector<HourWeather> houWeather;\r
-    WeatherItem weather[WEATHER_ITEM_COUNT] = {nullptr, nullptr, nullptr, false};\r
-    std::vector<std::tuple<std::string, std::string, int>> vec_forecast_1h;\r
-    std::vector<std::tuple<std::string, std::string, int>> vec_forecast_24h;\r
-    std::vector<std::tuple<std::string, std::string, int>> vec_rise;\r
-    std::map<std::string, std::string> map_observe;\r
-    std::map<std::string, std::string> map_address;\r
+    CurWeather curWeather_{nullptr};\r
+    std::vector<HourWeather> houWeather_;\r
+    WeatherItem weather_[ONE_WEEK_DYAS] = {nullptr, 0, nullptr, false};\r
+    std::string strTmp_[ONE_WEEK_DYAS];\r
+    std::string minTemp_[ONE_WEEK_DYAS];\r
+    std::string maxTemp_[ONE_WEEK_DYAS];\r
+    std::string currentWeek_[ONE_WEEK_DYAS];\r
+    std::string strRise_[ONE_WEEK_DYAS];\r
+    std::string strSet_[ONE_WEEK_DYAS];\r
+    int weatherValue_[ONE_WEEK_DYAS];\r
+    SunStruct sunData_[ONE_WEEK_DYAS] = {nullptr, nullptr, nullptr};\r
+    MonthStruct monthData_[ONE_WEEK_DYAS] = {nullptr, nullptr, nullptr};\r
+    LunarPhaseStruct parseData_[ONE_WEEK_DYAS] = {nullptr, 0, nullptr, nullptr, nullptr};\r
+    std::vector<std::tuple<std::string, std::string, int>> vec_forecast_1h_;\r
+    std::vector<std::tuple<std::string, std::string, int>> vec_forecast_24h_;\r
+    std::map<std::string, std::string> map_observe_;\r
+    std::map<std::string, std::string> map_address_;\r
+    int usedLen_{0};\r
+    bool isDay_{0};\r
 };\r
 }\r
 \r
-#endif  // Weather_MODEL_H
\ No newline at end of file
+#endif // Weather_MODEL_H
\ No newline at end of file
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/include/weather/WeatherPageDays.h b/code/sdk/application/wearable/evb/nativeapp/nativeui/include/weather/WeatherPageDays.h
new file mode 100644 (file)
index 0000000..d34c77b
--- /dev/null
@@ -0,0 +1,44 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: WeatherPageDays\r
+ * Create: 2025-03-15\r
+ */\r
+\r
+#ifndef WEATHER_PAGE_DAYS_H\r
+#define WEATHER_PAGE_DAYS_H\r
+\r
+#include "components/ui_image_view.h"\r
+#include "components/ui_label.h"\r
+#include "components/ui_label_button.h"\r
+#include "components/ui_simple_list.h"\r
+#include "components/ui_scroll_view_nested.h"\r
+#include "components/ui_swipe_view.h"\r
+#include "SlicePage.h"\r
+#include "UiConfig.h"\r
+#include "WeatherItemView.h"\r
+#include "WeatherPresenter.h"\r
+\r
+namespace OHOS {\r
+class WeatherPageDays :  public SlicePage<WeatherPresenter>,\r
+                        public UIView::OnClickListener,\r
+                        public UIView::OnDragListener,\r
+                        public UISwipeView::OnSwipeListener {\r
+public:\r
+    WeatherPageDays();\r
+    ~WeatherPageDays() override;\r
+    void OnStart(void* data) override;\r
+    bool OnClick(UIView &view, const ClickEvent &event) override;\r
+    bool OnDrag(UIView& view, const DragEvent& event) override;\r
+    void OnSwipe(UISwipeView &view) override;\r
+    void InitScrollView();\r
+    bool InitScrollData();\r
+    void RefreshWeathersList(WeatherItem *item, uint8_t count);\r
+private:\r
+    UIViewGroup *group_{nullptr};\r
+    UISimpleList *contentList_{nullptr};\r
+    UILabel *title_{nullptr};\r
+    UIImageView *bgImg_{nullptr};\r
+    UIImageView *pageIdxImg_{nullptr};\r
+};\r
+}\r
+#endif
\ No newline at end of file
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/include/weather/WeatherPageHours.h b/code/sdk/application/wearable/evb/nativeapp/nativeui/include/weather/WeatherPageHours.h
new file mode 100644 (file)
index 0000000..7c3e6d2
--- /dev/null
@@ -0,0 +1,41 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: WeatherPageHours\r
+ * Create: 2025-03-15\r
+ */\r
+\r
+#ifndef WEATHER_PAGE_HOURS_H\r
+#define WEATHER_PAGE_HOURS_H\r
+\r
+#include "components/ui_image_view.h"\r
+#include "components/ui_label.h"\r
+#include "components/ui_label_button.h"\r
+#include "components/ui_swipe_view.h"\r
+#include "ui_swipe_view.h"\r
+#include "SlicePage.h"\r
+#include "UiConfig.h"\r
+#include "WeatherPresenter.h"\r
+#include "WeatherView.h"\r
+#include "WeatherPageHoursGroup.h"\r
+\r
+namespace OHOS {\r
+static constexpr int16_t GROUP_24H_COUNT = 3;\r
+\r
+class WeatherPresenter;\r
+class WeatherPageHours : public SlicePage<WeatherPresenter>,\r
+                        public UIView::OnClickListener,\r
+                        public UIView::OnDragListener,\r
+                        public UISwipeView::OnSwipeListener {\r
+public:\r
+    WeatherPageHours();\r
+    ~WeatherPageHours() override;\r
+    void OnStart(void* data) override;\r
+    bool OnClick(UIView &view, const ClickEvent &event) override;\r
+    bool OnDrag(UIView& view, const DragEvent& event) override;\r
+    void OnSwipe(UISwipeView &view) override;\r
+private:\r
+    UISwipeView *weatherSwipeGroup_{nullptr};\r
+    WeatherPageHoursGroup *hoursGroup_[GROUP_24H_COUNT]{nullptr};\r
+};\r
+}\r
+#endif
\ No newline at end of file
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/include/weather/WeatherPageHoursGroup.h b/code/sdk/application/wearable/evb/nativeapp/nativeui/include/weather/WeatherPageHoursGroup.h
new file mode 100644 (file)
index 0000000..d26f0e8
--- /dev/null
@@ -0,0 +1,42 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: WeatherPageHoursGroup\r
+ * Create: 2025-03-15\r
+ */\r
+\r
+#ifndef WEATHER_PAGE_HOURS_GROUP_H\r
+#define WEATHER_PAGE_HOURS_GROUP_H\r
+\r
+#include "components/ui_image_view.h"\r
+#include "components/ui_label.h"\r
+#include "components/ui_label_button.h"\r
+#include "components/ui_swipe_view.h"\r
+#include "ui_swipe_view.h"\r
+#include "SlicePage.h"\r
+#include "UiConfig.h"\r
+#include "WeatherPresenter.h"\r
+#include "WeatherView.h"\r
+\r
+namespace OHOS {\r
+static constexpr int16_t WEATHER_24H_PER_8H = 8;\r
+\r
+class WeatherPresenter;\r
+class WeatherPageHoursGroup : public UIViewGroup {\r
+public:\r
+    WeatherPageHoursGroup();\r
+    ~WeatherPageHoursGroup() override;\r
+    void WeatherInit(int index);\r
+    void InitLabel(int index);\r
+    void InitImage(int index);\r
+private:\r
+    std::vector<HourWeather> houWeather_;\r
+    UILabel *labelTime_[WEATHER_24H_PER_8H]{nullptr};\r
+    UILabel *labelTemp_[WEATHER_24H_PER_8H]{nullptr};\r
+    UIImageView *imgBack_[WEATHER_24H_PER_8H]{nullptr};\r
+    UIImageView *imgWeather_[WEATHER_24H_PER_8H]{nullptr};\r
+    UILabel *topLabel_{nullptr};\r
+    UIImageView *bgImg_{nullptr};\r
+    UIImageView *pageIdxImg_{nullptr};\r
+};\r
+}\r
+#endif
\ No newline at end of file
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/include/weather/WeatherPageLunarPhase.h b/code/sdk/application/wearable/evb/nativeapp/nativeui/include/weather/WeatherPageLunarPhase.h
new file mode 100644 (file)
index 0000000..9ed9a39
--- /dev/null
@@ -0,0 +1,52 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: WeatherPageLunarPhase\r
+ * Create: 2025-03-15\r
+ */\r
+\r
+#ifndef WEATHER_PAGE_LUNARPHASE_H\r
+#define WEATHER_PAGE_LUNARPHASE_H\r
+\r
+#include "components/ui_image_view.h"\r
+#include "components/ui_label.h"\r
+#include "components/ui_label_button.h"\r
+#include "components/ui_swipe_view.h"\r
+#include "ui_swipe_view.h"\r
+#include "SlicePage.h"\r
+#include "UiConfig.h"\r
+#include "WeatherPresenter.h"\r
+#include "WeatherView.h"\r
+\r
+namespace OHOS {\r
+static constexpr int16_t BUTTON_CHANGE_END = 6;\r
+\r
+class WeatherPresenter;\r
+class WeatherPageLunarPhase : public SlicePage<WeatherPresenter>,\r
+                        public UIView::OnClickListener,\r
+                        public UIView::OnDragListener {\r
+public:\r
+    WeatherPageLunarPhase();\r
+    ~WeatherPageLunarPhase() override;\r
+    void OnStart(void* data) override;\r
+    bool OnClick(UIView &view, const ClickEvent &event) override;\r
+    bool OnDrag(UIView& view, const DragEvent& event) override;\r
+    void InitLabel();\r
+    void InitImage();\r
+    void InitButton();\r
+    void InitMonthLabel();\r
+private:\r
+    UIViewGroup *group_{nullptr};\r
+    UIImageView *bgImg_{nullptr};\r
+    UIImageView *drawImg_{nullptr};\r
+    UILabel *labelTitle_{nullptr};\r
+    UILabel *labelDay_{nullptr};\r
+    UILabel *labelLunarPhase_{nullptr};\r
+    UILabel *labelMonthLight_{nullptr};\r
+    UILabel *labelMonthDay_{nullptr};\r
+    UIButton *buttonChangeLeft_{nullptr};\r
+    UIButton *buttonChangeRight_{nullptr};\r
+    LunarPhaseStruct *phase_ = nullptr;\r
+    int index_ = 0;\r
+};\r
+}\r
+#endif
\ No newline at end of file
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/include/weather/WeatherPageMonthRise.h b/code/sdk/application/wearable/evb/nativeapp/nativeui/include/weather/WeatherPageMonthRise.h
new file mode 100644 (file)
index 0000000..7abb646
--- /dev/null
@@ -0,0 +1,52 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: WeatherPageMonthRise\r
+ * Create: 2025-03-15\r
+ */\r
+\r
+#ifndef WEATHER_PAGE_MONTHRISE_H\r
+#define WEATHER_PAGE_MONTHRISE_H\r
+\r
+#include "components/ui_image_view.h"\r
+#include "components/ui_label.h"\r
+#include "components/ui_label_button.h"\r
+#include "components/ui_swipe_view.h"\r
+#include "ui_swipe_view.h"\r
+#include "SlicePage.h"\r
+#include "UiConfig.h"\r
+#include "WeatherPresenter.h"\r
+#include "WeatherView.h"\r
+\r
+namespace OHOS {\r
+static constexpr int16_t MONTHRISE_TIME_LABEL_COUNT = 2;\r
+static constexpr int16_t BUTTON_CHANGE_END = 6;\r
+\r
+class WeatherPresenter;\r
+class WeatherPageMonthRise : public SlicePage<WeatherPresenter>,\r
+                        public UIView::OnClickListener,\r
+                        public UIView::OnDragListener {\r
+public:\r
+    WeatherPageMonthRise();\r
+    ~WeatherPageMonthRise() override;\r
+    void OnStart(void* data) override;\r
+    bool OnClick(UIView &view, const ClickEvent &event) override;\r
+    bool OnDrag(UIView& view, const DragEvent& event) override;\r
+    void InitLabel();\r
+    void InitLabelMonth();\r
+    void InitImage();\r
+    void InitButton();\r
+private:\r
+    UIViewGroup *group_{nullptr};\r
+    UIImageView *bgImg_{nullptr};\r
+    UIImageView *drawImg_{nullptr};\r
+    UIImageView *monthImg_{nullptr};\r
+    UILabel *labelTitle_{nullptr};\r
+    UILabel *labelDay_{nullptr};\r
+    UILabel *labelMonth_[MONTHRISE_TIME_LABEL_COUNT]{nullptr};\r
+    UIButton *buttonChangeLeft_{nullptr};\r
+    UIButton *buttonChangeRight_{nullptr};\r
+    MonthStruct *month_ = nullptr;\r
+    int index_ = 0;\r
+};\r
+}\r
+#endif
\ No newline at end of file
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/include/weather/WeatherPageSunRise.h b/code/sdk/application/wearable/evb/nativeapp/nativeui/include/weather/WeatherPageSunRise.h
new file mode 100644 (file)
index 0000000..88c13ce
--- /dev/null
@@ -0,0 +1,52 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: WeatherPageSunRise\r
+ * Create: 2025-03-15\r
+ */\r
+\r
+#ifndef WEATHER_PAGE_SUNRISE_H\r
+#define WEATHER_PAGE_SUNRISE_H\r
+\r
+#include "components/ui_image_view.h"\r
+#include "components/ui_label.h"\r
+#include "components/ui_label_button.h"\r
+#include "components/ui_swipe_view.h"\r
+#include "ui_swipe_view.h"\r
+#include "SlicePage.h"\r
+#include "UiConfig.h"\r
+#include "WeatherPresenter.h"\r
+#include "WeatherView.h"\r
+\r
+namespace OHOS {\r
+static constexpr int16_t SUNRISE_TIME_LABEL_COUNT = 2;\r
+static constexpr int16_t BUTTON_CHANGE_END = 6;\r
+\r
+class WeatherPresenter;\r
+class WeatherPageSunRise : public SlicePage<WeatherPresenter>,\r
+                        public UIView::OnClickListener,\r
+                        public UIView::OnDragListener {\r
+public:\r
+    WeatherPageSunRise();\r
+    ~WeatherPageSunRise() override;\r
+    void OnStart(void* data) override;\r
+    bool OnClick(UIView &view, const ClickEvent &event) override;\r
+    bool OnDrag(UIView& view, const DragEvent& event) override;\r
+    void InitLabel();\r
+    void InitLabelSun();\r
+    void InitImage();\r
+    void InitButton();\r
+private:\r
+    UIViewGroup *group_{nullptr};\r
+    UIImageView *bgImg_{nullptr};\r
+    UIImageView *drawImg_{nullptr};\r
+    UIImageView *sunImg_{nullptr};\r
+    UILabel *labelTitle_{nullptr};\r
+    UILabel *labelDay_{nullptr};\r
+    UILabel *labelSun_[SUNRISE_TIME_LABEL_COUNT]{nullptr};\r
+    UIButton *buttonChangeLeft_{nullptr};\r
+    UIButton *buttonChangeRight_{nullptr};\r
+    SunStruct *sun_ = nullptr;\r
+    int index_ = 0;\r
+};\r
+}\r
+#endif
\ No newline at end of file
index 6cb6bf1..f6cdcf8 100644 (file)
@@ -9,10 +9,11 @@
 \r
 #include "Presenter.h"\r
 #include "components/ui_view.h"\r
-#include "weather/WeatherModel.h"\r
+#include "WeatherModel.h"\r
+\r
 namespace OHOS {\r
 class WeatherView;\r
 class WeatherPresenter : public Presenter<WeatherView> {};\r
 }\r
 \r
-#endif  // Weather_PRESENTER_H
\ No newline at end of file
+#endif  // WEATHER_PRESENTER_H
\ No newline at end of file
index 4c2e469..e337399 100644 (file)
@@ -8,14 +8,18 @@
 #define WEATHER_VIEW_H\r
 \r
 #include "View.h"\r
+\r
 namespace OHOS {\r
 enum WEATHER_PAGES {\r
     WEATHER_MAIN_PAGE = 1,  // 0 is invalid\r
-    WEATHER_SECOND_PAGE = 2,\r
-    WEATHER_THIRD_PAGE = 3,\r
+    WEATHER_HOURS_PAGE = 2,\r
+    WEATHER_DAYS_PAGE = 3,\r
+    WEATHER_SUNRISE_PAGE = 4,\r
+    WEATHER_MONTHRISE_PAGE = 5,\r
+    WEATHER_LUNARPHASE_PAGE = 6,\r
 };\r
 \r
 class WeatherPresenter;\r
 class WeatherView : public View<WeatherPresenter> {};\r
 }\r
-#endif  // Weather_VIEW_H\r
+#endif  // WEATHER_VIEW_H\r
index 9f8ecd3..8d6dc8d 100644 (file)
 #include "dock/input_device.h"
 #include "notification_manager.h"
 #include "alarm/AlarmPopUpPresenter.h"
-#include "callerlog/CallerLogModel.h"
-#include "makephone/MainCallingPresenter.h"
-#include "applist/ApplistModel.h"
+#include "phonemenu/PhoneMenuView.h"
+#include "phonemenu/PhoneMenuCallerLogModel.h"
+#include "settings/model/SettingDesktopModel.h"
+#include "quickaccess/FloatAccessView.h"
 
 namespace OHOS {
+// 可以弹窗快捷应用的应用页
+static uint16_t g_viewIds[] = {
+    VIEW_MAIN_SAMPLE,   // 主表盘
+    VIEW_APPLIST,       // 菜单页
+};
+
+static void PressQuickApp(uint16_t viewId)
+{
+    if (FloatAccessView::GetInstance()->IsShowView()) {
+        FloatAccessView::GetInstance()->ExitView();
+    } else {
+        int len = sizeof(g_viewIds) / sizeof(uint16_t);
+        for (int i = 0 ; i < len; i++) {
+            if (viewId == g_viewIds[i]) {
+                FloatAccessView::GetInstance()->ShowView();
+                return;
+            }
+        }
+    }
+}
+
 static bool IsNotifyCallStatus()
 {
     uint16_t notifyId = NotificationManager::GetInstance()->GetShowingNotifyId();
@@ -63,7 +85,7 @@ void KeyInputListener::OnKeyLongPress(const KeyEvent& event)
         // 切换到关机/重启卡片
         NativeAbility::GetInstance().ChangeSlice(VIEW_REBOOT);
     } else if (keyID == static_cast<uint16_t>(ZliteKeyCode::ZLITE_KEY_FUNC)) { // 功能按键
-        // 切换到查看系统版本卡片
+        PressQuickApp(NativeAbility::GetInstance().GetCurSliceId());
     }
     return;
 }
@@ -71,9 +93,9 @@ void KeyInputListener::OnKeyLongPress(const KeyEvent& event)
 void KeyInputListener::CallVolumeDipSwitchControl(uint8_t status)
 {
     VolumeSliderEventListener *volumeSliderEventListener = nullptr;
-    if (MainCallingPresenter::GetInstance() != nullptr && CallerLogModel::GetInstance()->GetCallStatus()) {
-        if (CallerLogModel::GetInstance()->GetVolumeScreenStatus()) {
-            VolumeSettingView *settingView = MainCallingPresenter::GetInstance()->GetvolumeSetting();
+    if (PhoneMenuCallerLogModel::GetInstance()->GetCallStatus()) {
+        if (PhoneMenuCallerLogModel::GetInstance()->GetVolumeScreenStatus()) {
+            VolumeSettingView *settingView = GetvolumeSetting();
             if (settingView == nullptr) {
                 return;
             }
@@ -83,8 +105,8 @@ void KeyInputListener::CallVolumeDipSwitchControl(uint8_t status)
             }
             volumeSliderEventListener->ChangeVolume(static_cast<VolumeChangeStatus>(status));
         } else {
-            MainCallingPresenter::GetInstance()->HonrsViewChange();
-            CallerLogModel::GetInstance()->SetVolumeScreenStatus(true);
+            HonrsViewChange();
+            PhoneMenuCallerLogModel::GetInstance()->SetVolumeScreenStatus(true);
         }
     }
     if (IsNotifyCallStatus()) {
@@ -107,24 +129,31 @@ void KeyInputListener::CallVolumeDipSwitchControl(uint8_t status)
 
 void KeyInputListener::OnKeyRelease(const KeyEvent& event)
 {
-    uint16_t currentViewId = NativeAbility::GetInstance().GetCurSliceId();
+    uint32_t targetId = NativeAbility::GetInstance().GetCurTargetId();
+    uint16_t curSlice = static_cast<uint16_t>(targetId & SLICE_MASK);
+    uint16_t curPage = static_cast<uint16_t>(targetId >> PAGE_OFFSET);
     uint16 keyID = event.GetKeyId();
     if (keyID == static_cast<uint16_t>(ZliteKeyCode::ZLITE_KEY_POWER)) { // 电源按键
         if (longPressFlag == 0 && pressFlag == 1) { // 短按电源键
-            if (currentViewId == VIEW_MAEKPHONE_SAMPLE ||
+            // 先关闭快捷应用悬浮框再处理事件
+            if (FloatAccessView::GetInstance()->IsShowView()) {
+                FloatAccessView::GetInstance()->CleanView();
+            }
+            if ((curSlice == VIEW_PHONE_MENU && curPage == PhoneMenuPages::PHONE_MENU_CALLING_PAGE) ||
                 NotificationManager::GetInstance()->GetWatchCallStatus()) { // 音量卡片
                 // 音量+
                 CallVolumeDipSwitchControl(VOLUMEUP);
-            } else if (currentViewId != VIEW_MAIN_SAMPLE) { // 主表盘
+            } else if (curSlice != VIEW_MAIN_SAMPLE) { // 主表盘
                 PressAlarmNotify(); // 当前为闹钟通知页面时,先处理闹钟再切换页面
-                NativeAbility::GetInstance().ChangeSlice(VIEW_MAIN_SAMPLE, TransitionType::TRANSITION_ZOOM);
+                NativeAbility::GetInstance().ChangeSlice(VIEW_MAIN_SAMPLE, TransitionType::TRANSITION_ZOOM_OUT);
             } else {
                 PressAlarmNotify(); // 当前为闹钟通知页面时,先处理闹钟再切换页面
                 if (!MainViewSample::GetInstance()->IsMainClockPage()) { // 当前页面为主表盘的其他页面时,切换回主表盘页面
                     MainViewSample::GetInstance()->SwitchToClockPage();
                 } else {
-                    if (ApplistModel::GetInstance().GetCurrentStyle() == AppListStyle::WATERFALL_STYLE) {
-                        NativeAbility::GetInstance().ChangeSlice(VIEW_APPLIST, TransitionType::TRANSITION_ENTER_WATERFALL);
+                    if (SettingDesktopModel::GetInstance().GetDesktopStyle() == DesktopStyle::WATERFALL_STYLE) {
+                        NativeAbility::GetInstance().ChangeSlice(VIEW_APPLIST,
+                                                                 TransitionType::TRANSITION_ENTER_WATERFALL);
                     } else {
                         NativeAbility::GetInstance().ChangeSlice(VIEW_APPLIST, TransitionType::TRANSITION_ZOOM);
                     }
@@ -133,11 +162,11 @@ void KeyInputListener::OnKeyRelease(const KeyEvent& event)
         }
     } else if (keyID == static_cast<uint16_t>(ZliteKeyCode::ZLITE_KEY_FUNC)) { // 功能按键
         if (longPressFlag == 0 && pressFlag == 1) { // 短按功能键
-            if (currentViewId == VIEW_MAEKPHONE_SAMPLE ||
+            if ((curSlice == VIEW_PHONE_MENU && curPage == PhoneMenuPages::PHONE_MENU_CALLING_PAGE) ||
                 NotificationManager::GetInstance()->GetWatchCallStatus()) { // 音量卡片
                 // 音量-
                 CallVolumeDipSwitchControl(VOLUMEDOWN);
-            } else if (currentViewId != VIEW_RECENT_APP) {
+            } else if (curSlice != VIEW_RECENT_APP) {
                 NativeAbility::GetInstance().ChangeSlice(VIEW_RECENT_APP);
             }
         }
index 5f0b22d..afb3f12 100644 (file)
-/*
- * Copyright (c) 2020-2021 CompanyNameMagicTag.
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-#include "main/HealthModel.h"
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-#include <unistd.h>
-#include "securec.h"
-#include "message.h"
-#include "wearable_log.h"
-#include "iostream"
-#include <fstream>
-#include "graphic_mutex.h"
-
-namespace OHOS {
-HealthAllData g_healthData;
-
-static GraphicMutex g_healthDataMutex;
-static constexpr const char *HEALTH_DATA_PATH = "/user/res/health.bin";
-static constexpr uint16_t LIST_HEALTH_LENGTH = 30;
-
-HealthModel::HealthModel()
-{
-}
-
-HealthModel::~HealthModel()
-{
-    listHealth.Clear();
-    listHealthNum = 0;
-}
-
-HealthModel *HealthModel::GetInstance(void)
-{
-    static HealthModel healthModel;
-    return &healthModel;
-}
-
-int HealthModel::SaveGlobalHealthToFile(void)
-{
-    std::ofstream outHealthFile;
-    outHealthFile.open(HEALTH_DATA_PATH, std::ios::out);
-    if (outHealthFile.is_open() == 0) {
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "open HEALTH_DATA_PATH failure!");
-        outHealthFile.close();
-        return -1;
-    } else {
-        outHealthFile.write((const char*)&g_healthData, sizeof(HealthAllData));
-        if (outHealthFile.fail()) {
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SaveGlobalHealthToFile fail");
-            return -1;
-        }
-        outHealthFile.close();
-        return 0;
-    }
-}
-
-int HealthModel::GetHealthGlobalData(DataDistribute type, uint32_t *value)
-{
-    switch (type) {
-        case HEALTH_SLEEP:
-            *value = g_healthData.healthSleep;
-            break;
-        case BATTERY_LIFE:
-            break;
-        default:
-            return -1;
-            break;
-    }
-    return 0;
-}
-
-void HealthModel::PushHealthData(HealthMsg healthMsg)
-{
-    uint16_t tmp;
-    if (listHealthNum >= LIST_HEALTH_MAX) {
-        return;
-    }
-    g_healthDataMutex.Lock();
-    listHealthNum++;
-    listHealth.PushBack(healthMsg);
-    g_healthDataMutex.Unlock();
-    switch (healthMsg.type) {
-        case HEALTH_SLEEP:
-            g_healthData.healthSleep = healthMsg.value;
-            break;
-        case BATTERY_LIFE:
-            break;
-        default:
-            break;
-    }
-}
-
-bool HealthModel::FetchedHealthData(HealthMsg *healthMsg)
-{
-    if (listHealth.IsEmpty()) {
-        return false;
-    } else {
-        g_healthDataMutex.Lock();
-        listHealthNum--;
-        *healthMsg = listHealth.Front();
-        listHealth.PopFront();
-        g_healthDataMutex.Unlock();
-    }
-    return true;
-}
-
-bool HealthModel::InitHealthData(void)
-{
-    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HealthModel::InitHealthData start");
-    (void)memset_s(&g_healthData, sizeof(HealthAllData), 0, sizeof(HealthAllData));
-    std::ifstream inHealthFile;
-    inHealthFile.open(HEALTH_DATA_PATH, std::ios::in);
-    if (!inHealthFile.is_open()) {
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "open HEALTH_DATA_PATH failure!");
-        inHealthFile.close();
-        return false;
-    } else {
-        inHealthFile.read((char*)&g_healthData, sizeof(HealthAllData));
-        if (inHealthFile.fail()) {
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "InitHealthData fail");
-            inHealthFile.close();
-            return false;
-        }
-        inHealthFile.close();
-    }
-    return true;
-}
-
-int HealthModel::GetBriScrStatus(void)
-{
-    return briScreenStatus;
-}
-
-int HealthModel::GetDntDistStatus(void)
-{
-    return dntDisturbStatus;
-}
-
-void HealthModel::UpdateBriScrStatus(uint16_t status)
-{
-    briScreenStatus = status;
-}
-
-void HealthModel::UpdateDntDistStatus(uint16_t status)
-{
-    dntDisturbStatus = status;
-}
-}
+/*\r
+ * Copyright (c) 2020-2021 CompanyNameMagicTag.\r
+ * Licensed under the Apache License, Version 2.0 (the "License");\r
+ * you may not use this file except in compliance with the License.\r
+ * You may obtain a copy of the License at\r
+ *\r
+ *     http://www.apache.org/licenses/LICENSE-2.0\r
+ *\r
+ * Unless required by applicable law or agreed to in writing, software\r
+ * distributed under the License is distributed on an "AS IS" BASIS,\r
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+ * See the License for the specific language governing permissions and\r
+ * limitations under the License.\r
+ */\r
+#include "main/HealthModel.h"\r
+#include <sys/types.h>\r
+#include <sys/stat.h>\r
+#include <fcntl.h>\r
+#include <unistd.h>\r
+#include "securec.h"\r
+#include "message.h"\r
+#include "wearable_log.h"\r
+#include "iostream"\r
+#include <fstream>\r
+#include "graphic_mutex.h"\r
+\r
+namespace OHOS {\r
+HealthAllData g_healthData;\r
+\r
+static GraphicMutex g_healthDataMutex;\r
+static constexpr const char *HEALTH_DATA_PATH = "/user/res/health.bin";\r
+static constexpr uint16_t LIST_HEALTH_LENGTH = 30;\r
+\r
+HealthModel::HealthModel()\r
+{\r
+}\r
+\r
+HealthModel::~HealthModel()\r
+{\r
+    listHealth.Clear();\r
+    listHealthNum = 0;\r
+}\r
+\r
+HealthModel *HealthModel::GetInstance(void)\r
+{\r
+    static HealthModel healthModel;\r
+    return &healthModel;\r
+}\r
+\r
+int HealthModel::SaveGlobalHealthToFile(void)\r
+{\r
+    std::ofstream outHealthFile;\r
+    outHealthFile.open(HEALTH_DATA_PATH, std::ios::out);\r
+    if (outHealthFile.is_open() == 0) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "open HEALTH_DATA_PATH failure!");\r
+        outHealthFile.close();\r
+        return -1;\r
+    } else {\r
+        outHealthFile.write((const char*)&g_healthData, sizeof(HealthAllData));\r
+        if (outHealthFile.fail()) {\r
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SaveGlobalHealthToFile fail");\r
+            return -1;\r
+        }\r
+        outHealthFile.close();\r
+        return 0;\r
+    }\r
+}\r
+\r
+int HealthModel::GetHealthGlobalData(DataDistribute type, uint32_t *value)\r
+{\r
+    switch (type) {\r
+        case HEALTH_SLEEP:\r
+            *value = g_healthData.healthSleep;\r
+            break;\r
+        case BATTERY_LIFE:\r
+            break;\r
+        default:\r
+            return -1;\r
+            break;\r
+    }\r
+    return 0;\r
+}\r
+\r
+void HealthModel::PushHealthData(HealthMsg healthMsg)\r
+{\r
+    uint16_t tmp;\r
+    if (listHealthNum >= LIST_HEALTH_MAX) {\r
+        return;\r
+    }\r
+    g_healthDataMutex.Lock();\r
+    listHealthNum++;\r
+    listHealth.PushBack(healthMsg);\r
+    g_healthDataMutex.Unlock();\r
+    switch (healthMsg.type) {\r
+        case HEALTH_SLEEP:\r
+            g_healthData.healthSleep = healthMsg.value;\r
+            break;\r
+        case BATTERY_LIFE:\r
+            break;\r
+        default:\r
+            break;\r
+    }\r
+}\r
+\r
+bool HealthModel::FetchedHealthData(HealthMsg *healthMsg)\r
+{\r
+    if (listHealth.IsEmpty()) {\r
+        return false;\r
+    } else {\r
+        g_healthDataMutex.Lock();\r
+        listHealthNum--;\r
+        *healthMsg = listHealth.Front();\r
+        listHealth.PopFront();\r
+        g_healthDataMutex.Unlock();\r
+    }\r
+    return true;\r
+}\r
+\r
+bool HealthModel::InitHealthData(void)\r
+{\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HealthModel::InitHealthData start");\r
+    (void)memset_s(&g_healthData, sizeof(HealthAllData), 0, sizeof(HealthAllData));\r
+    std::ifstream inHealthFile;\r
+    inHealthFile.open(HEALTH_DATA_PATH, std::ios::in);\r
+    if (!inHealthFile.is_open()) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "open HEALTH_DATA_PATH failure!");\r
+        inHealthFile.close();\r
+        return false;\r
+    } else {\r
+        inHealthFile.read((char*)&g_healthData, sizeof(HealthAllData));\r
+        if (inHealthFile.fail()) {\r
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "InitHealthData fail");\r
+            inHealthFile.close();\r
+            return false;\r
+        }\r
+        inHealthFile.close();\r
+    }\r
+    return true;\r
+}\r
+\r
+int HealthModel::GetBriScrStatus(void)\r
+{\r
+    return briScreenStatus;\r
+}\r
+\r
+int HealthModel::GetDntDistStatus(void)\r
+{\r
+    return dntDisturbStatus;\r
+}\r
+\r
+void HealthModel::UpdateBriScrStatus(uint16_t status)\r
+{\r
+    briScreenStatus = status;\r
+}\r
+\r
+void HealthModel::UpdateDntDistStatus(uint16_t status)\r
+{\r
+    dntDisturbStatus = status;\r
+}\r
+}\r
index 5586182..1c0ffd5 100644 (file)
@@ -1,6 +1,6 @@
 /*\r
- * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
- * Description: LoadImg\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: LoadImg.cpp\r
  * Author:\r
  * Create: 2025-06-05\r
  */\r
@@ -9,18 +9,17 @@
 \r
 namespace OHOS {\r
 namespace LOADIMG {\r
-\r
 // 加载图片资源\r
 void LoadBtnImage(UIButton *btn, std::string file, uint32_t resId1, uint32_t resId2)\r
 {\r
     ImageInfo *image1 = ImageCacheManager::GetInstance().LoadOneInMultiRes(resId1, file);\r
     if (image1 == nullptr) {\r
-        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "LoadBtnImage resId1 fail");\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "LoadBtnImage resId1 fail");\r
         return;\r
     }\r
     ImageInfo *image2 = ImageCacheManager::GetInstance().LoadOneInMultiRes(resId2, file);\r
     if (image2 == nullptr) {\r
-        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "LoadBtnImage resId2 fail");\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "LoadBtnImage resId2 fail");\r
         return;\r
     }\r
     btn->SetImageSrc(image1, image2);\r
@@ -30,7 +29,18 @@ void LoadImageViewImg(UIImageView *view, std::string file, uint32_t resId)
 {\r
     ImageInfo *image = ImageCacheManager::GetInstance().LoadOneInMultiRes(resId, file);\r
     if (image == nullptr) {\r
-        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "LoadImageViewImg %x fail", resId);\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "LoadImageViewImg %x fail", resId);\r
+        return;\r
+    }\r
+    view->SetSrc(image);\r
+    return;\r
+}\r
+\r
+void LoadImageImg(Image *view, std::string file, uint32_t resId)\r
+{\r
+    ImageInfo *image = ImageCacheManager::GetInstance().LoadOneInMultiRes(resId, file);\r
+    if (image == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "LoadImageImg %x fail", resId);\r
         return;\r
     }\r
     view->SetSrc(image);\r
index a84d1d7..369284f 100644 (file)
 #include "wearable_log.h"\r
 #include "main/DialBinTypesV2.h"\r
 #include "power_display_service.h"\r
+#include "UIWatchDialFactory.h"\r
 \r
 namespace OHOS {\r
     static const int CARD_SETTING_VALUE_LEN = 32;\r
     static const int DIAL_SETTING_VALUE_LEN = 64;\r
     const CardInfo cardInfoMap[] = {\r
-        { HEART_RATE, PNG_SET_CARD_HEART },\r
         { COMPASS, PNG_SET_CARD_COMPASS },\r
         { ACTIVITY, PNG_SET_CARD_ACTIVITY },\r
         { MUSIC_PLAYER, PNG_SET_CARD_PLAYER },\r
@@ -26,11 +26,6 @@ namespace OHOS {
         { VIDEO_CARD3, PNG_SET_CARD_VIDEO },\r
     };\r
 \r
-    const DialInfo dialInfoMap[] = {\r
-        { 0, "扫秒表盘", PNG_SET_DIAL_CLOCK, DEFAULT_TASK_PERIOD, DIAL_DISPLAY_CAPABILITY_NORMAL_ONLY},\r
-        { 1, "aod扫秒表盘", PNG_SET_DIAL_CLOCK, DEFAULT_TASK_PERIOD, DIAL_DISPLAY_CAPABILITY_AMBITIENT_ONLY},\r
-    };\r
-\r
     MainModel::MainModel()\r
     {\r
         power_display_gui_enable_aod(IsAodEnabled());\r
@@ -56,17 +51,12 @@ namespace OHOS {
 \r
     const DialInfo *MainModel::GetDialInfo(uint8_t dialId) const\r
     {\r
-        for (uint8_t i = 0; i < (sizeof(dialInfoMap) / sizeof(dialInfoMap[0])); i++) {\r
-            if (dialId == dialInfoMap[i].id) {\r
-                return &dialInfoMap[i];\r
-            }\r
-        }\r
-        return nullptr;\r
+        return UIWatchDialFactory::GetInstance().GetNormalDialInfo(dialId);\r
     }\r
 \r
     uint8_t MainModel::GetDialInfoNum() const\r
     {\r
-        return sizeof(dialInfoMap) / sizeof(dialInfoMap[0]);\r
+        return UIWatchDialFactory::GetInstance().GetNormalDialInfoNum();\r
     }\r
 \r
     void MainModel::InitCardSettings(void)\r
@@ -95,7 +85,6 @@ namespace OHOS {
         } else {\r
             /* 使用默认card配置 */\r
             cardSettings[index++] = WATCH_FACE;\r
-            cardSettings[index++] = HEART_RATE;\r
             cardSettings[index++] = COMPASS;\r
             cardSettings[index++] = ACTIVITY;\r
             cardSettings[index++] = MUSIC_PLAYER;\r
@@ -180,40 +169,38 @@ namespace OHOS {
     {\r
         char temp[DIAL_SETTING_VALUE_LEN] = { 0 };\r
         int32_t len = UtilsGetValue("dial_setting", temp, DIAL_SETTING_VALUE_LEN);\r
-        if (len >= 0) {\r
-            char *setBuffer = nullptr;\r
-            char *setValue = strtok_s(temp, ",", &setBuffer);\r
-            if (setValue != nullptr) {\r
-                dialSetting.dialFlag = atoi(setValue);\r
-            } else {\r
-                InitDialSettingDefault();\r
-                return;\r
-            }\r
+        if (len < 0) {\r
+            InitDialSettingDefault();\r
+            return;\r
+        }\r
+        char* setBuffer = nullptr;\r
+        char* setValue = strtok_s(temp, ",", &setBuffer);\r
+        if (!setValue) {\r
+            InitDialSettingDefault();\r
+            return;\r
+        }\r
+        dialSetting.dialFlag = atoi(setValue);\r
 \r
-            setValue = strtok_s(nullptr, ",", &setBuffer);\r
-            if (setValue != nullptr) {\r
-                dialSetting.dialId = atoi(setValue);\r
-            } else {\r
-                InitDialSettingDefault();\r
-                return;\r
-            }\r
+        setValue = strtok_s(nullptr, ",", &setBuffer);\r
+        if (!setValue) {\r
+            InitDialSettingDefault();\r
+            return;\r
+        }\r
+        dialSetting.dialId = atoi(setValue);\r
 \r
-            if (dialSetting.dialFlag == 0) {\r
-                return;\r
-            }\r
-            setValue = strtok_s(nullptr, ",", &setBuffer);\r
-            if (setValue != nullptr) {\r
-                dialSetting.dialFullName = setValue;\r
-                if (!((dialSetting.dialFullName.length() > 0) &&\r
-                    (access(dialSetting.dialFullName.c_str(), F_OK) == 0))) {\r
-                    InitDialSettingDefault();\r
-                    return;\r
-                }\r
-            } else {\r
-                InitDialSettingDefault();\r
-                return;\r
-            }\r
-        } else {\r
+        if (dialSetting.dialFlag  == 0) {\r
+            dialSetting.dialFullName = "";\r
+            return;\r
+        }\r
+\r
+        setValue = strtok_s(nullptr, ",", &setBuffer);\r
+        if (!setValue) {\r
+            InitDialSettingDefault();\r
+            return;\r
+        }\r
+        dialSetting.dialFullName = setValue;\r
+\r
+        if (access(dialSetting.dialFullName.c_str(), F_OK) != 0) {\r
             InitDialSettingDefault();\r
         }\r
     }\r
index 434c85e..a19c72d 100644 (file)
-/*
- * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved.
- * Description: MainPresenterSample
- * Author:
- * Create: 2021-10-18
- */
-
-#include "main/MainPresenterSample.h"
-#include "common/task_manager.h"
-#include "heartrate/HeartRateView.h"
-#include "player/PlayersModel.h"
-#include "player/PlayersPresenter.h"
-#include "NativeRegisterManager.h"
-#include "compass/CompassModel.h"
-#include "drag_event.h"
-#include "graphic_service.h"
-#include "wearable_log.h"
-#include "UiConfig.h"
-#include "ui_resource_image.h"
-#include <iostream>
-#include <map>
-#include "main/dial/ModelDialDataFactory.h"
-#include "main/dial/DialModelTime.h"
-#include "main/dial/DialViewGroup.h"
-#include "uiservice/ui_service.h"
-#include "PageTransitionMgr.h"
-
-namespace OHOS {
-
-REGIST_SLICE(VIEW_MAIN_SAMPLE, MainViewSample, MainPresenterSample);
-
-std::map<std::string, AppViewId> g_jumpView = { { MAIN_CLICK_WEATHER, VIEW_MAIN_SAMPLE },            // 天气界面
-                                                { MAIN_CLICK_ACTIVITY, VIEW_MAIN_ACTIVITY },         // 活动记录界面
-                                                { MAIN_CLICK_MESSAGE, VIEW_MAIN_SAMPLE },            // 消息app
-                                                { MAIN_CLICK_HEARTRATE, VIEW_MAIN_SAMPLE },          // 心率界面
-                                                { DROPDOWN_CLICK_ALARM, VIEW_MAIN_ALARM },           // 闹钟app
-                                                { DROPDOWN_CLICK_SETTING, VIEW_SETTING } };          // 设置界面
-
-std::map<std::string, int> g_chanColor = { { DROPDOWN_CLICK_FINDMYPHONE, DROPDOWN_DROPDOWN_FIND_PHONE_B },
-                                           { DROPDOWN_CLICK_ALARM, DROPDOWN_DROPDOWN_ALARM_B },
-                                           { DROPDOWN_CLICK_SETTING, DROPDOWN_DROPDOWN_SETTING_B } };
-
-static MainPresenterSample *g_pMainPresenterSample = nullptr;
-
-static constexpr uint16_t DROP_X_MAX = 360;
-static constexpr uint16_t PROGRESS_PERCENTAGE = 100;
-static constexpr uint16_t HORIZONTAL_SWIPE = 1;
-static constexpr uint16_t PLAYER_PERIOD = 500;
-static constexpr uint16_t MAX_PERIOD = 1000;
-
-MainPresenterSample::MainPresenterSample()
-{
-    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MainPresenterSample :%p", this);
-    g_pMainPresenterSample = this;
-}
-
-MainPresenterSample::~MainPresenterSample()
-{
-    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "~MainPresenterSample");
-}
-
-MainPresenterSample *MainPresenterSample::GetInstance(void)
-{
-    return g_pMainPresenterSample;
-}
-
-void MainPresenterSample::OnStart()
-{
-    mainPresenterState_ = MainPresenterState::START;
-}
-
-void MainPresenterSample::OnPause()
-{
-    // Save watchface content for slide back
-    UIView* watchFace = view_->GetViewById(WATCH_FACE)->GetParent();
-    uint8_t opaScale = watchFace->GetOpaScale();
-    watchFace->SetOpaScale(OPA_OPAQUE);
-    PageTransitionMgr::GetInstance().SaveSlideBackSnapShotIfNecessary(watchFace);
-    watchFace->SetOpaScale(opaScale);
-
-    uint8_t curCardId = view_->GetHorCurrentCard();
-    UICardPage *card = view_->GetViewById(curCardId);
-    if (card != nullptr) {
-        card->OnPause();
-    }
-    mainPresenterState_ = MainPresenterState::PAUSE;
-}
-
-void MainPresenterSample::OnResume(void)
-{
-    mainPresenterState_ = MainPresenterState::RESUME;
-    // Set current page again to invoke OnActive method.
-    uint8_t curCardId = view_->GetHorCurrentCard();
-    view_->SwitchToCard(curCardId);
-}
-
-void MainPresenterSample::OnStop(void)
-{
-    mainPresenterState_ = MainPresenterState::STOP;
-    if (isCompassSensorOpened_) {
-        CompassModel::GetInstance()->CloseCompassSensor();
-    }
-}
-
-MainPresenterState MainPresenterSample::GetMainPresenterState(void)
-{
-    return mainPresenterState_;
-}
-
-bool MainPresenterSample::OnClick(UIView &view, const ClickEvent &event)
-{
-    UNUSED(event);
-    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "StatusButtonClickListener: %s", view.GetViewId());
-    std::string curViewId = view.GetViewId();
-
-    UIImageView *imgView = static_cast<UIImageView *>(&view);
-    if (HealthModel::GetInstance() == nullptr) {
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "health model nullptr");
-        return false;
-    }
-    if (curViewId == DROPDOWN_CLICK_DONOTDISTURB) {
-        if (HealthModel::GetInstance()->GetDntDistStatus() == 0) {
-            ScreenModels::GetInstance()->LoadAppImages(DROPDOWN_IAMGES, imgView, DROPDOWN_DROPDOWN_DN_DISTURB_B);
-            HealthModel::GetInstance()->UpdateDntDistStatus(1);
-        } else {
-            ScreenModels::GetInstance()->LoadAppImages(DROPDOWN_IAMGES, imgView, DROPDOWN_DROPDOWN_DN_DISTURB);
-            HealthModel::GetInstance()->UpdateDntDistStatus(0);
-        }
-    }
-    if (curViewId == DROPDOWN_CLICK_BRIGHTENSCREEN) {
-        if (HealthModel::GetInstance()->GetBriScrStatus() == 0) {
-            ScreenModels::GetInstance()->LoadAppImages(DROPDOWN_IAMGES, imgView, DROPDOWN_DROPDOWN_BRI_SCREEN_B);
-            HealthModel::GetInstance()->UpdateBriScrStatus(1);
-            ScreenOffEnable(0);
-        } else {
-            ScreenModels::GetInstance()->LoadAppImages(DROPDOWN_IAMGES, imgView, DROPDOWN_DROPDOWN_BRI_SCREEN);
-            HealthModel::GetInstance()->UpdateBriScrStatus(0);
-            ScreenOffEnable(1);
-        }
-    }
-
-    if (g_jumpView.count(curViewId) != 0) {
-        if (g_jumpView[curViewId] == VIEW_SETTING) {
-            NativeAbility::GetInstance().ChangeSlice(g_jumpView[curViewId], TransitionType::TRANSITION_INVALID,
-                gSliceDefaultPriority, true);
-        } else {
-            NativeAbility::GetInstance().ChangeSlice(g_jumpView[curViewId]);
-        }
-    }
-    return true;
-}
-
-bool MainPresenterSample::OnLongPress(UIView& view, const LongPressEvent& event)
-{
-    UNUSED(event);
-    UNUSED(view);
-    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MainPresenterSample OnLongPress");
-    uint8_t cardId = view_->GetHorCurrentCard();
-    if (cardId != WATCH_FACE) {
-        SetCardModel::GetInstance().SetSelectedCard(cardId);
-        NativeAbility::GetInstance().ChangeSlice(VIEW_SET_CARD);
-    } else {
-        NativeAbility::GetInstance().ChangeSlice(VIEW_SET_DIAL);
-    }
-    return true;
-}
-
-void MainPresenterSample::SetPage(int8_t id, bool loadAdjacent)
-{
-    if (view_ != nullptr) {
-        view_->SetPage(id, loadAdjacent);
-    }
-}
-
-void MainPresenterSample::SetTaskPeroid(CardId cardId)
-{
-    SetLastRun(0); // refresh entering card in time
-    if (cardId == COMPASS) {
-        SetPeriod(DEFAULT_TASK_PERIOD);
-    } else if (cardId == WATCH_FACE) {
-        uint32_t time;
-        DialSetting &setting = GetDialSetting();
-        if (setting.dialFlag) {
-            time = dynamic_cast<DialViewGroup*>(view_->GetViewById(WATCH_FACE))->GetPeriod();
-        } else {
-            time = DEFAULT_TASK_PERIOD;
-        }
-        SetPeriod(time);
-    } else if (cardId == MUSIC_PLAYER) {
-        SetPeriod(PLAYER_PERIOD);
-    } else {
-        SetPeriod(MAX_PERIOD);
-    }
-}
-
-void MainPresenterSample::OnSwipe(UISwipeView &view)
-{
-    UNUSED(view);
-    CardId cardId = view_->GetHorCurrentCard();
-    SetTaskPeroid(cardId);
-    if (cardId == COMPASS) {
-        if (!isCompassSensorOpened_) {
-            CompassModel::GetInstance()->OpenCompassSensor();
-            isCompassSensorOpened_ = true;
-        }
-    } else if (isCompassSensorOpened_) {
-        CompassModel::GetInstance()->CloseCompassSensor();
-        isCompassSensorOpened_ = false;
-    }
-
-    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "OnSwipe OnSwipe");
-    return;
-}
-
-void MainPresenterSample::ProcessDataNotify(void)
-{
-    HealthMsg healthMsg;
-    uint16_t len;
-
-    while ((HealthModel::GetInstance()->FetchedHealthData(&healthMsg))) {
-        switch (healthMsg.type) {
-            case BATTERY_LIFE:
-                break;
-            default:
-                break;
-        }
-    }
-}
-
-void MainPresenterSample::SetCircleProgress()
-{
-    PlayersView *playersView = dynamic_cast<PlayersView*>(view_->GetViewById(MUSIC_PLAYER));
-    if (playersView == nullptr) {
-        return;
-    }
-    UICircleProgress *playbackProgress = playersView->GetPlaybackProgress();
-    if (playbackProgress == nullptr) {
-        return;
-    }
-    int32_t playerState;
-    PlayersModel::GetInstance()->GetPlayerCtr()->GetPlayerState(playerState);
-    state_ = playersView->GetPlayerButtonState();
-    if ((playerState != PLAYER_STARTED) && (state_ == UICheckBox::UICheckBoxState::SELECTED)) {
-        playersView->SetPlayerButtonState(UICheckBox::UICheckBoxState::UNSELECTED);
-    } else if ((playerState == PLAYER_STARTED) && (state_ == UICheckBox::UICheckBoxState::UNSELECTED)) {
-        playersView->SetPlayerButtonState(UICheckBox::UICheckBoxState::SELECTED);
-    }
-    if (state_ == UICheckBox::UICheckBoxState::SELECTED) {
-        PlayersModel::GetInstance()->GetPlayerCtr()->GetCurrentTime(playerCurrentTime_);
-        PlayersModel::GetInstance()->GetDuration(playerMusicDuration_);
-        if (playerMusicDuration_ != 0) {
-            playerProgressValue_ = (playerCurrentTime_ * PROGRESS_PERCENTAGE) / playerMusicDuration_;
-            WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "playerProgressValue_ %lld", playerProgressValue_);
-        } else {
-            playerProgressValue_ = 100; // 100: max progress value
-        }
-        PlayersModel::GetInstance()->SetCircleProgress(playerProgressValue_);
-        PlayersPresenter::GetInstance()->SetPlaybackProgress(playerProgressValue_);
-    }
-}
-
-void MainPresenterSample::Notify(void)
-{
-    CardId cardId = view_->GetHorCurrentCard();
-    if (cardId == MUSIC_PLAYER) {
-        SetCircleProgress();
-    } else if (cardId == WATCH_FACE) {
-        DialSetting &setting = GetDialSetting();
-        if (setting.dialFlag) {
-            DialModelTime::GetInstance()->UpdateTime();
-            DialViewGroup* group = dynamic_cast<DialViewGroup*>(view_->GetViewById(WATCH_FACE));
-            if (group != nullptr) {
-                group->UpdateViewsByPeriodicUpdateData();
-            }
-        } else {
-            MainClockView* clock = dynamic_cast<MainClockView*>(view_->GetViewById(WATCH_FACE));
-            if (clock != nullptr) {
-                clock->UpdateTime();
-            }
-        }
-    }
-}
-
-void MainPresenterSample::InitCardSettings(void)
-{
-    MainModel::GetInstance().InitCardSettings();
-}
-
-uint8_t MainPresenterSample::GetCardSettingCount(void)
-{
-    return MainModel::GetInstance().GetCardSettingCount();
-}
-
-CardId *MainPresenterSample::GetCardSettings(void)
-{
-    return MainModel::GetInstance().GetCardSettings();
-}
-
-void MainPresenterSample::InitDialSettings(void)
-{
-    return MainModel::GetInstance().InitDialSettings();
-}
-DialSetting& MainPresenterSample::GetDialSetting()
-{
-    return MainModel::GetInstance().GetDialSetting();
-}
-
-bool MainPresenterSample::IsFromSetCardView(void) const
-{
-    return MainModel::GetInstance().IsFromSetCardView();
-}
-
-void MainPresenterSample::SetFromSetCardView(bool isFrom)
-{
-    MainModel::GetInstance().SetFromSetCardView(isFrom);
-}
-
-uint8_t MainPresenterSample::GetFromCardId(void)
-{
-    return MainModel::GetInstance().GetFromCardId();
-}
-
-}
+/*\r
+ * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved.\r
+ * Description: MainPresenterSample\r
+ * Author:\r
+ * Create: 2021-10-18\r
+ */\r
+\r
+#include "main/MainPresenterSample.h"\r
+#include "common/task_manager.h"\r
+#include "player/PlayersModel.h"\r
+#include "player/PlayersPresenter.h"\r
+#include "NativeRegisterManager.h"\r
+#include "compass/CompassModel.h"\r
+#include "drag_event.h"\r
+#include "graphic_service.h"\r
+#include "wearable_log.h"\r
+#include "UiConfig.h"\r
+#include "ui_resource_image.h"\r
+#include <iostream>\r
+#include <map>\r
+#include "main/dial/ModelDialDataFactory.h"\r
+#include "main/dial/DialModelTime.h"\r
+#include "main/dial/DialViewGroup.h"\r
+#include "uiservice/ui_service.h"\r
+#include "PageTransitionMgr.h"\r
+#include "findphone/FindPhoneView.h"\r
+#include "settings/model/SettingCardModel.h"\r
+#include "clock/GradientClockView.h"\r
+#include "common/periodicupdate_interface.h"\r
+\r
+namespace OHOS {\r
+\r
+REGIST_SLICE(VIEW_MAIN_SAMPLE, MainViewSample, MainPresenterSample);\r
+\r
+std::map<std::string, AppViewId> g_jumpView = { { MAIN_CLICK_WEATHER, VIEW_MAIN_SAMPLE },            // 天气界面\r
+                                                { MAIN_CLICK_ACTIVITY, VIEW_MAIN_ACTIVITY },         // 活动记录界面\r
+                                                { MAIN_CLICK_MESSAGE, VIEW_MAIN_SAMPLE },            // 消息app\r
+                                                { DROPDOWN_CLICK_ALARM, VIEW_MAIN_ALARM },           // 闹钟app\r
+                                                { DROPDOWN_CLICK_SETTING, VIEW_SETTING } };          // 设置界面\r
+\r
+std::map<std::string, int> g_chanColor = { { DROPDOWN_CLICK_FINDMYPHONE, DROPDOWN_DROPDOWN_FIND_PHONE_B },\r
+                                           { DROPDOWN_CLICK_ALARM, DROPDOWN_DROPDOWN_ALARM_B },\r
+                                           { DROPDOWN_CLICK_SETTING, DROPDOWN_DROPDOWN_SETTING_B } };\r
+\r
+static MainPresenterSample *g_pMainPresenterSample = nullptr;\r
+\r
+static constexpr uint16_t DROP_X_MAX = 360;\r
+static constexpr uint16_t HORIZONTAL_SWIPE = 1;\r
+static constexpr uint16_t MAX_PERIOD = 1000;\r
+\r
+MainPresenterSample::MainPresenterSample()\r
+{\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MainPresenterSample :%p", this);\r
+    g_pMainPresenterSample = this;\r
+}\r
+\r
+MainPresenterSample::~MainPresenterSample()\r
+{\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "~MainPresenterSample");\r
+}\r
+\r
+MainPresenterSample *MainPresenterSample::GetInstance(void)\r
+{\r
+    return g_pMainPresenterSample;\r
+}\r
+\r
+void MainPresenterSample::OnStart()\r
+{\r
+    mainPresenterState_ = MainPresenterState::START;\r
+}\r
+\r
+void MainPresenterSample::OnPause()\r
+{\r
+    // Save watchface content for slide back\r
+    UIView* watchFace = view_->GetViewById(WATCH_FACE)->GetParent();\r
+    uint8_t opaScale = watchFace->GetOpaScale();\r
+    watchFace->SetOpaScale(OPA_OPAQUE);\r
+    PageTransitionMgr::GetInstance().SaveSlideBackSnapShotIfNecessary(watchFace);\r
+    watchFace->SetOpaScale(opaScale);\r
+\r
+    uint8_t curCardId = view_->GetHorCurrentCard();\r
+    UICardPage *card = view_->GetViewById(curCardId);\r
+    if (card != nullptr) {\r
+        card->OnPause();\r
+    }\r
+    mainPresenterState_ = MainPresenterState::PAUSE;\r
+    Deinit();\r
+}\r
+\r
+void MainPresenterSample::OnResume(void)\r
+{\r
+    mainPresenterState_ = MainPresenterState::RESUME;\r
+    // Set current page again to invoke OnActive method.\r
+    uint8_t curCardId = view_->GetHorCurrentCard();\r
+    view_->SwitchToCard(curCardId);\r
+    Init();\r
+}\r
+\r
+void MainPresenterSample::OnStop(void)\r
+{\r
+    mainPresenterState_ = MainPresenterState::STOP;\r
+    if (isCompassSensorOpened_) {\r
+        CompassModel::GetInstance()->CloseCompassSensor();\r
+    }\r
+}\r
+\r
+MainPresenterState MainPresenterSample::GetMainPresenterState(void)\r
+{\r
+    return mainPresenterState_;\r
+}\r
+\r
+bool MainPresenterSample::OnClick(UIView &view, const ClickEvent &event)\r
+{\r
+    UNUSED(event);\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "StatusButtonClickListener: %s", view.GetViewId());\r
+    std::string curViewId = view.GetViewId();\r
+\r
+    UIImageView *imgView = static_cast<UIImageView *>(&view);\r
+    if (HealthModel::GetInstance() == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "health model nullptr");\r
+        return false;\r
+    }\r
+    if (curViewId == DROPDOWN_CLICK_DONOTDISTURB) {\r
+        if (HealthModel::GetInstance()->GetDntDistStatus() == 0) {\r
+            ScreenModels::GetInstance()->LoadAppImages(DROPDOWN_IAMGES, imgView, DROPDOWN_DROPDOWN_DN_DISTURB_B);\r
+            HealthModel::GetInstance()->UpdateDntDistStatus(1);\r
+        } else {\r
+            ScreenModels::GetInstance()->LoadAppImages(DROPDOWN_IAMGES, imgView, DROPDOWN_DROPDOWN_DN_DISTURB);\r
+            HealthModel::GetInstance()->UpdateDntDistStatus(0);\r
+        }\r
+    }\r
+    if (curViewId == DROPDOWN_CLICK_BRIGHTENSCREEN) {\r
+        if (HealthModel::GetInstance()->GetBriScrStatus() == 0) {\r
+            ScreenModels::GetInstance()->LoadAppImages(DROPDOWN_IAMGES, imgView, DROPDOWN_DROPDOWN_BRI_SCREEN_B);\r
+            HealthModel::GetInstance()->UpdateBriScrStatus(1);\r
+            ScreenOffEnable(0);\r
+        } else {\r
+            ScreenModels::GetInstance()->LoadAppImages(DROPDOWN_IAMGES, imgView, DROPDOWN_DROPDOWN_BRI_SCREEN);\r
+            HealthModel::GetInstance()->UpdateBriScrStatus(0);\r
+            ScreenOffEnable(1);\r
+        }\r
+    }\r
+    if (curViewId == DROPDOWN_CLICK_FINDMYPHONE) {\r
+        NativeAbility::GetInstance().SwitchSlice(VIEW_FIND_PHONE, FIND_PHONE_PAGES::FIND_PHONE_MAIN_PAGE);\r
+    }\r
+\r
+    if (g_jumpView.count(curViewId) != 0) {\r
+        if (g_jumpView[curViewId] == VIEW_SETTING) {\r
+            NativeAbility::GetInstance().ChangeSlice(g_jumpView[curViewId], TransitionType::TRANSITION_INVALID,\r
+                gSliceDefaultPriority, true);\r
+        } else {\r
+            NativeAbility::GetInstance().ChangeSlice(g_jumpView[curViewId]);\r
+        }\r
+    }\r
+    return true;\r
+}\r
+\r
+bool MainPresenterSample::OnLongPress(UIView& view, const LongPressEvent& event)\r
+{\r
+    UNUSED(event);\r
+    UNUSED(view);\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MainPresenterSample OnLongPress");\r
+    uint8_t cardId = view_->GetHorCurrentCard();\r
+    if (cardId != WATCH_FACE) {\r
+        SettingCardModel::GetInstance().SetSelectedCard(cardId);\r
+        NativeAbility::GetInstance().SwitchSlice(VIEW_SETTING, SettingPageId::CARD_MGR_PAGE,\r
+            TransitionType::TRANSITION_INVALID, true);\r
+    } else {\r
+        NativeAbility::GetInstance().SwitchSlice(VIEW_SETTING, SettingPageId::DESKTOP_DIAL_PAGE,\r
+            TransitionType::TRANSITION_INVALID, true);\r
+    }\r
+    return true;\r
+}\r
+\r
+void MainPresenterSample::SetPage(int8_t id, bool loadAdjacent)\r
+{\r
+    if (view_ != nullptr) {\r
+        view_->SetPage(id, loadAdjacent);\r
+    }\r
+}\r
+\r
+void MainPresenterSample::SetTaskPeroid(CardId cardId)\r
+{\r
+    SetLastRun(0); // refresh entering card in time\r
+    PeriodicUpdateInterface* page = dynamic_cast<PeriodicUpdateInterface*>(view_->GetViewById(cardId));\r
+    if (page != nullptr) {\r
+        page->Update();\r
+        SetPeriod(page->GetPeriod());\r
+    } else if (cardId == WATCH_FACE) {\r
+        DialSetting &setting = GetDialSetting();\r
+        if (setting.dialFlag) {\r
+            SetPeriod(dynamic_cast<DialViewGroup*>(view_->GetViewById(WATCH_FACE))->GetPeriod());\r
+        }\r
+    } else {\r
+        SetPeriod(MAX_PERIOD);\r
+    }\r
+}\r
+\r
+void MainPresenterSample::OnSwipe(UISwipeView &view)\r
+{\r
+    if (view.GetDirection()) {\r
+        view_->GetVerCurrentCard();\r
+    } else {\r
+        CardId cardId = view_->GetHorCurrentCard();\r
+        SetTaskPeroid(cardId);\r
+        if (cardId == COMPASS) {\r
+            if (!isCompassSensorOpened_) {\r
+                CompassModel::GetInstance()->OpenCompassSensor();\r
+                isCompassSensorOpened_ = true;\r
+            }\r
+        } else if (isCompassSensorOpened_) {\r
+            CompassModel::GetInstance()->CloseCompassSensor();\r
+            isCompassSensorOpened_ = false;\r
+        }\r
+    }\r
+\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "OnSwipe OnSwipe");\r
+    return;\r
+}\r
+\r
+void MainPresenterSample::ProcessDataNotify(void)\r
+{\r
+    HealthMsg healthMsg;\r
+    uint16_t len;\r
+\r
+    while ((HealthModel::GetInstance()->FetchedHealthData(&healthMsg))) {\r
+        switch (healthMsg.type) {\r
+            case BATTERY_LIFE:\r
+                break;\r
+            default:\r
+                break;\r
+        }\r
+    }\r
+}\r
+\r
+void MainPresenterSample::Callback(void)\r
+{\r
+    CardId cardId = view_->GetHorCurrentCard();\r
+    PeriodicUpdateInterface* page = dynamic_cast<PeriodicUpdateInterface*>(view_->GetViewById(cardId));\r
+    if (page != nullptr) {\r
+        page->Update();\r
+    } else if (cardId == WATCH_FACE) {\r
+        DialSetting &setting = GetDialSetting();\r
+        if (setting.dialFlag) {\r
+            DialModelTime::GetInstance()->UpdateTime();\r
+            DialViewGroup* group = dynamic_cast<DialViewGroup*>(view_->GetViewById(WATCH_FACE));\r
+            if (group != nullptr) {\r
+                group->UpdateViewsByPeriodicUpdateData();\r
+            }\r
+        }\r
+    }\r
+}\r
+\r
+void MainPresenterSample::InitCardSettings(void)\r
+{\r
+    MainModel::GetInstance().InitCardSettings();\r
+}\r
+\r
+uint8_t MainPresenterSample::GetCardSettingCount(void)\r
+{\r
+    return MainModel::GetInstance().GetCardSettingCount();\r
+}\r
+\r
+CardId *MainPresenterSample::GetCardSettings(void)\r
+{\r
+    return MainModel::GetInstance().GetCardSettings();\r
+}\r
+\r
+void MainPresenterSample::InitDialSettings(void)\r
+{\r
+    return MainModel::GetInstance().InitDialSettings();\r
+}\r
+DialSetting& MainPresenterSample::GetDialSetting()\r
+{\r
+    return MainModel::GetInstance().GetDialSetting();\r
+}\r
+\r
+bool MainPresenterSample::IsFromSetCardView(void) const\r
+{\r
+    return MainModel::GetInstance().IsFromSetCardView();\r
+}\r
+\r
+void MainPresenterSample::SetFromSetCardView(bool isFrom)\r
+{\r
+    MainModel::GetInstance().SetFromSetCardView(isFrom);\r
+}\r
+\r
+uint8_t MainPresenterSample::GetFromCardId(void)\r
+{\r
+    return MainModel::GetInstance().GetFromCardId();\r
+}\r
+\r
+}\r
index 0133239..98fef53 100644 (file)
-/*
- * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved.
- * Description: MainViewSample
- * Author:
- * Create: 2021-10-18
- */
-#include "wearable_log.h"
-#include "main/MainViewSample.h"
-#include "graphic_service.h"
-#include "common/image_cache_manager.h"
-#include "UICardPageFactory.h"
-
-namespace OHOS {
-static MainViewSample *g_pMainView = nullptr;
-static constexpr uint16_t MESLABLE_X_TMP = 177;
-static constexpr uint16_t MESLABLE_Y_TMP = 212;
-static constexpr uint16_t MESLABLE_WIDTH_TMP = 100;
-static constexpr uint16_t MESLABLE_HEIGHT_TMP = 30;
-static constexpr uint8_t FONT_SIZE_TMP = 24;
-static constexpr uint8_t PULL_MIDDLE_VIEW_OPA = 0;
-
-struct MainViewMapper {
-    CardId id;
-    UICardPage *(MainViewSample::*func)(void);
-};
-
-static const MainViewMapper CardMapper[] = {
-    {WATCH_FACE, &MainViewSample::InitWatchFacePage},
-    {HEART_RATE, &MainViewSample::InitHeartRatePage},
-    {COMPASS, &MainViewSample::InitCompassPage},
-    {ACTIVITY, &MainViewSample::InitActivityPage},
-    {MUSIC_PLAYER, &MainViewSample::InitMusicPlayerPage},
-    {VIDEO_CARD1, &MainViewSample::InitVideoCardPage1},
-    {VIDEO_CARD2, &MainViewSample::InitVideoCardPage2},
-    {VIDEO_CARD3, &MainViewSample::InitVideoCardPage3},
-};
-
-MainViewSample::MainViewSample()
-{
-    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MainViewSample::MainViewSample");
-    g_pMainView = this;
-}
-
-MainViewSample::~MainViewSample()
-{
-    dropDownView->ClearBackgroundBlur();
-    messageView->ClearBackgroundBlur();
-
-    for (int32_t i = 0; i < MAX_CARD; i++) {
-        recordCard[i] = nullptr;
-        pageStatus[i] = false;
-    }
-
-    if (mainSwipeGroup != nullptr) {
-        delete mainSwipeGroup;
-        mainSwipeGroup = nullptr;
-    }
-
-    if (mainClockView != nullptr) {
-        delete mainClockView;
-        mainClockView = nullptr;
-    }
-
-    if (activityWeekView != nullptr) {
-        delete activityWeekView;
-        activityWeekView = nullptr;
-    }
-
-    if (playersView != nullptr) {
-        delete playersView;
-        playersView = nullptr;
-    }
-
-    bool hasVideo = false;
-    if (videoCard1 != nullptr) {
-        hasVideo = true;
-        delete videoCard1;
-        videoCard1 = nullptr;
-    }
-
-    if (videoCard2 != nullptr) {
-        hasVideo = true;
-        delete videoCard2;
-        videoCard2 = nullptr;
-    }
-
-    if (videoCard3 != nullptr) {
-        hasVideo = true;
-        delete videoCard3;
-        videoCard3 = nullptr;
-    }
-
-    if (hasVideo) {
-        ImageCacheManager::GetInstance().UnloadSingleRes(PNG_PREVIEW_CARD_VIDEO);
-    }
-
-    if (heartRateView != nullptr) {
-        delete heartRateView;
-        heartRateView = nullptr;
-    }
-
-    if (dropDownView != nullptr) {
-        delete dropDownView;
-        dropDownView = nullptr;
-    }
-
-    if (messageView != nullptr) {
-        messageView->RemoveAll();
-        delete messageView;
-        messageView = nullptr;
-    }
-
-    if (messageLable != nullptr) {
-        delete messageLable;
-        messageLable = nullptr;
-    }
-
-    if (compassControlView != nullptr) {
-        delete compassControlView;
-        compassControlView = nullptr;
-    }
-
-    if (callback != nullptr) {
-        delete callback;
-        callback = nullptr;
-    }
-
-    g_pMainView = nullptr;
-}
-
-MainViewSample *MainViewSample::GetInstance(void)
-{
-    return g_pMainView;
-}
-
-void MainViewSample::OnStart()
-{
-    mainSwipeGroup = new UICrossView();
-    if (mainSwipeGroup == nullptr) {
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "mainSwipeGroup new fail");
-        return;
-    }
-
-    if (callback == nullptr) {
-        callback = new ZoomEffect();
-        if (callback == nullptr) {
-            delete mainSwipeGroup;
-            mainSwipeGroup = nullptr;
-            GRAPHIC_LOGE("SwipeCallback new fail\n");
-            return;
-        }
-    }
-    callback->SetContainer(mainSwipeGroup);
-
-    HorizontalViewInit();
-    HorViewLoad();
-    VerticalViewInit();
-    VertViewLoad();
-    mainSwipeGroup->SetPosition(0, 0, Screen::GetInstance().GetWidth(), Screen::GetInstance().GetHeight());
-    mainSwipeGroup->SetAnimatorTime(50); // 50: animator drag time(ms);
-    mainSwipeGroup->SetLoopState(true);
-    mainSwipeGroup->EnableScreenCap(true);
-    mainSwipeGroup->RegisterSwipeCallback(callback);
-    if (presenter_->IsFromSetCardView()) {
-        presenter_->SetFromSetCardView(false);
-        SwitchToCard(presenter_->GetFromCardId(), false);
-    } else {
-        SwitchToClockPage(false);
-    }
-    AddViewToRootContainer(mainSwipeGroup);
-}
-
-bool MainViewSample::HorizontalViewInit(void)
-{
-    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MainViewSample::HorizontalViewInit");
-    presenter_->InitDialSettings();
-    presenter_->InitCardSettings();
-    uint8_t cardSettingNum = presenter_->GetCardSettingCount();
-    CardId *cardSettings = presenter_->GetCardSettings();
-    uint8_t cardMapNumber = sizeof(CardMapper) / sizeof(CardMapper[0]);
-    for (int16_t i = 0; i < cardSettingNum; i++) {
-        for (uint8_t j = 0; j < cardMapNumber; j++) {
-            if (cardSettings[i] == CardMapper[j].id) {
-                recordCard[j] = (this->*(CardMapper[j].func))();
-                if (recordCard[j] == nullptr) {
-                    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,
-                                  "MainViewSample:: recordCard %d error", j);
-                    return false;
-                }
-                WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,
-                              "MainViewSample:: recordCard[%d]:%p", j, recordCard[j]);
-                break;
-            }
-        }
-    }
-    mainSwipeGroup->SetOnSwipeListener(presenter_);
-    mainSwipeGroup->SetOnLongPressListener(presenter_);
-    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MainViewSample::InitPage over");
-    return true;
-}
-
-void MainViewSample::HorViewLoad(void)
-{
-    uint8_t cardSettingNum = presenter_->GetCardSettingCount();
-    CardId *cardSettings = presenter_->GetCardSettings();
-    for (int16_t i = 0; i < cardSettingNum; i++) {
-        CardId cardId = cardSettings[i];
-        if (recordCard[cardId] != nullptr) {
-            mainSwipeGroup->HorAdd(recordCard[cardId]);
-            WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MainViewSample:: HorViewLoad cardid = %d ViewIndex = %d",
-                          cardId, recordCard[cardId]->GetViewIndex());
-        }
-    }
-}
-
-void MainViewSample::VerticalViewInit(void)
-{
-    dropDownView = new PullUpDownView();
-    if (dropDownView == nullptr) {
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "dropDownView new fail");
-        return;
-    }
-    dropDownView->PreLoad();
-    dropDownView->SetViewId("dropDownView");
-    dropDownView->SetPosition(0, 0, Screen::GetInstance().GetWidth(), Screen::GetInstance().GetHeight());
-    dropDownView->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);
-
-    messageView = new UICardPage();
-    if (messageView == nullptr) {
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "messageView new fail");
-        return;
-    }
-    messageView->SetPosition(0, 0);
-    messageView->SetWidth(Screen::GetInstance().GetWidth());
-    messageView->SetHeight(Screen::GetInstance().GetHeight());
-    messageView->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);
-    messageView->SetViewId("messageView");
-    messageView->SetTouchable(true);
-    messageView->SetIntercept(true);
-    messageLable = new UILabel();
-    if (messageLable == nullptr) {
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "messageLable new fail");
-        return;
-    }
-    messageLable->SetPosition(MESLABLE_X_TMP, MESLABLE_Y_TMP, MESLABLE_WIDTH_TMP, MESLABLE_HEIGHT_TMP);
-    messageLable->SetText("无消息");
-    messageLable->SetAlign(TEXT_ALIGNMENT_CENTER);
-    messageLable->SetFont(DEFAULT_VECTOR_FONT_FILENAME, FONT_SIZE_TMP);
-    messageLable->SetStyle(STYLE_BACKGROUND_COLOR, OPA_TRANSPARENT);
-    messageView->Add(messageLable);
-}
-
-void MainViewSample::VertViewLoad(void)
-{
-    mainSwipeGroup->VerAdd(dropDownView, UICrossView::VPage::UP_PAGE);
-    mainSwipeGroup->VerAdd(messageView, UICrossView::VPage::DOWN_PAGE);
-    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MainViewSample::PullViewLoad::Pull View Load complete");
-}
-
-void MainViewSample::OnStop()
-{
-    messageView->RemoveAll();
-    return;
-}
-
-UICardPage *MainViewSample::InitWatchOffDial(DialSetting &setting)
-{
-    DialViewGroup *dial = new DialViewGroup();
-    dial->SetDial(setting.dialFullName);
-    return dial;
-}
-
-UICardPage *MainViewSample::InitWatchDial(DialSetting &setting)
-{
-    return UICardPageFactory::GetInstance().CreateWatchDial(DIAL_DISPLAY_MODE_MAIN, setting.dialId);
-}
-
-UICardPage *MainViewSample::InitWatchFacePage(void)
-{
-    DialSetting &setting = presenter_->GetDialSetting();
-    if (setting.dialFlag) {
-        mainClockView = InitWatchOffDial(setting);
-    } else {
-        mainClockView = InitWatchDial(setting);
-    }
-
-    if (mainClockView == nullptr) {
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "MainClockView new fail");
-        return nullptr;
-    }
-    return mainClockView;
-}
-
-UICardPage *MainViewSample::InitHeartRatePage(void)
-{
-    heartRateView = new HeartRateView();
-    if (heartRateView == nullptr) {
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "heartRateView new fail");
-        return nullptr;
-    }
-    return heartRateView;
-}
-
-UICardPage *MainViewSample::InitActivityPage(void)
-{
-    activityWeekView = new ActivityWeekView();
-    if (activityWeekView == nullptr) {
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "activityWeekView new fail");
-        return nullptr;
-    }
-    return activityWeekView;
-}
-
-UICardPage *MainViewSample::InitCompassPage(void)
-{
-    compassControlView = new CompassControlView();
-    if (compassControlView == nullptr) {
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "compassControlView new fail");
-        return nullptr;
-    }
-    return compassControlView;
-}
-
-UICardPage *MainViewSample::InitMusicPlayerPage(void)
-{
-    playersView = new PlayersView();
-    if (playersView == nullptr) {
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "playersView new fail");
-        return nullptr;
-    }
-    return playersView;
-}
-
-UICardPage *MainViewSample::InitVideoCardPage1(void)
-{
-    videoCard1 = dynamic_cast<VideoCard*>(InitVideoCardPage(APP_VIDEO_PATH"/noaudio_05.mp4", PNG_PREVIEW_CARD_VIDEO));
-    return videoCard1;
-}
-
-UICardPage *MainViewSample::InitVideoCardPage2(void)
-{
-    videoCard2 = dynamic_cast<VideoCard*>(InitVideoCardPage(APP_VIDEO_PATH"/noaudio_05.mp4", PNG_PREVIEW_CARD_VIDEO));
-    return videoCard2;
-}
-
-UICardPage *MainViewSample::InitVideoCardPage3(void)
-{
-    videoCard3 = dynamic_cast<VideoCard*>(InitVideoCardPage(APP_VIDEO_PATH"/noaudio_05.mp4", PNG_PREVIEW_CARD_VIDEO));
-    return videoCard3;
-}
-
-UICardPage *MainViewSample::InitVideoCardPage(const std::string &video, const std::string &preview)
-{
-    VideoCard *page = new VideoCard;
-    if (page == nullptr) {
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "videocard new fail");
-        return nullptr;
-    }
-    page->SetFilePath(video);
-    page->SetPreviewFile(preview);
-    return page;
-}
-
-void MainViewSample::SetPage(int16_t page, bool loadAdjacent)
-{
-    if (mainSwipeGroup != nullptr) {
-        mainSwipeGroup->SetHorCurrentPage(page, loadAdjacent);
-    }
-
-    if (presenter_ != nullptr) {
-        CardId *cardSettings = presenter_->GetCardSettings();
-        /* page 与CardId 没有对应关系,需要一次转换 */
-        CardId id = MAX_CARD;
-        for (uint8_t i = 0; i < presenter_->GetCardSettingCount(); ++i) {
-            if (cardSettings[i] < MAX_CARD && recordCard[cardSettings[i]] != nullptr &&
-                recordCard[cardSettings[i]]->GetViewIndex() == page) {
-                id = cardSettings[i];
-            }
-        }
-        presenter_->SetTaskPeroid(id);
-    }
-}
-
-void MainViewSample::ReloadWatchFace()
-{
-    if (mainSwipeGroup == nullptr) {
-        return;
-    }
-    mainSwipeGroup->Remove(mainClockView, UISwipeView::HORIZONTAL);
-
-    delete mainClockView;
-    mainClockView = nullptr;
-    recordCard[WATCH_FACE] = InitWatchFacePage();
-    if (recordCard[WATCH_FACE] == nullptr) {
-        GRAPHIC_LOGE("failed to reload main clock");
-        return;
-    }
-    mainSwipeGroup->HorInsert(nullptr, mainClockView);
-
-    SwitchToCard(WATCH_FACE);
-    Draw();
-}
-
-bool MainViewSample::IsMainClockPage(void)
-{
-    if (mainSwipeGroup->GetCurrentPageId(0) == mainClockView->GetViewIndex() &&
-        mainSwipeGroup->GetCurrentPageId(1) == 1) { // 0: horizontal; 1: vertical
-        return true;
-    } else {
-        return false;
-    }
-}
-
-CardId MainViewSample::GetHorCurrentCard() const
-{
-    CardId *cardSettings = presenter_->GetCardSettings();
-    int pageId = mainSwipeGroup->GetCurrentPageId(UISwipeView::HORIZONTAL); // 0: horizontal; 1: vertical
-    /* pageId 与CardId 没有对应关系,需要一次转换 */
-    for (uint8_t i = 0; i < presenter_->GetCardSettingCount(); ++i) {
-        if (cardSettings[i] < MAX_CARD && recordCard[cardSettings[i]] != nullptr &&
-            recordCard[cardSettings[i]]->GetViewIndex() == pageId) {
-            return cardSettings[i];
-        }
-    }
-    return MAX_CARD;
-}
-
-void MainViewSample::SwitchToCard(uint8_t cardId, bool loadAdjacent)
-{
-    if ((cardId < MAX_CARD) && (recordCard[cardId] != nullptr)) {
-        SetPage(recordCard[cardId]->GetViewIndex(), loadAdjacent);
-    } else {
-        SwitchToClockPage(loadAdjacent);
-    }
-}
-} // OHOS
+/*\r
+ * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved.\r
+ * Description: MainViewSample\r
+ * Author:\r
+ * Create: 2021-10-18\r
+ */\r
+#include "wearable_log.h"\r
+#include "main/MainViewSample.h"\r
+#include "graphic_service.h"\r
+#include "common/image_cache_manager.h"\r
+#include "swipe_effect/turn_page_effect.h"\r
+#include "swipe_effect/push_press_effect.h"\r
+#include "swipe_effect/cube_effect.h"\r
+#include "swipe_effect/windmill_effect.h"\r
+#include "swipe_effect/card_flip_effect.h"\r
+#include "swipe_effect/zoom_effect.h"\r
+#include "settings/model/SettingCardModel.h"\r
+#include "clock/GradientClockView.h"\r
+#include "UIWatchDialFactory.h"\r
+\r
+namespace OHOS {\r
+static MainViewSample *g_pMainView = nullptr;\r
+static constexpr uint16_t MESLABLE_X_TMP = 177;\r
+static constexpr uint16_t MESLABLE_Y_TMP = 212;\r
+static constexpr uint16_t MESLABLE_WIDTH_TMP = 100;\r
+static constexpr uint16_t MESLABLE_HEIGHT_TMP = 30;\r
+static constexpr uint8_t FONT_SIZE_TMP = 24;\r
+static constexpr uint8_t PULL_MIDDLE_VIEW_OPA = 0;\r
+static constexpr uint8_t PAGE_ID = 2;\r
+\r
+struct MainViewMapper {\r
+    CardId id;\r
+    UICardPage *(MainViewSample::*func)(void);\r
+};\r
+\r
+static const MainViewMapper CardMapper[] = {\r
+    {WATCH_FACE, &MainViewSample::InitWatchFacePage},\r
+    {COMPASS, &MainViewSample::InitCompassPage},\r
+    {ACTIVITY, &MainViewSample::InitActivityPage},\r
+    {MUSIC_PLAYER, &MainViewSample::InitMusicPlayerPage},\r
+    {VIDEO_CARD1, &MainViewSample::InitVideoCardPage1},\r
+    {VIDEO_CARD2, &MainViewSample::InitVideoCardPage2},\r
+    {VIDEO_CARD3, &MainViewSample::InitVideoCardPage3},\r
+};\r
+\r
+MainViewSample::MainViewSample()\r
+{\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MainViewSample::MainViewSample");\r
+    g_pMainView = this;\r
+}\r
+\r
+MainViewSample::~MainViewSample()\r
+{\r
+    dropDownView->ClearBackgroundBlur();\r
+    messageView->ClearBackgroundBlur();\r
+\r
+    for (int32_t i = 0; i < MAX_CARD; i++) {\r
+        recordCard[i] = nullptr;\r
+        pageStatus[i] = false;\r
+    }\r
+\r
+    if (mainSwipeGroup != nullptr) {\r
+        delete mainSwipeGroup;\r
+        mainSwipeGroup = nullptr;\r
+    }\r
+\r
+    if (mainClockView != nullptr) {\r
+        delete mainClockView;\r
+        mainClockView = nullptr;\r
+    }\r
+\r
+    if (activityWeekView != nullptr) {\r
+        delete activityWeekView;\r
+        activityWeekView = nullptr;\r
+    }\r
+\r
+    if (playersView != nullptr) {\r
+        delete playersView;\r
+        playersView = nullptr;\r
+    }\r
+\r
+    bool hasVideo = false;\r
+    if (videoCard1 != nullptr) {\r
+        hasVideo = true;\r
+        delete videoCard1;\r
+        videoCard1 = nullptr;\r
+    }\r
+\r
+    if (videoCard2 != nullptr) {\r
+        hasVideo = true;\r
+        delete videoCard2;\r
+        videoCard2 = nullptr;\r
+    }\r
+\r
+    if (videoCard3 != nullptr) {\r
+        hasVideo = true;\r
+        delete videoCard3;\r
+        videoCard3 = nullptr;\r
+    }\r
+\r
+    if (hasVideo) {\r
+        ImageCacheManager::GetInstance().UnloadSingleRes(PNG_PREVIEW_CARD_VIDEO);\r
+    }\r
+\r
+    if (dropDownView != nullptr) {\r
+        delete dropDownView;\r
+        dropDownView = nullptr;\r
+    }\r
+\r
+    if (messageView != nullptr) {\r
+        messageView->RemoveAll();\r
+        delete messageView;\r
+        messageView = nullptr;\r
+    }\r
+\r
+    if (compassControlView != nullptr) {\r
+        delete compassControlView;\r
+        compassControlView = nullptr;\r
+    }\r
+\r
+    if (callback != nullptr) {\r
+        delete callback;\r
+        callback = nullptr;\r
+    }\r
+\r
+    g_pMainView = nullptr;\r
+}\r
+\r
+MainViewSample *MainViewSample::GetInstance(void)\r
+{\r
+    return g_pMainView;\r
+}\r
+\r
+bool MainViewSample::SetCardEffect(CardEffectID style)\r
+{\r
+    if (mainSwipeGroup == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "mainSwipeGroup is nullptr");\r
+        return false;\r
+    }\r
+    if (callback != nullptr) {\r
+        delete callback;\r
+        callback = nullptr;\r
+    }\r
+\r
+    std::map<CardEffectID, std::function<OHOS::CardSwipe*()>> effectMap = {\r
+        {CardEffectID::UI_CARD_FLIP, []{ return new CardFlipEffect(); }},\r
+        {CardEffectID::UI_ZOOM, []{ return new ZoomEffect(); }},\r
+        {CardEffectID::UI_CUBE, []{ return new CubeEffect(); }},\r
+        {CardEffectID::UI_TURN_PAGE, []{ return new TurnPageEffect(); }},\r
+        {CardEffectID::UI_PUSH_PRESS, []{ return new PushPressEffect(); }},\r
+        {CardEffectID::UI_WINDMILL, []{ return new WindmillEffect(); }},\r
+    };\r
+    auto it = effectMap.find(style);\r
+    if (it != effectMap.end()) {\r
+        callback = it->second();\r
+    } else {\r
+        callback = new ZoomEffect(); // ZoomEffect is used by default\r
+    }\r
+\r
+    if (callback == nullptr) {\r
+        delete mainSwipeGroup;\r
+        mainSwipeGroup = nullptr;\r
+        GRAPHIC_LOGE("Effect new fail\n");\r
+        return false;\r
+    }\r
+\r
+    callback->SetContainer(mainSwipeGroup);\r
+    mainSwipeGroup->RegisterSwipeCallback(callback);\r
+    return true;\r
+}\r
+\r
+void MainViewSample::OnStart()\r
+{\r
+    mainSwipeGroup = new UICrossView();\r
+    if (mainSwipeGroup == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "mainSwipeGroup new fail");\r
+        return;\r
+    }\r
+\r
+    SettingCardModel& swipeEffectModel = SettingCardModel::GetInstance();\r
+    if (!SetCardEffect(swipeEffectModel.GetSwipeEffectStyle())) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SetCardEffect fail");\r
+        return;\r
+    }\r
+\r
+    HorizontalViewInit();\r
+    HorViewLoad();\r
+    VerticalViewInit();\r
+    VertViewLoad();\r
+    mainSwipeGroup->SetPosition(0, 0, Screen::GetInstance().GetWidth(), Screen::GetInstance().GetHeight());\r
+    mainSwipeGroup->SetAnimatorTime(50); // 50: animator drag time(ms);\r
+    mainSwipeGroup->SetLoopState(true);\r
+    mainSwipeGroup->EnableScreenCap(true);\r
+    if (presenter_->IsFromSetCardView()) {\r
+        presenter_->SetFromSetCardView(false);\r
+        SwitchToCard(presenter_->GetFromCardId(), false);\r
+    } else {\r
+        SwitchToClockPage(false);\r
+    }\r
+    AddViewToRootContainer(mainSwipeGroup);\r
+}\r
+\r
+bool MainViewSample::HorizontalViewInit(void)\r
+{\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MainViewSample::HorizontalViewInit");\r
+    presenter_->InitDialSettings();\r
+    presenter_->InitCardSettings();\r
+    uint8_t cardSettingNum = presenter_->GetCardSettingCount();\r
+    CardId *cardSettings = presenter_->GetCardSettings();\r
+    uint8_t cardMapNumber = sizeof(CardMapper) / sizeof(CardMapper[0]);\r
+    for (int16_t i = 0; i < cardSettingNum; i++) {\r
+        for (uint8_t j = 0; j < cardMapNumber; j++) {\r
+            if (cardSettings[i] == CardMapper[j].id) {\r
+                recordCard[j] = (this->*(CardMapper[j].func))();\r
+                if (recordCard[j] == nullptr) {\r
+                    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,\r
+                                  "MainViewSample:: recordCard %d error", j);\r
+                    return false;\r
+                }\r
+                WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,\r
+                              "MainViewSample:: recordCard[%d]:%p", j, recordCard[j]);\r
+                break;\r
+            }\r
+        }\r
+    }\r
+    mainSwipeGroup->SetOnSwipeListener(presenter_);\r
+    mainSwipeGroup->SetOnLongPressListener(presenter_);\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MainViewSample::InitPage over");\r
+    return true;\r
+}\r
+\r
+void MainViewSample::HorViewLoad(void)\r
+{\r
+    uint8_t cardSettingNum = presenter_->GetCardSettingCount();\r
+    CardId *cardSettings = presenter_->GetCardSettings();\r
+    for (int16_t i = 0; i < cardSettingNum; i++) {\r
+        CardId cardId = cardSettings[i];\r
+        if (recordCard[cardId] != nullptr) {\r
+            mainSwipeGroup->HorAdd(recordCard[cardId]);\r
+            WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MainViewSample:: HorViewLoad cardid = %d ViewIndex = %d",\r
+                          cardId, recordCard[cardId]->GetViewIndex());\r
+        }\r
+    }\r
+}\r
+\r
+void MainViewSample::VerticalViewInit(void)\r
+{\r
+    dropDownView = new PullUpDownView();\r
+    if (dropDownView == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "dropDownView new fail");\r
+        return;\r
+    }\r
+    dropDownView->PreLoad();\r
+    dropDownView->SetViewId("dropDownView");\r
+    dropDownView->SetPosition(0, 0, Screen::GetInstance().GetWidth(), Screen::GetInstance().GetHeight());\r
+    dropDownView->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+\r
+    messageView = new MessageMainPage();\r
+    if (messageView == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "messageView new fail");\r
+        return;\r
+    }\r
+    messageView->PreLoad();\r
+    messageView->SetPosition(0, 0);\r
+    messageView->SetWidth(Screen::GetInstance().GetWidth());\r
+    messageView->SetHeight(Screen::GetInstance().GetHeight());\r
+    messageView->SetStyle(STYLE_BACKGROUND_OPA, OPA_OPAQUE);\r
+    messageView->SetViewId("messageView");\r
+    messageView->SetTouchable(true);\r
+    messageView->SetIntercept(true);\r
+}\r
+\r
+void MainViewSample::VertViewLoad(void)\r
+{\r
+    mainSwipeGroup->VerAdd(dropDownView, UICrossView::VPage::UP_PAGE);\r
+    mainSwipeGroup->VerAdd(messageView, UICrossView::VPage::DOWN_PAGE);\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MainViewSample::PullViewLoad::Pull View Load complete");\r
+}\r
+\r
+void MainViewSample::OnStop()\r
+{\r
+    messageView->RemoveAll();\r
+    return;\r
+}\r
+\r
+UICardPage *MainViewSample::InitWatchOffDial(DialSetting &setting)\r
+{\r
+    DialViewGroup *dial = new DialViewGroup();\r
+    dial->SetDial(setting.dialFullName);\r
+    return dial;\r
+}\r
+\r
+UICardPage *MainViewSample::InitWatchDial(DialSetting &setting)\r
+{\r
+    return dynamic_cast<UICardPage*>(UIWatchDialFactory::GetInstance().CreateNormalDial(setting.dialId));\r
+}\r
+\r
+UICardPage *MainViewSample::InitWatchFacePage(void)\r
+{\r
+    DialSetting &setting = presenter_->GetDialSetting();\r
+    if (setting.dialFlag) {\r
+        mainClockView = InitWatchOffDial(setting);\r
+    } else {\r
+        mainClockView = InitWatchDial(setting);\r
+    }\r
+\r
+    if (mainClockView == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "MainClockView new fail");\r
+        return nullptr;\r
+    }\r
+    return mainClockView;\r
+}\r
+\r
+UICardPage *MainViewSample::InitActivityPage(void)\r
+{\r
+    activityWeekView = new ActivityWeekView();\r
+    if (activityWeekView == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "activityWeekView new fail");\r
+        return nullptr;\r
+    }\r
+    return activityWeekView;\r
+}\r
+\r
+UICardPage *MainViewSample::InitCompassPage(void)\r
+{\r
+    compassControlView = new CompassControlView();\r
+    if (compassControlView == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "compassControlView new fail");\r
+        return nullptr;\r
+    }\r
+    return compassControlView;\r
+}\r
+\r
+UICardPage *MainViewSample::InitMusicPlayerPage(void)\r
+{\r
+    playersView = new PlayersView();\r
+    if (playersView == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "playersView new fail");\r
+        return nullptr;\r
+    }\r
+    return playersView;\r
+}\r
+\r
+UICardPage *MainViewSample::InitVideoCardPage1(void)\r
+{\r
+    videoCard1 = dynamic_cast<VideoCard*>(InitVideoCardPage(APP_VIDEO_PATH"/noaudio_05.mp4", PNG_PREVIEW_CARD_VIDEO));\r
+    return videoCard1;\r
+}\r
+\r
+UICardPage *MainViewSample::InitVideoCardPage2(void)\r
+{\r
+    videoCard2 = dynamic_cast<VideoCard*>(InitVideoCardPage(APP_VIDEO_PATH"/noaudio_05.mp4", PNG_PREVIEW_CARD_VIDEO));\r
+    return videoCard2;\r
+}\r
+\r
+UICardPage *MainViewSample::InitVideoCardPage3(void)\r
+{\r
+    videoCard3 = dynamic_cast<VideoCard*>(InitVideoCardPage(APP_VIDEO_PATH"/noaudio_05.mp4", PNG_PREVIEW_CARD_VIDEO));\r
+    return videoCard3;\r
+}\r
+\r
+UICardPage *MainViewSample::InitVideoCardPage(const std::string &video, const std::string &preview)\r
+{\r
+    VideoCard *page = new VideoCard;\r
+    if (page == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "videocard new fail");\r
+        return nullptr;\r
+    }\r
+    page->SetFilePath(video);\r
+    page->SetPreviewFile(preview);\r
+    return page;\r
+}\r
+\r
+void MainViewSample::SetPage(int16_t page, bool loadAdjacent)\r
+{\r
+    if (mainSwipeGroup != nullptr) {\r
+        mainSwipeGroup->SetHorCurrentPage(page, loadAdjacent);\r
+    }\r
+\r
+    if (presenter_ != nullptr) {\r
+        CardId *cardSettings = presenter_->GetCardSettings();\r
+        /* page 与CardId 没有对应关系,需要一次转换 */\r
+        CardId id = MAX_CARD;\r
+        for (uint8_t i = 0; i < presenter_->GetCardSettingCount(); ++i) {\r
+            if (cardSettings[i] < MAX_CARD && recordCard[cardSettings[i]] != nullptr &&\r
+                recordCard[cardSettings[i]]->GetViewIndex() == page) {\r
+                id = cardSettings[i];\r
+            }\r
+        }\r
+        presenter_->SetTaskPeroid(id);\r
+    }\r
+}\r
+\r
+void MainViewSample::ReloadWatchFace()\r
+{\r
+    if (mainSwipeGroup == nullptr) {\r
+        return;\r
+    }\r
+    mainSwipeGroup->Remove(mainClockView, UISwipeView::HORIZONTAL);\r
+\r
+    delete mainClockView;\r
+    mainClockView = nullptr;\r
+    recordCard[WATCH_FACE] = InitWatchFacePage();\r
+    if (recordCard[WATCH_FACE] == nullptr) {\r
+        GRAPHIC_LOGE("failed to reload main clock");\r
+        return;\r
+    }\r
+    mainSwipeGroup->HorInsert(nullptr, mainClockView);\r
+\r
+    SwitchToCard(WATCH_FACE);\r
+    Draw();\r
+}\r
+\r
+bool MainViewSample::IsMainClockPage(void)\r
+{\r
+    if (mainSwipeGroup->GetCurrentPageId(0) == mainClockView->GetViewIndex() &&\r
+        mainSwipeGroup->GetCurrentPageId(1) == 1) { // 0: horizontal; 1: vertical\r
+        return true;\r
+    } else {\r
+        return false;\r
+    }\r
+}\r
+\r
+CardId MainViewSample::GetHorCurrentCard() const\r
+{\r
+    CardId *cardSettings = presenter_->GetCardSettings();\r
+    int pageId = mainSwipeGroup->GetCurrentPageId(UISwipeView::HORIZONTAL); // 0: horizontal; 1: vertical\r
+    /* pageId 与CardId 没有对应关系,需要一次转换 */\r
+    for (uint8_t i = 0; i < presenter_->GetCardSettingCount(); ++i) {\r
+        if (cardSettings[i] < MAX_CARD && recordCard[cardSettings[i]] != nullptr &&\r
+            recordCard[cardSettings[i]]->GetViewIndex() == pageId) {\r
+            return cardSettings[i];\r
+        }\r
+    }\r
+    return MAX_CARD;\r
+}\r
+\r
+void MainViewSample::GetVerCurrentCard() const\r
+{\r
+    int pageId = mainSwipeGroup->GetCurrentPageId(UISwipeView::VERTICAL);\r
+    if (pageId == PAGE_ID) {\r
+        MessageModel::GetInstance().SetTime();\r
+        std::vector<MessageItem> &itemInfo = MessageModel::GetInstance().GetMsgListItems();\r
+        MessageMainPage::GetInstance()->RefreshMsgList(itemInfo);\r
+    }\r
+}\r
+\r
+void MainViewSample::SwitchToCard(uint8_t cardId, bool loadAdjacent)\r
+{\r
+    if ((cardId < MAX_CARD) && (recordCard[cardId] != nullptr)) {\r
+        SetPage(recordCard[cardId]->GetViewIndex(), loadAdjacent);\r
+    } else {\r
+        SwitchToClockPage(loadAdjacent);\r
+    }\r
+}\r
+} // OHOS\r
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/main/src/MessageDetailsGroup.cpp b/code/sdk/application/wearable/evb/nativeapp/nativeui/main/src/MessageDetailsGroup.cpp
new file mode 100644 (file)
index 0000000..9d53fcb
--- /dev/null
@@ -0,0 +1,198 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: MessageDetailsGroup\r
+ * Created: 2025-06\r
+ */\r
+\r
+#include <string>\r
+#include "common/image_cache_manager.h"\r
+#include "NativeAbility.h"\r
+#include "wearable_log.h"\r
+#include "main/LoadImg.h"\r
+#include "main/MessageDetailsGroup.h"\r
+\r
+namespace OHOS {\r
+static constexpr int16_t MESSAGE_ICON_X = 130;\r
+static constexpr int16_t MESSAGE_ICON_Y = 50;\r
+static constexpr int16_t MESSAGE_ICON_SIZE = 40;\r
+static constexpr int16_t MESSAGE_TITLES_X = 170;\r
+static constexpr int16_t MESSAGE_TITLES_Y = 40;\r
+static constexpr int16_t MESSAGE_TITLES_WIDTH = 160;\r
+static constexpr int16_t MESSAGE_TITLES_HEIGHT = 53;\r
+static constexpr int16_t MESSAGE_TITLES_FONT_SIZE = 38;\r
+static constexpr int16_t MESSAGE_CONTACTS_X = 15;\r
+static constexpr int16_t MESSAGE_CONTACTS_Y = 138;\r
+static constexpr int16_t MESSAGE_CONTACTS_WIDTH = 370;\r
+static constexpr int16_t MESSAGE_CONTACTS_HEIGHT = 50;\r
+static constexpr int16_t MESSAGE_CONTACTA_FONT_SIZE = 36;\r
+static constexpr int16_t MESSAGE_CONTENTS_X = 15;\r
+static constexpr int16_t MESSAGE_CONTENTS_Y = 201;\r
+static constexpr int16_t MESSAGE_CONTENTS_WIDTH = 370;\r
+static constexpr int16_t MESSAGE_CONTENTS_HEIGHT = 200;\r
+static constexpr int16_t MESSAGE_CONTENTA_FONT_SIZE = 36;\r
+static constexpr int16_t MESSAGE_TIME_X = 77;\r
+static constexpr int16_t MESSAGE_TIME_Y = 385;\r
+static constexpr int16_t MESSAGE_TIME_WIDTH = 300;\r
+static constexpr int16_t MESSAGE_TIME_HEIGHT = 40;\r
+static constexpr int16_t MESSAGE_TIME_FONT_SIZE = 36;\r
+constexpr int16_t PAGE_WIDTH = 454;\r
+\r
+DetailsGroup::DetailsGroup()\r
+{\r
+    InitDetailsPage();\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "DetailsGroup::DetailsGroup");\r
+}\r
+\r
+DetailsGroup::~DetailsGroup()\r
+{\r
+    RemoveAll();\r
+    if (detailsMsgIcon_ != nullptr) {\r
+        delete detailsMsgIcon_;\r
+        detailsMsgIcon_ = nullptr;\r
+    }\r
+    if (detailsMsgTitle_ != nullptr) {\r
+        delete detailsMsgTitle_;\r
+        detailsMsgTitle_ = nullptr;\r
+    }\r
+    if (detailsMsgContacts_ != nullptr) {\r
+        delete detailsMsgContacts_;\r
+        detailsMsgContacts_ = nullptr;\r
+    }\r
+    if (detailsMsgContents_ != nullptr) {\r
+        delete detailsMsgContents_;\r
+        detailsMsgContents_ = nullptr;\r
+    }\r
+    if (detailsMsgTime_ != nullptr) {\r
+        delete detailsMsgTime_;\r
+        detailsMsgTime_ = nullptr;\r
+    }\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "DetailsGroup::~DetailsGroup");\r
+}\r
+\r
+void DetailsGroup::InitDetailsPage()\r
+{\r
+    SetPosition(0, 0, HORIZONTAL_RESOLUTION, HORIZONTAL_RESOLUTION);\r
+    SetViewId("detail");\r
+    SetThrowDrag(true);\r
+    SetScrollBlankSize(31);\r
+\r
+    detailsMsgIcon_ = new UIImageView;\r
+    if (detailsMsgIcon_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new detailsMsgIcon_ fail");\r
+        return;\r
+    }\r
+    detailsMsgIcon_->SetPosition(MESSAGE_ICON_X, MESSAGE_ICON_Y);\r
+\r
+    detailsMsgTitle_ = new UILabel;\r
+    if (detailsMsgTitle_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new detailsMsgTitle_ fail");\r
+        return;\r
+    }\r
+    detailsMsgTitle_->SetPosition(MESSAGE_TITLES_X, MESSAGE_TITLES_Y, MESSAGE_TITLES_WIDTH, MESSAGE_TITLES_HEIGHT);\r
+    detailsMsgTitle_->SetFont(BOLD_VECTOR_FONT_FILENAME, MESSAGE_TITLES_FONT_SIZE);\r
+    detailsMsgTitle_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+    detailsMsgTitle_->SetStyle(STYLE_TEXT_OPA, OPA_OPAQUE);\r
+    detailsMsgTitle_->SetStyle(STYLE_TEXT_COLOR, Color::White().full);\r
+    detailsMsgTitle_->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+    detailsMsgTitle_->SetVisible(true);\r
+\r
+    detailsMsgContacts_ = new UILabel;\r
+    if (detailsMsgContacts_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new detailsMsgContacts_ fail");\r
+        return;\r
+    }\r
+    detailsMsgContacts_->SetPosition(MESSAGE_CONTACTS_X, MESSAGE_CONTACTS_Y,\r
+        MESSAGE_CONTACTS_WIDTH, MESSAGE_CONTACTS_HEIGHT);\r
+    detailsMsgContacts_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, MESSAGE_CONTACTA_FONT_SIZE);\r
+    detailsMsgContacts_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+    detailsMsgContacts_->SetStyle(STYLE_TEXT_OPA, OPA_OPAQUE);\r
+    detailsMsgContacts_->SetStyle(STYLE_TEXT_COLOR, Color::White().full);\r
+    detailsMsgContacts_->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+    detailsMsgContacts_->SetVisible(true);\r
+\r
+    detailsMsgContents_ = new UILabel;\r
+    if (detailsMsgContents_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new detailsMsgContents_ fail");\r
+        return;\r
+    }\r
+    detailsMsgContents_->SetPosition(MESSAGE_CONTENTS_X, MESSAGE_CONTENTS_Y,\r
+        MESSAGE_CONTENTS_WIDTH, MESSAGE_CONTENTS_HEIGHT);\r
+    detailsMsgContents_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, MESSAGE_CONTENTA_FONT_SIZE);\r
+    detailsMsgContents_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_TOP);\r
+    detailsMsgContents_->SetStyle(STYLE_TEXT_OPA, OPA_OPAQUE);\r
+    detailsMsgContents_->SetStyle(STYLE_TEXT_COLOR, Color::White().full);\r
+    detailsMsgContents_->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+    detailsMsgContents_->SetVisible(true);\r
+\r
+    detailsMsgTime_ = new UILabel;\r
+    if (detailsMsgTime_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new detailsMsgTime_ fail");\r
+        return;\r
+    }\r
+    detailsMsgTime_->SetPosition(MESSAGE_TIME_X, MESSAGE_TIME_Y, MESSAGE_TIME_WIDTH, MESSAGE_TIME_HEIGHT);\r
+    detailsMsgTime_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, MESSAGE_TIME_FONT_SIZE);\r
+    detailsMsgTime_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+    detailsMsgTime_->SetStyle(STYLE_TEXT_OPA, OPA_OPAQUE);\r
+    detailsMsgTime_->SetStyle(STYLE_TEXT_COLOR, Color::White().full);\r
+    detailsMsgTime_->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+    detailsMsgTime_->SetVisible(true);\r
+\r
+    Add(detailsMsgIcon_);\r
+    Add(detailsMsgTitle_);\r
+    Add(detailsMsgContacts_);\r
+    Add(detailsMsgContents_);\r
+    Add(detailsMsgTime_);\r
+}\r
+\r
+void DetailsGroup::RefreshNotify()\r
+{\r
+    detailsMsgTitle_->SetText(detailsMsg_.appName.c_str());\r
+    if (strcmp(detailsMsg_.appName.c_str(), "微信") == 0) {\r
+        LOADIMG::LoadImageViewImg(detailsMsgIcon_, MESSAGE_IMAGE, IMAGE_MESSAGE_WX);\r
+    } else if (strcmp(detailsMsg_.appName.c_str(), "QQ") == 0) {\r
+        LOADIMG::LoadImageViewImg(detailsMsgIcon_, MESSAGE_IMAGE, IMAGE_MESSAGE_QQ);\r
+    } else if (strcmp(detailsMsg_.appName.c_str(), "抖音") == 0) {\r
+        LOADIMG::LoadImageViewImg(detailsMsgIcon_, MESSAGE_IMAGE, IMAGE_MESSAGE_DY);\r
+    } else if (strcmp(detailsMsg_.appName.c_str(), "日历") == 0) {\r
+        LOADIMG::LoadImageViewImg(detailsMsgIcon_, MESSAGE_IMAGE, IMAGE_MESSAGE_CALENDAR);\r
+    } else if (strcmp(detailsMsg_.appName.c_str(), "信息") == 0) {\r
+        LOADIMG::LoadImageViewImg(detailsMsgIcon_, MESSAGE_IMAGE, IMAGE_MESSAGE_DUANXIN);\r
+    } else if (strcmp(detailsMsg_.appName.c_str(), "短信") == 0) {\r
+        LOADIMG::LoadImageViewImg(detailsMsgIcon_, MESSAGE_IMAGE, IMAGE_MESSAGE_DUANXIN);\r
+    } else if (strcmp(detailsMsg_.appName.c_str(), "今日头条") == 0) {\r
+        LOADIMG::LoadImageViewImg(detailsMsgIcon_, MESSAGE_IMAGE, IMAGE_MESSAGE_TOUTIAO);\r
+    } else if (strcmp(detailsMsg_.appName.c_str(), "微博") == 0) {\r
+        LOADIMG::LoadImageViewImg(detailsMsgIcon_, MESSAGE_IMAGE, IMAGE_MESSAGE_WB);\r
+    } else if (strcmp(detailsMsg_.appName.c_str(), "小红书") == 0) {\r
+        LOADIMG::LoadImageViewImg(detailsMsgIcon_, MESSAGE_IMAGE, IMAGE_MESSAGE_XHS);\r
+    }\r
+    int controlOffset = 10;\r
+    int cut = 2;\r
+    int posX = (PAGE_WIDTH - detailsMsgTitle_->GetTextWidth() - detailsMsgIcon_->GetWidth() - controlOffset) / cut;\r
+    detailsMsgIcon_->SetX(posX);\r
+    detailsMsgTitle_->SetWidth(detailsMsgTitle_->GetTextWidth());\r
+    detailsMsgTitle_->SetX(posX + detailsMsgIcon_->GetWidth() + controlOffset);\r
+\r
+    std::string str = detailsMsg_.appContact + ":";\r
+    detailsMsgContacts_->SetText(str.c_str());\r
+    if (detailsMsgContacts_->GetTextWidth() > MESSAGE_CONTACTS_WIDTH) {\r
+        detailsMsgContacts_->SetWidth(MESSAGE_CONTACTS_WIDTH);\r
+    } else {\r
+        detailsMsgContacts_->SetWidth(detailsMsgContacts_->GetTextWidth());\r
+    }\r
+    posX = (PAGE_WIDTH - detailsMsgContacts_->GetWidth()) / cut;\r
+    detailsMsgContacts_->SetX(posX);\r
+\r
+    detailsMsgContents_->SetText(detailsMsg_.appContents.c_str());\r
+    int height = detailsMsgContents_->GetTextHeight();\r
+    detailsMsgContents_->SetHeight(height);\r
+    posX = (PAGE_WIDTH - detailsMsgContents_->GetWidth()) / cut;\r
+    detailsMsgContents_->SetX(posX);\r
+\r
+    detailsMsgTime_->SetText(detailsMsg_.time.c_str());\r
+    int posY = detailsMsgContents_->GetY() + height + (cut * controlOffset);\r
+    detailsMsgTime_->SetY(posY);\r
+    posX = (PAGE_WIDTH - detailsMsgTime_->GetWidth()) / cut;\r
+}\r
+\r
+}
\ No newline at end of file
index db7e81e..8f05bf0 100644 (file)
 /*\r
- * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
- */\r
-/*\r
- * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved.\r
- * Description: MessageItemView.cpp\r
- * Author:\r
- * Create: 2021-11-23\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: MessageItemView\r
+ * Create: 2025-06-29\r
  */\r
 \r
 #include "wearable_log.h"\r
+#include "ui_resource_message.h"\r
+#include "common/image_cache_manager.h"\r
+#include "main/LoadImg.h"\r
+#include "main/MessageMainPage.h"\r
 #include "main/MessageItemView.h"\r
 \r
 namespace OHOS {\r
-    static constexpr int16 SETTING_ICON_X = 20;\r
-    static constexpr int16 NUM_22 = 22;\r
-    static constexpr int16_t SETTING_ITEM_BUTTON_HEIGHT = 80;\r
-    static constexpr int16_t SETTING_ITEM_LABEL_WIDTH = 155;\r
-    static constexpr int16_t SETTING_ITEM_LABEL_HEIGHT = 100;\r
-    static constexpr int16 SETTING_ITEM_FONT_SIZE = 35;\r
-    static constexpr int16_t SETTINGS_RESIZE_SIZE = 100;\r
-    static constexpr int16_t SETTING_SICON_Y = 15;\r
-    static constexpr int16 NUMS_2 = 2;\r
-    static constexpr int16 NUMS_50 = 50;\r
-\r
-    MessageItemView::MessageItemView()\r
-    {\r
-        SetPosition(0, 0, HORIZONTAL_RESOLUTION, 200);\r
-        SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
-        SetStyle(STYLE_BACKGROUND_OPA, UN_OPACITY);\r
-        SetTouchable(true);\r
-        SetUpChild();\r
-\r
-        Add(&sback);\r
-        Add(&sLabel_1);\r
-        Add(&sIcon);\r
-        Add(&sLabel_2);\r
-        Add(&sLabel_3);\r
-    }\r
+static constexpr int16_t MESSAGE_ITEM_GROUP_X = 30;\r
+static constexpr int16_t MESSAGE_ITEM_GROUP_EX = -100;\r
+static constexpr int16_t MESSAGE_ITEM_GROUP_MOVEX = 100;\r
+static constexpr int16_t MESSAGE_ITEM_GROUP_WIDTH = 454;\r
+static constexpr int16_t MESSAGE_ITEM_GROUP_HEIGHT = 130;\r
+static constexpr int16_t MESSAGE_ITEM_DELETE_X = 283;\r
+static constexpr int16_t MESSAGE_ITEM_DELETE_SIZE = 36;\r
+static constexpr int16_t MESSAGE_ITEM_APPNAME_X = 60;\r
+static constexpr int16_t MESSAGE_ITEM_APPNAME_Y = 15;\r
+static constexpr int16_t MESSAGE_ITEM_APPNAME_WIDTH = 131;\r
+static constexpr int16_t MESSAGE_ITEM_APPNAME_HEIGHT = 45;\r
+static constexpr int16_t ITEM_APPNAME_FONT_SIZE = 32;\r
+static constexpr int16_t MESSAGE_ITEM_APPICON_X = 10;\r
+static constexpr int16_t MESSAGE_ITEM_APPICON_Y = 15;\r
+static constexpr int16_t MESSAGE_ITEM_APPICON_SIZE = 30;\r
+static constexpr int16_t MESSAGE_ITEM_CONTACT_X = 10;\r
+static constexpr int16_t MESSAGE_ITEM_CONTACT_Y = 73;\r
+static constexpr int16_t MESSAGE_ITEM_CONTACT_WIDTH = 95;\r
+static constexpr int16_t MESSAGE_ITEM_CONTACT_HEIGHT = 42;\r
+static constexpr int16_t ITEM_CONTACT_FONT_SIZE = 30;\r
+static constexpr int16_t MESSAGE_ITEM_INFOR_X = 110;\r
+static constexpr int16_t MESSAGE_ITEM_INFOR_Y = 73;\r
+static constexpr int16_t MESSAGE_ITEM_INFOR_WIDTH = 156;\r
+static constexpr int16_t MESSAGE_ITEM_INFOR_HEIGHT = 42;\r
+static constexpr int16_t ITEM_INFOR_FONT_SIZE = 30;\r
+static constexpr int16_t MESSAGE_ITEM_TIME_X = 270;\r
+static constexpr int16_t MESSAGE_ITEM_TIME_Y = 75;\r
+static constexpr int16_t MESSAGE_ITEM_TIME_WIDTH = 100;\r
+static constexpr int16_t MESSAGE_ITEM_TIME_HEIGHT = 36;\r
+static constexpr int16_t ITEM_TIME_FONT_SIZE = 26;\r
+static constexpr char *DELETE_BUTTON = "deleteButton";\r
+\r
+MessageItemView::MessageItemView()\r
+{\r
+    appName_.SetPosition(MESSAGE_ITEM_APPNAME_X, MESSAGE_ITEM_APPNAME_Y,\r
+        MESSAGE_ITEM_APPNAME_WIDTH, MESSAGE_ITEM_APPNAME_HEIGHT);\r
+    appName_.SetFont(DEFAULT_VECTOR_FONT_FILENAME, ITEM_APPNAME_FONT_SIZE);\r
+    appName_.SetAlign(TEXT_ALIGNMENT_LEFT, TEXT_ALIGNMENT_CENTER);\r
+    appName_.SetStyle(STYLE_TEXT_OPA, OPA_OPAQUE);\r
+    appName_.SetStyle(STYLE_TEXT_COLOR, Color::White().full);\r
+    appName_.SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+\r
+    appIcon_.SetPosition(MESSAGE_ITEM_APPICON_X, MESSAGE_ITEM_APPICON_Y,\r
+        MESSAGE_ITEM_APPICON_SIZE, MESSAGE_ITEM_APPICON_SIZE);\r
+    appIcon_.SetStyle(STYLE_IMAGE_OPA, OPA_OPAQUE);\r
+\r
+    appContact_.SetPosition(MESSAGE_ITEM_CONTACT_X, MESSAGE_ITEM_CONTACT_Y,\r
+        MESSAGE_ITEM_CONTACT_WIDTH, MESSAGE_ITEM_CONTACT_HEIGHT);\r
+    appContact_.SetFont(DEFAULT_VECTOR_FONT_FILENAME, ITEM_CONTACT_FONT_SIZE);\r
+    appContact_.SetAlign(TEXT_ALIGNMENT_LEFT, TEXT_ALIGNMENT_CENTER);\r
+    appContact_.SetStyle(STYLE_TEXT_OPA, OPA_OPAQUE);\r
+    appContact_.SetStyle(STYLE_TEXT_COLOR, Color::White().full);\r
+    appContact_.SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+\r
+    appContents_.SetPosition(MESSAGE_ITEM_INFOR_X, MESSAGE_ITEM_INFOR_Y,\r
+        MESSAGE_ITEM_INFOR_WIDTH, MESSAGE_ITEM_INFOR_HEIGHT);\r
+    appContents_.SetFont(DEFAULT_VECTOR_FONT_FILENAME, ITEM_INFOR_FONT_SIZE);\r
+    appContents_.SetAlign(TEXT_ALIGNMENT_LEFT, TEXT_ALIGNMENT_CENTER);\r
+    appContents_.SetStyle(STYLE_TEXT_OPA, OPA_OPAQUE);\r
+    appContents_.SetStyle(STYLE_TEXT_COLOR, Color::White().full);\r
+    appContents_.SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+\r
+    msgTime_.SetPosition(MESSAGE_ITEM_TIME_X, MESSAGE_ITEM_TIME_Y,\r
+        MESSAGE_ITEM_TIME_WIDTH, MESSAGE_ITEM_TIME_HEIGHT);\r
+    msgTime_.SetFont(DEFAULT_VECTOR_FONT_FILENAME, ITEM_TIME_FONT_SIZE);\r
+    msgTime_.SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+    msgTime_.SetStyle(STYLE_TEXT_OPA, OPA_OPAQUE);\r
+    msgTime_.SetStyle(STYLE_TEXT_COLOR, Color::White().full);\r
+    msgTime_.SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+\r
+    LOADIMG::LoadImageViewImg(&bgImg_, MESSAGE_IMAGE, IMAGE_MESSAGE_BG);\r
+\r
+    group_.SetPosition(MESSAGE_ITEM_GROUP_X, 0, MESSAGE_ITEM_GROUP_WIDTH, MESSAGE_ITEM_GROUP_HEIGHT);\r
+    group_.SetViewId("message");\r
+    group_.SetDraggable(true);\r
+    group_.SetTouchable(true);\r
+\r
+    deleteImg_.SetPosition(MESSAGE_ITEM_DELETE_X, 0, MESSAGE_ITEM_DELETE_SIZE, MESSAGE_ITEM_DELETE_SIZE);\r
+    LOADIMG::LoadImageViewImg(&deleteImg_, MESSAGE_IMAGE, IMAGE_MESSAGE_SINGLE_DELETE);\r
+    deleteImg_.SetViewId(DELETE_BUTTON);\r
+    deleteImg_.SetTouchable(true);\r
+    deleteImg_.SetOnClickListener(this);\r
 \r
-    MessageItemView::~MessageItemView()\r
-    {\r
-        Remove(&sIcon);\r
-        Remove(&sLabel_1);\r
-        Remove(&sLabel_2);\r
-        Remove(&sLabel_3);\r
-        Remove(&sback);\r
+    group_.Add(&bgImg_);\r
+    group_.Add(&appName_);\r
+    group_.Add(&appIcon_);\r
+    group_.Add(&appContact_);\r
+    group_.Add(&appContents_);\r
+    group_.Add(&msgTime_);\r
+    Add(&group_);\r
+    Add(&deleteImg_);\r
+\r
+}\r
+\r
+MessageItemView::~MessageItemView()\r
+{\r
+    group_.RemoveAll();\r
+    Remove(&appIcon_);\r
+    Remove(&appName_);\r
+    Remove(&appContact_);\r
+    Remove(&appContents_);\r
+    Remove(&bgImg_);\r
+    Remove(&msgTime_);\r
+    Remove(&group_);\r
+    Remove(&deleteImg_);\r
+}\r
+\r
+void MessageItemView::SetItemInfo(const MessageItem itemInfo)\r
+{\r
+    msgItemInfo_ = itemInfo;\r
+    appName_.SetText(itemInfo.appName.c_str());\r
+    appContact_.SetText(itemInfo.appContact.c_str());\r
+    appContents_.SetText(itemInfo.appContents.c_str());\r
+    msgTime_.SetText(itemInfo.time.c_str());\r
+    // 获取label1的内容更改图标\r
+    if (strcmp(msgItemInfo_.appName.c_str(), "微信") == 0) {\r
+        LOADIMG::LoadImageViewImg(&appIcon_, MESSAGE_IMAGE, IMAGE_MESSAGE_WX);\r
+    } else if (strcmp(msgItemInfo_.appName.c_str(), "QQ") == 0) {\r
+        LOADIMG::LoadImageViewImg(&appIcon_, MESSAGE_IMAGE, IMAGE_MESSAGE_QQ);\r
+    } else if (strcmp(msgItemInfo_.appName.c_str(), "抖音") == 0) {\r
+        LOADIMG::LoadImageViewImg(&appIcon_, MESSAGE_IMAGE, IMAGE_MESSAGE_DY);\r
+    } else if (strcmp(msgItemInfo_.appName.c_str(), "日历") == 0) {\r
+        LOADIMG::LoadImageViewImg(&appIcon_, MESSAGE_IMAGE, IMAGE_MESSAGE_CALENDAR);\r
+    } else if (strcmp(msgItemInfo_.appName.c_str(), "信息") == 0) {\r
+        LOADIMG::LoadImageViewImg(&appIcon_, MESSAGE_IMAGE, IMAGE_MESSAGE_DUANXIN);\r
+    } else if (strcmp(msgItemInfo_.appName.c_str(), "短信") == 0) {\r
+        LOADIMG::LoadImageViewImg(&appIcon_, MESSAGE_IMAGE, IMAGE_MESSAGE_DUANXIN);\r
+    } else if (strcmp(msgItemInfo_.appName.c_str(), "今日头条") == 0) {\r
+        LOADIMG::LoadImageViewImg(&appIcon_, MESSAGE_IMAGE, IMAGE_MESSAGE_TOUTIAO);\r
+    } else if (strcmp(msgItemInfo_.appName.c_str(), "微博") == 0) {\r
+        LOADIMG::LoadImageViewImg(&appIcon_, MESSAGE_IMAGE, IMAGE_MESSAGE_WB);\r
+    } else if (strcmp(msgItemInfo_.appName.c_str(), "小红书") == 0) {\r
+        LOADIMG::LoadImageViewImg(&appIcon_, MESSAGE_IMAGE, IMAGE_MESSAGE_XHS);\r
     }\r
+    if (msgItemInfo_.status == false) {\r
+        group_.SetPosition(MESSAGE_ITEM_GROUP_X, 0, MESSAGE_ITEM_GROUP_WIDTH, MESSAGE_ITEM_GROUP_HEIGHT);\r
+    } else {\r
+        group_.SetPosition(MESSAGE_ITEM_GROUP_EX, 0, MESSAGE_ITEM_GROUP_WIDTH, MESSAGE_ITEM_GROUP_HEIGHT);\r
+    }\r
+    deleteImg_.SetVisible(msgItemInfo_.status);\r
+}\r
+\r
+MessageItem MessageItemView::GetItem()\r
+{\r
+    return msgItemInfo_;\r
+}\r
 \r
-    void MessageItemView::SetItemInfo(const MessageItem itemInfo)\r
-    {\r
-        sItemInfo = itemInfo;\r
-        sLabel_1.SetText(itemInfo.label_1.c_str());\r
-        sIcon.SetSrc(itemInfo.icon.c_str());\r
-        sLabel_2.SetText(itemInfo.label_2.c_str());\r
-        sLabel_3.SetText(itemInfo.label_3.c_str());\r
+void MessageItemView::SetIndex(uint16_t index)\r
+{\r
+    itemIndex_ = index;\r
+}\r
+\r
+uint16_t MessageItemView ::GetIndex()\r
+{\r
+    return itemIndex_;\r
+}\r
+\r
+bool MessageItemView::OnDragStartEvent(const DragEvent& event)\r
+{\r
+    return false;\r
+}\r
+\r
+bool MessageItemView::OnDragEvent(const DragEvent& event)\r
+{\r
+    // 检查拖拽方向是否为左到右,并且X坐标在允许范围内(0到100之间)\r
+    if ((event.GetDragDirection() == DragEvent::DIRECTION_RIGHT_TO_LEFT &&\r
+        (((0 - group_.GetX()) <= MESSAGE_ITEM_GROUP_MOVEX)))) {\r
+        int pox = group_.GetX() + event.GetDeltaX();\r
+        group_.SetX(pox);\r
+        group_.Invalidate();\r
+        Invalidate();\r
+        return true;\r
+    } else if (event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT) {\r
+        group_.SetX(MESSAGE_ITEM_GROUP_X);\r
+        group_.Invalidate();\r
+        deleteImg_.SetVisible(false);\r
+        return true;\r
     }\r
+    return false;\r
+}\r
 \r
-    void MessageItemView::SetUpChild()\r
-    {\r
-        sLabel_1.SetPosition(50, 10);\r
-        sLabel_1.Resize(SETTING_ITEM_LABEL_WIDTH, 50);\r
-        sLabel_1.SetFont(DEFAULT_VECTOR_FONT_FILENAME, SETTING_ITEM_FONT_SIZE);\r
-        sLabel_1.SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
-        sLabel_1.SetStyle(STYLE_TEXT_OPA, OPA_OPAQUE);\r
-        sLabel_1.SetStyle(STYLE_TEXT_COLOR, Color::White().full);\r
-        sLabel_1.SetStyle(STYLE_BACKGROUND_COLOR, Color::Blue().full);\r
-        sLabel_1.SetStyle(STYLE_BACKGROUND_OPA, OPA_OPAQUE);\r
-\r
-        sIcon.SetPosition(15, SETTING_SICON_Y);\r
-        sIcon.SetStyle(STYLE_IMAGE_OPA, OPA_OPAQUE);\r
-\r
-        sLabel_2.SetPosition(15, 78);\r
-        sLabel_2.Resize(100, 50);\r
-        sLabel_2.SetFont(DEFAULT_VECTOR_FONT_FILENAME, SETTING_ITEM_FONT_SIZE);\r
-        sLabel_2.SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
-        sLabel_2.SetStyle(STYLE_TEXT_OPA, OPA_OPAQUE);\r
-        sLabel_2.SetStyle(STYLE_TEXT_COLOR, Color::White().full);\r
-        sLabel_2.SetStyle(STYLE_BACKGROUND_COLOR, Color::Orange().full);\r
-        sLabel_2.SetStyle(STYLE_BACKGROUND_OPA, OPA_OPAQUE);\r
-\r
-        sLabel_3.SetPosition(150, 78, 100, 50);\r
-        sLabel_3.SetFont(DEFAULT_VECTOR_FONT_FILENAME, SETTING_ITEM_FONT_SIZE);\r
-        sLabel_3.SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
-        sLabel_3.SetStyle(STYLE_TEXT_OPA, OPA_OPAQUE);\r
-        sLabel_3.SetStyle(STYLE_TEXT_COLOR, Color::White().full);\r
-        sLabel_3.SetStyle(STYLE_BACKGROUND_COLOR,  Color::Gray().full);\r
-        sLabel_3.SetStyle(STYLE_BACKGROUND_OPA, OPA_OPAQUE);\r
-\r
-        sback.SetPosition(0, 0, 450, 180);\r
-        sback.SetStyle(STYLE_BACKGROUND_COLOR, Color::Green().full);\r
-        sback.SetStyle(STYLE_BACKGROUND_OPA, OPA_OPAQUE);\r
+bool MessageItemView::OnDragEndEvent(const DragEvent& event)\r
+{\r
+    // 超出一定距离 显示X按钮\r
+    if ((0 - group_.GetX()) >= MESSAGE_ITEM_GROUP_MOVEX) {\r
+        group_.SetX(MESSAGE_ITEM_GROUP_EX);\r
+        group_.Invalidate();\r
+        deleteImg_.SetVisible(true);\r
+        msgItemInfo_.status = true;\r
+        SetIndex(msgItemInfo_.index);\r
+        // 恢复其它item位置\r
+        UpdateItemStatus();\r
+        Invalidate();\r
+        return true;\r
+    } else {\r
+        group_.SetPosition(MESSAGE_ITEM_GROUP_X, 0,\r
+            MESSAGE_ITEM_GROUP_WIDTH, MESSAGE_ITEM_GROUP_HEIGHT);\r
+        group_.Invalidate();\r
+    }\r
+    return false;\r
+}\r
 \r
+bool MessageItemView::OnClick(UIView &view, const ClickEvent &event)\r
+{\r
+    UNUSED(event);\r
+    if (strcmp(view.GetViewId(), DELETE_BUTTON) == 0) {\r
+        deleteImg_.SetVisible(false);\r
+        // 单项删除\r
+        MessageModel::GetInstance().DeleteItem(msgItemInfo_);\r
+        return true;\r
     }\r
+    return false;\r
+}\r
 \r
-}
\ No newline at end of file
+// 恢复item的位置\r
+void MessageItemView::UpdateItemStatus()\r
+{\r
+    std::vector<MessageItem> &vecMsg = MessageModel::GetInstance().GetMsgListItems();\r
+    for (int i = 0; i < vecMsg.size(); ++i) {\r
+        if (vecMsg[i].index == itemIndex_) {\r
+            vecMsg[i].status = true;\r
+        } else {\r
+            vecMsg[i].status = false;\r
+        }\r
+    }\r
+    MessageMainPage::GetInstance()->RefreshMsgList(vecMsg);\r
+}\r
+}\r
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/main/src/MessageMainPage.cpp b/code/sdk/application/wearable/evb/nativeapp/nativeui/main/src/MessageMainPage.cpp
new file mode 100644 (file)
index 0000000..d90e886
--- /dev/null
@@ -0,0 +1,485 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: MessageMainPage\r
+ * Create: 2025-06-29\r
+ */\r
+\r
+#include "wearable_log.h"\r
+#include "common/screen.h"\r
+#include "ui_resource_image.h"\r
+#include "ui_resource_message.h"\r
+#include "common/image_cache_manager.h"\r
+#include "main/LoadImg.h"\r
+#include "UiConfig.h"\r
+#include "main/MainPresenterSample.h"\r
+#include "main/MessageMainPage.h"\r
+\r
+namespace OHOS {\r
+\r
+static constexpr int16_t MESSAGE_TITLE_X = 97;\r
+static constexpr int16_t MESSAGE_TITLE_Y = 31;\r
+static constexpr int16_t MESSAGE_TITLE_WIDTH = 260;\r
+static constexpr int16_t MESSAGE_TITLE_HEIGHT = 53;\r
+static constexpr int16_t MESSAGE_TITLE_FONT_SIZE = 38;\r
+static constexpr int16_t NOTICE_IMAGE_X = 191;\r
+static constexpr int16_t NOTICE_IMAGE_Y = 361;\r
+static constexpr int16_t NOTICE_IMAGE_SIZE = 85;\r
+static constexpr int16_t MESAGE_LIST_X = 5;\r
+static constexpr int16_t MESAGE_LIST_Y = 100;\r
+static constexpr int16_t MESSAGE_LIST_WIDTH = 454;\r
+static constexpr int16_t MESSAGE_LIST_HEIGHT = 354;\r
+static constexpr int16_t MESSAGE_SCORLL_BAR_X = 222;\r
+static constexpr int16_t MESSAGE_SCORLL_BAR_Y = 129;\r
+static constexpr int16_t MESSAGE_SCORLL_BLANK_SIZE = 70;\r
+static constexpr int16_t MESSAGE_DELETE_REMINDER_X = 21;\r
+static constexpr int16_t MESSAGE_DELETE_REMINDER_Y = 158;\r
+static constexpr int16_t MESSAGE_DELETE_REMINDER_WIDTH = 424;\r
+static constexpr int16_t MESSAGE_DELETE_REMINDER_HEIGHT = 50;\r
+static constexpr int16_t DELETE_REMINDER_FONT_SIZE = 36;\r
+static constexpr int16_t MESSAGE_DELETE_CONFIRM_X = 260;\r
+static constexpr int16_t MESSAGE_DELETE_CONFIRM_Y = 300;\r
+static constexpr int16_t MESSAGE_DELETE_CONFIRM_SIZE = 85;\r
+static constexpr int16_t MESSAGE_DELETE_CANCEL_X = 110;\r
+static constexpr int16_t MESSAGE_DELETE_CANCEL_Y = 300;\r
+static constexpr int16_t MESSAGE_DELETE_CANCEL_SIZE = 85;\r
+static constexpr int16_t NOMESSAGE_TITLE_X = 45;\r
+static constexpr int16_t NOMESSAGE_TITLE_Y = 341;\r
+static constexpr int16_t NOMESSAGE_TITLE_WIDTH = 364;\r
+static constexpr int16_t NOMESSAGE_TITLE_HEIGHT = 50;\r
+static constexpr int16_t NOMESSAGE_TITLE_FONT_SIZE = 36;\r
+static constexpr int16_t NOMESSAGE_ICON_X = 154;\r
+static constexpr int16_t NOMESSAGE_ICON_Y = 154;\r
+static constexpr int16_t NOMESSAGE_ICON_SIZE = 146;\r
+static constexpr int16_t MOVE_DISTANCE = 30;\r
+static constexpr int16_t MESSAGE_ITEM_HEIGHT = 130;\r
+static constexpr char *DELETE_BUTTON = "deleteButton";\r
+static constexpr char *CONFIRM_BUTTON = "confirmButton";\r
+static constexpr char *CANCEL_BUTTON = "cancelButton";\r
+\r
+static MessageMainPage *g_pMessageMainView = nullptr;\r
+\r
+MessageMainPage::MessageMainPage()\r
+{\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MessageMainPage::MessageMainPage");\r
+    g_pMessageMainView = this;\r
+}\r
+\r
+MessageMainPage::~MessageMainPage()\r
+{\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MessageMainPage::~MessageMainPage");\r
+    RemoveAll();\r
+    if (detailsGroup_ != nullptr) {\r
+        delete detailsGroup_;\r
+        detailsGroup_ = nullptr;\r
+    }\r
+    if (deleteGroup_ != nullptr) {\r
+        deleteGroup_->RemoveAll();\r
+        delete deleteGroup_;\r
+        deleteGroup_ = nullptr;\r
+    }\r
+    if (noMsgLable_ != nullptr) {\r
+        delete noMsgLable_;\r
+        noMsgLable_ = nullptr;\r
+    }\r
+    if (msgLable_ != nullptr) {\r
+        delete msgLable_;\r
+        msgLable_ = nullptr;\r
+    }\r
+    if (noMsgImage_ != nullptr) {\r
+        delete noMsgImage_;\r
+        noMsgImage_ = nullptr;\r
+    }\r
+    if (deleteTips_ != nullptr) {\r
+        delete deleteTips_;\r
+        deleteTips_ = nullptr;\r
+    }\r
+    if (confirm_ != nullptr) {\r
+        delete confirm_;\r
+        confirm_ = nullptr;\r
+    }\r
+    if (cancel_ != nullptr) {\r
+        delete cancel_;\r
+        cancel_ = nullptr;\r
+    }\r
+    if (deleteImage_ != nullptr) {\r
+        delete deleteImage_;\r
+        deleteImage_ = nullptr;\r
+    }\r
+    if (msgList_ != nullptr) {\r
+        delete msgList_;\r
+        msgList_ = nullptr;\r
+    }\r
+\r
+    g_pMessageMainView = nullptr;\r
+    ImageCacheManager::GetInstance().UnloadAllInMultiRes(MESSAGE_IMAGE);\r
+    MessageModel::GetInstance().SetViewStatus(false);\r
+}\r
+\r
+MessageMainPage *MessageMainPage::GetInstance(void)\r
+{\r
+    return g_pMessageMainView;\r
+}\r
+\r
+bool MessageMainPage::InitView()\r
+{\r
+    msgLable_ = new UILabel();\r
+    if (msgLable_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "msgLable_ new fail");\r
+        return false;\r
+    }\r
+    msgLable_->SetPosition(MESSAGE_TITLE_X, MESSAGE_TITLE_Y, MESSAGE_TITLE_WIDTH, MESSAGE_TITLE_HEIGHT);\r
+    msgLable_->SetText("通知");\r
+    msgLable_->SetAlign(TEXT_ALIGNMENT_CENTER);\r
+    msgLable_->SetFont(BOLD_VECTOR_FONT_FILENAME, MESSAGE_TITLE_FONT_SIZE);\r
+    msgLable_->SetStyle(STYLE_BACKGROUND_COLOR, Color::Blue().full);\r
+    msgLable_->SetStyle(STYLE_BACKGROUND_COLOR, OPA_TRANSPARENT);\r
+\r
+    // 删除图标\r
+    deleteImage_ = new UIImageView();\r
+    if (deleteImage_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new deleteImage_ fail");\r
+        return false;\r
+    }\r
+    deleteImage_->SetPosition(NOTICE_IMAGE_X, NOTICE_IMAGE_Y, NOTICE_IMAGE_SIZE, NOTICE_IMAGE_SIZE);\r
+    LOADIMG::LoadImageViewImg(deleteImage_, MESSAGE_IMAGE, IMAGE_MESSAGE_DELETE);\r
+    deleteImage_->SetViewId(DELETE_BUTTON);\r
+    deleteImage_->SetTouchable(true);\r
+    deleteImage_->SetOnClickListener(this);\r
+    InitMsgList();\r
+    InitScrollData();\r
+    Add(msgLable_);\r
+    Add(deleteImage_);\r
+    return true;\r
+}\r
+\r
+void MessageMainPage::PreLoad(void)\r
+{\r
+    if (! MessageModel::GetInstance().GetViewStatus()) {\r
+        DeleteView();\r
+        NoNotify();\r
+        InitView();\r
+        const std::vector<MessageItem> &itemInfo = MessageModel::GetInstance().GetMsgListItems();\r
+        if (itemInfo.size() == 0) {\r
+            msgLable_->SetVisible(true);\r
+            deleteImage_->SetVisible(false);\r
+            msgList_->SetVisible(false);\r
+            deleteGroup_->SetVisible(false);\r
+            noMsgLable_->SetVisible(true);\r
+            noMsgImage_->SetVisible(true);\r
+        } else {\r
+            msgLable_->SetVisible(true);\r
+            deleteImage_->SetVisible(true);\r
+            msgList_->SetVisible(true);\r
+            deleteGroup_->SetVisible(false);\r
+            noMsgLable_->SetVisible(false);\r
+            noMsgImage_->SetVisible(false);\r
+        }\r
+        MessageModel::GetInstance().SetViewStatus(true);\r
+    }\r
+}\r
+\r
+void MessageMainPage::InitMsgList(void)\r
+{\r
+    msgList_ = new UISimpleList();\r
+    if (msgList_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new msgList_ is nullptr");\r
+        return;\r
+    }\r
+    msgList_->SetPosition(MESAGE_LIST_X, MESAGE_LIST_Y, MESSAGE_LIST_WIDTH, MESSAGE_LIST_HEIGHT);\r
+    msgList_->SetScrollBlankSize(MESSAGE_SCORLL_BLANK_SIZE, UIAbstractScroll::Direction::BOTTOM);\r
+    msgList_->SetDraggable(true);\r
+    msgList_->SetThrowDrag(true);\r
+    msgList_->EnableAutoAlign(true);\r
+    msgList_->SetYScrollBarVisible(true);\r
+    Point scorllBarPoint = {MESSAGE_SCORLL_BAR_X, MESSAGE_SCORLL_BAR_Y};\r
+    msgList_->SetScrollBarCenter(scorllBarPoint);\r
+    msgList_->SetOnDragListener(this);\r
+    Add(msgList_);\r
+}\r
+\r
+void MessageMainPage::ConfirmDelete(void)\r
+{\r
+    if (deleteImage_->IsVisible()) {\r
+        deleteImage_->SetVisible(false);\r
+    }\r
+    if (msgLable_->IsVisible()) {\r
+        msgLable_->SetVisible(false);\r
+    }\r
+    if (msgList_->IsVisible()) {\r
+        msgList_->SetVisible(false);\r
+    }\r
+    if (noMsgLable_->IsVisible()) {\r
+        noMsgLable_->SetVisible(false);\r
+    }\r
+    if (noMsgImage_->IsVisible()) {\r
+        noMsgImage_->SetVisible(false);\r
+    }\r
+    deleteGroup_->SetVisible(true);\r
+}\r
+\r
+void MessageMainPage::NewNotify(void)\r
+{\r
+    if (noMsgLable_->IsVisible()) {\r
+        noMsgLable_->SetVisible(false);\r
+    }\r
+    if (noMsgImage_->IsVisible()) {\r
+        noMsgImage_->SetVisible(false);\r
+    }\r
+    if (! deleteImage_->IsVisible()) {\r
+        deleteImage_->SetVisible(true);\r
+    }\r
+    if (! msgLable_->IsVisible()) {\r
+        msgLable_->SetVisible(true);\r
+    }\r
+    if (! msgList_->IsVisible()) {\r
+        msgList_->SetVisible(true);\r
+    }\r
+}\r
+\r
+void MessageMainPage::DeleteView(void)\r
+{\r
+    // deleteGroup_这个页面会多次创建,防止new多次 加入判空处理\r
+    if (deleteGroup_ == nullptr) {\r
+        deleteGroup_ = new UIScrollView;\r
+        if (deleteGroup_ == nullptr) {\r
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new deleteGroup_ is nullptr");\r
+            return;\r
+        }\r
+    }\r
+    deleteGroup_->SetPosition(0, 0, HORIZONTAL_RESOLUTION, HORIZONTAL_RESOLUTION);\r
+    // 标题\r
+    deleteTips_ = new UILabel();\r
+    if (deleteTips_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new deleteTips_ is nullptr");\r
+        return;\r
+    }\r
+    deleteTips_->SetPosition(MESSAGE_DELETE_REMINDER_X, MESSAGE_DELETE_REMINDER_Y,\r
+        MESSAGE_DELETE_REMINDER_WIDTH, MESSAGE_DELETE_REMINDER_HEIGHT);\r
+    deleteTips_->SetText("是否清空消息通知?");\r
+    deleteTips_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, DELETE_REMINDER_FONT_SIZE);\r
+    deleteTips_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+    deleteTips_->SetStyle(STYLE_TEXT_OPA, OPA_OPAQUE);\r
+\r
+    // 确认按钮\r
+    confirm_ = new UIImageView();\r
+    if (confirm_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new confirm_ is nullptr");\r
+        return;\r
+    }\r
+    confirm_->SetPosition(MESSAGE_DELETE_CONFIRM_X, MESSAGE_DELETE_CONFIRM_Y,\r
+        MESSAGE_DELETE_CONFIRM_SIZE, MESSAGE_DELETE_CONFIRM_SIZE);\r
+    LOADIMG::LoadImageViewImg(confirm_, MESSAGE_IMAGE, IMAGE_MESSAGE_CONFIRM);\r
+    confirm_->SetViewId(CONFIRM_BUTTON);\r
+    confirm_->SetTouchable(true);\r
+    confirm_->SetOnClickListener(this);\r
+\r
+    // 取消按钮\r
+    cancel_ = new UIImageView();\r
+    if (cancel_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new cancel_ is nullptr");\r
+        return;\r
+    }\r
+    cancel_->SetPosition(MESSAGE_DELETE_CANCEL_X, MESSAGE_DELETE_CANCEL_Y,\r
+        MESSAGE_DELETE_CANCEL_SIZE, MESSAGE_DELETE_CANCEL_SIZE);\r
+    LOADIMG::LoadImageViewImg(cancel_, MESSAGE_IMAGE, IMAGE_MESSAGE_CANCEL);\r
+    cancel_->SetViewId(CANCEL_BUTTON);\r
+    cancel_->SetTouchable(true);\r
+    cancel_->SetOnClickListener(this);\r
+\r
+    deleteGroup_->Add(deleteTips_);\r
+    deleteGroup_->Add(confirm_);\r
+    deleteGroup_->Add(cancel_);\r
+    Add(deleteGroup_);\r
+}\r
+\r
+void MessageMainPage::VerticalViewInits(void)\r
+{\r
+    deleteGroup_->SetVisible(false);\r
+    if (! noMsgLable_->IsVisible()) {\r
+        noMsgLable_->SetVisible(true);\r
+    }\r
+    if (! noMsgImage_->IsVisible()) {\r
+        noMsgImage_->SetVisible(true);\r
+    }\r
+    if (! msgLable_->IsVisible()) {\r
+        msgLable_->SetVisible(true);\r
+    }\r
+}\r
+\r
+void MessageMainPage::NoNotify(void)\r
+{\r
+    noMsgLable_ = new UILabel();\r
+    if (noMsgLable_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new noMsgLable_ fail");\r
+        return;\r
+    }\r
+    noMsgLable_->SetPosition(NOMESSAGE_TITLE_X, NOMESSAGE_TITLE_Y,\r
+        NOMESSAGE_TITLE_WIDTH, NOMESSAGE_TITLE_HEIGHT);\r
+    noMsgLable_->SetText("没有通知");\r
+    noMsgLable_->SetAlign(TEXT_ALIGNMENT_CENTER);\r
+    noMsgLable_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, NOMESSAGE_TITLE_FONT_SIZE);\r
+    noMsgLable_->SetStyle(STYLE_BACKGROUND_COLOR, OPA_TRANSPARENT);\r
+\r
+    noMsgImage_ = new UIImageView();\r
+    if (noMsgImage_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new noMsgImage_ is nullptr");\r
+        return;\r
+    }\r
+    noMsgImage_->SetPosition(NOMESSAGE_ICON_X, NOMESSAGE_ICON_Y, NOMESSAGE_ICON_SIZE, NOMESSAGE_ICON_SIZE);\r
+    LOADIMG::LoadImageViewImg(noMsgImage_, MESSAGE_IMAGE, IMAGE_MESSAGE_RING);\r
+    Add(noMsgLable_);\r
+    Add(noMsgImage_);\r
+}\r
+\r
+void MessageMainPage::CancelDelete(void)\r
+{\r
+    deleteGroup_->SetVisible(false);\r
+    if (! msgLable_->IsVisible()) {\r
+        msgLable_->SetVisible(true);\r
+    }\r
+    if (! deleteImage_->IsVisible()) {\r
+        deleteImage_->SetVisible(true);\r
+    }\r
+    if (! msgList_->IsVisible()) {\r
+        msgList_->SetVisible(true);\r
+    }\r
+}\r
+\r
+static UIView* CreateViewCb(uint8_t type)\r
+{\r
+    MessageItemView* item = new MessageItemView();\r
+    if (item == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new item is nullptr");\r
+        return nullptr;\r
+    }\r
+    item->SetPosition(0, 0, HORIZONTAL_RESOLUTION, MESSAGE_ITEM_HEIGHT);\r
+    item->SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
+    item->SetStyle(STYLE_BACKGROUND_OPA, UN_OPACITY);\r
+    item->SetTouchable(true);\r
+    item->SetOnClickListener(g_pMessageMainView);\r
+    return item;\r
+}\r
+\r
+static void UpdateViewCb(UIView* view, void* data, uint8_t type)\r
+{\r
+    MessageItemView* item = dynamic_cast<MessageItemView*>(view);\r
+    if (data == nullptr || item == nullptr) {\r
+        return;\r
+    }\r
+    MessageItem* content = static_cast<MessageItem *>(data);\r
+    item->SetItemInfo(*content);\r
+}\r
+\r
+void MessageMainPage::RefreshMsgList(std::vector<MessageItem> &item)\r
+{\r
+    if (item.size() == 0) {\r
+        msgLable_->SetVisible(true);\r
+        deleteImage_->SetVisible(false);\r
+        msgList_->SetVisible(false);\r
+        deleteGroup_->SetVisible(false);\r
+        noMsgLable_->SetVisible(true);\r
+        noMsgImage_->SetVisible(true);\r
+        return;\r
+    }        \r
+     // 设置msgList_数据\r
+    msgList_->ClearAll();\r
+    for (size_t i = 0; i < item.size(); ++i) {\r
+        Contents content;\r
+        content.createFunc = CreateViewCb;\r
+        content.updateFunc = UpdateViewCb;\r
+        content.type = 1;\r
+        content.data = reinterpret_cast<void *>(&item[i]);\r
+        msgList_->AddContent(content);\r
+    }\r
+    msgList_->RefreshList();\r
+}\r
+\r
+bool MessageMainPage::InitScrollData()\r
+{\r
+    std::vector<MessageItem> &itemInfo = MessageModel::GetInstance().GetMsgListItems();\r
+    RefreshMsgList(itemInfo);\r
+    return true;\r
+}\r
+\r
+bool MessageMainPage::OnClick(UIView &view, const ClickEvent &event)\r
+{\r
+    UNUSED(event);\r
+    if (strcmp(view.GetViewId(), DELETE_BUTTON) == 0) {\r
+        ConfirmDelete();\r
+    } else if (strcmp(view.GetViewId(), CONFIRM_BUTTON) == 0) {\r
+        VerticalViewInits();\r
+        MessageModel::GetInstance().ClearListItem();\r
+        MessageModel::GetInstance().SetIndex(0);\r
+    } else if (strcmp(view.GetViewId(), CANCEL_BUTTON) == 0) {\r
+        CancelDelete();\r
+    } else {\r
+        // 点击的是消息item条目\r
+        MessageItemView *MessageItemViewID = static_cast<MessageItemView *>(&view);\r
+        noMsgLable_->SetVisible(false);\r
+        msgLable_->SetVisible(false);\r
+        noMsgImage_->SetVisible(false);\r
+        deleteImage_->SetVisible(false);\r
+        msgList_->SetVisible(false);\r
+        LoadDetailsView();\r
+        detailsGroup_->detailsMsg_ = MessageItemViewID->GetItem();\r
+        detailsGroup_->RefreshNotify();\r
+    }\r
+    return true;\r
+}\r
+\r
+bool MessageMainPage::OnDragStartEvent(const DragEvent &event)\r
+{\r
+    UNUSED(event);\r
+    return true;\r
+}\r
+\r
+bool MessageMainPage::OnDragEvent(const DragEvent &event)\r
+{\r
+    int16_t deltaX = event.GetDeltaX();\r
+    int16_t deltaY = event.GetDeltaY();\r
+    if (event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT &&\r
+        (MATH_ABS(deltaX) >= MATH_ABS(deltaY) && MATH_ABS(deltaX) > MOVE_DISTANCE)) {\r
+        // 返回主页面\r
+        DeleteDetailsView();\r
+        noMsgLable_->SetVisible(true);\r
+        msgLable_->SetVisible(true);\r
+        noMsgImage_->SetVisible(true);\r
+        deleteImage_->SetVisible(true);\r
+        msgList_->SetVisible(true);\r
+        return true;\r
+    }\r
+    return true;\r
+}\r
+\r
+void MessageMainPage::LoadDetailsView(void)\r
+{\r
+    detailsGroup_ = new DetailsGroup();\r
+    if (detailsGroup_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new detailsGroup_ is nullptr");\r
+        return;\r
+    }\r
+    Add(detailsGroup_);\r
+}\r
+\r
+void MessageMainPage::DeleteDetailsView(void)\r
+{\r
+    if (detailsGroup_ != nullptr) {\r
+        Remove(detailsGroup_);\r
+        delete detailsGroup_;\r
+        detailsGroup_ = nullptr;\r
+    }\r
+}\r
+\r
+bool MessageMainPage::OnDragEndEvent(const DragEvent &event)\r
+{\r
+    if (event.GetDragDirection() == DragEvent::DIRECTION_TOP_TO_BOTTOM ||\r
+        event.GetDragDirection() == DragEvent::DIRECTION_BOTTOM_TO_TOP) {\r
+        std::vector<MessageItem> &itemInfo = MessageModel::GetInstance().GetMsgListItems();\r
+        for (size_t i = 0; i < itemInfo.size(); ++i) {\r
+            itemInfo[i].status = false;\r
+        }\r
+        RefreshMsgList(itemInfo);\r
+    }\r
+    return true;\r
+}\r
+}\r
index 8bbdf47..7c938c4 100644 (file)
 /*\r
- * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved.\r
- * Description: MainModel.cpp\r
- * Author:\r
- * Create: 2021-11-23\r
- */\r
+* Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+* Description: MessageModel\r
+* Create: 2025-06-29\r
+*/\r
 \r
 #include "unistd.h"\r
-#include "main/MessageModel.h"\r
-#include "main/MessageMainView.h"\r
+#include <sys/time.h>\r
 #include "kv_store.h"\r
+#include <hal_tick.h>\r
+#include <cstdint>\r
+#include <random>\r
+#ifdef BUILD_IN_LINUX\r
+#include "localtime.h"\r
+#endif\r
 #include "securec.h"\r
 #include "wearable_log.h"\r
 #include "main/DialBinTypesV2.h"\r
 #include "power_display_service.h"\r
-#include <hal_tick.h>\r
-#include <cstdint>\r
-#include <random>\r
+#include "main/MessageMainPage.h"\r
+#include "main/MessageModel.h"\r
+\r
 namespace OHOS {\r
-    MessageModel::MessageModel() {\r
-        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MessageModel::MessageModel");\r
-    }\r
 \r
-    MessageModel::~MessageModel() {\r
-        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MessageModel::~MessageModel");\r
-    }\r
+static constexpr int16_t MESSAGE_MAX = 20;\r
+static constexpr int32_t SECONDS = 60;\r
+static constexpr int32_t HOURS = 3600;\r
+static constexpr int32_t ONE_DAY = 86400;\r
+static constexpr int16_t BUFFER_MAX = 6;\r
 \r
-    MessageModel &MessageModel::GetInstance()\r
-    {\r
-        static MessageModel instance;\r
-        return instance;\r
-    }\r
+MessageModel::MessageModel() {}\r
+\r
+MessageModel::~MessageModel() {}\r
+\r
+MessageModel &MessageModel::GetInstance()\r
+{\r
+    static MessageModel instance;\r
+    return instance;\r
+}\r
 \r
-    void MessageModel::GetMessageInfo(std::string app, std::string contact, std::string information)\r
-    {\r
-        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MessageModel::GetMessageInfo");\r
-        //保存数据\r
-        mes.label_1 = app; // 应用\r
-        mes.label_2 = contact; // 联系人\r
-        mes.label_3 = information; // 内容\r
-        mes.icon = "默认";\r
-        // if (app == 微信) {\r
-        //     mes1.icon = 微信图标;\r
-        // }\r
-        // if (app == 信息) {\r
-        //     mes1.icon = 信息图标;\r
-        // }\r
-        InitMessageItem();\r
-        if (GetViewStatus()) {\r
-            if (! MessageMainView::GetInstance()->contentList->IsVisible()) {\r
-                MessageMainView::GetInstance()->NewNotify();\r
-            }\r
-            MessageMainView::GetInstance()->InitScrollData();\r
+// 将数据转换,保存到model模块\r
+void MessageModel::SaveMsgToModel(std::string app, std::string contact, std::string information)\r
+{\r
+    mes_.appName = app; // 应用\r
+    mes_.appContact = contact; // 联系人\r
+    mes_.appContents = information; // 内容\r
+    mes_.time = "现在";\r
+    for (int i = 0; i < vecMsg_.size(); ++i) {\r
+        if (vecMsg_[i].appName == mes_.appName && vecMsg_[i].appContact == mes_.appContact) {\r
+            mes_.index = index_;\r
+            indexAdd_ = false;\r
+            break;\r
         }\r
+        indexAdd_ = true;\r
+        continue;\r
     }\r
+    if (indexAdd_) {\r
+        mes_.index = index_++;\r
+    }\r
+    gettimeofday(&currentTime_, nullptr);\r
+    mes_.initialTime = currentTime_.tv_sec;\r
+}\r
 \r
-    void MessageModel::InitMessageItem()\r
-    {\r
-        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MessageModel::InitMessageItem");\r
-        if (vecMsg.size() != 0) {\r
-            WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MessageModel::InitMessageItem,vecMsg.size() != 0");\r
-            size_t i = 0;\r
-            for (i; i < vecMsg.size(); ++i) {\r
-                WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MessageModel::InitMessageItem,for()");\r
-                WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MessageModel::InitMessageItem,vecMsg[i].label_1 = %s", vecMsg[i].label_1.c_str());\r
-                WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MessageModel::InitMessageItem,vecMsg[i].label_2 = %s", vecMsg[i].label_2.c_str());\r
-                WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MessageModel::InitMessageItem,vecMsg[i].label_3 = %s", vecMsg[i].label_3.c_str());\r
-                WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MessageModel::InitMessageItem,mes.label_1 = %s", mes.label_1.c_str());\r
-                WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MessageModel::InitMessageItem,mes.label_2 = %s", mes.label_2.c_str());\r
-                WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MessageModel::InitMessageItem,mes.label_3 = %s", mes.label_3.c_str());\r
-                if (vecMsg[i].label_1 == mes.label_1 && vecMsg[i].label_2 == mes.label_2) {\r
-                    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MessageModel::InitMessageItem,if()");\r
-                    vecMsg[i].label_3 = mes.label_3;\r
-                    break;\r
-                }\r
-                WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MessageModel::InitMessageItem,else(break)");\r
-                continue;\r
-            }\r
-            if (i == vecMsg.size()) {\r
-                vecMsg.push_back(mes);\r
-            }\r
-        } else {\r
-            WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MessageModel::InitMessageItem,else()");\r
-            vecMsg.push_back(mes);\r
+// 将转换好的数据存到vecMsg_\r
+void MessageModel::SetMsgListItems()\r
+{\r
+    for (size_t i = 0; i < vecMsg_.size(); ++i) {\r
+        if (vecMsg_[i].appName == mes_.appName && vecMsg_[i].appContact == mes_.appContact) {\r
+            vecMsg_[i].appContents = mes_.appContents;\r
+            vecMsg_[i].time = "现在";\r
+            return;\r
         }\r
     }\r
+    if (vecMsg_.size() < MESSAGE_MAX) {\r
+        vecMsg_.push_back(mes_);\r
+    } else {\r
+        vecMsg_.erase(vecMsg_.begin());\r
+        vecMsg_.push_back(mes_);\r
+        int j = 0;\r
+        for (j; j < vecMsg_.size(); ++j) {\r
+            vecMsg_[j].index = j;\r
+        }\r
+        SetIndex(j);\r
+    }\r
+    // 收到新的消息后,需要同步将消息进行展示\r
+    if (MessageModel::GetInstance().GetViewStatus()) {\r
+        if (! MessageMainPage::GetInstance()->msgList_->IsVisible()) {\r
+            MessageMainPage::GetInstance()->NewNotify();\r
+        }\r
+        MessageMainPage::GetInstance()->InitScrollData();\r
+    }\r
+}\r
+\r
+std::vector<MessageItem> &MessageModel::GetMsgListItems()\r
+{\r
+    return vecMsg_;\r
+}\r
+\r
+void MessageModel::ClearListItem()\r
+{\r
+    vecMsg_.clear();\r
+}\r
+\r
+void MessageModel::SetViewStatus(bool viewStatus)\r
+{\r
+    viewInitStatus_ = viewStatus;\r
+}\r
+\r
+bool MessageModel::GetViewStatus(void)\r
+{\r
+    return viewInitStatus_;\r
+}\r
 \r
-    const std::vector<MessageItem> MessageModel::GetMessagelistItems() const\r
-    {                                                                                   \r
-        return vecMsg;\r
+void MessageModel::SetTime(void)\r
+{\r
+    if (vecMsg_.size() != 0) {\r
+        for (size_t i = 0; i < vecMsg_.size(); ++i) {\r
+            durTime_ = UpdateTime(vecMsg_[i].initialTime);\r
+            vecMsg_[i].time = durTime_;\r
+        }\r
     }\r
+    return;\r
+}\r
+\r
+std::string MessageModel::UpdateTime(long time)\r
+{\r
+    struct timeval tv;\r
+    gettimeofday(&tv, nullptr);\r
+    auto now = tv.tv_sec;\r
+    auto seconds = now - time;\r
 \r
-    void MessageModel::ClearListItem()\r
-    {\r
-        vecMsg.clear();\r
+    if (seconds < 0) {\r
+        return "未来时间";\r
     }\r
 \r
-    void MessageModel::SetViewStatus(bool viewStatus)\r
-    {\r
-        viewInitStatus = viewStatus;\r
+    if (seconds < SECONDS) {\r
+        return "现在";\r
+    } else if (seconds < HOURS) {\r
+        long minutes = seconds / SECONDS;\r
+        return std::to_string(minutes) + "分钟前";\r
+    } else if (seconds < ONE_DAY) {\r
+        long hours = seconds / HOURS;\r
+        return std::to_string(hours) + "小时前";\r
+    } else {\r
+        struct tm timeinfo;\r
+        time_t t = static_cast<time_t>(time);\r
+        localtime_r(&t, &timeinfo);\r
+        char buffer[BUFFER_MAX];\r
+        snprintf_s(buffer, sizeof(buffer), sizeof(buffer) - 1, "%02d/%02d", timeinfo.tm_mon + 1, timeinfo.tm_mday);\r
+        return std::string(buffer);\r
     }\r
+}\r
 \r
-    bool MessageModel::GetViewStatus(void)\r
-    {\r
-        return viewInitStatus;\r
+void MessageModel::DeleteItem(MessageItem itemInfo)\r
+{\r
+    for (int i = 0; i < vecMsg_.size(); ++i) {\r
+        if (vecMsg_[i].appName == itemInfo.appName && vecMsg_[i].appContact == itemInfo.appContact) {\r
+            vecMsg_.erase(vecMsg_.begin() + i);\r
+            break;\r
+        }\r
+        continue;\r
     }\r
+    int j = 0;\r
+    for (j; j < vecMsg_.size(); ++j) {\r
+        vecMsg_[j].index = j;\r
+    }\r
+    MessageMainPage::GetInstance()->RefreshMsgList(vecMsg_);\r
+    SetIndex(j);\r
+}\r
+\r
+void MessageModel::SetIndex(uint16_t itemIndex)\r
+{\r
+    index_ = itemIndex;\r
+}\r
 }\r
index 5971ec4..1f59286 100644 (file)
@@ -1,36 +1,36 @@
-/*
- * Copyright (c) 2020-2021 CompanyNameMagicTag.
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "main/ModelListenerSample.h"
-
-#include "wearable_log.h"
-namespace OHOS {
-ModelListenerSample::ModelListenerSample()
-{
-    Init();
-    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ModelListenerSample::ModelListenerSample");
-}
-ModelListenerSample::~ModelListenerSample()
-{
-    Deinit();
-    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ModelListenerSample::~ModelListenerSample");
-}
-
-void ModelListenerSample::Callback()
-{
-    Notify();
-    OnTickEvent();
-}
-}
+/*\r
+ * Copyright (c) 2020-2021 CompanyNameMagicTag.\r
+ * Licensed under the Apache License, Version 2.0 (the "License");\r
+ * you may not use this file except in compliance with the License.\r
+ * You may obtain a copy of the License at\r
+ *\r
+ *     http://www.apache.org/licenses/LICENSE-2.0\r
+ *\r
+ * Unless required by applicable law or agreed to in writing, software\r
+ * distributed under the License is distributed on an "AS IS" BASIS,\r
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+ * See the License for the specific language governing permissions and\r
+ * limitations under the License.\r
+ */\r
+\r
+#include "main/ModelListenerSample.h"\r
+\r
+#include "wearable_log.h"\r
+namespace OHOS {\r
+ModelListenerSample::ModelListenerSample()\r
+{\r
+    Init();\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ModelListenerSample::ModelListenerSample");\r
+}\r
+ModelListenerSample::~ModelListenerSample()\r
+{\r
+    Deinit();\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ModelListenerSample::~ModelListenerSample");\r
+}\r
+\r
+void ModelListenerSample::Callback()\r
+{\r
+    Notify();\r
+    OnTickEvent();\r
+}\r
+}
\ No newline at end of file
index 810d3ab..7a28700 100644 (file)
-/*
- * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved.
- * Description: WeekStep
- * Author:
- * Create: 2021-09-11
- */
-
-#include "main/PullUpDownView.h"
-#include "wearable_log.h"
-#include "UiConfig.h"
-#include "common/screen.h"
-#include "main/MainPresenterSample.h"
-#include "screensetting/ScreenModels.h"
-#include "settings/SettingModel.h"
-#include "ui_resource_image.h"
-
-namespace OHOS {
-
-static PullUpDownView *g_pPullUpDownView = nullptr;
-
-constexpr int16_t DISTURB_IMG_X = 117;
-constexpr int16_t DISTURB_IMG_Y = 50;
-constexpr int16_t SCREEN_IMG_X = 251;
-constexpr int16_t SCREEN_IMG_Y = 50;
-constexpr int16_t PHONE_IMG_X = 49;
-constexpr int16_t PHONE_IMG_Y = 184;
-constexpr int16_t ALARM_IMG_X = 184;
-constexpr int16_t ALARM_IMG_Y = 184;
-constexpr int16_t SETTING_IMG_X = 319;
-constexpr int16_t SETTING_IMG_Y = 184;
-
-constexpr int16_t BLUETOOTH_IMG_X = 145;
-constexpr int16_t BLUETOOTH_IMG_Y = 335;
-constexpr int16_t BATTERY_IMG_X = 195;
-constexpr int16_t BATTERY_IMG_Y = 340;
-
-constexpr int16_t DISTURB_LABEL_X = 136;
-constexpr int16_t DISTURB_LABEL_Y = 145;
-constexpr int16_t SCREEN_LABEL_X = 270;
-constexpr int16_t SCREEN_LABEL_Y = 145;
-constexpr int16_t PHONE_LABEL_X = 68;
-constexpr int16_t PHONE_LABEL_Y = 279;
-constexpr int16_t ALARM_LABEL_X = 203;
-constexpr int16_t ALARM_LABEL_Y = 279;
-constexpr int16_t SETTING_LABEL_X = 338;
-constexpr int16_t SETTING_LABEL_Y = 279;
-
-constexpr int16_t BATTERY_LABEL_X = 247;
-constexpr int16_t BATTERY_LABEL_Y = 335;
-constexpr int16_t DATE_LABEL_X = 173;
-constexpr int16_t DATE_LABEL_Y = 374;
-
-constexpr int16_t FONT_DEFAULT_SIZE = 24;
-constexpr int16_t TEXT_WIDTH = 86;
-constexpr int16_t TEXT_HEIGHT = 30;
-
-constexpr int16_t NONOTICE_LABLE_X = 141;
-constexpr int16_t NONOTICE_LABLE_Y = 212;
-
-PullUpDownView::PullUpDownView()
-{
-    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "PullUpDownView::PullUpDownView");
-    g_pPullUpDownView = this;
-}
-
-PullUpDownView::~PullUpDownView()
-{
-    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "PullUpDownView::~PullUpDownView");
-    RemoveAll();
-    delete dnotDisturb;
-    dnotDisturb = nullptr;
-    delete briScreen;
-    briScreen = nullptr;
-    delete finPhone;
-    finPhone = nullptr;
-    delete droAlarm;
-    droAlarm = nullptr;
-    delete droSetting;
-    droSetting = nullptr;
-    delete dnotDisturbLable;
-    dnotDisturbLable = nullptr;
-    delete briScreenLable;
-    briScreenLable = nullptr;
-    delete finPhoneLable;
-    finPhoneLable = nullptr;
-    delete droAlarmLable;
-    droAlarmLable = nullptr;
-    delete droSettingLable;
-    droSettingLable = nullptr;
-    delete bluetooth;
-    bluetooth = nullptr;
-    delete battery;
-    battery = nullptr;
-    delete batteryLable;
-    batteryLable = nullptr;
-    delete dateLable;
-    dateLable = nullptr;
-    g_pPullUpDownView = nullptr;
-}
-
-PullUpDownView *PullUpDownView::GetInstance(void)
-{
-    return g_pPullUpDownView;
-}
-
-void PullUpDownView::InitSubViewImg(void)
-{
-    if (HealthModel::GetInstance() == nullptr) {
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "health model nullptr");
-        return;
-    }
-
-    dnotDisturb = new UIImageView();
-    if (dnotDisturb == nullptr) {
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "dnotDisturb new fail");
-        return;
-    }
-    dnotDisturb->SetPosition(DISTURB_IMG_X, DISTURB_IMG_Y);
-    if (HealthModel::GetInstance()->GetDntDistStatus() == 0) {
-        ScreenModels::GetInstance()->LoadAppImages(DROPDOWN_IAMGES, dnotDisturb, DROPDOWN_DROPDOWN_DN_DISTURB);
-    } else {
-        ScreenModels::GetInstance()->LoadAppImages(DROPDOWN_IAMGES, dnotDisturb, DROPDOWN_DROPDOWN_DN_DISTURB_B);
-    }
-    dnotDisturb->SetViewId(DROPDOWN_CLICK_DONOTDISTURB);
-    dnotDisturb->SetTouchable(true);
-    dnotDisturb->SetOnClickListener(clickListener); // 进入勿扰模式
-
-    briScreen = new UIImageView();
-    if (briScreen == nullptr) {
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "briScreen new fail");
-        return;
-    }
-    briScreen->SetPosition(SCREEN_IMG_X, SCREEN_IMG_Y);
-    if (HealthModel::GetInstance()->GetBriScrStatus() == 0) {
-        ScreenModels::GetInstance()->LoadAppImages(DROPDOWN_IAMGES, briScreen, DROPDOWN_DROPDOWN_BRI_SCREEN);
-    } else {
-        ScreenModels::GetInstance()->LoadAppImages(DROPDOWN_IAMGES, briScreen, DROPDOWN_DROPDOWN_BRI_SCREEN_B);
-    }
-    briScreen->SetViewId(DROPDOWN_CLICK_BRIGHTENSCREEN);
-    briScreen->SetTouchable(true);
-    briScreen->SetOnClickListener(clickListener); // 进入亮屏模式
-}
-
-void PullUpDownView::InitViewImg(void)
-{
-    InitSubViewImg();
-
-    finPhone = new UIImageView();
-    if (finPhone == nullptr) {
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "finPhone new fail");
-        return;
-    }
-    finPhone->SetPosition(PHONE_IMG_X, PHONE_IMG_Y);
-    ScreenModels::GetInstance()->LoadAppImages(DROPDOWN_IAMGES, finPhone, DROPDOWN_DROPDOWN_FIND_PHONE);
-    finPhone->SetViewId(DROPDOWN_CLICK_FINDMYPHONE); // 找手机界面 DROP_DOWN_FIND_PHONE
-    finPhone->SetTouchable(true);
-    finPhone->SetOnClickListener(clickListener);
-
-    droAlarm = new UIImageView();
-    if (droAlarm == nullptr) {
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "droAlarm new fail");
-        return;
-    }
-    droAlarm->SetPosition(ALARM_IMG_X, ALARM_IMG_Y);
-    ScreenModels::GetInstance()->LoadAppImages(DROPDOWN_IAMGES, droAlarm, DROPDOWN_DROPDOWN_ALARM);
-    droAlarm->SetViewId(DROPDOWN_CLICK_ALARM); // 进入闹钟App DROP_DOWN_ALARM
-    droAlarm->SetTouchable(true);
-    droAlarm->SetOnClickListener(clickListener);
-
-    droSetting = new UIImageView();
-    if (droSetting == nullptr) {
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "droSetting new fail");
-        return;
-    }
-    droSetting->SetPosition(SETTING_IMG_X, SETTING_IMG_Y);
-    ScreenModels::GetInstance()->LoadAppImages(DROPDOWN_IAMGES, droSetting, DROPDOWN_DROPDOWN_SETTING);
-    droSetting->SetViewId(DROPDOWN_CLICK_SETTING); // 进入设置界面 DROP_DOWN_SETTING
-    droSetting->SetTouchable(true);
-    droSetting->SetOnClickListener(clickListener);
-}
-
-void PullUpDownView::InitViewLable(void)
-{
-    dnotDisturbLable = new UILabel();
-    if (dnotDisturbLable == nullptr) {
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "dnotDisturbLable new fail");
-        return;
-    }
-    dnotDisturbLable->SetPosition(DISTURB_LABEL_X, DISTURB_LABEL_Y, TEXT_WIDTH, TEXT_HEIGHT);
-    dnotDisturbLable->SetText("勿扰");
-    dnotDisturbLable->SetFont(DEFAULT_VECTOR_FONT_FILENAME, FONT_DEFAULT_SIZE);
-    dnotDisturbLable->SetStyle(STYLE_BACKGROUND_COLOR, OPA_TRANSPARENT);
-    briScreenLable = new UILabel();
-    if (briScreenLable == nullptr) {
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "briScreenLable new fail");
-        return;
-    }
-    briScreenLable->SetPosition(SCREEN_LABEL_X, SCREEN_LABEL_Y, TEXT_WIDTH, TEXT_HEIGHT);
-    briScreenLable->SetText("亮屏");
-    briScreenLable->SetFont(DEFAULT_VECTOR_FONT_FILENAME, FONT_DEFAULT_SIZE);
-    briScreenLable->SetStyle(STYLE_BACKGROUND_COLOR, OPA_TRANSPARENT);
-    finPhoneLable = new UILabel();
-    if (finPhoneLable == nullptr) {
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "finPhoneLable new fail");
-        return;
-    }
-    finPhoneLable->SetPosition(PHONE_LABEL_X, PHONE_LABEL_Y, TEXT_WIDTH, TEXT_HEIGHT);
-    finPhoneLable->SetText("找手机");
-    finPhoneLable->SetFont(DEFAULT_VECTOR_FONT_FILENAME, FONT_DEFAULT_SIZE);
-    finPhoneLable->SetStyle(STYLE_BACKGROUND_COLOR, OPA_TRANSPARENT);
-    droAlarmLable = new UILabel();
-    if (finPhoneLable == nullptr) {
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "finPhoneLable new fail");
-        return;
-    }
-    droAlarmLable->SetPosition(ALARM_LABEL_X, ALARM_LABEL_Y, TEXT_WIDTH, TEXT_HEIGHT);
-    droAlarmLable->SetText("闹钟");
-    droAlarmLable->SetFont(DEFAULT_VECTOR_FONT_FILENAME, FONT_DEFAULT_SIZE);
-    droAlarmLable->SetStyle(STYLE_BACKGROUND_COLOR, OPA_TRANSPARENT);
-    droSettingLable = new UILabel();
-    if (droSettingLable == nullptr) {
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "droSettingLable new fail");
-        return;
-    }
-    droSettingLable->SetPosition(SETTING_LABEL_X, SETTING_LABEL_Y, TEXT_WIDTH, TEXT_HEIGHT);
-    droSettingLable->SetText("设置");
-    droSettingLable->SetFont(DEFAULT_VECTOR_FONT_FILENAME, FONT_DEFAULT_SIZE);
-    droSettingLable->SetStyle(STYLE_BACKGROUND_COLOR, OPA_TRANSPARENT);
-}
-
-void PullUpDownView::InitViewInfo(void)
-{
-    bluetooth = new UIImageView(); // 蓝牙状态显示
-    if (bluetooth == nullptr) {
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "bluetooth new fail");
-        return;
-    }
-    bluetooth->SetPosition(BLUETOOTH_IMG_X, BLUETOOTH_IMG_Y);
-    if (BluetoothModel::GetInstance() == nullptr) {
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "bluetooth model nullptr");
-        return;
-    }
-
-    if (SettingModel::GetInstance().GetBlueToothConnectStatus()) {
-        ScreenModels::GetInstance()->LoadAppImages(DROPDOWN_IAMGES, bluetooth, DROPDOWN_DROPDOWN_BLUETOOTH_B);
-    } else {
-        ScreenModels::GetInstance()->LoadAppImages(DROPDOWN_IAMGES, bluetooth, DROPDOWN_DROPDOWN_BLUETOOTH);
-    }
-
-    battery = new UIImageView(); // 电量状态显示
-    if (battery == nullptr) {
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "battery new fail");
-        return;
-    }
-    battery->SetPosition(BATTERY_IMG_X, BATTERY_IMG_Y);
-    ScreenModels::GetInstance()->LoadAppImages(DROPDOWN_IAMGES, battery, DROPDOWN_DROPDOWN_BATTERY);
-    batteryLable = new UILabel();
-    if (batteryLable == nullptr) {
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "batteryLable new fail");
-        return;
-    }
-    batteryLable->SetPosition(BATTERY_LABEL_X, BATTERY_LABEL_Y, TEXT_WIDTH, TEXT_HEIGHT);
-    batteryLable->SetText("90%");
-    batteryLable->SetFont(DEFAULT_VECTOR_FONT_FILENAME, FONT_DEFAULT_SIZE);
-    batteryLable->SetStyle(STYLE_BACKGROUND_COLOR, OPA_TRANSPARENT);
-    dateLable = new UILabel();
-    if (dateLable == nullptr) {
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "dateLable new fail");
-        return;
-    }
-    dateLable->SetPosition(DATE_LABEL_X, DATE_LABEL_Y, 192, TEXT_HEIGHT); // TEXT_WIDTH = 192
-    dateLable->SetText("10/23 星期五");
-    dateLable->SetFont(DEFAULT_VECTOR_FONT_FILENAME, FONT_DEFAULT_SIZE);
-    dateLable->SetStyle(STYLE_BACKGROUND_COLOR, OPA_TRANSPARENT);
-}
-
-bool PullUpDownView::InitView()
-{
-    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "PullUpDownView::InitDropDownView");
-    clickListener = (UIView::OnClickListener *)OHOS::MainPresenterSample::GetInstance();
-
-    InitViewImg();
-    InitViewLable();
-    InitViewInfo();
-
-    Add(dnotDisturb);
-    Add(dnotDisturbLable);
-    Add(briScreen);
-    Add(briScreenLable);
-    Add(finPhone);
-    Add(finPhoneLable);
-    Add(droAlarm);
-    Add(droAlarmLable);
-    Add(droSetting);
-    Add(droSettingLable);
-    Add(bluetooth);
-    Add(battery);
-    Add(batteryLable);
-    Add(dateLable);
-
-    SetTouchable(true);
-    SetIntercept(true);
-
-    return true;
-}
-
-void PullUpDownView::PreLoad(void)
-{
-    if (!viewiInitStatus) {
-        InitView();
-        viewiInitStatus = true;
-    }
-}
-
-void PullUpDownView::UpdateBlueToothStatus(int status)
-{
-    if (bluetooth == nullptr) {
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "bluetooth nullptr");
-        return;
-    }
-    if (status == 1) {
-        ScreenModels::GetInstance()->LoadAppImages(DROPDOWN_IAMGES, bluetooth, DROPDOWN_DROPDOWN_BLUETOOTH_B);
-    } else {
-        ScreenModels::GetInstance()->LoadAppImages(DROPDOWN_IAMGES, bluetooth, DROPDOWN_DROPDOWN_BLUETOOTH);
-    }
-    bluetooth->Invalidate();
-    return;
-}
-
-}
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: PullUpDownView\r
+ * Create: 2025-06-29\r
+ */\r
+\r
+#include "wearable_log.h"\r
+#include "UiConfig.h"\r
+#include "common/screen.h"\r
+#include "main/MainPresenterSample.h"\r
+#include "screensetting/ScreenModels.h"\r
+#include "settings/model/SettingBluetoothModel.h"\r
+#include "ui_resource_image.h"\r
+#include "main/PullUpDownView.h"\r
+\r
+namespace OHOS {\r
+\r
+static PullUpDownView *g_pPullUpDownView = nullptr;\r
+\r
+constexpr int16_t DISTURB_IMG_X = 117;\r
+constexpr int16_t DISTURB_IMG_Y = 50;\r
+constexpr int16_t SCREEN_IMG_X = 251;\r
+constexpr int16_t SCREEN_IMG_Y = 50;\r
+constexpr int16_t PHONE_IMG_X = 49;\r
+constexpr int16_t PHONE_IMG_Y = 184;\r
+constexpr int16_t ALARM_IMG_X = 184;\r
+constexpr int16_t ALARM_IMG_Y = 184;\r
+constexpr int16_t SETTING_IMG_X = 319;\r
+constexpr int16_t SETTING_IMG_Y = 184;\r
+\r
+constexpr int16_t BLUETOOTH_IMG_X = 145;\r
+constexpr int16_t BLUETOOTH_IMG_Y = 335;\r
+constexpr int16_t BATTERY_IMG_X = 195;\r
+constexpr int16_t BATTERY_IMG_Y = 340;\r
+\r
+constexpr int16_t DISTURB_LABEL_X = 136;\r
+constexpr int16_t DISTURB_LABEL_Y = 145;\r
+constexpr int16_t SCREEN_LABEL_X = 270;\r
+constexpr int16_t SCREEN_LABEL_Y = 145;\r
+constexpr int16_t PHONE_LABEL_X = 68;\r
+constexpr int16_t PHONE_LABEL_Y = 279;\r
+constexpr int16_t ALARM_LABEL_X = 203;\r
+constexpr int16_t ALARM_LABEL_Y = 279;\r
+constexpr int16_t SETTING_LABEL_X = 338;\r
+constexpr int16_t SETTING_LABEL_Y = 279;\r
+\r
+constexpr int16_t BATTERY_LABEL_X = 247;\r
+constexpr int16_t BATTERY_LABEL_Y = 335;\r
+constexpr int16_t DATE_LABEL_X = 173;\r
+constexpr int16_t DATE_LABEL_Y = 374;\r
+\r
+constexpr int16_t FONT_DEFAULT_SIZE = 24;\r
+constexpr int16_t TEXT_WIDTH = 86;\r
+constexpr int16_t TEXT_HEIGHT = 30;\r
+\r
+constexpr int16_t NONOTICE_LABLE_X = 141;\r
+constexpr int16_t NONOTICE_LABLE_Y = 212;\r
+\r
+PullUpDownView::PullUpDownView()\r
+{\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "PullUpDownView::PullUpDownView");\r
+    g_pPullUpDownView = this;\r
+}\r
+\r
+PullUpDownView::~PullUpDownView()\r
+{\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "PullUpDownView::~PullUpDownView");\r
+    RemoveAll();\r
+    delete dnotDisturb;\r
+    dnotDisturb = nullptr;\r
+    delete briScreen;\r
+    briScreen = nullptr;\r
+    delete finPhone;\r
+    finPhone = nullptr;\r
+    delete droAlarm;\r
+    droAlarm = nullptr;\r
+    delete droSetting;\r
+    droSetting = nullptr;\r
+    delete dnotDisturbLable;\r
+    dnotDisturbLable = nullptr;\r
+    delete briScreenLable;\r
+    briScreenLable = nullptr;\r
+    delete finPhoneLable;\r
+    finPhoneLable = nullptr;\r
+    delete droAlarmLable;\r
+    droAlarmLable = nullptr;\r
+    delete droSettingLable;\r
+    droSettingLable = nullptr;\r
+    delete bluetooth;\r
+    bluetooth = nullptr;\r
+    delete battery;\r
+    battery = nullptr;\r
+    delete batteryLable;\r
+    batteryLable = nullptr;\r
+    delete dateLable;\r
+    dateLable = nullptr;\r
+    g_pPullUpDownView = nullptr;\r
+}\r
+\r
+PullUpDownView *PullUpDownView::GetInstance(void)\r
+{\r
+    return g_pPullUpDownView;\r
+}\r
+\r
+void PullUpDownView::InitSubViewImg(void)\r
+{\r
+    if (HealthModel::GetInstance() == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "health model nullptr");\r
+        return;\r
+    }\r
+\r
+    dnotDisturb = new UIImageView();\r
+    if (dnotDisturb == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "dnotDisturb new fail");\r
+        return;\r
+    }\r
+    dnotDisturb->SetPosition(DISTURB_IMG_X, DISTURB_IMG_Y);\r
+    if (HealthModel::GetInstance()->GetDntDistStatus() == 0) {\r
+        ScreenModels::GetInstance()->LoadAppImages(DROPDOWN_IAMGES, dnotDisturb, DROPDOWN_DROPDOWN_DN_DISTURB);\r
+    } else {\r
+        ScreenModels::GetInstance()->LoadAppImages(DROPDOWN_IAMGES, dnotDisturb, DROPDOWN_DROPDOWN_DN_DISTURB_B);\r
+    }\r
+    dnotDisturb->SetViewId(DROPDOWN_CLICK_DONOTDISTURB);\r
+    dnotDisturb->SetTouchable(true);\r
+    dnotDisturb->SetOnClickListener(clickListener); // 进入勿扰模式\r
+\r
+    briScreen = new UIImageView();\r
+    if (briScreen == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "briScreen new fail");\r
+        return;\r
+    }\r
+    briScreen->SetPosition(SCREEN_IMG_X, SCREEN_IMG_Y);\r
+    if (HealthModel::GetInstance()->GetBriScrStatus() == 0) {\r
+        ScreenModels::GetInstance()->LoadAppImages(DROPDOWN_IAMGES, briScreen, DROPDOWN_DROPDOWN_BRI_SCREEN);\r
+    } else {\r
+        ScreenModels::GetInstance()->LoadAppImages(DROPDOWN_IAMGES, briScreen, DROPDOWN_DROPDOWN_BRI_SCREEN_B);\r
+    }\r
+    briScreen->SetViewId(DROPDOWN_CLICK_BRIGHTENSCREEN);\r
+    briScreen->SetTouchable(true);\r
+    briScreen->SetOnClickListener(clickListener); // 进入亮屏模式\r
+}\r
+\r
+void PullUpDownView::InitViewImg(void)\r
+{\r
+    InitSubViewImg();\r
+\r
+    finPhone = new UIImageView();\r
+    if (finPhone == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "finPhone new fail");\r
+        return;\r
+    }\r
+    finPhone->SetPosition(PHONE_IMG_X, PHONE_IMG_Y);\r
+    ScreenModels::GetInstance()->LoadAppImages(DROPDOWN_IAMGES, finPhone, DROPDOWN_DROPDOWN_FIND_PHONE);\r
+    finPhone->SetViewId(DROPDOWN_CLICK_FINDMYPHONE); // 找手机界面 DROP_DOWN_FIND_PHONE\r
+    finPhone->SetTouchable(true);\r
+    finPhone->SetOnClickListener(clickListener);\r
+\r
+    droAlarm = new UIImageView();\r
+    if (droAlarm == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "droAlarm new fail");\r
+        return;\r
+    }\r
+    droAlarm->SetPosition(ALARM_IMG_X, ALARM_IMG_Y);\r
+    ScreenModels::GetInstance()->LoadAppImages(DROPDOWN_IAMGES, droAlarm, DROPDOWN_DROPDOWN_ALARM);\r
+    droAlarm->SetViewId(DROPDOWN_CLICK_ALARM); // 进入闹钟App DROP_DOWN_ALARM\r
+    droAlarm->SetTouchable(true);\r
+    droAlarm->SetOnClickListener(clickListener);\r
+\r
+    droSetting = new UIImageView();\r
+    if (droSetting == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "droSetting new fail");\r
+        return;\r
+    }\r
+    droSetting->SetPosition(SETTING_IMG_X, SETTING_IMG_Y);\r
+    ScreenModels::GetInstance()->LoadAppImages(DROPDOWN_IAMGES, droSetting, DROPDOWN_DROPDOWN_SETTING);\r
+    droSetting->SetViewId(DROPDOWN_CLICK_SETTING); // 进入设置界面 DROP_DOWN_SETTING\r
+    droSetting->SetTouchable(true);\r
+    droSetting->SetOnClickListener(clickListener);\r
+}\r
+\r
+void PullUpDownView::InitViewLable(void)\r
+{\r
+    dnotDisturbLable = new UILabel();\r
+    if (dnotDisturbLable == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "dnotDisturbLable new fail");\r
+        return;\r
+    }\r
+    dnotDisturbLable->SetPosition(DISTURB_LABEL_X, DISTURB_LABEL_Y, TEXT_WIDTH, TEXT_HEIGHT);\r
+    dnotDisturbLable->SetText("勿扰");\r
+    dnotDisturbLable->SetFont(DEFAULT_VECTOR_FONT_FILENAME, FONT_DEFAULT_SIZE);\r
+    dnotDisturbLable->SetStyle(STYLE_BACKGROUND_COLOR, OPA_TRANSPARENT);\r
+    briScreenLable = new UILabel();\r
+    if (briScreenLable == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "briScreenLable new fail");\r
+        return;\r
+    }\r
+    briScreenLable->SetPosition(SCREEN_LABEL_X, SCREEN_LABEL_Y, TEXT_WIDTH, TEXT_HEIGHT);\r
+    briScreenLable->SetText("亮屏");\r
+    briScreenLable->SetFont(DEFAULT_VECTOR_FONT_FILENAME, FONT_DEFAULT_SIZE);\r
+    briScreenLable->SetStyle(STYLE_BACKGROUND_COLOR, OPA_TRANSPARENT);\r
+    finPhoneLable = new UILabel();\r
+    if (finPhoneLable == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "finPhoneLable new fail");\r
+        return;\r
+    }\r
+    finPhoneLable->SetPosition(PHONE_LABEL_X, PHONE_LABEL_Y, TEXT_WIDTH, TEXT_HEIGHT);\r
+    finPhoneLable->SetText("找手机");\r
+    finPhoneLable->SetFont(DEFAULT_VECTOR_FONT_FILENAME, FONT_DEFAULT_SIZE);\r
+    finPhoneLable->SetStyle(STYLE_BACKGROUND_COLOR, OPA_TRANSPARENT);\r
+    droAlarmLable = new UILabel();\r
+    if (finPhoneLable == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "finPhoneLable new fail");\r
+        return;\r
+    }\r
+    droAlarmLable->SetPosition(ALARM_LABEL_X, ALARM_LABEL_Y, TEXT_WIDTH, TEXT_HEIGHT);\r
+    droAlarmLable->SetText("闹钟");\r
+    droAlarmLable->SetFont(DEFAULT_VECTOR_FONT_FILENAME, FONT_DEFAULT_SIZE);\r
+    droAlarmLable->SetStyle(STYLE_BACKGROUND_COLOR, OPA_TRANSPARENT);\r
+    droSettingLable = new UILabel();\r
+    if (droSettingLable == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "droSettingLable new fail");\r
+        return;\r
+    }\r
+    droSettingLable->SetPosition(SETTING_LABEL_X, SETTING_LABEL_Y, TEXT_WIDTH, TEXT_HEIGHT);\r
+    droSettingLable->SetText("设置");\r
+    droSettingLable->SetFont(DEFAULT_VECTOR_FONT_FILENAME, FONT_DEFAULT_SIZE);\r
+    droSettingLable->SetStyle(STYLE_BACKGROUND_COLOR, OPA_TRANSPARENT);\r
+}\r
+\r
+void PullUpDownView::InitViewInfo(void)\r
+{\r
+    bluetooth = new UIImageView(); // 蓝牙状态显示\r
+    if (bluetooth == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "bluetooth new fail");\r
+        return;\r
+    }\r
+    bluetooth->SetPosition(BLUETOOTH_IMG_X, BLUETOOTH_IMG_Y);\r
+    if (SettingBluetoothModel::GetInstance() == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "bluetooth model nullptr");\r
+        return;\r
+    }\r
+\r
+    if (SettingBluetoothModel::GetInstance()->GetAclConnected()) {\r
+        ScreenModels::GetInstance()->LoadAppImages(DROPDOWN_IAMGES, bluetooth, DROPDOWN_DROPDOWN_BLUETOOTH_B);\r
+    } else {\r
+        ScreenModels::GetInstance()->LoadAppImages(DROPDOWN_IAMGES, bluetooth, DROPDOWN_DROPDOWN_BLUETOOTH);\r
+    }\r
+\r
+    battery = new UIImageView(); // 电量状态显示\r
+    if (battery == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "battery new fail");\r
+        return;\r
+    }\r
+    battery->SetPosition(BATTERY_IMG_X, BATTERY_IMG_Y);\r
+    ScreenModels::GetInstance()->LoadAppImages(DROPDOWN_IAMGES, battery, DROPDOWN_DROPDOWN_BATTERY);\r
+    batteryLable = new UILabel();\r
+    if (batteryLable == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "batteryLable new fail");\r
+        return;\r
+    }\r
+    batteryLable->SetPosition(BATTERY_LABEL_X, BATTERY_LABEL_Y, TEXT_WIDTH, TEXT_HEIGHT);\r
+    batteryLable->SetText("90%");\r
+    batteryLable->SetFont(DEFAULT_VECTOR_FONT_FILENAME, FONT_DEFAULT_SIZE);\r
+    batteryLable->SetStyle(STYLE_BACKGROUND_COLOR, OPA_TRANSPARENT);\r
+    dateLable = new UILabel();\r
+    if (dateLable == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "dateLable new fail");\r
+        return;\r
+    }\r
+    dateLable->SetPosition(DATE_LABEL_X, DATE_LABEL_Y, 192, TEXT_HEIGHT); // TEXT_WIDTH = 192\r
+    dateLable->SetText("10/23 星期五");\r
+    dateLable->SetFont(DEFAULT_VECTOR_FONT_FILENAME, FONT_DEFAULT_SIZE);\r
+    dateLable->SetStyle(STYLE_BACKGROUND_COLOR, OPA_TRANSPARENT);\r
+}\r
+\r
+bool PullUpDownView::InitView()\r
+{\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "PullUpDownView::InitDropDownView");\r
+    clickListener = (UIView::OnClickListener *)OHOS::MainPresenterSample::GetInstance();\r
+\r
+    InitViewImg();\r
+    InitViewLable();\r
+    InitViewInfo();\r
+\r
+    Add(dnotDisturb);\r
+    Add(dnotDisturbLable);\r
+    Add(briScreen);\r
+    Add(briScreenLable);\r
+    Add(finPhone);\r
+    Add(finPhoneLable);\r
+    Add(droAlarm);\r
+    Add(droAlarmLable);\r
+    Add(droSetting);\r
+    Add(droSettingLable);\r
+    Add(bluetooth);\r
+    Add(battery);\r
+    Add(batteryLable);\r
+    Add(dateLable);\r
+\r
+    SetTouchable(true);\r
+    SetIntercept(true);\r
+\r
+    return true;\r
+}\r
+\r
+void PullUpDownView::PreLoad(void)\r
+{\r
+    if (!viewiInitStatus) {\r
+        InitView();\r
+        viewiInitStatus = true;\r
+    }\r
+}\r
+\r
+void PullUpDownView::UpdateBlueToothStatus(int status)\r
+{\r
+    if (bluetooth == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "bluetooth nullptr");\r
+        return;\r
+    }\r
+    if (status == 1) {\r
+        ScreenModels::GetInstance()->LoadAppImages(DROPDOWN_IAMGES, bluetooth, DROPDOWN_DROPDOWN_BLUETOOTH_B);\r
+    } else {\r
+        ScreenModels::GetInstance()->LoadAppImages(DROPDOWN_IAMGES, bluetooth, DROPDOWN_DROPDOWN_BLUETOOTH);\r
+    }\r
+    bluetooth->Invalidate();\r
+    return;\r
+}\r
+\r
+}\r
index 1c86925..136045c 100644 (file)
 #include "UiConfig.h"\r
 #include "ui_resource_image.h"\r
 #include "drag_event.h"\r
-#include "makephone/MainCallingView.h"\r
+#include "phonemenu/PhoneMenuView.h"\r
 #include "phoneservice/PhoneService.h"\r
-#include "callerlog/CallerLogModel.h"\r
+#include "phonemenu/PhoneMenuCallerLogModel.h"\r
 #include "bts_avrcp_controller.h"\r
 #include "bts_avrcp_target.h"\r
 #include "notification_manager.h"\r
-#include "bluetooth/BluetoothHeadsetEvent.h"\r
+#include "settings/model/SettingBluetoothHeadsetEvent.h"\r
 #include "bts_avrcp_controller.h"\r
 \r
 namespace OHOS {\r
@@ -126,7 +126,7 @@ void VolumeSliderEventListener::ChangeVolume(VolumeChangeStatus status)
     }\r
 }\r
 \r
-extern BtAvrcpTgInf g_avrcp_srv_inf;\r
+extern SettingBtAvrcpTgInf g_avrcp_srv_inf;\r
 void VolumeSliderEventListener::BtAndLocalVolumeSet(int16_t sounding)\r
 {\r
     if (g_avrcp_srv_inf.avrcp_srv_conn_stat == PROFILE_STATE_CONNECTED) {\r
@@ -170,16 +170,8 @@ bool VolumeSliderEventListener::OnDrag(UIView& view, const DragEvent& event)
                 playersView->SetVisible(true);\r
             }\r
             if (playerCoefficients == VOLUMEPHONE) {\r
-                MainCallingView *mainCallView = MainCallingView::GetInstance();\r
-                if (mainCallView == nullptr) {\r
-                    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "OnDrag:MainCallingView new fail");\r
-                    return false;\r
-                }\r
                 volumeSettingView->SetVisible(false);\r
-                mainCallView->GetScreenGroup()->SetVisible(false);\r
-                mainCallView->GetDisplayGroup()->SetVisible(false);\r
-                mainCallView->GetCallingGroup()->SetVisible(true);\r
-                CallerLogModel::GetInstance()->SetVolumeScreenStatus(false);\r
+                PhoneMenuCallerLogModel::GetInstance()->SetVolumeScreenStatus(false);\r
             }\r
             if (playerCoefficients == VOLUMEPHONENOTIFY) {\r
                 volumeSettingView->SetVisible(false);\r
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/main/src/dial/DialModelArcProgress.cpp b/code/sdk/application/wearable/evb/nativeapp/nativeui/main/src/dial/DialModelArcProgress.cpp
new file mode 100644 (file)
index 0000000..aad2b67
--- /dev/null
@@ -0,0 +1,29 @@
+/*
+/*
+ * Copyright (c) CompanyNameMagicTag 2025. All rights reserved.
+ * Description: DialModelArcProgress
+ * Author: Hisi Graphic
+ * Create: 2025-08
+ */
+
+#include "main/dial/RegisterDialModel.h"
+#include "main/dial/DialModelArcProgress.h"
+#include "gfx_utils/graphic_math.h"
+
+REGIST_DIAL_MODULE(OHOS::DialDataType::ARC_PROGRESS_TEST, OHOS::DialModelArcProgress::GetInstance());
+
+namespace OHOS {
+DialModelArcProgress* DialModelArcProgress::GetInstance()
+{
+    static DialModelArcProgress instance;
+    return &instance;
+}
+
+bool DialModelArcProgress::GetDialFloatData(DialDataType& type, float& out)
+{
+    (void)type;
+    out = data_;
+    data_ = FloatMore(data_, 1.0) ? 0.1 : data_ + 0.01;
+    return true;
+}
+}
index 3c52dd7..6643334 100644 (file)
@@ -12,6 +12,7 @@
 #include "screennotify/ui_screennotify.h"
 #endif
 #include "main/MainPresenterSample.h"
+#include "aod_view/AodPresenter.h"
 #include "main/dial/DialDigitalImgView.h"
 #include "common/input_device_manager.h"
 #include "main/dial/DialSequenceImgView.h"
@@ -362,12 +363,11 @@ void DialViewGroup::AddDialClick(Rect& rect, const char* bundleName)
     if (name == nullptr) {
         return;
     }
-    if (memcpy_s(name, len, bundleName, len) != EOK) {
+    if (strcpy_s(name, len, bundleName) != EOK) {
         UIFree(name);
         name = nullptr;
         return;
     }
-    name[len] = '\0';
     DialClick click = {rect, false, {.bundleName = name}};
     dialClicks_.PushBack(click);
 }
@@ -450,10 +450,13 @@ void DialViewGroup::CoverEnd(bool isCovered)
 
 void DialViewGroup::OnActive(void)
 {
-    MainPresenterSample* mainPresenter = MainPresenterSample::GetInstance();
-    if ((mainPresenter == nullptr) || (mainPresenter->GetMainPresenterState() != MainPresenterState::RESUME)) {
-        return;
+    if (state_ == DisplayState::NORMAL) {
+        MainPresenterSample* mainPresenter = MainPresenterSample::GetInstance();
+        if ((mainPresenter == nullptr) || (mainPresenter->GetMainPresenterState() != MainPresenterState::RESUME)) {
+            return;
+        }
     }
+
     if (!isSeqImgLoaded_) {
         std::weak_ptr<bool> wk = isExists_;
         GraphicService::GetInstance()->ForceRefreshImmediately();
index 11f9844..4e8664d 100644 (file)
 #include "common/screen.h"
 #include "main/MainModel.h"
 #include "main/MainViewSample.h"
-#include "set_dial/SetDialModel.h"
 #include "graphic_service.h"
 #include "NativeAbility.h"
 #include "graphic_mutex.h"
-#include "set_dial/SetDialModel.h"
-#include "set_dial/SetDialPresenter.h"
+#include "settings/model/SettingDesktopModel.h"
 #include "power_display_service.h"
 
 using namespace OHOS;
@@ -336,11 +334,10 @@ bool SetCurrentWatchFace(uint32_t uuid)
     DialSetting setting = MainModel::GetInstance().GetDialSetting();
     setting.dialFlag = 1;
     setting.dialFullName = g_info[index].fileName;
-    if (NativeAbility::GetInstance().GetCurSliceId() == VIEW_SET_DIAL) {
+    if (NativeAbility::GetInstance().GetCurTargetId() ==
+        (VIEW_SETTING | static_cast<uint32_t>(SettingPageId::DESKTOP_DIAL_PAGE) << PAGE_OFFSET)) {
         GraphicService::GetInstance()->PostGraphicEvent([setting]() {
-            if (SetDialPresenter::GetCurrentInstance() != nullptr) {
-                SetDialPresenter::GetCurrentInstance()->SpecifyDialSetting(setting);
-            }
+            SettingDesktopModel::GetInstance().SetSpecifyDialSetting(setting);
         });
         NativeAbility::GetInstance().ChangeSlice(VIEW_MAIN_SAMPLE);
         return true;
@@ -382,14 +379,13 @@ bool UninstallWatch(uint32_t uuid)
         setting.dialFlag = 0;
         setting.dialId = 0;
     }
-    if (NativeAbility::GetInstance().GetCurSliceId() == VIEW_SET_DIAL) {
+    if (NativeAbility::GetInstance().GetCurTargetId() ==
+        (VIEW_SETTING | static_cast<uint32_t>(SettingPageId::DESKTOP_DIAL_PAGE) << PAGE_OFFSET)) {
         if (g_info[index].watchInfo.is_current_watch) {
             // If it is the current watch face, set it as the default watch face. Otherwise, the configuration remains
             // unchanged.
             GraphicService::GetInstance()->PostGraphicEvent([setting]() {
-                if (SetDialPresenter::GetCurrentInstance() != nullptr) {
-                    SetDialPresenter::GetCurrentInstance()->SpecifyDialSetting(setting);
-                }
+                SettingDesktopModel::GetInstance().SetSpecifyDialSetting(setting);
             });
         }
         NativeAbility::GetInstance().ChangeSlice(VIEW_MAIN_SAMPLE);
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/monkey/src/MonkeyModel.cpp b/code/sdk/application/wearable/evb/nativeapp/nativeui/monkey/src/MonkeyModel.cpp
new file mode 100644 (file)
index 0000000..bbb360c
--- /dev/null
@@ -0,0 +1,184 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: MonkeyModel\r
+ * Create: 2025-04-24\r
+ */\r
+#include <algorithm>\r
+#include <random>\r
+#include "AppViewIDs.h"\r
+#include "UiConfig.h"\r
+#include "NativeAbility.h"\r
+#include "flashlight/FlashLightView.h"\r
+#include "phonemenu/PhoneMenuView.h"\r
+#include "stopwatch/StopwatchView.h"\r
+#include "sport/SportView.h"\r
+#include "timers/TimerView.h"\r
+#include "weather/WeatherView.h"\r
+#include "blood/BloodView.h"\r
+#include "heartrate/HeartRateView.h"\r
+#include "camera/CameraView.h"\r
+#include "findphone/FindPhoneView.h"\r
+#include "sleep/SleepView.h"\r
+#include "settings/common/SettingCommon.h"\r
+#include "date/DateView.h"\r
+#include "monkey/MonkeyModel.h"\r
+#include "cmsis_os.h"\r
+\r
+namespace OHOS {\r
+static constexpr uint8_t TIME_PERIOL = 20;\r
+static std::vector<SlicePageId> g_page;\r
+static uint8_t g_curTime = 0;\r
+MonkeyModel::MonkeyModel()\r
+{\r
+    g_page.clear();\r
+    // 手电筒\r
+    g_page.push_back({VIEW_FLASHLIGHT, FLASH_LIGHT_VIEW});\r
+    g_page.push_back({VIEW_FLASHLIGHT, FLASH_LIGHT_PLAY_VIEW});\r
+    g_page.push_back({VIEW_FLASHLIGHT, FLASH_LIGHT_SET_VIEW});\r
+    g_page.push_back({VIEW_FLASHLIGHT, FLASH_LIGHT_COLOR_VIEW});\r
+    g_page.push_back({VIEW_FLASHLIGHT, FLASH_LIGHT_BLINK_VIEW});\r
+    g_page.push_back({VIEW_FLASHLIGHT, FLASH_LIGHT_RECOVER_VIEW});\r
+    // 通话菜单\r
+    g_page.push_back({VIEW_PHONE_MENU, PHONE_MENU_MAIN_PAGE});\r
+    g_page.push_back({VIEW_PHONE_MENU, PHONE_MENU_CONTACTS_PAGE});\r
+    g_page.push_back({VIEW_PHONE_MENU, PHONE_MENU_DIAL_PAGE});\r
+    g_page.push_back({VIEW_PHONE_MENU, PHONE_MENU_DISCONNECT_PAGE});\r
+    g_page.push_back({VIEW_PHONE_MENU, PHONE_MENU_CALLER_LOG_PAGE});\r
+    g_page.push_back({VIEW_PHONE_MENU, PHONE_MENU_CALLING_PAGE});\r
+    // 秒表\r
+    g_page.push_back({VIEW_STOPWATCH, STOPWATCH_MAIN_PAGE});\r
+    g_page.push_back({VIEW_STOPWATCH, STOPWATCH_RECORD_PAGE});\r
+    // 运动\r
+    g_page.push_back({VIEW_SPORT, SPORT_PAGE_MENU});\r
+    g_page.push_back({VIEW_SPORT, SPORT_PAGE_PREPARE});\r
+    g_page.push_back({VIEW_SPORT, SPORT_PAGE_COUNTDOWN});\r
+    g_page.push_back({VIEW_SPORT, SPORT_PAGE_DATA});\r
+    g_page.push_back({VIEW_SPORT, SPORT_PAGE_PAUSE});\r
+    g_page.push_back({VIEW_SPORT, SPORT_PAGE_PROMPT});\r
+    g_page.push_back({VIEW_SPORT, SPORT_PAGE_SETTINGS});\r
+    g_page.push_back({VIEW_SPORT, SPORT_PAGE_TARGET});\r
+    g_page.push_back({VIEW_SPORT, SPORT_PAGE_TARGET_SETTING});\r
+    g_page.push_back({VIEW_SPORT, SPORT_PAGE_TARGET_PROMPT});\r
+    g_page.push_back({VIEW_SPORT, SPORT_PAGE_REMIND});\r
+    g_page.push_back({VIEW_SPORT, SPORT_PAGE_REMIND_INTERVAL});\r
+    g_page.push_back({VIEW_SPORT, SPORT_PAGE_REMIND_HEARTRATE});\r
+    g_page.push_back({VIEW_SPORT, SPORT_PAGE_HEARTRATE_RANGE});\r
+    g_page.push_back({VIEW_SPORT, SPORT_PAGE_MISTOUCH});\r
+    // 设置\r
+    g_page.push_back({VIEW_SETTING, MAIN_PAGE});\r
+    g_page.push_back({VIEW_SETTING, BLUETOOTH_PAGE});\r
+    g_page.push_back({VIEW_SETTING, DISPLAY_PAGE});\r
+    g_page.push_back({VIEW_EMPTY, 1});\r
+    g_page.push_back({VIEW_SETTING, DESKTOP_PAGE});\r
+    g_page.push_back({VIEW_SETTING, POWER_PAGE});\r
+    g_page.push_back({VIEW_SETTING, CARD_PAGE});\r
+    g_page.push_back({VIEW_SETTING, SYSTEM_PAGE});\r
+    g_page.push_back({VIEW_SETTING, ABOUT_PAGE});\r
+    g_page.push_back({VIEW_SETTING, DISPLAY_BRIGHTNESS_PAGE});\r
+    g_page.push_back({VIEW_SETTING, DISPLAY_SCREEN_OFF_PAGE});\r
+    g_page.push_back({VIEW_SETTING, DISPLAY_STEADY_ON_PAGE});\r
+    g_page.push_back({VIEW_SETTING, DESKTOP_DIAL_PAGE});\r
+    g_page.push_back({VIEW_EMPTY, 1});\r
+    g_page.push_back({VIEW_SETTING, DESKTOP_DIAL_STYLE_PAGE});\r
+    g_page.push_back({VIEW_SETTING, CARD_EFFECT_PAGE});\r
+    g_page.push_back({VIEW_SETTING, CARD_MGR_PAGE});\r
+    g_page.push_back({VIEW_SETTING, CARD_ADD_PAGE});\r
+    g_page.push_back({VIEW_SETTING, SYSTEM_OPERATION_PAGE});\r
+    g_page.push_back({VIEW_SETTING, SYSTEM_OTA_PAGE});\r
+    g_page.push_back({VIEW_SETTING, CONNECT_NEW_PHONE_PAGE});\r
+    g_page.push_back({VIEW_SETTING, CONNECT_OPEN_PAGE});\r
+    g_page.push_back({VIEW_EMPTY, 1});\r
+    g_page.push_back({VIEW_SETTING, CONNECT_BLUE_SUCCESS_PAGE});\r
+    g_page.push_back({VIEW_SETTING, CONNECT_BLUE_FAIL_PAGE});\r
+    g_page.push_back({VIEW_SETTING, RECONNECTION_PAGE});\r
+    g_page.push_back({VIEW_SETTING, RECONNECT_SECOND_CONFIRM_PAGE});\r
+    g_page.push_back({VIEW_SETTING, UNPAIR_SECOND_CONFIRM_PAGE});\r
+    g_page.push_back({VIEW_SETTING, QRCODE_CONN_PAGE});\r
+    g_page.push_back({VIEW_EMPTY, 1});\r
+    // 计时器\r
+    g_page.push_back({VIEW_TIMER, TIMER_MAIN_PAGE});\r
+    g_page.push_back({VIEW_TIMER, TIMER_TIMING_PAGE});\r
+    g_page.push_back({VIEW_TIMER, TIMER_SETTING_PAGE});\r
+    // 天气\r
+    g_page.push_back({VIEW_WEATHER, WEATHER_MAIN_PAGE});\r
+    g_page.push_back({VIEW_WEATHER, WEATHER_HOURS_PAGE});\r
+    g_page.push_back({VIEW_WEATHER, WEATHER_DAYS_PAGE});\r
+    g_page.push_back({VIEW_WEATHER, WEATHER_SUNRISE_PAGE});\r
+    g_page.push_back({VIEW_WEATHER, WEATHER_MONTHRISE_PAGE});\r
+    g_page.push_back({VIEW_WEATHER, WEATHER_LUNARPHASE_PAGE});\r
+    // 血氧\r
+    g_page.push_back({VIEW_BLOOD, BLOOD_MAIN_PAGE});\r
+    g_page.push_back({VIEW_BLOOD, BLOOD_READY_PAGE});\r
+    g_page.push_back({VIEW_BLOOD, BLOOD_MEASUREMENT_PAGE});\r
+    g_page.push_back({VIEW_BLOOD, BLOOD_RESULT_PAGE});\r
+    g_page.push_back({VIEW_BLOOD, BLOOD_CHART_PAGE});\r
+    g_page.push_back({VIEW_BLOOD, BLOOD_EXPLAIN_PAGE});\r
+    // 心率\r
+    g_page.push_back({VIEW_HEARTRATE, HEARTRATE_MAIN_PAGE});\r
+    g_page.push_back({VIEW_HEARTRATE, HEARTRATE_READY_PAGE});\r
+    g_page.push_back({VIEW_HEARTRATE, HEARTRATE_MEASUREMENT_PAGE});\r
+    // 相机\r
+    g_page.push_back({VIEW_CAMERA, CAMERA_MAIN_PAGE});\r
+    // 寻找手机\r
+    g_page.push_back({VIEW_FIND_PHONE, FIND_PHONE_MAIN_PAGE});\r
+    // 睡眠\r
+    g_page.push_back({VIEW_SLEEPING, SLEEPING_MAIN_PAGE});\r
+    g_page.push_back({VIEW_SLEEPING, SLEEPING_DEATIL_PAGE});\r
+    g_page.push_back({VIEW_SLEEPING, SLEEPING_TARGET_PAGE});\r
+    // 日历\r
+    g_page.push_back({VIEW_DATE, DATE_MAIN_PAGE});\r
+    g_page.push_back({VIEW_DATE, DATE_MESSAGE_PAGE});\r
+    g_page.push_back({VIEW_EMPTY, 1});\r
+    timeCallback_ = new TimeAnimatorCallback(TIME_PERIOL);\r
+    if (timeCallback_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new timeCallback_ fail");\r
+        return;\r
+    }\r
+    timeAnimator_ = new Animator(timeCallback_, nullptr, 0, true);\r
+    if (timeAnimator_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new timeAnimator_ fail");\r
+        return;\r
+    }\r
+}\r
+\r
+MonkeyModel::~MonkeyModel()\r
+{\r
+    if (timeAnimator_ != nullptr) {\r
+        delete timeAnimator_;\r
+        timeAnimator_ = nullptr;\r
+    }\r
+    if (timeCallback_ != nullptr) {\r
+        delete timeCallback_;\r
+        timeCallback_ = nullptr;\r
+    }\r
+}\r
+\r
+MonkeyModel &MonkeyModel::GetInstance()\r
+{\r
+    static MonkeyModel instance;\r
+    return instance;\r
+}\r
+\r
+void MonkeyModel::SetStart(bool start)\r
+{\r
+    if (start) {\r
+        timeAnimator_->Start();\r
+    } else {\r
+        timeAnimator_->Stop();\r
+    }\r
+}\r
+\r
+void MonkeyModel::TimeAnimatorCallback::Callback(UIView *view)\r
+{\r
+    int pageSize = g_page.size();\r
+    static int monkeyId = 0;\r
+    static int g_curTime = 0;\r
+    g_curTime++;\r
+    if (g_curTime > periol_) {\r
+        monkeyId = (monkeyId + 1) % pageSize;\r
+        std::cout << "sliceId = " << g_page[monkeyId].sliceId << " pageId = " << g_page[monkeyId].pageId << std::endl;\r
+        NativeAbility::GetInstance().SwitchSlice(g_page[monkeyId].sliceId, g_page[monkeyId].pageId);\r
+        g_curTime = 0;\r
+    }\r
+}\r
+}\r
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/monkey/src/MonkeyPage.cpp b/code/sdk/application/wearable/evb/nativeapp/nativeui/monkey/src/MonkeyPage.cpp
new file mode 100644 (file)
index 0000000..0428c5b
--- /dev/null
@@ -0,0 +1,141 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: MonkeyPage\r
+ * Create: 2025-04-24\r
+ */\r
+#include <iostream>\r
+#include "NativeAbility.h"\r
+#include "SlicePageFactory.h"\r
+#include "wearable_log.h"\r
+#include "AppViewIDs.h"\r
+#include "UiConfig.h"\r
+#include "monkey/MonkeyPresenter.h"\r
+#include "monkey/MonkeyModel.h"\r
+#include "monkey/MonkeyPage.h"\r
+\r
+namespace OHOS {\r
+static constexpr uint16_t MONKEY_LABEL_POS_X = 137;\r
+static constexpr uint16_t MONKEY_LABEL_POS_Y = 66;\r
+static constexpr uint16_t MONKEY_LABEL_WIDTH = 200;\r
+static constexpr uint16_t MONKEY_LABEL_HEIGHT = 90;\r
+static constexpr uint16_t START_MONKEY_BUTTON_POS_X = 142;\r
+static constexpr uint16_t START_MONKEY_BUTTON_POS_Y = 165;\r
+static constexpr uint16_t START_MONKEY_BUTTON_WIDTH = 182;\r
+static constexpr uint16_t START_MONKEY_BUTTON_HEIGHT = 47;\r
+static constexpr uint16_t END_MONKEY_BUTTON_POS_X = 142;\r
+static constexpr uint16_t END_MONKEY_BUTTON_POS_Y = 247;\r
+static constexpr uint16_t END_MONKEY_BUTTON_WIDTH = 182;\r
+static constexpr uint16_t END_MONKEY_BUTTON_HEIGHT = 47;\r
+static constexpr uint16_t MONKEY_FONT_SIZE = 34;\r
+static constexpr char *START_MONKEY = "startMonkey";\r
+static constexpr char *END_MONKEY = "endMonkey";\r
+\r
+REGIST_SLICE_PAGE(VIEW_MONKEY, MONKEY_PAGES::MONKEY_MAIN_PAGE, MonkeyPage, true);\r
+\r
+void MonkeyPage::OnStart(void *data)\r
+{\r
+    container_ = new UIScrollView();\r
+    if (container_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new container_ fail");\r
+        return;\r
+    }\r
+    container_->SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);\r
+    container_->SetStyle(STYLE_BACKGROUND_OPA, 0);\r
+\r
+    monkeyLabel_ = new UILabel();\r
+    if (monkeyLabel_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new monkeyLabel_ fail");\r
+        return;\r
+    }\r
+    monkeyLabel_->SetPosition(MONKEY_LABEL_POS_X, MONKEY_LABEL_POS_Y, MONKEY_LABEL_WIDTH, MONKEY_LABEL_HEIGHT);\r
+    monkeyLabel_->SetViewId("label1");\r
+    monkeyLabel_->SetStyle(STYLE_TEXT_FONT, MONKEY_FONT_SIZE);\r
+    monkeyLabel_->SetText("Monkey测试");\r
+    monkeyLabel_->SetLineBreakMode(UILabel::LINE_BREAK_ADAPT);\r
+    monkeyLabel_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+    monkeyLabel_->SetRollSpeed(0);\r
+    monkeyLabel_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, MONKEY_FONT_SIZE);\r
+    container_->Add(monkeyLabel_);\r
+    monkeyLabel_->SetVisible(true);\r
+\r
+    endMonkeyButton_ = new UILabelButtonExt();\r
+    if (endMonkeyButton_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new endMonkeyButton_ fail");\r
+        return;\r
+    }\r
+    endMonkeyButton_->SetPosition(END_MONKEY_BUTTON_POS_X, END_MONKEY_BUTTON_POS_Y, END_MONKEY_BUTTON_WIDTH,\r
+                                  END_MONKEY_BUTTON_HEIGHT);\r
+    endMonkeyButton_->SetText("结束测试");\r
+    endMonkeyButton_->SetViewId(END_MONKEY);\r
+    endMonkeyButton_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, MONKEY_FONT_SIZE);\r
+    endMonkeyButton_->SetStyleForState(STYLE_BORDER_COLOR, Color::Blue().full, UIButton::PRESSED);\r
+    container_->Add(endMonkeyButton_);\r
+    endMonkeyButton_->SetVisible(true);\r
+\r
+    startMonkeyButton_ = new UILabelButtonExt();\r
+    if (startMonkeyButton_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new startMonkeyButton_ fail");\r
+        return;\r
+    }\r
+    startMonkeyButton_->SetPosition(START_MONKEY_BUTTON_POS_X, START_MONKEY_BUTTON_POS_Y, START_MONKEY_BUTTON_WIDTH,\r
+                                    START_MONKEY_BUTTON_HEIGHT);\r
+    startMonkeyButton_->SetText("开始测试");\r
+    startMonkeyButton_->SetViewId(START_MONKEY);\r
+    startMonkeyButton_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, MONKEY_FONT_SIZE);\r
+    startMonkeyButton_->SetStyleForState(STYLE_BORDER_COLOR, Color::Blue().full, UIButton::PRESSED);\r
+    container_->Add(startMonkeyButton_);\r
+    startMonkeyButton_->SetVisible(true);\r
+\r
+    endMonkeyButton_->SetOnClickListener(this);\r
+    startMonkeyButton_->SetOnClickListener(this);\r
+    container_->SetOnDragListener(this);\r
+    AddViewToPageContainer(container_);\r
+}\r
+\r
+MonkeyPage::MonkeyPage()\r
+{\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MonkeyPage::MonkeyPage");\r
+}\r
+\r
+MonkeyPage::~MonkeyPage()\r
+{\r
+    if (container_ != nullptr) {\r
+        container_->RemoveAll();\r
+        delete container_;\r
+        container_ = nullptr;\r
+    }\r
+    if (monkeyLabel_ != nullptr) {\r
+        delete monkeyLabel_;\r
+        monkeyLabel_ = nullptr;\r
+    }\r
+    if (endMonkeyButton_ != nullptr) {\r
+        delete endMonkeyButton_;\r
+        endMonkeyButton_ = nullptr;\r
+    }\r
+    if (startMonkeyButton_ != nullptr) {\r
+        delete startMonkeyButton_;\r
+        startMonkeyButton_ = nullptr;\r
+    }\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MonkeyPage::~MonkeyPage");\r
+}\r
+\r
+bool MonkeyPage::OnDrag(UIView &view, const DragEvent &event)\r
+{\r
+    if ((event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT) && (event.GetDeltaX() > X_DRAG_OFFSET) &&\r
+        (event.GetDeltaX() > (DOUBLES * MATH_ABS(event.GetDeltaY())))) {\r
+        MonkeyModel::GetInstance().SetStart(false);\r
+        NativeAbility::GetInstance().ChangeSliceToApplist();\r
+    }\r
+    return false;\r
+}\r
+\r
+bool MonkeyPage::OnClick(UIView &view, const ClickEvent &event)\r
+{\r
+    if (strcmp(view.GetViewId(), START_MONKEY) == 0) {\r
+        MonkeyModel::GetInstance().SetStart(true);\r
+    } else if (strcmp(view.GetViewId(), END_MONKEY) == 0) {\r
+        MonkeyModel::GetInstance().SetStart(false);\r
+    }\r
+    return false;\r
+}\r
+}
\ No newline at end of file
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/monkey/src/MonkeyPresenter.cpp b/code/sdk/application/wearable/evb/nativeapp/nativeui/monkey/src/MonkeyPresenter.cpp
new file mode 100644 (file)
index 0000000..fb750b9
--- /dev/null
@@ -0,0 +1,12 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: MonkeyPresenter\r
+ * Create: 2025-04-24\r
+ */\r
+#include "NativeRegisterManager.h"\r
+#include "monkey/MonkeyView.h"\r
+#include "monkey/MonkeyPresenter.h"\r
+\r
+namespace OHOS {\r
+REGIST_MENU(VIEW_MONKEY, MonkeyView, MonkeyPresenter, MONKEY_ICON, MONKEY_ICON, "Monkey");\r
+}\r
index 49596a4..07e8d63 100644 (file)
@@ -9,6 +9,7 @@
 #include "player/PlayersModel.h"
 #include "uiservice/ui_service.h"
 #include "NativeRegisterManager.h"
+#include "phonemenu/PhoneMenuView.h"
 
 namespace OHOS {
 
@@ -56,7 +57,7 @@ void VocassistPresenter::VocAssistDeal(int flag)
             VocassistModel::GetInstance()->SetToggleFlag(ALREADY_CLOSE_VOCASSIST_IMAGE);
         }
     }
-    
+
     VocassistModel::GetInstance()->SetExitStatus(CONTINUTE_EXIT_MODE1);
     VoiceAssistance::GetInstance()->DelayDisplayTime(DELAY_SIX_SECONDS);        // 开启定时器,太长时间未操作退出语音助手
 }
@@ -112,9 +113,9 @@ bool VocassistPresenter::OnDrag(UIView& view, const DragEvent& event)
         strcmp(view.GetViewId(), VOC_ID) == 0) { // 语音助手右滑退出
         int phoneStatus = VocassistModel::GetInstance()->GetPhoneDetailStatus();    // 扫描设置此时通话的状态和个数
         if (phoneStatus == ONE_ROAD_AND_INCOMING) {
-            NativeAbility::GetInstance().ChangeSlice(VIEW_MAEKPHONE_SAMPLE);
+            NativeAbility::GetInstance().SwitchSlice(VIEW_PHONE_MENU, PhoneMenuPages::PHONE_MENU_CALLING_PAGE);
         } else {
-            NativeAbility::GetInstance().ChangeSlice(VIEW_APPLIST);
+            NativeAbility::GetInstance().ChangeSliceToApplist();
         }
     }
     return true;
index e0c2c71..729a542 100644 (file)
@@ -10,7 +10,8 @@
 #include "graphic_timer.h"\r
 #include "AppViewIDs.h"\r
 #include "player/PlayersModel.h"\r
-#include "callerlog/CallerLogModel.h"\r
+#include "phonemenu/PhoneMenuView.h"\r
+#include "phonemenu/PhoneMenuCallerLogModel.h"\r
 #include "offlinevoice/VocassistModel.h"\r
 #include "offlinevoice/VocassistView.h"\r
 #include "offlinevoice/VocassistPresenter.h"\r
@@ -624,7 +625,7 @@ void VoiceAssistance::ExitProgress()
         if (quitStatus == CONTINUTE_EXIT_MODE1) {\r
             int phoneStatus = VocassistModel::GetInstance()->GetPhoneDetailStatus();    // 扫描设置此时通话的状态和个数\r
             if (phoneStatus == ONE_ROAD_AND_INCOMING) {\r
-                NativeAbility::GetInstance().ChangeSlice(VIEW_MAEKPHONE_SAMPLE); // 返回来电界面\r
+                NativeAbility::GetInstance().SwitchSlice(VIEW_PHONE_MENU, PhoneMenuPages::PHONE_MENU_CALLING_PAGE);\r
                 return;\r
             }\r
             WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Too long no operate, now exit vocassist");\r
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/phonemenu/src/PhoneMenuCallerLogItemView.cpp b/code/sdk/application/wearable/evb/nativeapp/nativeui/phonemenu/src/PhoneMenuCallerLogItemView.cpp
new file mode 100644 (file)
index 0000000..24992a0
--- /dev/null
@@ -0,0 +1,105 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: PhoneMenuCallerLogItemView\r
+ * Create: 2025-07-12\r
+ */\r
+\r
+#include <string>\r
+#include <sys/time.h>\r
+#ifdef BUILD_IN_LINUX\r
+#include "localtime.h"\r
+#endif\r
+#include "UiConfig.h"\r
+#include "main/LoadImg.h"\r
+#include "ui_resource_phonemenu.h"\r
+#include "phonemenu/PhoneMenuCallerLogItemView.h"\r
+\r
+namespace OHOS {\r
+static constexpr uint16_t BG_GROUP_W = 418;\r
+static constexpr uint16_t BG_GROUP_H = 128;\r
+static constexpr uint16_t BG_BACKGROUND_OPA = 48;\r
+static constexpr uint16_t BG_BORDER_RADIUS = 65;\r
+static constexpr uint16_t ICON_X = 40;\r
+static constexpr uint16_t ICON_Y = 40;\r
+static constexpr uint16_t PHONE_LABEL_X = 107;\r
+static constexpr uint16_t PHONE_LABEL_Y = 20;\r
+static constexpr uint16_t PHONE_LABEL_W = 230;\r
+static constexpr uint16_t PHONE_LABEL_H = 46;\r
+static constexpr uint16_t PHONE_LABEL_FONT = 36;\r
+static constexpr uint16_t STATUS_LABEL_X = 107;\r
+static constexpr uint16_t STATUS_LABEL_Y = 66;\r
+static constexpr uint16_t STATUS_LABEL_W = 268;\r
+static constexpr uint16_t STATUS_LABEL_H = 42;\r
+static constexpr uint16_t STATUS_LABEL_FONT = 30;\r
+static constexpr uint16_t NUM_10 = 10;\r
+\r
+PhoneMenuCallerLogItemView::PhoneMenuCallerLogItemView()\r
+{\r
+    bg_.SetPosition(0, 0, BG_GROUP_W, BG_GROUP_H);\r
+    bg_.SetStyle(STYLE_BACKGROUND_OPA, BG_BACKGROUND_OPA);\r
+    bg_.SetStyle(STYLE_BACKGROUND_COLOR, Color::Gray().full);\r
+    bg_.SetStyle(STYLE_BORDER_RADIUS, BG_BORDER_RADIUS);\r
+\r
+    icon_.SetPosition(ICON_X, ICON_Y);\r
+\r
+    phoneLabel_.SetPosition(PHONE_LABEL_X, PHONE_LABEL_Y, PHONE_LABEL_W, PHONE_LABEL_H);\r
+    phoneLabel_.SetFont(DEFAULT_VECTOR_FONT_FILENAME, PHONE_LABEL_FONT);\r
+    phoneLabel_.SetAlign(TEXT_ALIGNMENT_LEFT, TEXT_ALIGNMENT_CENTER);\r
+\r
+    stutasLabel_.SetPosition(STATUS_LABEL_X, STATUS_LABEL_Y, STATUS_LABEL_W, STATUS_LABEL_H);\r
+    stutasLabel_.SetFont(DEFAULT_VECTOR_FONT_FILENAME, STATUS_LABEL_FONT);\r
+    stutasLabel_.SetAlign(TEXT_ALIGNMENT_LEFT, TEXT_ALIGNMENT_CENTER);\r
+    stutasLabel_.SetStyle(STYLE_TEXT_COLOR, Color::Gray().full);\r
+\r
+    Add(&bg_);\r
+    Add(&icon_);\r
+    Add(&stutasLabel_);\r
+    Add(&phoneLabel_);\r
+}\r
+\r
+PhoneMenuCallerLogItemView::~PhoneMenuCallerLogItemView()\r
+{\r
+    Remove(&bg_);\r
+    Remove(&icon_);\r
+    Remove(&stutasLabel_);\r
+    Remove(&phoneLabel_);\r
+}\r
+\r
+void PhoneMenuCallerLogItemView::SetItemInfo(const CallLogInfo &itemInfo)\r
+{\r
+    memset_s(tel_, MAX_PHONE_NUM, 0, MAX_PHONE_NUM);\r
+    memcpy_s(tel_, MAX_PHONE_NUM, itemInfo.tel, itemInfo.telLen);\r
+    phoneLabel_.SetText(itemInfo.name);\r
+    if (strlen(itemInfo.name) == 0 || itemInfo.nameLen == 0) {\r
+        phoneLabel_.SetText((const char *)itemInfo.tel);\r
+    }\r
+    std::string timeStr;\r
+    struct tm pTM;\r
+    localtime_r((time_t *)&itemInfo.creationTime, &pTM);\r
+    if (pTM.tm_mon < NUM_10) {\r
+        timeStr += "0";\r
+    }\r
+    timeStr += std::to_string(pTM.tm_mon) + "/";\r
+    if (pTM.tm_mday < NUM_10) {\r
+        timeStr += "0";\r
+    }\r
+    timeStr += std::to_string(pTM.tm_mday);\r
+    if (itemInfo.status == CALL_MISSED) {\r
+        stutasLabel_.SetText(("未接来电   " + timeStr).c_str());\r
+        phoneLabel_.SetStyle(STYLE_TEXT_COLOR, Color::Red().full);\r
+        LOADIMG::LoadImageViewImg(&icon_, PHONEMENU_IMAGE, IMAGE_PHONEMENU_CALLIN);\r
+    } else if (itemInfo.status == CALL_INCOMING) {\r
+        stutasLabel_.SetText(("接听        " + timeStr).c_str());\r
+        LOADIMG::LoadImageViewImg(&icon_, PHONEMENU_IMAGE, IMAGE_PHONEMENU_CALLIN);\r
+    } else if (itemInfo.status == CALL_OUTGOING) {\r
+        stutasLabel_.SetText(("拨号        " + timeStr).c_str());\r
+        LOADIMG::LoadImageViewImg(&icon_, PHONEMENU_IMAGE, IMAGE_PHONEMENU_CALLOUT);\r
+    }\r
+    SetViewId("CallerLogItem");\r
+}\r
+\r
+unsigned char *PhoneMenuCallerLogItemView::GetItemPhoneNumber()\r
+{\r
+    return tel_;\r
+}\r
+}\r
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/phonemenu/src/PhoneMenuCallerLogModel.cpp b/code/sdk/application/wearable/evb/nativeapp/nativeui/phonemenu/src/PhoneMenuCallerLogModel.cpp
new file mode 100644 (file)
index 0000000..faf55c8
--- /dev/null
@@ -0,0 +1,844 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: PhoneMenuCallerLogModel\r
+ * Create: 2025-07-12\r
+ */\r
+\r
+#include <string>\r
+#include <sys/time.h>\r
+#include "ohos_timer.h"\r
+#include "graphic_timer.h"\r
+#include "samgr_lite.h"\r
+#include "graphic_service.h"\r
+#include "main/LoadImg.h"\r
+#include "ui_resource_phonemenu.h"\r
+#include "NativeAbility.h"\r
+#include "notification_manager.h"\r
+#include "main/VolumeSettingView.h"\r
+#include "main/VolumeSettingPresenter.h"\r
+#include "phoneservice/PhoneService.h"\r
+#include "phonemenu/PhoneMenuView.h"\r
+#include "phonemenu/PhoneMenuCallingPage.h"\r
+#include "phonemenu/PhoneMenuCallerLogModel.h"\r
+\r
+#ifdef __cplusplus\r
+extern "C" {\r
+#endif\r
+\r
+using namespace OHOS;\r
+\r
+static int g_callTimes{0};\r
+static constexpr int NO_NUMBER_STATUS = -1;\r
+static int g_phoneStatus = PHONE_SINGLE_STATUS;\r
+static int g_isCall{NO_NUMBER_STATUS};\r
+static PhoneCallInfo callInfo{};\r
+static int g_retNum{0};\r
+static int g_volumeLocal{0};\r
+GraphicTimer *g_startCounting = nullptr;\r
+static constexpr uint64_t MS_ONE_SECONDS = 1000;\r
+static PhoneCallInfo callList[MULTI_CALL_MAX_NUME]{};\r
+static int g_firstPriority = NO_NUMBER_STATUS;\r
+static int g_secondPriority = NO_NUMBER_STATUS;\r
+static int g_thirdPriority = NO_NUMBER_STATUS;\r
+static int g_fourthPriority = NO_NUMBER_STATUS;\r
+static bool g_isWatchCallView = false;\r
+static constexpr int16 USLEEP_NUM = 5000;\r
+static constexpr int16 ONE_NUM = 1;\r
+\r
+static void SetPriorityNumber()\r
+{\r
+    time_t seconds;\r
+    time(&seconds);\r
+\r
+    if (g_firstPriority != NO_NUMBER_STATUS) {\r
+        PhoneMenuCallerLogModel::GetInstance()->SetoperateNumber(callList[g_firstPriority].unitCalls.number,\r
+                                                                 callList[g_firstPriority].unitCalls.number_len);\r
+        g_callTimes = seconds - callList[g_firstPriority].activeTime;\r
+    } else if (g_secondPriority != NO_NUMBER_STATUS) {\r
+        PhoneMenuCallerLogModel::GetInstance()->SetoperateNumber(callList[g_secondPriority].unitCalls.number,\r
+                                                                 callList[g_secondPriority].unitCalls.number_len);\r
+        g_callTimes = seconds - callList[g_secondPriority].activeTime;\r
+    } else if (g_thirdPriority != NO_NUMBER_STATUS) {\r
+        PhoneMenuCallerLogModel::GetInstance()->SetoperateNumber(callList[g_thirdPriority].unitCalls.number,\r
+                                                                 callList[g_thirdPriority].unitCalls.number_len);\r
+    } else if (g_fourthPriority != NO_NUMBER_STATUS) {\r
+        PhoneMenuCallerLogModel::GetInstance()->SetoperateNumber(callList[g_fourthPriority].unitCalls.number,\r
+                                                                 callList[g_fourthPriority].unitCalls.number_len);\r
+    }\r
+    return;\r
+}\r
+\r
+static void DisableCallingTimer()\r
+{\r
+    if (g_startCounting != nullptr) {\r
+        delete g_startCounting;\r
+        g_startCounting = nullptr;\r
+        g_callTimes = 0;\r
+    }\r
+}\r
+\r
+static void StatusReset()\r
+{\r
+    PhoneMenuCallerLogModel::GetInstance()->SetCallStatus(false);\r
+    PhoneMenuCallerLogModel::GetInstance()->SetWaitingStatus(false);\r
+    PhoneMenuCallerLogModel::GetInstance()->SetMakePhoneStatus(false);\r
+    DisableCallingTimer();\r
+    if (!PhoneMenuCallerLogModel::GetInstance()->GetNotifyFlag()) {\r
+        PhoneMenuCallerLogModel::GetInstance()->BackToPrePage();\r
+    } else {\r
+        g_isWatchCallView = false;\r
+    }\r
+    return;\r
+}\r
+\r
+static void CallTimerCallbackProc(void *data)\r
+{\r
+    g_callTimes++;\r
+\r
+    if (PhoneMenuCallingPage::GetInstance() == nullptr) {\r
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[CallTimerCallbackProc] GetInstance is nullptr");\r
+        return;\r
+    }\r
+\r
+    if (PhoneMenuCallingPage::GetInstance()->GetCallingStateLabel() == nullptr) {\r
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,\r
+                      "[CallTimerCallbackProc] GetInstance()->GetCallingStateLabel is nullptr");\r
+        return;\r
+    }\r
+\r
+    if (PhoneMenuCallingPage::GetInstance()->GetCallingState() == PhoneMenuCallingPage::CallingState::SESSION) {\r
+        PhoneMenuCallingPage::GetInstance()->GetCallingStateLabel()->SetText(\r
+            PhoneMenuCallerLogModel::GetInstance()->DisplayCallDuration().c_str());\r
+    }\r
+}\r
+\r
+static void CallTimerCallback(void *data)\r
+{\r
+    GraphicService::GetInstance()->PostGraphicEvent(std::bind(CallTimerCallbackProc, data));\r
+}\r
+\r
+static void InitCallingTimer()\r
+{\r
+    if (g_startCounting != nullptr) {\r
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "PhoneMenuCallerLogModel::CallerTimer already exists!!");\r
+        return;\r
+    }\r
+    uint32 tick = GetOSTick(MS_ONE_SECONDS);\r
+    g_startCounting = new GraphicTimer(tick, CallTimerCallback, nullptr, true);\r
+    if (g_startCounting == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "PhoneMenuCallerLogModel::CallerTimer new GraphicTimer failed!!");\r
+        return;\r
+    }\r
+    bool retTimer = g_startCounting->Start();\r
+    if (!retTimer) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "PhoneMenuCallerLogModel::CallerTimer Start failed!!");\r
+        if (g_startCounting != nullptr) {\r
+            delete g_startCounting;\r
+            g_startCounting = nullptr;\r
+        }\r
+        return;\r
+    }\r
+}\r
+\r
+bool FindCallListInfoAndSetPriorityNumber()\r
+{\r
+    g_isCall = NO_NUMBER_STATUS;\r
+    g_firstPriority = NO_NUMBER_STATUS;\r
+    g_secondPriority = NO_NUMBER_STATUS;\r
+    g_thirdPriority = NO_NUMBER_STATUS;\r
+    g_fourthPriority = NO_NUMBER_STATUS;\r
+    (void)memset_s(callList, MULTI_CALL_MAX_NUME * sizeof(PhoneCallInfo), 0,\r
+                   MULTI_CALL_MAX_NUME * sizeof(PhoneCallInfo));\r
+    int ret = GetCallInfoInCallList(callList, MULTI_CALL_MAX_NUME, &g_retNum);\r
+    if (ret != 0) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "FindCallListInfoAndSetPriorityNumber Error ret = %d", ret);\r
+        return false;\r
+    }\r
+    if (g_retNum == 0) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "FindCallListInfoAndSetPriorityNumber no call num");\r
+        return false;\r
+    }\r
+\r
+    if (g_retNum > 0 && g_retNum <= MULTI_CALL_MAX_NUME) {\r
+        for (int i = 0; i < g_retNum; i++) {\r
+            if (callList[i].lastStatus == HFP_HF_CALL_STATE_ACTIVE) {\r
+                g_firstPriority = i;\r
+                g_isCall = callList[i].lastStatus;\r
+                break;\r
+            } else if (callList[i].lastStatus == HFP_HF_CALL_STATE_HELD) {\r
+                g_secondPriority = i;\r
+                g_isCall = callList[i].lastStatus;\r
+            } else if (callList[i].lastStatus == HFP_HF_CALL_STATE_ALERTING ||\r
+                       callList[i].lastStatus == HFP_HF_CALL_STATE_DIALING) {\r
+                if (g_secondPriority == NO_NUMBER_STATUS) {\r
+                    g_isCall = callList[i].lastStatus;\r
+                }\r
+                g_thirdPriority = i;\r
+            } else if (callList[i].lastStatus == HFP_HF_CALL_STATE_INCOMING ||\r
+                       callList[i].lastStatus == HFP_HF_CALL_STATE_WAITING) {\r
+                if (g_isCall == NO_NUMBER_STATUS && callList[i].lastStatus == HFP_HF_CALL_STATE_INCOMING) {\r
+                    g_isCall = callList[i].lastStatus;\r
+                }\r
+                g_fourthPriority = i;\r
+            }\r
+        }\r
+    }\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "FindCallListInfoAndSetPriorityNumber] [%d] [%d] [%d] [%d], g_isCall = %d",\r
+                  g_firstPriority, g_secondPriority, g_thirdPriority, g_fourthPriority, g_isCall);\r
+    SetPriorityNumber();\r
+    return true;\r
+}\r
+\r
+static void CallModelResumePlayer(void)\r
+{\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[CallModelResumePlayer] [ResumePlayer] start");\r
+    usleep(USLEEP_NUM);\r
+}\r
+\r
+static void CallModelPostGraphicEvent(void (*fun)(void))\r
+{\r
+    GraphicService::GetInstance()->PostGraphicEvent(*fun);\r
+}\r
+\r
+static int g_callOperate = OPERATE_NO_OPE;\r
+\r
+static void ExitMakePhoneSlice(void)\r
+{\r
+    if (NativeAbility::GetInstance().GetCurTargetId() ==\r
+        (VIEW_PHONE_MENU | static_cast<uint32_t>(PhoneMenuPages::PHONE_MENU_CALLING_PAGE) << PAGE_OFFSET)) {\r
+        WEARABLE_LOGD(HILOG_MODULE_AAFWK, "ExitMakePhoneSlice");\r
+\r
+        if (GetCurrCallNum() == 0) {\r
+            NativeAbility::GetInstance().ChangeSlice(VIEW_MAIN_SAMPLE);\r
+            CallModelPostGraphicEvent(CallModelResumePlayer);\r
+        } else {\r
+            NativeAbility::GetInstance().ChangeSliceToApplist();\r
+        }\r
+    }\r
+    PhoneMenuCallerLogModel::GetInstance()->SetCallStatus(false);\r
+    DisableCallingTimer();\r
+    if (PhoneMenuCallerLogModel::GetInstance()->GetNotifyFlag()) {\r
+        g_isWatchCallView = false;\r
+    }\r
+}\r
+\r
+static void DialingHandle(void)\r
+{\r
+    PhoneMenuCallerLogModel::GetInstance()->SetDialingStatus("正在拨号");\r
+    PhoneMenuCallerLogModel::GetInstance()->SetMakePhoneStatus(true);\r
+}\r
+\r
+static void AlertingHandle(void)\r
+{\r
+    PhoneMenuCallerLogModel::GetInstance()->SetDialingStatus("正在响铃");\r
+    PhoneMenuCallerLogModel::GetInstance()->SetMakePhoneStatus(true);\r
+}\r
+\r
+static void IncomingHandle(void)\r
+{\r
+    PhoneMenuCallerLogModel::GetInstance()->SetMakePhoneStatus(false);\r
+}\r
+\r
+static void WaitingOpreate()\r
+{\r
+    if (!IsCompleteCallFlow()) {\r
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[UsingPhoneChangeStatusCallback] is not complete call flow");\r
+        return;\r
+    }\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[WaitingOpreate] WaitingOpreate");\r
+    PhoneMenuCallerLogModel::GetInstance()->SetCallStatus(false);\r
+    PhoneMenuCallerLogModel::GetInstance()->SetWaitingStatus(true);\r
+    if (!PhoneMenuCallerLogModel::GetInstance()->GetNotifyFlag()) {\r
+        uint32_t targetId = NativeAbility::GetInstance().GetCurSliceId();\r
+        if (targetId == VIEW_PHONE_MENU) {\r
+            NativeAbility::GetInstance().SwitchPageInSlice(PhoneMenuPages::PHONE_MENU_CALLING_PAGE,\r
+                TransitionType::TRANSITION_INVALID, false);\r
+        } else {\r
+            NativeAbility::GetInstance().SwitchSlice(VIEW_PHONE_MENU, PhoneMenuPages::PHONE_MENU_CALLING_PAGE);\r
+        }\r
+    } else {\r
+        g_isWatchCallView = true;\r
+    }\r
+}\r
+\r
+static void WatchActiveHandle(const PhoneCallInfo *phoneCall)\r
+{\r
+    if (NativeAbility::GetInstance().GetCurTargetId() ==\r
+            (VIEW_PHONE_MENU | static_cast<uint32_t>(PhoneMenuPages::PHONE_MENU_CALLING_PAGE) << PAGE_OFFSET) ||\r
+        NativeAbility::GetInstance().GetCurSliceId() == VIEW_OFFLINEVOICE ||\r
+        PhoneMenuCallerLogModel::GetInstance()->GetNotifyFlag()) {\r
+        time_t seconds;\r
+        time(&seconds);\r
+        g_callTimes = seconds - phoneCall->activeTime;\r
+\r
+        InitCallingTimer();\r
+        PhoneMenuCallerLogModel::GetInstance()->SetCallStatus(true);\r
+    }\r
+    if (PhoneMenuCallerLogModel::GetInstance()->GetNotifyFlag()) {\r
+        g_isWatchCallView = true;\r
+    }\r
+}\r
+\r
+static void PhoneActiveHandle(void)\r
+{\r
+    if (NativeAbility::GetInstance().GetCurTargetId() ==\r
+            (VIEW_PHONE_MENU | static_cast<uint32_t>(PhoneMenuPages::PHONE_MENU_CALLING_PAGE) << PAGE_OFFSET) ||\r
+        g_isWatchCallView) {\r
+        if (GetCurrCallNum() > ONE_NUM) {\r
+            g_phoneStatus = PHONE_MULTI_STATUS;\r
+            if (GetScoConnectState() == HFP_SCO_STATE_DISCONNECTED) {\r
+                DisableCallingTimer();\r
+            }\r
+        }\r
+        TransCallToMobilePhone();\r
+        PhoneMenuCallerLogModel::GetInstance()->BackToPrePage();\r
+        CallModelPostGraphicEvent(CallModelResumePlayer);\r
+    }\r
+    usleep(USLEEP_NUM);\r
+    g_callOperate = OPERATE_WATCH_ACTIVE;\r
+}\r
+\r
+static void OppoActiveHandle(const PhoneCallInfo *phoneCall)\r
+{\r
+    if (NativeAbility::GetInstance().GetCurTargetId() ==\r
+            (VIEW_PHONE_MENU | static_cast<uint32_t>(PhoneMenuPages::PHONE_MENU_CALLING_PAGE) << PAGE_OFFSET) ||\r
+        g_isWatchCallView) {\r
+        if (GetCurrCallNum() > ONE_NUM) {\r
+            g_phoneStatus = PHONE_MULTI_STATUS;\r
+            return;\r
+        }\r
+        time_t seconds;\r
+        time(&seconds);\r
+        g_callTimes = seconds - phoneCall->activeTime;\r
+        InitCallingTimer();\r
+        PhoneMenuCallerLogModel::GetInstance()->SetCallStatus(true);\r
+    }\r
+}\r
+\r
+bool MulitplePhoneTextReplaces()\r
+{\r
+    DisableCallingTimer();\r
+    PhoneMenuCallingPage::GetInstance()->GetCallingPhoneNumberLabel()->SetText("正在通话");\r
+    PhoneMenuCallingPage::GetInstance()->GetCallingStateLabel()->SetText("");\r
+    return true;\r
+}\r
+\r
+static bool MultiplePhonesViewDisplay()\r
+{\r
+    if (g_phoneStatus == PHONE_MULTI_STATUS) {\r
+        if (NativeAbility::GetInstance().GetCurTargetId() !=\r
+            (VIEW_PHONE_MENU | static_cast<uint32_t>(PhoneMenuPages::PHONE_MENU_CALLING_PAGE))) {\r
+            WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[MultiplePhonesViewDisplay]GetCurSliceId no PHONE_MENU_CALLING_PAGE");\r
+            DisableCallingTimer();\r
+            PhoneMenuCallerLogModel::GetInstance()->SetMulitplePhoneStatus(true);\r
+            PhoneMenuCallerLogModel::GetInstance()->SetCallStatus(true);\r
+            if (!PhoneMenuCallerLogModel::GetInstance()->GetNotifyFlag()) {\r
+                NativeAbility::GetInstance().SwitchSlice(VIEW_PHONE_MENU, PhoneMenuPages::PHONE_MENU_CALLING_PAGE);\r
+            } else {\r
+                g_isWatchCallView = true;\r
+            }\r
+            return true;\r
+        }\r
+        if (!MulitplePhoneTextReplaces()) {\r
+            return false;\r
+        }\r
+        return true;\r
+    }\r
+    return false;\r
+}\r
+\r
+static void NonWatchFinishHandle(int laststatus)\r
+{\r
+    if (NativeAbility::GetInstance().GetCurTargetId() ==\r
+            (VIEW_PHONE_MENU | static_cast<uint32_t>(PhoneMenuPages::PHONE_MENU_CALLING_PAGE) << PAGE_OFFSET) ||\r
+        PhoneMenuCallerLogModel::GetInstance()->GetNotifyFlag()) {\r
+        if (GetCurrCallNum() == 0) {\r
+            PhoneMenuCallerLogModel::GetInstance()->SetNotifyFlag(false);\r
+            StatusReset();\r
+            CallModelPostGraphicEvent(CallModelResumePlayer);\r
+            g_phoneStatus = PHONE_SINGLE_STATUS;\r
+        } else if (g_phoneStatus == PHONE_MULTI_STATUS) {\r
+            MultiplePhonesViewDisplay();\r
+        } else if (FindCallListInfoAndSetPriorityNumber()) {\r
+            if (laststatus == HFP_HF_CALL_STATE_ACTIVE || laststatus == HFP_HF_CALL_STATE_HELD) {\r
+                PhoneMenuCallerLogModel::GetInstance()->SetCallStatus(false);\r
+                PhoneMenuCallerLogModel::GetInstance()->SetWaitingStatus(false);\r
+            } else if (laststatus == HFP_HF_CALL_STATE_WAITING) {\r
+                PhoneMenuCallerLogModel::GetInstance()->SetCallStatus(true);\r
+                PhoneMenuCallerLogModel::GetInstance()->SetWaitingStatus(false);\r
+            }\r
+            uint32_t targetId = NativeAbility::GetInstance().GetCurSliceId();\r
+            if (targetId == VIEW_PHONE_MENU) {\r
+                NativeAbility::GetInstance().SwitchPageInSlice(PhoneMenuPages::PHONE_MENU_CALLING_PAGE,\r
+                    TransitionType::TRANSITION_INVALID, false);\r
+            } else {\r
+                NativeAbility::GetInstance().SwitchSlice(VIEW_PHONE_MENU, PhoneMenuPages::PHONE_MENU_CALLING_PAGE);\r
+            }\r
+        }\r
+        if (GetCurrCallNum() == 0) {\r
+            PhoneMenuCallerLogModel::GetInstance()->SetNotifyFlag(false);\r
+        }\r
+    }\r
+    if (GetCurrCallNum() == 0) {\r
+        g_phoneStatus = PHONE_SINGLE_STATUS;\r
+    }\r
+}\r
+\r
+static void WatchFinishHandle(void)\r
+{\r
+    if (NativeAbility::GetInstance().GetCurTargetId() ==\r
+            (VIEW_PHONE_MENU | static_cast<uint32_t>(PhoneMenuPages::PHONE_MENU_CALLING_PAGE) << PAGE_OFFSET) ||\r
+        PhoneMenuCallerLogModel::GetInstance()->GetNotifyFlag()) {\r
+        if (GetCurrCallNum() == 0) {\r
+            PhoneMenuCallerLogModel::GetInstance()->SetNotifyFlag(false);\r
+            StatusReset();\r
+        } else {\r
+            StatusReset();\r
+            for (int i = GetCurrCallNum(); i > 0; i--) {\r
+                FinishCall();\r
+            }\r
+        }\r
+    }\r
+    g_phoneStatus = PHONE_SINGLE_STATUS;\r
+}\r
+\r
+static void ChangeStatusScreendisplay(int lastStatus)\r
+{\r
+    if (GetScoConnectState() != HFP_SCO_STATE_CONNECTED) {\r
+        if (lastStatus == HFP_HF_CALL_STATE_ACTIVE) {\r
+            WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[ChangeStatusScreendisplay] STATE_ACTIVE");\r
+            StatusReset();\r
+            return;\r
+        } else if (lastStatus == HFP_HF_CALL_STATE_INCOMING) {\r
+            WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[ChangeStatusScreendisplay] STATE_INCOMING");\r
+        } else if (GetCurrCallNum() == ONE_NUM &&\r
+                   (lastStatus == HFP_HF_CALL_STATE_DIALING || lastStatus == HFP_HF_CALL_STATE_ALERTING)) {\r
+            WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[ChangeStatusScreendisplay] STATE_ALERTING");\r
+        } else if (GetCurrCallNum() > ONE_NUM) {\r
+            WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[ChangeStatusScreendisplay] GetCurrCallNum MULITE");\r
+            DisableCallingTimer();\r
+            return;\r
+        }\r
+    }\r
+    if (!IsCompleteCallFlow()) {\r
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[ChangeStatusScreendisplay] is not complete call flow");\r
+        return;\r
+    }\r
+    if (MultiplePhonesViewDisplay()) {\r
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[ChangeStatusScreendisplay] MultiplePhonesViewDisplay");\r
+        return;\r
+    }\r
+    if (g_callOperate != OPERATE_PHONE_ACTIVE && (!PhoneMenuCallerLogModel::GetInstance()->GetNotifyFlag())) {\r
+        uint32_t targetId = NativeAbility::GetInstance().GetCurSliceId();\r
+        if (targetId == VIEW_PHONE_MENU) {\r
+            NativeAbility::GetInstance().SwitchPageInSlice(PhoneMenuPages::PHONE_MENU_CALLING_PAGE,\r
+                TransitionType::TRANSITION_INVALID, false);\r
+        } else {\r
+            NativeAbility::GetInstance().SwitchSlice(VIEW_PHONE_MENU, PhoneMenuPages::PHONE_MENU_CALLING_PAGE);\r
+        }\r
+    }\r
+}\r
+\r
+void UsingPhoneChangeStatusCallback(const PhoneCallInfo *phoneCall)\r
+{\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[UsingPhoneChangeStatusCallback] operate:%d, callNUm:%d, call flow:%d",\r
+                  phoneCall->operate, GetCurrCallNum(), IsCompleteCallFlow());\r
+\r
+    if (phoneCall->operate == OPERATE_WATCH_FINISH && GetCurrCallNum() == 0) {\r
+        g_callOperate = OPERATE_WATCH_FINISH;\r
+        WatchFinishHandle();\r
+        return;\r
+    }\r
+    PhoneMenuCallerLogModel::GetInstance()->SetoperateNumber(phoneCall->unitCalls.number,\r
+                                                             phoneCall->unitCalls.number_len);\r
+    g_callOperate = phoneCall->operate;\r
+\r
+    switch (g_callOperate) {\r
+        case OPERATE_DIALING:\r
+            DialingHandle();\r
+            break;\r
+        case OPERATE_ALERTING:\r
+            AlertingHandle();\r
+            break;\r
+        case OPERATE_INCOMING:\r
+            IncomingHandle();\r
+            break;\r
+        case OPERATE_WAITING:\r
+            WaitingOpreate();\r
+            return;\r
+        case OPERATE_WATCH_ACTIVE:\r
+            WatchActiveHandle(phoneCall);\r
+            break;\r
+        case OPERATE_PHONE_ACTIVE:\r
+            PhoneActiveHandle();\r
+            return;\r
+        case OPERATE_PEER_ACTIVE:\r
+            OppoActiveHandle(phoneCall);\r
+            break;\r
+        case OPERATE_PHONE_HOLD:\r
+            return;\r
+        case OPERATE_WATCH_FINISH:\r
+            WatchFinishHandle();\r
+            return;\r
+        case OPERATE_WATCH_REJECT:\r
+        case OPERATE_NON_WATCH_FINISH:\r
+            NonWatchFinishHandle(phoneCall->lastStatus);\r
+            return;\r
+        default:\r
+            break;\r
+    }\r
+    ChangeStatusScreendisplay(phoneCall->lastStatus);\r
+}\r
+\r
+void UsingPhoneErrorCallback(PhoneServiceErrorType type)\r
+{\r
+    if (type == ERROR_DIAL) {\r
+    } else if (type == ERROR_BT) {\r
+        WEARABLE_LOGD(HILOG_MODULE_AAFWK, "UsingPhoneErrorCallback BT");\r
+        ExitMakePhoneSlice();\r
+    }\r
+}\r
+\r
+static void ScoConnectHandle(void)\r
+{\r
+    if (GetCurrCallNum() == 0) {\r
+        return;\r
+    }\r
+\r
+    if (!FindCallListInfoAndSetPriorityNumber()) {\r
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ScoConnectHandle FindCallListInfoAndSetPriorityNumber false");\r
+        return;\r
+    }\r
+\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[ScoConnectHandle] g_isCall = %d", g_isCall);\r
+    switch (g_isCall) {\r
+        case HFP_HF_CALL_STATE_ACTIVE:\r
+            if (g_callOperate == OPERATE_PHONE_ACTIVE) {\r
+                WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[ScoConnectHandle] OPERATE_PHONE_ACTIVE");\r
+                return;\r
+            }\r
+            PhoneMenuCallerLogModel::GetInstance()->SetCallStatus(true);\r
+            InitCallingTimer();\r
+            break;\r
+        case HFP_HF_CALL_STATE_ALERTING:\r
+            PhoneMenuCallerLogModel::GetInstance()->SetDialingStatus("正在响铃");\r
+            PhoneMenuCallerLogModel::GetInstance()->SetMakePhoneStatus(true);\r
+            break;\r
+        case HFP_HF_CALL_STATE_DIALING:\r
+            PhoneMenuCallerLogModel::GetInstance()->SetDialingStatus("正在拨号");\r
+            PhoneMenuCallerLogModel::GetInstance()->SetMakePhoneStatus(true);\r
+            break;\r
+        case HFP_HF_CALL_STATE_INCOMING:\r
+            PhoneMenuCallerLogModel::GetInstance()->SetMakePhoneStatus(false);\r
+            break;\r
+        case HFP_HF_CALL_STATE_HELD:\r
+            PhoneMenuCallerLogModel::GetInstance()->SetCallStatus(true);\r
+            InitCallingTimer();\r
+            break;\r
+        default:\r
+            break;\r
+    }\r
+    g_isCall = NO_NUMBER_STATUS;\r
+    if (!IsCompleteCallFlow()) {\r
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[ScoConnectHandle] is not complete call flow");\r
+        return;\r
+    }\r
+    if (MultiplePhonesViewDisplay()) {\r
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[ScoConnectHandle] MultiplePhonesViewDisplay");\r
+        return;\r
+    }\r
+    if (!PhoneMenuCallerLogModel::GetInstance()->GetNotifyFlag()) {\r
+        uint32_t targetId = NativeAbility::GetInstance().GetCurSliceId();\r
+        if (targetId == VIEW_PHONE_MENU) {\r
+            NativeAbility::GetInstance().SwitchPageInSlice(PhoneMenuPages::PHONE_MENU_CALLING_PAGE,\r
+                TransitionType::TRANSITION_INVALID, false);\r
+        } else {\r
+            NativeAbility::GetInstance().SwitchSlice(VIEW_PHONE_MENU, PhoneMenuPages::PHONE_MENU_CALLING_PAGE);\r
+        }\r
+    } else {\r
+        g_isWatchCallView = true;\r
+    }\r
+}\r
+\r
+static void ScoDisconnectHandle(void)\r
+{\r
+    ExitMakePhoneSlice();\r
+    PhoneMenuCallerLogModel::GetInstance()->SetWaitingStatus(false);\r
+}\r
+\r
+void UsingPhoneScoStatausCallback(hfp_sco_connect_state_t state)\r
+{\r
+    WEARABLE_LOGD(HILOG_MODULE_AAFWK, "UsingPhoneScoStatausCallback SOC state: %d", state);\r
+\r
+    if (!IsCompleteCallFlow()) {\r
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[UsingPhoneScoStatausCallback] is not complete call flow");\r
+        return;\r
+    }\r
+\r
+    if (state == HFP_SCO_STATE_CONNECTED) {\r
+        ScoConnectHandle();\r
+    } else if (state == HFP_SCO_STATE_DISCONNECTED) {\r
+        ScoDisconnectHandle();\r
+    }\r
+}\r
+\r
+void PhoneChangeStatusCallback(const PhoneCallInfo *phoneCall)\r
+{\r
+    (void)memset_s(&callInfo, sizeof(PhoneCallInfo), 0, sizeof(PhoneCallInfo));\r
+    (void)memcpy_s(&callInfo, sizeof(PhoneCallInfo), phoneCall, sizeof(PhoneCallInfo));\r
+    GraphicService::GetInstance()->PostGraphicEvent(std::bind(UsingPhoneChangeStatusCallback, &callInfo));\r
+}\r
+\r
+void PhoneErrorCallback(PhoneServiceErrorType type, int volume)\r
+{\r
+    g_volumeLocal = volume;\r
+    GraphicService::GetInstance()->PostGraphicEvent(std::bind(UsingPhoneErrorCallback, type));\r
+}\r
+\r
+void PhoneScoStatausCallback(hfp_sco_connect_state_t state)\r
+{\r
+    GraphicService::GetInstance()->PostGraphicEvent(std::bind(UsingPhoneScoStatausCallback, state));\r
+}\r
+\r
+namespace OHOS {\r
+static constexpr int32 NUM_TEN = 10;\r
+static constexpr int16 NUM_TIME_MIN = 60;\r
+static constexpr int16 NUM_TIME_HOUR = 3600;\r
+static constexpr int32 NUM_TIME_DAY = 86400;\r
+VolumeSettingView *g_volumeSetting = nullptr;\r
+\r
+void HonrsViewChange(void)\r
+{\r
+    if (g_volumeSetting == nullptr) {\r
+        g_volumeSetting = new VolumeSettingView();\r
+        if (g_volumeSetting == nullptr) {\r
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "CallViewEventListener::g_volumeSetting nullptr err");\r
+            return;\r
+        }\r
+        if (!g_volumeSetting->SetUpVolume()) {\r
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "CallViewEventListener::g_volumeSetting SetUpVolume fail");\r
+            return;\r
+        }\r
+        g_volumeSetting->GetProgress()->SetValue(\r
+            AudioManager::GetInstance().GetVolume(AUDIO_STREAM_VOICE_CALL_BT_SCO));\r
+        if (NotificationManager::GetInstance()->screenContainer_ != nullptr) {\r
+            NotificationManager::GetInstance()->screenContainer_->Add(g_volumeSetting);\r
+        }\r
+    }\r
+    VolumeSliderEventListener *volumeSliderEventListener = g_volumeSetting->GetVolumeEventListener();\r
+    if (volumeSliderEventListener == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "CallViewEventListener::volumeSliderEventListener nullptr err");\r
+        return;\r
+    }\r
+\r
+    volumeSliderEventListener->SetPlayerCoefficients(VOLUMEPHONENOTIFY);\r
+    g_volumeSetting->SetVisible(true);\r
+    RootView::GetInstance()->Invalidate();\r
+}\r
+\r
+VolumeSettingView *GetvolumeSetting(void)\r
+{\r
+    return g_volumeSetting;\r
+}\r
+\r
+PhoneMenuCallerLogModel::PhoneMenuCallerLogModel()\r
+{\r
+    PhoneMenuSync::ReadFileContact(CONTACTS_FILE_PATH);\r
+}\r
+\r
+PhoneMenuCallerLogModel::~PhoneMenuCallerLogModel() {}\r
+\r
+std::list<Contacts> &PhoneMenuCallerLogModel::GetContacts()\r
+{\r
+    return PhoneMenuSync::GetContacts();\r
+}\r
+\r
+void PhoneMenuCallerLogModel::InitPhoneService()\r
+{\r
+    WEARABLE_LOGD(HILOG_MODULE_AAFWK, "PhoneMenuCallerLogModel::[InitPhoneService]::Init start");\r
+    PhoneServiceInit();\r
+    PhoneServiceCb serviceFoution;\r
+\r
+    serviceFoution.callChanged = PhoneChangeStatusCallback;\r
+    serviceFoution.phoneServiceErrorCb = PhoneErrorCallback;\r
+    serviceFoution.scoStatusCb = PhoneScoStatausCallback;\r
+    int ret = RegisterCallChangedCb(&serviceFoution);\r
+    WEARABLE_LOGD(HILOG_MODULE_AAFWK, "PhoneMenuCallerLogModel::[InitPhoneService]::Init ret = %d", ret);\r
+}\r
+\r
+std::string PhoneMenuCallerLogModel::InitDateHourTime(void)\r
+{\r
+    struct tm pTM;\r
+    time_t seconds;\r
+    time(&seconds);\r
+    localtime_r(&seconds, &pTM);\r
+    timers_.erase();\r
+    if (pTM.tm_min < NUM_TEN) {\r
+        std::string min = "0" + std::to_string(pTM.tm_min);\r
+        timers_ = std::to_string(pTM.tm_hour) + ":" + min;\r
+        return timers_;\r
+    }\r
+    timers_ = std::to_string(pTM.tm_hour) + ":" + std::to_string(pTM.tm_min);\r
+    return timers_;\r
+}\r
+\r
+std::string &PhoneMenuCallerLogModel::DisplayCallDuration()\r
+{\r
+    callDuration_.erase();\r
+    std::string hours;\r
+    std::string minute;\r
+    std::string seconds;\r
+    if (g_callTimes >= NUM_TIME_DAY) {\r
+        g_callTimes = 0;\r
+    }\r
+    int hour = g_callTimes / NUM_TIME_HOUR;\r
+    int min = (g_callTimes % NUM_TIME_HOUR) / NUM_TIME_MIN;\r
+    int sec = (g_callTimes % NUM_TIME_HOUR) % NUM_TIME_MIN;\r
+    if (hour >= 0 && hour < NUM_TEN) {\r
+        hours = "0" + std::to_string(hour);\r
+    } else {\r
+        hours = std::to_string(hour);\r
+    }\r
+    if (min >= 0 && min < NUM_TEN) {\r
+        minute = "0" + std::to_string(min);\r
+    } else {\r
+        minute = std::to_string(min);\r
+    }\r
+    if (sec >= 0 && sec < NUM_TEN) {\r
+        seconds = "0" + std::to_string(sec);\r
+    } else {\r
+        seconds = std::to_string(sec);\r
+    }\r
+\r
+    if (hour == 0) {\r
+        callDuration_ = "通话中  " + minute + ":" + seconds;\r
+    } else {\r
+        callDuration_ = "通话中  " + hours + ":" + minute + ":" + seconds;\r
+    }\r
+    return callDuration_;\r
+}\r
+\r
+void PhoneMenuCallerLogModel::SetDialingStatus(const char *text)\r
+{\r
+    dialingStatus_.clear();\r
+    dialingStatus_.append(reinterpret_cast<const char *>(text));\r
+}\r
+\r
+std::string PhoneMenuCallerLogModel::GetDialingStatus(void)\r
+{\r
+    return dialingStatus_;\r
+}\r
+\r
+void PhoneMenuCallerLogModel::SetNotifyFlag(bool flag)\r
+{\r
+    notifyFlag_ = flag;\r
+}\r
+\r
+bool PhoneMenuCallerLogModel::GetNotifyFlag(void)\r
+{\r
+    return notifyFlag_;\r
+}\r
+\r
+bool PhoneMenuCallerLogModel::IsMulitplePhoneStatus(void)\r
+{\r
+    WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "IsMulitplePhoneStatus phoneStatus_:%d", g_phoneStatus);\r
+    return g_phoneStatus == PHONE_MULTI_STATUS;\r
+}\r
+\r
+void PhoneMenuCallerLogModel::SetMulitplePhoneStatus(bool status)\r
+{\r
+    mulitplePhoneStatus_ = status;\r
+}\r
+\r
+bool PhoneMenuCallerLogModel::GetMulitplePhoneStatus()\r
+{\r
+    return mulitplePhoneStatus_;\r
+}\r
+\r
+bool PhoneMenuCallerLogModel::GetWaitingStatus()\r
+{\r
+    return waitingStatus_;\r
+}\r
+void PhoneMenuCallerLogModel::SetWaitingStatus(bool status)\r
+{\r
+    waitingStatus_ = status;\r
+}\r
+\r
+void PhoneMenuCallerLogModel::SetCallStatus(bool status)\r
+{\r
+    callStatus_ = status;\r
+}\r
+\r
+bool PhoneMenuCallerLogModel::GetCallStatus()\r
+{\r
+    return callStatus_;\r
+}\r
+\r
+void PhoneMenuCallerLogModel::SetVolumeScreenStatus(bool status)\r
+{\r
+    volumeStatus_ = status;\r
+}\r
+\r
+bool PhoneMenuCallerLogModel::GetVolumeScreenStatus()\r
+{\r
+    return volumeStatus_;\r
+}\r
+\r
+void PhoneMenuCallerLogModel::SetoperateNumber(const char *number, char number_len)\r
+{\r
+    phoneNumber_.clear();\r
+    phoneNumber_.append(number, number_len);\r
+}\r
+\r
+std::string PhoneMenuCallerLogModel::GetPhoneNumber(void)\r
+{\r
+    return phoneNumber_;\r
+}\r
+\r
+void PhoneMenuCallerLogModel::SetMakePhoneStatus(bool status)\r
+{\r
+    phoneStatus_ = status;\r
+}\r
+\r
+bool PhoneMenuCallerLogModel::GetPhoneStatus()\r
+{\r
+    return phoneStatus_;\r
+}\r
+\r
+int PhoneMenuCallerLogModel::CurrCallNum(void)\r
+{\r
+    return GetCurrCallNum();\r
+}\r
+\r
+PhoneMenuCallerLogModel *PhoneMenuCallerLogModel::GetInstance(void)\r
+{\r
+    static PhoneMenuCallerLogModel callLogModel;\r
+    return &callLogModel;\r
+}\r
+\r
+void PhoneMenuCallerLogModel::SaveCurPage()\r
+{\r
+    uint32_t targetId = NativeAbility::GetInstance().GetCurTargetId();\r
+    if (targetId == VIEW_AOD) {\r
+        preSliceId_ = VIEW_MAIN_SAMPLE;\r
+        prePageId_ = 0;\r
+    } else {\r
+        preSliceId_ = static_cast<uint16_t>(targetId & SLICE_MASK);\r
+        prePageId_ = static_cast<uint16_t>(targetId >> PAGE_OFFSET);\r
+    }\r
+    WEARABLE_LOGD(\r
+        WEARABLE_LOG_MODULE_APP, "PhoneMenuCallerLogModel SaveCurPage:%d %d %d", targetId, preSliceId_, prePageId_);\r
+}\r
+\r
+void PhoneMenuCallerLogModel::BackToPrePage()\r
+{\r
+    if (prePageId_ != 0) {\r
+        NativeAbility::GetInstance().SwitchSlice(preSliceId_, prePageId_);\r
+    } else {\r
+        NativeAbility::GetInstance().ChangeSlice(preSliceId_);\r
+    }\r
+}\r
+}\r
+#ifdef __cplusplus\r
+}\r
+#endif\r
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/phonemenu/src/PhoneMenuCallerLogPage.cpp b/code/sdk/application/wearable/evb/nativeapp/nativeui/phonemenu/src/PhoneMenuCallerLogPage.cpp
new file mode 100644 (file)
index 0000000..4db4739
--- /dev/null
@@ -0,0 +1,243 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: PhoneMenuCallerLogPage\r
+ * Create: 2025-06-06\r
+ */\r
+\r
+#include <string.h>\r
+#include "UiConfig.h"\r
+#include "wearable_log.h"\r
+#include "AppViewIDs.h"\r
+#include "SlicePageFactory.h"\r
+#include "NativeAbility.h"\r
+#include "phonemenu/PhoneMenuView.h"\r
+#include "phonemenu/PhoneMenuCallerLogItemView.h"\r
+#include "phonemenu/PhoneMenuCallerLogModel.h"\r
+#include "phonemenu/PhoneMenuCallerLogPage.h"\r
+\r
+namespace OHOS {\r
+static constexpr uint16_t TITLI_LABEL_X = 97;\r
+static constexpr uint16_t TITLI_LABEL_Y = 31;\r
+static constexpr uint16_t TITLI_LABEL_W = 260;\r
+static constexpr uint16_t TITLI_LABEL_H = 53;\r
+static constexpr uint16_t TITLI_LABEL_FONT = 38;\r
+static constexpr uint16_t NOCALL_LABEL_X = 156;\r
+static constexpr uint16_t NOCALL_LABEL_Y = 202;\r
+static constexpr uint16_t NOCALL_LABEL_W = 148;\r
+static constexpr uint16_t NOCALL_LABEL_H = 50;\r
+static constexpr uint16_t NOCALL_LABEL_FONT = 36;\r
+static constexpr uint16_t CLEAR_LABEL_X = 156;\r
+static constexpr uint16_t CLEAR_LABEL_W = 148;\r
+static constexpr uint16_t CLEAR_LABEL_H = 50;\r
+static constexpr uint16_t CLEAR_LABEL_FONT = 36;\r
+static constexpr uint16_t LIST_X = 17;\r
+static constexpr uint16_t LIST_Y = 110;\r
+static constexpr uint16_t LIST_W = 418;\r
+static constexpr uint16_t LIST_H = 344;\r
+static constexpr uint16_t LIST_ITEM_W = 418;\r
+static constexpr uint16_t LIST_ITEM_H = 143;\r
+static constexpr uint16_t TOP_BLANK_SIZE = 31;\r
+static constexpr uint16_t BOTTOM_BLANK_SIZE = 80;\r
+const char *PHONE_MENU_CLEAR_BUTTON = "phoneMenuClearButton";\r
+\r
+REGIST_SLICE_PAGE(VIEW_PHONE_MENU, PhoneMenuPages::PHONE_MENU_CALLER_LOG_PAGE, PhoneMenuCallerLogPage, false);\r
+\r
+static PhoneMenuCallerLogPage *g_PhoneMenuCallerLogPageInstance = nullptr;\r
+\r
+static UIView *CreateViewCb(uint8_t type)\r
+{\r
+    PhoneMenuCallerLogItemView *item = new PhoneMenuCallerLogItemView();\r
+    if (item == nullptr) {\r
+        return nullptr;\r
+    }\r
+    item->SetPosition(0, 0, LIST_ITEM_W, LIST_ITEM_H);\r
+    item->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+    item->SetTouchable(true);\r
+    item->SetOnClickListener(g_PhoneMenuCallerLogPageInstance);\r
+    return item;\r
+}\r
+\r
+static void UpdateViewCb(UIView *view, void *data, uint8_t type)\r
+{\r
+    if (view == nullptr || data == nullptr) {\r
+        return;\r
+    }\r
+    PhoneMenuCallerLogItemView *item = dynamic_cast<PhoneMenuCallerLogItemView *>(view);\r
+    if (item == nullptr) {\r
+        return;\r
+    }\r
+    CallLogInfo *itemInfo = static_cast<CallLogInfo *>(data);\r
+    item->SetItemInfo(*itemInfo);\r
+}\r
+\r
+PhoneMenuCallerLogPage::PhoneMenuCallerLogPage()\r
+{\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "PhoneMenuCallerLogPage::PhoneMenuCallerLogPage");\r
+    g_PhoneMenuCallerLogPageInstance = this;\r
+}\r
+\r
+PhoneMenuCallerLogPage::~PhoneMenuCallerLogPage()\r
+{\r
+    if (group_ != nullptr) {\r
+        group_->RemoveAll();\r
+        delete group_;\r
+        group_ = nullptr;\r
+    }\r
+    if (titleLabel_ != nullptr) {\r
+        delete titleLabel_;\r
+        titleLabel_ = nullptr;\r
+    }\r
+    if (noCallLabel_ != nullptr) {\r
+        delete noCallLabel_;\r
+        noCallLabel_ = nullptr;\r
+    }\r
+    if (clearButton_ != nullptr) {\r
+        delete clearButton_;\r
+        clearButton_ = nullptr;\r
+    }\r
+    if (callerLogList_ != nullptr) {\r
+        delete callerLogList_;\r
+        callerLogList_ = nullptr;\r
+    }\r
+    if (info_ != nullptr) {\r
+        delete[] info_;\r
+        info_ = nullptr;\r
+    }\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "PhoneMenuCallerLogPage::~PhoneMenuCallerLogPage");\r
+}\r
+\r
+void PhoneMenuCallerLogPage::OnStart(void *data)\r
+{\r
+    group_ = new UIScrollView();\r
+    if (group_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "PhoneMenuCallerLogPage group_ new fail");\r
+        return;\r
+    }\r
+    group_->SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);\r
+    group_->SetOnDragListener(this);\r
+    group_->SetDraggable(true);\r
+    group_->SetTouchable(true);\r
+\r
+    titleLabel_ = new UILabel();\r
+    if (titleLabel_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "PhoneMenuCallerLogPage titleLabel_ new fail");\r
+        return;\r
+    }\r
+    titleLabel_->SetPosition(TITLI_LABEL_X, TITLI_LABEL_Y, TITLI_LABEL_W, TITLI_LABEL_H);\r
+    titleLabel_->SetText("最近通话");\r
+    titleLabel_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+    titleLabel_->SetFont(BOLD_VECTOR_FONT_FILENAME, TITLI_LABEL_FONT);\r
+    group_->Add(titleLabel_);\r
+\r
+    noCallLabel_ = new UILabel();\r
+    if (noCallLabel_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "PhoneMenuCallerLogPage noCallLabel_ new fail");\r
+        return;\r
+    }\r
+    noCallLabel_->SetPosition(NOCALL_LABEL_X, NOCALL_LABEL_Y, NOCALL_LABEL_W, NOCALL_LABEL_H);\r
+    noCallLabel_->SetText("暂无通话");\r
+    noCallLabel_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+    noCallLabel_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, NOCALL_LABEL_FONT);\r
+    group_->Add(noCallLabel_);\r
+\r
+    clearButton_ = new UILabelButton();\r
+    if (clearButton_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "PhoneMenuCallerLogPage clearButton_ new fail");\r
+        return;\r
+    }\r
+    clearButton_->SetText("全部清除");\r
+    clearButton_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, CLEAR_LABEL_FONT);\r
+    clearButton_->SetViewId(PHONE_MENU_CLEAR_BUTTON);\r
+    clearButton_->SetStyleForState(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT, UIButton::RELEASED);\r
+    clearButton_->SetStyleForState(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT, UIButton::PRESSED);\r
+    clearButton_->SetStyleForState(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT, UIButton::INACTIVE);\r
+    clearButton_->SetOnClickListener(this);\r
+    group_->Add(clearButton_);\r
+\r
+    callerLogList_ = new UISimpleList();\r
+    if (callerLogList_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "PhoneMenuCallerLogPage callerLogList_ new fail");\r
+        return;\r
+    }\r
+    callerLogList_->SetPosition(LIST_X, LIST_Y, LIST_W, LIST_H);\r
+    callerLogList_->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+    callerLogList_->SetBoundaryIntercept(DragEvent::DIRECTION_TOP_TO_BOTTOM, false);\r
+    callerLogList_->SetBoundaryIntercept(DragEvent::DIRECTION_BOTTOM_TO_TOP, false);\r
+\r
+    int num = 0;\r
+    if (GetCallLog(&info_, &num) == -1) {\r
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "PhoneMenuCallerLogPage GetCallLog fail");\r
+    }\r
+\r
+    for (int i = num - 1; i >= 0; i--) {\r
+        Contents content;\r
+        content.createFunc = CreateViewCb;\r
+        content.updateFunc = UpdateViewCb;\r
+        content.type = 0;\r
+        content.data = reinterpret_cast<void *>(&info_[i]);\r
+        callerLogList_->AddContent(content);\r
+    }\r
+    callerLogList_->RefreshList();\r
+    group_->Add(callerLogList_);\r
+\r
+    if (num == 0) {\r
+        noCallLabel_->SetVisible(true);\r
+        callerLogList_->SetVisible(false);\r
+        clearButton_->SetVisible(false);\r
+    } else {\r
+        group_->SetYScrollBarVisible(true);\r
+        group_->SetScrollBlankSize(TOP_BLANK_SIZE, UIAbstractScroll::Direction::TOP);\r
+        group_->SetScrollBlankSize(BOTTOM_BLANK_SIZE, UIAbstractScroll::Direction::BOTTOM);\r
+        noCallLabel_->SetVisible(false);\r
+        callerLogList_->SetVisible(true);\r
+        callerLogList_->Resize(LIST_W, LIST_ITEM_H * num);\r
+        clearButton_->SetVisible(true);\r
+        clearButton_->SetPosition(CLEAR_LABEL_X, LIST_Y + LIST_ITEM_H * num, CLEAR_LABEL_W, CLEAR_LABEL_H);\r
+    }\r
+\r
+    AddViewToPageContainer(group_);\r
+}\r
+\r
+bool PhoneMenuCallerLogPage::OnDrag(UIView &view, const DragEvent &event)\r
+{\r
+    if ((event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT) && (event.GetDeltaX() > X_DRAG_OFFSET) &&\r
+        (event.GetDeltaX() > (DOUBLES * MATH_ABS(event.GetDeltaY())))) {\r
+        NativeAbility::GetInstance().SwitchPageInSlice(PhoneMenuPages::PHONE_MENU_MAIN_PAGE,\r
+            TransitionType::TRANSITION_INVALID, false);\r
+    }\r
+    return true;\r
+}\r
+\r
+bool PhoneMenuCallerLogPage::OnClick(UIView &view, const ClickEvent &event)\r
+{\r
+    if (strcmp(view.GetViewId(), PHONE_MENU_CLEAR_BUTTON) == 0) {\r
+        if (ClearCallLogFile() == 0) {\r
+            WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "PhoneMenuCallerLogPage ClearCallLogFile success");\r
+        }\r
+        callerLogList_->ClearAll();\r
+        callerLogList_->RefreshList();\r
+        NativeAbility::GetInstance().SwitchPageInSlice(PhoneMenuPages::PHONE_MENU_CALLER_LOG_PAGE,\r
+            TransitionType::TRANSITION_INVALID, false);\r
+    } else {\r
+        if (GetBtConnectStatus() != PROFILE_STATE_CONNECTED) {\r
+            NativeAbility::GetInstance().SwitchPageInSlice(PhoneMenuPages::PHONE_MENU_DISCONNECT_PAGE,\r
+                TransitionType::TRANSITION_INVALID, false);\r
+            return true;\r
+        }\r
+\r
+        PhoneMenuCallerLogItemView *itemView = dynamic_cast<PhoneMenuCallerLogItemView *>(&view);\r
+        if (itemView == nullptr) {\r
+            return false;\r
+        }\r
+        unsigned char *phoneNumber = itemView->GetItemPhoneNumber();\r
+        SetMicMute(false);\r
+        PhoneMenuCallerLogModel::GetInstance()->SetMicMute(false);\r
+        if (DialCall(phoneNumber, strlen((const char *)phoneNumber)) != OHOS_SUCCESS) {\r
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "PhoneMenuCallerLogPage DialCall fail");\r
+            return false;\r
+        }\r
+        PhoneMenuCallerLogModel::GetInstance()->SaveCurPage();\r
+    }\r
+    return true;\r
+}\r
+}
\ No newline at end of file
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/phonemenu/src/PhoneMenuCallingPage.cpp b/code/sdk/application/wearable/evb/nativeapp/nativeui/phonemenu/src/PhoneMenuCallingPage.cpp
new file mode 100644 (file)
index 0000000..903089e
--- /dev/null
@@ -0,0 +1,302 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: PhoneMenuCallingPage\r
+ * Create: 2025-06-06\r
+ */\r
+\r
+#include "AppViewIDs.h"\r
+#include "SlicePageFactory.h"\r
+#include "NativeAbility.h"\r
+#include "UiConfig.h"\r
+#include "main/LoadImg.h"\r
+#include "wearable_log.h"\r
+#include "ui_resource_phonemenu.h"\r
+#include "phonemenu/PhoneMenuView.h"\r
+#include "phonemenu/PhoneMenuCallerLogModel.h"\r
+#include "phonemenu/PhoneMenuCallingPage.h"\r
+\r
+namespace OHOS {\r
+static constexpr uint16_t PHONE_LABEL_X = 74;\r
+static constexpr uint16_t PHONE_LABEL_Y = 143;\r
+static constexpr uint16_t PHONE_LABEL_W = 320;\r
+static constexpr uint16_t PHONE_LABEL_H = 46;\r
+static constexpr uint16_t PHONE_LABEL_FONT = 46;\r
+static constexpr uint16_t STATE_LABEL_X1 = 185;\r
+static constexpr uint16_t STATE_LABEL_X2 = 125;\r
+static constexpr uint16_t STATE_LABEL_Y = 204;\r
+static constexpr uint16_t STATE_LABEL_W = 238;\r
+static constexpr uint16_t STATE_LABEL_H = 46;\r
+static constexpr uint16_t STATE_LABEL_FONT = 34;\r
+static constexpr uint16_t ICON_X = 142;\r
+static constexpr uint16_t ICON_Y = 214;\r
+static constexpr uint16_t BUTTON_X1 = 109;\r
+static constexpr uint16_t BUTTON_X2 = 249;\r
+static constexpr uint16_t BUTTON_X3 = 186;\r
+static constexpr uint16_t BUTTON_Y = 300;\r
+static constexpr uint16_t BUTTON_W = 85;\r
+static constexpr uint16_t BUTTON_H = 85;\r
+static const char *HANG_UP_BUTTON_ID = "callingHangUp";\r
+static const char *ANSWER_BUTTON_ID = "callingAnswer";\r
+static const char *VOLUME_BUTTON_ID = "microphoneChange";\r
+static PhoneMenuCallingPage *g_phoneMenuCallingPage = nullptr;\r
+\r
+REGIST_SLICE_PAGE(VIEW_PHONE_MENU, PhoneMenuPages::PHONE_MENU_CALLING_PAGE, PhoneMenuCallingPage, false);\r
+\r
+PhoneMenuCallingPage::PhoneMenuCallingPage()\r
+{\r
+    g_phoneMenuCallingPage = this;\r
+}\r
+\r
+PhoneMenuCallingPage::~PhoneMenuCallingPage()\r
+{\r
+    if (group_ != nullptr) {\r
+        group_->RemoveAll();\r
+        delete group_;\r
+        group_ = nullptr;\r
+    }\r
+    if (icon_ != nullptr) {\r
+        delete icon_;\r
+        icon_ = nullptr;\r
+    }\r
+    if (phoneNumber_ != nullptr) {\r
+        delete phoneNumber_;\r
+        phoneNumber_ = nullptr;\r
+    }\r
+    if (stateLabel_ != nullptr) {\r
+        delete stateLabel_;\r
+        stateLabel_ = nullptr;\r
+    }\r
+    if (answerButton_ != nullptr) {\r
+        delete answerButton_;\r
+        answerButton_ = nullptr;\r
+    }\r
+    if (hangUpButton_ != nullptr) {\r
+        delete hangUpButton_;\r
+        hangUpButton_ = nullptr;\r
+    }\r
+    if (volumeButton_ != nullptr) {\r
+        delete volumeButton_;\r
+        volumeButton_ = nullptr;\r
+    }\r
+    g_phoneMenuCallingPage = nullptr;\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "PhoneMenuCallingPage::~PhoneMenuCallingPage");\r
+}\r
+\r
+PhoneMenuCallingPage *PhoneMenuCallingPage::GetInstance()\r
+{\r
+    return g_phoneMenuCallingPage;\r
+}\r
+\r
+UILabel *PhoneMenuCallingPage::GetCallingPhoneNumberLabel()\r
+{\r
+    return phoneNumber_;\r
+}\r
+\r
+UILabel *PhoneMenuCallingPage::GetCallingStateLabel()\r
+{\r
+    return stateLabel_;\r
+}\r
+\r
+PhoneMenuCallingPage::CallingState PhoneMenuCallingPage::GetCallingState()\r
+{\r
+    return state_;\r
+}\r
+\r
+void PhoneMenuCallingPage::CreateUILabel()\r
+{\r
+    phoneNumber_ = new UILabel();\r
+    if (phoneNumber_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "PhoneMenuCallingPage phoneNumber_ new fail");\r
+        return;\r
+    }\r
+    phoneNumber_->SetPosition(PHONE_LABEL_X, PHONE_LABEL_Y, PHONE_LABEL_W, PHONE_LABEL_H);\r
+    phoneNumber_->SetText(PhoneMenuCallerLogModel::GetInstance()->GetPhoneNumber().c_str());\r
+    phoneNumber_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, PHONE_LABEL_FONT);\r
+    phoneNumber_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+    group_->Add(phoneNumber_);\r
+\r
+    stateLabel_ = new UILabel();\r
+    if (stateLabel_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "PhoneMenuCallingPage stateLabel_ new fail");\r
+        return;\r
+    }\r
+    stateLabel_->SetPosition(STATE_LABEL_X1, STATE_LABEL_Y, STATE_LABEL_W, STATE_LABEL_H);\r
+    stateLabel_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, STATE_LABEL_FONT);\r
+    stateLabel_->SetAlign(TEXT_ALIGNMENT_LEFT, TEXT_ALIGNMENT_CENTER);\r
+    stateLabel_->SetTextColor(Color::Green());\r
+    group_->Add(stateLabel_);\r
+\r
+    icon_ = new UIImageView();\r
+    if (icon_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "PhoneMenuCallingPage icon_ new fail");\r
+        return;\r
+    }\r
+    icon_->SetPosition(ICON_X, ICON_Y);\r
+    group_->Add(icon_);\r
+}\r
+\r
+void PhoneMenuCallingPage::CreateUIButton()\r
+{\r
+    answerButton_ = new UIButton();\r
+    if (answerButton_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "PhoneMenuCallingPage answerButton_ new fail");\r
+        return;\r
+    }\r
+    answerButton_->SetPosition(BUTTON_X2, BUTTON_Y, BUTTON_W, BUTTON_H);\r
+    answerButton_->SetViewId(ANSWER_BUTTON_ID);\r
+    answerButton_->SetStyleForState(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT, UIButton::RELEASED);\r
+    answerButton_->SetStyleForState(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT, UIButton::PRESSED);\r
+    answerButton_->SetStyleForState(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT, UIButton::INACTIVE);\r
+    LOADIMG::LoadBtnImage(answerButton_, PHONEMENU_IMAGE, IMAGE_PHONEMENU_ANSWER, IMAGE_PHONEMENU_ANSWER);\r
+    answerButton_->SetOnClickListener(this);\r
+    group_->Add(answerButton_);\r
+\r
+    hangUpButton_ = new UIButton();\r
+    if (hangUpButton_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "PhoneMenuCallingPage hangUpButton_ new fail");\r
+        return;\r
+    }\r
+    hangUpButton_->SetViewId(HANG_UP_BUTTON_ID);\r
+    hangUpButton_->SetStyleForState(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT, UIButton::RELEASED);\r
+    hangUpButton_->SetStyleForState(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT, UIButton::PRESSED);\r
+    hangUpButton_->SetStyleForState(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT, UIButton::INACTIVE);\r
+    LOADIMG::LoadBtnImage(hangUpButton_, PHONEMENU_IMAGE, IMAGE_PHONEMENU_HANGUP, IMAGE_PHONEMENU_HANGUP);\r
+    hangUpButton_->SetOnClickListener(this);\r
+    group_->Add(hangUpButton_);\r
+\r
+    volumeButton_ = new UIButton();\r
+    if (volumeButton_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "PhoneMenuCallingPage volumeButton_ new fail");\r
+        return;\r
+    }\r
+    volumeButton_->SetPosition(BUTTON_X2, BUTTON_Y, BUTTON_W, BUTTON_H);\r
+    volumeButton_->SetViewId(VOLUME_BUTTON_ID);\r
+    volumeButton_->SetStyleForState(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT, UIButton::RELEASED);\r
+    volumeButton_->SetStyleForState(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT, UIButton::PRESSED);\r
+    volumeButton_->SetStyleForState(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT, UIButton::INACTIVE);\r
+    bool isMicMute = PhoneMenuCallerLogModel::GetInstance()->GetMicMute();\r
+    if (isMicMute) {\r
+        LOADIMG::LoadBtnImage(volumeButton_, PHONEMENU_IMAGE, IMAGE_PHONEMENU_MIC_MUTE, IMAGE_PHONEMENU_MIC_MUTE);\r
+    } else {\r
+        LOADIMG::LoadBtnImage(volumeButton_, PHONEMENU_IMAGE, IMAGE_PHONEMENU_MIC, IMAGE_PHONEMENU_MIC);\r
+    }\r
+    volumeButton_->SetOnClickListener(this);\r
+    group_->Add(volumeButton_);\r
+}\r
+\r
+void PhoneMenuCallingPage::OnStart(void *data)\r
+{\r
+    group_ = new UIViewGroup();\r
+    if (group_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "PhoneMenuCallingPage group_ new fail");\r
+        return;\r
+    }\r
+    group_->SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);\r
+    group_->SetOnDragListener(this);\r
+    group_->SetDraggable(true);\r
+    group_->SetTouchable(true);\r
+\r
+    CreateUILabel();\r
+    CreateUIButton();\r
+    AddViewToPageContainer(group_);\r
+\r
+    if (PhoneMenuCallerLogModel::GetInstance()->GetCallStatus()) {\r
+        state_ = CallingState::SESSION;\r
+        stateLabel_->SetPosition(STATE_LABEL_X2, STATE_LABEL_Y, STATE_LABEL_W, STATE_LABEL_H);\r
+        stateLabel_->SetText(PhoneMenuCallerLogModel::GetInstance()->DisplayCallDuration().c_str());\r
+        icon_->SetVisible(false);\r
+        hangUpButton_->SetVisible(true);\r
+        hangUpButton_->SetPosition(BUTTON_X1, BUTTON_Y, BUTTON_W, BUTTON_H);\r
+        answerButton_->SetVisible(false);\r
+        volumeButton_->SetVisible(true);\r
+    } else if (PhoneMenuCallerLogModel::GetInstance()->GetWaitingStatus()) {\r
+        state_ = CallingState::WAITING;\r
+        stateLabel_->SetText("新来电...");\r
+        icon_->SetVisible(true);\r
+        LOADIMG::LoadImageViewImg(icon_, PHONEMENU_IMAGE, IMAGE_PHONEMENU_CALLIN_ICON);\r
+        hangUpButton_->SetVisible(true);\r
+        hangUpButton_->SetPosition(BUTTON_X3, BUTTON_Y, BUTTON_W, BUTTON_H);\r
+        answerButton_->SetVisible(false);\r
+        volumeButton_->SetVisible(false);\r
+    } else if (PhoneMenuCallerLogModel::GetInstance()->GetPhoneStatus()) {\r
+        state_ = CallingState::OUTGOING;\r
+        stateLabel_->SetText("正在呼叫...");\r
+        icon_->SetVisible(true);\r
+        LOADIMG::LoadImageViewImg(icon_, PHONEMENU_IMAGE, IMAGE_PHONEMENU_CALLOUT_ICON);\r
+        hangUpButton_->SetVisible(true);\r
+        hangUpButton_->SetPosition(BUTTON_X3, BUTTON_Y, BUTTON_W, BUTTON_H);\r
+        answerButton_->SetVisible(false);\r
+        volumeButton_->SetVisible(false);\r
+    } else {\r
+        state_ = CallingState::INCOMING;\r
+        stateLabel_->SetText("手机来电");\r
+        icon_->SetVisible(true);\r
+        LOADIMG::LoadImageViewImg(icon_, PHONEMENU_IMAGE, IMAGE_PHONEMENU_CALLIN_ICON);\r
+        hangUpButton_->SetVisible(true);\r
+        hangUpButton_->SetPosition(BUTTON_X1, BUTTON_Y, BUTTON_W, BUTTON_H);\r
+        answerButton_->SetVisible(true);\r
+        volumeButton_->SetVisible(false);\r
+    }\r
+\r
+    PhoneMenuCallerLogModel::GetInstance()->SetVolumeScreenStatus(false);\r
+    if (PhoneMenuCallerLogModel::GetInstance()->GetMulitplePhoneStatus()) {\r
+        MulitplePhoneTextReplaces();\r
+        PhoneMenuCallerLogModel::GetInstance()->SetMulitplePhoneStatus(false);\r
+    }\r
+}\r
+\r
+bool PhoneMenuCallingPage::OnDrag(UIView &view, const DragEvent &event)\r
+{\r
+    return false;\r
+}\r
+\r
+bool PhoneMenuCallingPage::OnClick(UIView &view, const ClickEvent &event)\r
+{\r
+    if (strcmp(view.GetViewId(), VOLUME_BUTTON_ID) == 0) {\r
+        WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "PhoneMenuCallingPage VOLUME_BUTTON_ID");\r
+        bool isMicMute = PhoneMenuCallerLogModel::GetInstance()->GetMicMute();\r
+        if (!isMicMute) {\r
+            LOADIMG::LoadBtnImage(volumeButton_, PHONEMENU_IMAGE, IMAGE_PHONEMENU_MIC_MUTE, IMAGE_PHONEMENU_MIC_MUTE);\r
+        } else {\r
+            LOADIMG::LoadBtnImage(volumeButton_, PHONEMENU_IMAGE, IMAGE_PHONEMENU_MIC, IMAGE_PHONEMENU_MIC);\r
+        }\r
+        PhoneMenuCallerLogModel::GetInstance()->SetMicMute(!isMicMute);\r
+        SetMicMute(!isMicMute);\r
+        return true;\r
+    } else if (strcmp(view.GetViewId(), ANSWER_BUTTON_ID) == 0) {\r
+        WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "PhoneMenuCallingPage ANSWER_BUTTON_ID");\r
+        if (AcceptIncomingCall() != 0) {\r
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "PhoneMenuCallingPage AcceptIncomingCall() fail");\r
+            return false;\r
+        }\r
+        PhoneMenuCallerLogModel::GetInstance()->SetCallStatus(true);\r
+    } else if (strcmp(view.GetViewId(), HANG_UP_BUTTON_ID) == 0) {\r
+        WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "PhoneMenuCallingPage HANG_UP_BUTTON_ID");\r
+        if (state_ == CallingState::WAITING) {\r
+            if (RejectIncomingCall() != 0) {\r
+                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "PhoneMenuCallingPage RejectIncomingCall error");\r
+                return false;\r
+            }\r
+            PhoneMenuCallerLogModel::GetInstance()->SetWaitingStatus(false);\r
+            PhoneMenuCallerLogModel::GetInstance()->SetCallStatus(true);\r
+            NativeAbility::GetInstance().SwitchPageInSlice(PhoneMenuPages::PHONE_MENU_CALLING_PAGE,\r
+                TransitionType::TRANSITION_INVALID, false);\r
+        } else if (state_ == CallingState::INCOMING) {\r
+            if (RejectIncomingCall() != 0) {\r
+                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "PhoneMenuCallingPage RejectIncomingCall fail");\r
+                return false;\r
+            }\r
+            PhoneMenuCallerLogModel::GetInstance()->BackToPrePage();\r
+        } else {\r
+            if (FinishCall() != 0) {\r
+                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "PhoneMenuCallingPage FinishCall fail");\r
+                return false;\r
+            }\r
+            PhoneMenuCallerLogModel::GetInstance()->SetMakePhoneStatus(false);\r
+            PhoneMenuCallerLogModel::GetInstance()->SetCallStatus(false);\r
+            PhoneMenuCallerLogModel::GetInstance()->BackToPrePage();\r
+        }\r
+    }\r
+    return true;\r
+}\r
+}
\ No newline at end of file
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/phonemenu/src/PhoneMenuContactsItemView.cpp b/code/sdk/application/wearable/evb/nativeapp/nativeui/phonemenu/src/PhoneMenuContactsItemView.cpp
new file mode 100644 (file)
index 0000000..b6ce0e9
--- /dev/null
@@ -0,0 +1,74 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: PhoneMenuContactsItemView\r
+ * Create: 2025-07-12\r
+ */\r
+\r
+#include "UiConfig.h"\r
+#include "main/LoadImg.h"\r
+#include "ui_resource_phonemenu.h"\r
+#include "phonemenu/PhoneMenuContactsItemView.h"\r
+\r
+namespace OHOS {\r
+static constexpr uint16_t BG_GROUP_X = 0;\r
+static constexpr uint16_t BG_GROUP_Y = 7;\r
+static constexpr uint16_t BG_GROUP_W = 383;\r
+static constexpr uint16_t BG_GROUP_H = 88;\r
+static constexpr uint16_t BG_BACKGROUND_OPA = 48;\r
+static constexpr uint16_t BG_BORDER_RADIUS = 45;\r
+static constexpr uint16_t ICON_X = 33;\r
+static constexpr uint16_t ICON_Y = 26;\r
+static constexpr uint16_t LABEL_X = 89;\r
+static constexpr uint16_t LABEL_Y = 30;\r
+static constexpr uint16_t LABEL_W = 294;\r
+static constexpr uint16_t LABEL_H = 35;\r
+static constexpr uint16_t LABEL_FONT = 32;\r
+\r
+PhoneMenuContactsItemView::PhoneMenuContactsItemView()\r
+{\r
+    bg_.SetPosition(BG_GROUP_X, BG_GROUP_Y, BG_GROUP_W, BG_GROUP_H);\r
+    bg_.SetStyle(STYLE_BACKGROUND_OPA, BG_BACKGROUND_OPA);\r
+    bg_.SetStyle(STYLE_BACKGROUND_COLOR, Color::Gray().full);\r
+    bg_.SetStyle(STYLE_BORDER_RADIUS, BG_BORDER_RADIUS);\r
+\r
+    icon_.SetPosition(ICON_X, ICON_Y);\r
+    LOADIMG::LoadImageViewImg(&icon_, PHONEMENU_IMAGE, IMAGE_PHONEMENU_CONTACTS);\r
+\r
+    label_.SetPosition(LABEL_X, LABEL_Y, LABEL_W, LABEL_H);\r
+    label_.SetFont(DEFAULT_VECTOR_FONT_FILENAME, LABEL_FONT);\r
+    label_.SetAlign(TEXT_ALIGNMENT_LEFT, TEXT_ALIGNMENT_CENTER);\r
+    label_.SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+\r
+    Add(&bg_);\r
+    Add(&icon_);\r
+    Add(&label_);\r
+}\r
+\r
+PhoneMenuContactsItemView::~PhoneMenuContactsItemView()\r
+{\r
+    Remove(&bg_);\r
+    Remove(&icon_);\r
+    Remove(&label_);\r
+}\r
+\r
+void PhoneMenuContactsItemView::SetItemInfo(const PhoneMenuContactsItem &itemInfo)\r
+{\r
+    itemInfo_ = itemInfo;\r
+    label_.SetText(itemInfo.name.c_str());\r
+}\r
+\r
+const char *PhoneMenuContactsItemView::GetContactsName() const\r
+{\r
+    return itemInfo_.name.c_str();\r
+}\r
+\r
+const char *PhoneMenuContactsItemView::GetContactsCid() const\r
+{\r
+    return itemInfo_.cid.c_str();\r
+}\r
+\r
+const char *PhoneMenuContactsItemView::GetContactsPhoneNumber() const\r
+{\r
+    return itemInfo_.phoneNumber.c_str();\r
+}\r
+}
\ No newline at end of file
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/phonemenu/src/PhoneMenuContactsPage.cpp b/code/sdk/application/wearable/evb/nativeapp/nativeui/phonemenu/src/PhoneMenuContactsPage.cpp
new file mode 100644 (file)
index 0000000..985f091
--- /dev/null
@@ -0,0 +1,193 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: PhoneMenuContactsPage\r
+ * Create: 2025-07-12\r
+ */\r
+\r
+#include "SlicePageFactory.h"\r
+#include "NativeAbility.h"\r
+#include "AppViewIDs.h"\r
+#include "wearable_log.h"\r
+#include "main/LoadImg.h"\r
+#include "ui_resource_phonemenu.h"\r
+#include "phoneservice/PhoneService.h"\r
+#include "phonemenu/PhoneMenuView.h"\r
+#include "phonemenu/PhoneMenuCallerLogModel.h"\r
+#include "phonemenu/PhoneMenuContactsItemView.h"\r
+#include "phonemenu/PhoneMenuContactsPage.h"\r
+\r
+namespace OHOS {\r
+static constexpr uint16_t LABEL_POS_X = 97;\r
+static constexpr uint16_t LABEL_POS_Y = 31;\r
+static constexpr uint16_t LABEL_WIDTH = 260;\r
+static constexpr uint16_t LABEL_HEIGHT = 53;\r
+static constexpr uint16_t LABEL_FONT_SIZE = 38;\r
+static constexpr uint16_t IMAGE_POS_X = 174;\r
+static constexpr uint16_t IMAGE_POS_Y = 111;\r
+static constexpr uint16_t LABEL_POS_X_NO_CONTACTS = 104;\r
+static constexpr uint16_t LABEL_POS_Y_NO_CONTACTS = 257;\r
+static constexpr uint16_t LABEL_WIDTH_NO_CONTACTS = 246;\r
+static constexpr uint16_t LABEL_HEIGHT_NO_CONTACTS = 100;\r
+static constexpr uint16_t LABEL_FONT_NO_CONTACTS = 34;\r
+static constexpr uint16_t LIST_POS_X = 35;\r
+static constexpr uint16_t LIST_POS_Y = 104;\r
+static constexpr uint16_t LIST_WIDTH = 383;\r
+static constexpr uint16_t LIST_HEIGHT = 350;\r
+static constexpr uint16_t LIST_ITEM_W = 383;\r
+static constexpr uint16_t LIST_ITEM_H = 102;\r
+static constexpr uint16_t CONTAINER_TOP_BLANK_SIZE = 31;\r
+static constexpr uint16_t CONTAINER_BOTTOM_BLANK_SIZE = 100;\r
+\r
+REGIST_SLICE_PAGE(VIEW_PHONE_MENU, PhoneMenuPages::PHONE_MENU_CONTACTS_PAGE, PhoneMenuContactsPage, false);\r
+\r
+static PhoneMenuContactsPage *g_PhoneMenuContactsPageInstance = nullptr;\r
+\r
+static UIView *CreateViewCb(uint8_t type)\r
+{\r
+    PhoneMenuContactsItemView *item = new PhoneMenuContactsItemView();\r
+    if (item == nullptr) {\r
+        return nullptr;\r
+    }\r
+    item->SetPosition(0, 0, LIST_ITEM_W, LIST_ITEM_H);\r
+    item->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+    item->SetTouchable(true);\r
+    item->SetOnClickListener(g_PhoneMenuContactsPageInstance);\r
+    return item;\r
+}\r
+\r
+static void UpdateViewCb(UIView *view, void *data, uint8_t type)\r
+{\r
+    if (view == nullptr || data == nullptr) {\r
+        return;\r
+    }\r
+    PhoneMenuContactsItemView *item = dynamic_cast<PhoneMenuContactsItemView *>(view);\r
+    if (item == nullptr) {\r
+        return;\r
+    }\r
+    PhoneMenuContactsItem *itemInfo = static_cast<PhoneMenuContactsItem *>(data);\r
+    item->SetItemInfo(*itemInfo);\r
+}\r
+\r
+void PhoneMenuContactsPage::OnStart(void *data)\r
+{\r
+    container_ = new UIScrollView();\r
+    if (container_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "PhoneMenuContactsPage container_ new fail");\r
+        return;\r
+    }\r
+    container_->SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);\r
+    container_->SetOnDragListener(this);\r
+    container_->SetScrollBlankSize(CONTAINER_TOP_BLANK_SIZE, UIAbstractScroll::Direction::TOP);\r
+    container_->SetScrollBlankSize(CONTAINER_BOTTOM_BLANK_SIZE, UIAbstractScroll::Direction::BOTTOM);\r
+\r
+    contactsLabel_ = new UILabel();\r
+    if (contactsLabel_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "PhoneMenuContactsPage contactsLabel_ new fail");\r
+        return;\r
+    }\r
+    contactsLabel_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+    container_->Add(contactsLabel_);\r
+\r
+    auto list = PhoneMenuCallerLogModel::GetInstance()->GetContacts();\r
+    if (list.empty()) {\r
+        image_ = new UIImageView();\r
+        if (image_ == nullptr) {\r
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "PhoneMenuContactsPage image_ new fail");\r
+            return;\r
+        }\r
+        image_->SetPosition(IMAGE_POS_X, IMAGE_POS_Y);\r
+        LOADIMG::LoadImageViewImg(image_, PHONEMENU_IMAGE, IMAGE_PHONEMENU_PHONE);\r
+        container_->Add(image_);\r
+\r
+        contactsLabel_->SetPosition(LABEL_POS_X_NO_CONTACTS, LABEL_POS_Y_NO_CONTACTS,\r
+                                    LABEL_WIDTH_NO_CONTACTS, LABEL_HEIGHT_NO_CONTACTS);\r
+        contactsLabel_->SetText("请前往手机APP\n同步常用联系人");\r
+        contactsLabel_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, LABEL_FONT_NO_CONTACTS);\r
+    } else {\r
+        contactsLabel_->SetPosition(LABEL_POS_X, LABEL_POS_Y, LABEL_WIDTH, LABEL_HEIGHT);\r
+        contactsLabel_->SetText("通讯录");\r
+        contactsLabel_->SetFont(BOLD_VECTOR_FONT_FILENAME, LABEL_FONT_SIZE);\r
+\r
+        contactsList_ = new UISimpleList();\r
+        if (contactsList_ == nullptr) {\r
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "PhoneMenuContactsPage contactsList_ new fail");\r
+            return;\r
+        }\r
+        contactsList_->SetPosition(LIST_POS_X, LIST_POS_Y, LIST_WIDTH, LIST_HEIGHT);\r
+        contactsList_->SetBoundaryIntercept(DragEvent::DIRECTION_TOP_TO_BOTTOM, false);\r
+        contactsList_->SetBoundaryIntercept(DragEvent::DIRECTION_BOTTOM_TO_TOP, false);\r
+        contactsList_->Resize(LIST_WIDTH, LIST_ITEM_H * list.size());\r
+        for (auto &contacts : list) {\r
+            Contents content;\r
+            content.createFunc = CreateViewCb;\r
+            content.updateFunc = UpdateViewCb;\r
+            content.type = 0;\r
+            content.data = reinterpret_cast<void *>(&contacts);\r
+            contactsList_->AddContent(content);\r
+        }\r
+        contactsList_->RefreshList();\r
+        container_->Add(contactsList_);\r
+    }\r
+    AddViewToPageContainer(container_);\r
+}\r
+\r
+PhoneMenuContactsPage::PhoneMenuContactsPage()\r
+{\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "PhoneMenuContactsPage::PhoneMenuContactsPage");\r
+    g_PhoneMenuContactsPageInstance = this;\r
+}\r
+\r
+PhoneMenuContactsPage::~PhoneMenuContactsPage()\r
+{\r
+    if (container_ != nullptr) {\r
+        container_->RemoveAll();\r
+        delete container_;\r
+        container_ = nullptr;\r
+    }\r
+    if (image_ != nullptr) {\r
+        delete image_;\r
+        image_ = nullptr;\r
+    }\r
+    if (contactsLabel_ != nullptr) {\r
+        delete contactsLabel_;\r
+        contactsLabel_ = nullptr;\r
+    }\r
+    if (contactsList_ != nullptr) {\r
+        delete contactsList_;\r
+        contactsList_ = nullptr;\r
+    }\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "PhoneMenuContactsPage::~PhoneMenuContactsPage");\r
+}\r
+\r
+bool PhoneMenuContactsPage::OnDrag(UIView &view, const DragEvent &event)\r
+{\r
+    if ((event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT) && (event.GetDeltaX() > X_DRAG_OFFSET) &&\r
+        (event.GetDeltaX() > (DOUBLES * MATH_ABS(event.GetDeltaY())))) {\r
+        NativeAbility::GetInstance().SwitchPageInSlice(PhoneMenuPages::PHONE_MENU_MAIN_PAGE,\r
+            TransitionType::TRANSITION_INVALID, false);\r
+    }\r
+    return true;\r
+}\r
+\r
+bool PhoneMenuContactsPage::OnClick(UIView &view, const ClickEvent &event)\r
+{\r
+    PhoneMenuContactsItemView *itemView = dynamic_cast<PhoneMenuContactsItemView *>(&view);\r
+    if (itemView == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "PhoneMenuContactsPage::OnClick dynamic_cast view fail");\r
+        return false;\r
+    }\r
+    std::string phoneNumber = itemView->GetContactsPhoneNumber();\r
+    if (GetBtConnectStatus() != PROFILE_STATE_CONNECTED) {\r
+        NativeAbility::GetInstance().SwitchPageInSlice(PhoneMenuPages::PHONE_MENU_DISCONNECT_PAGE,\r
+            TransitionType::TRANSITION_INVALID, false);\r
+        return true;\r
+    }\r
+    SetMicMute(false);\r
+    PhoneMenuCallerLogModel::GetInstance()->SetMicMute(false);\r
+    if (DialCall((unsigned char *)phoneNumber.c_str(), phoneNumber.size()) != OHOS_SUCCESS) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "PhoneMenuContactsPage::OnClick DialCall[fail]");\r
+    }\r
+    PhoneMenuCallerLogModel::GetInstance()->SaveCurPage();\r
+    return true;\r
+}\r
+}
\ No newline at end of file
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/phonemenu/src/PhoneMenuDialPage.cpp b/code/sdk/application/wearable/evb/nativeapp/nativeui/phonemenu/src/PhoneMenuDialPage.cpp
new file mode 100644 (file)
index 0000000..c9f7718
--- /dev/null
@@ -0,0 +1,441 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: PhoneMenuDialPage\r
+ * Create: 2025-07-12\r
+ */\r
+\r
+#include "SlicePageFactory.h"\r
+#include "NativeAbility.h"\r
+#include "AppViewIDs.h"\r
+#include "wearable_log.h"\r
+#include "main/LoadImg.h"\r
+#include "ui_resource_phonemenu.h"\r
+#include "phoneservice/PhoneService.h"\r
+#include "phonemenu/PhoneMenuView.h"\r
+#include "phonemenu/PhoneMenuCallerLogModel.h"\r
+#include "phonemenu/PhoneMenuDialPage.h"\r
+\r
+static constexpr uint16_t DIAL_NORMAL_BUTTON_WIDTH = 88;\r
+static constexpr uint16_t DIAL_NORMAL_BUTTON_HEIGHT = 64;\r
+static constexpr uint16_t DIAL_WIDE_BUTTON_WIDTH = 180;\r
+static constexpr uint16_t DIAL_WIDE_BUTTON_HEIGHT = 64;\r
+static constexpr uint16_t FIRST_ROW_COLOR_BUTTON_POS_Y = 115;\r
+static constexpr uint16_t SECOND_ROW_COLOR_BUTTON_POS_Y = 183;\r
+static constexpr uint16_t THIRD_ROW_COLOR_BUTTON_POS_Y = 251;\r
+static constexpr uint16_t FOUR_ROW_COLOR_BUTTON_POS_Y = 319;\r
+static constexpr uint16_t FIRST_COLUMN_COLOR_BUTTON_POS_X = 45;\r
+static constexpr uint16_t SECOND_COLUMN_COLOR_BUTTON_POS_X = 137;\r
+static constexpr uint16_t THIRD_COLUMN_COLOR_BUTTON_POS_X = 229;\r
+static constexpr uint16_t FOUR_COLUMN_COLOR_BUTTON_POS_X = 321;\r
+static constexpr uint16_t NUMBER_LABEL_POS_X = 93;\r
+static constexpr uint16_t NUMBER_LABEL_POS_Y = 53;\r
+static constexpr uint16_t NUMBER_LABEL_WIDTH = 268;\r
+static constexpr uint16_t NUMBER_LABEL_HEIGHT = 48;\r
+static constexpr uint16_t NUMBER_LABEL_FONT_SIZE = 30;\r
+static constexpr uint16_t DIAL_FONT_SIZE = 40;\r
+static constexpr uint16_t DIAL_BUTTON_BORDER_RADIUS = 20;\r
+static constexpr uint16_t BUTTON_BACKGROUND_OPA = 80;\r
+static constexpr char *KEY_0_BUTTON_ID = "key0Button";\r
+static constexpr char *KEY_1_BUTTON_ID = "key1Button";\r
+static constexpr char *KEY_2_BUTTON_ID = "key2Button";\r
+static constexpr char *KEY_3_BUTTON_ID = "key3Button";\r
+static constexpr char *KEY_4_BUTTON_ID = "key4Button";\r
+static constexpr char *KEY_5_BUTTON_ID = "key5Button";\r
+static constexpr char *KEY_6_BUTTON_ID = "key6Bbutton";\r
+static constexpr char *KEY_7_BUTTON_ID = "key7Button";\r
+static constexpr char *KEY_8_BUTTON_ID = "key8Button";\r
+static constexpr char *KEY_9_BUTTON_ID = "key9Button";\r
+static constexpr char *KEY_STAR_BUTTON_ID = "keyStarButton";\r
+static constexpr char *KEY_POUND_BUTTON_ID = "keyPoundButton";\r
+static constexpr char *DELETE_BUTTON_ID = "deleteButton";\r
+static constexpr char *DIAL_BUTTON_ID = "dialButton";\r
+\r
+namespace OHOS {\r
+REGIST_SLICE_PAGE(VIEW_PHONE_MENU, PhoneMenuPages::PHONE_MENU_DIAL_PAGE, PhoneMenuDialPage, false);\r
+\r
+void PhoneMenuDialPage::OnStart(void *data)\r
+{\r
+    container_ = new UIScrollView();\r
+    if (container_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "PhoneMenuDialPage container_ new fail");\r
+        return;\r
+    }\r
+    container_->SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);\r
+    container_->SetOnDragListener(this);\r
+\r
+    dialNumberLabel_ = new UILabel();\r
+    if (dialNumberLabel_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "PhoneMenuDialPage dialNumberLabel_ new fail");\r
+        return;\r
+    }\r
+    dialNumberLabel_->SetPosition(NUMBER_LABEL_POS_X, NUMBER_LABEL_POS_Y, NUMBER_LABEL_WIDTH, NUMBER_LABEL_HEIGHT);\r
+    dialNumberLabel_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+    dialNumberLabel_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, NUMBER_LABEL_FONT_SIZE);\r
+    container_->Add(dialNumberLabel_);\r
+\r
+    key1Button_ = new UILabelButton();\r
+    if (key1Button_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "PhoneMenuDialPage key1Button_ new fail");\r
+        return;\r
+    }\r
+    key1Button_->SetPosition(FIRST_COLUMN_COLOR_BUTTON_POS_X, FIRST_ROW_COLOR_BUTTON_POS_Y, DIAL_NORMAL_BUTTON_WIDTH,\r
+                             DIAL_NORMAL_BUTTON_HEIGHT);\r
+    key1Button_->SetViewId(KEY_1_BUTTON_ID);\r
+    key1Button_->SetText("1");\r
+    key1Button_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, DIAL_FONT_SIZE);\r
+    key1Button_->SetStyle(STYLE_BORDER_RADIUS, DIAL_BUTTON_BORDER_RADIUS);\r
+    key1Button_->SetStyle(STYLE_BACKGROUND_COLOR, Color::Gray().full);\r
+    key1Button_->SetStyle(STYLE_BACKGROUND_OPA, BUTTON_BACKGROUND_OPA);\r
+    key1Button_->SetStyleForState(STYLE_BORDER_RADIUS, DIAL_BUTTON_BORDER_RADIUS, UIButton::PRESSED);\r
+    key1Button_->SetStyleForState(STYLE_BACKGROUND_COLOR, Color::Gray().full, UIButton::PRESSED);\r
+    key1Button_->SetStyleForState(STYLE_BACKGROUND_OPA, BUTTON_BACKGROUND_OPA, UIButton::PRESSED);\r
+    key1Button_->SetOnClickListener(this);\r
+    container_->Add(key1Button_);\r
+\r
+    key2Button_ = new UILabelButton();\r
+    if (key2Button_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "PhoneMenuDialPage key2Button_ new fail");\r
+        return;\r
+    }\r
+    key2Button_->SetPosition(SECOND_COLUMN_COLOR_BUTTON_POS_X, FIRST_ROW_COLOR_BUTTON_POS_Y, DIAL_NORMAL_BUTTON_WIDTH,\r
+                             DIAL_NORMAL_BUTTON_HEIGHT);\r
+    key2Button_->SetViewId(KEY_2_BUTTON_ID);\r
+    key2Button_->SetText("2");\r
+    key2Button_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, DIAL_FONT_SIZE);\r
+    key2Button_->SetStyle(STYLE_BORDER_RADIUS, DIAL_BUTTON_BORDER_RADIUS);\r
+    key2Button_->SetStyle(STYLE_BACKGROUND_COLOR, Color::Gray().full);\r
+    key2Button_->SetStyle(STYLE_BACKGROUND_OPA, BUTTON_BACKGROUND_OPA);\r
+    key2Button_->SetStyleForState(STYLE_BORDER_RADIUS, DIAL_BUTTON_BORDER_RADIUS, UIButton::PRESSED);\r
+    key2Button_->SetStyleForState(STYLE_BACKGROUND_COLOR, Color::Gray().full, UIButton::PRESSED);\r
+    key2Button_->SetStyleForState(STYLE_BACKGROUND_OPA, BUTTON_BACKGROUND_OPA, UIButton::PRESSED);\r
+    key2Button_->SetOnClickListener(this);\r
+    container_->Add(key2Button_);\r
+\r
+    key3Button_ = new UILabelButton();\r
+    if (key3Button_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "PhoneMenuDialPage key3Button_ new fail");\r
+        return;\r
+    }\r
+    key3Button_->SetPosition(THIRD_COLUMN_COLOR_BUTTON_POS_X, FIRST_ROW_COLOR_BUTTON_POS_Y, DIAL_NORMAL_BUTTON_WIDTH,\r
+                             DIAL_NORMAL_BUTTON_HEIGHT);\r
+    key3Button_->SetViewId(KEY_3_BUTTON_ID);\r
+    key3Button_->SetText("3");\r
+    key3Button_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, DIAL_FONT_SIZE);\r
+    key3Button_->SetStyle(STYLE_BORDER_RADIUS, DIAL_BUTTON_BORDER_RADIUS);\r
+    key3Button_->SetStyle(STYLE_BACKGROUND_COLOR, Color::Gray().full);\r
+    key3Button_->SetStyle(STYLE_BACKGROUND_OPA, BUTTON_BACKGROUND_OPA);\r
+    key3Button_->SetStyleForState(STYLE_BORDER_RADIUS, DIAL_BUTTON_BORDER_RADIUS, UIButton::PRESSED);\r
+    key3Button_->SetStyleForState(STYLE_BACKGROUND_COLOR, Color::Gray().full, UIButton::PRESSED);\r
+    key3Button_->SetStyleForState(STYLE_BACKGROUND_OPA, BUTTON_BACKGROUND_OPA, UIButton::PRESSED);\r
+    key3Button_->SetOnClickListener(this);\r
+    container_->Add(key3Button_);\r
+\r
+    deleteButton_ = new UILabelButton();\r
+    if (deleteButton_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "PhoneMenuDialPage deleteButton_ new fail");\r
+        return;\r
+    }\r
+    deleteButton_->SetPosition(FOUR_COLUMN_COLOR_BUTTON_POS_X, FIRST_ROW_COLOR_BUTTON_POS_Y, DIAL_NORMAL_BUTTON_WIDTH,\r
+                               DIAL_NORMAL_BUTTON_HEIGHT);\r
+    deleteButton_->SetViewId(DELETE_BUTTON_ID);\r
+    LOADIMG::LoadBtnImage(deleteButton_, PHONEMENU_IMAGE, IMAGE_PHONEMENU_DEL, IMAGE_PHONEMENU_DEL);\r
+    deleteButton_->SetOnClickListener(this);\r
+    container_->Add(deleteButton_);\r
+\r
+    key4Button_ = new UILabelButton();\r
+    if (key4Button_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "PhoneMenuDialPage key4Button_ new fail");\r
+        return;\r
+    }\r
+    key4Button_->SetPosition(FIRST_COLUMN_COLOR_BUTTON_POS_X, SECOND_ROW_COLOR_BUTTON_POS_Y, DIAL_NORMAL_BUTTON_WIDTH,\r
+                             DIAL_NORMAL_BUTTON_HEIGHT);\r
+    key4Button_->SetViewId(KEY_4_BUTTON_ID);\r
+    key4Button_->SetText("4");\r
+    key4Button_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, DIAL_FONT_SIZE);\r
+    key4Button_->SetStyle(STYLE_BORDER_RADIUS, DIAL_BUTTON_BORDER_RADIUS);\r
+    key4Button_->SetStyle(STYLE_BACKGROUND_COLOR, Color::Gray().full);\r
+    key4Button_->SetStyle(STYLE_BACKGROUND_OPA, BUTTON_BACKGROUND_OPA);\r
+    key4Button_->SetStyleForState(STYLE_BORDER_RADIUS, DIAL_BUTTON_BORDER_RADIUS, UIButton::PRESSED);\r
+    key4Button_->SetStyleForState(STYLE_BACKGROUND_COLOR, Color::Gray().full, UIButton::PRESSED);\r
+    key4Button_->SetStyleForState(STYLE_BACKGROUND_OPA, BUTTON_BACKGROUND_OPA, UIButton::PRESSED);\r
+    key4Button_->SetOnClickListener(this);\r
+    container_->Add(key4Button_);\r
+\r
+    key5Button_ = new UILabelButton();\r
+    if (key5Button_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "PhoneMenuDialPage key5Button_ new fail");\r
+        return;\r
+    }\r
+    key5Button_->SetPosition(SECOND_COLUMN_COLOR_BUTTON_POS_X, SECOND_ROW_COLOR_BUTTON_POS_Y, DIAL_NORMAL_BUTTON_WIDTH,\r
+                             DIAL_NORMAL_BUTTON_HEIGHT);\r
+    key5Button_->SetViewId(KEY_5_BUTTON_ID);\r
+    key5Button_->SetText("5");\r
+    key5Button_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, DIAL_FONT_SIZE);\r
+    key5Button_->SetStyle(STYLE_BORDER_RADIUS, DIAL_BUTTON_BORDER_RADIUS);\r
+    key5Button_->SetStyle(STYLE_BACKGROUND_COLOR, Color::Gray().full);\r
+    key5Button_->SetStyle(STYLE_BACKGROUND_OPA, BUTTON_BACKGROUND_OPA);\r
+    key5Button_->SetStyleForState(STYLE_BORDER_RADIUS, DIAL_BUTTON_BORDER_RADIUS, UIButton::PRESSED);\r
+    key5Button_->SetStyleForState(STYLE_BACKGROUND_COLOR, Color::Gray().full, UIButton::PRESSED);\r
+    key5Button_->SetStyleForState(STYLE_BACKGROUND_OPA, BUTTON_BACKGROUND_OPA, UIButton::PRESSED);\r
+    key5Button_->SetOnClickListener(this);\r
+    container_->Add(key5Button_);\r
+\r
+    key6Button_ = new UILabelButton();\r
+    if (key6Button_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "PhoneMenuDialPage key6Button_ new fail");\r
+        return;\r
+    }\r
+    key6Button_->SetPosition(THIRD_COLUMN_COLOR_BUTTON_POS_X, SECOND_ROW_COLOR_BUTTON_POS_Y, DIAL_NORMAL_BUTTON_WIDTH,\r
+                             DIAL_NORMAL_BUTTON_HEIGHT);\r
+    key6Button_->SetViewId(KEY_6_BUTTON_ID);\r
+    key6Button_->SetText("6");\r
+    key6Button_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, DIAL_FONT_SIZE);\r
+    key6Button_->SetStyle(STYLE_BORDER_RADIUS, DIAL_BUTTON_BORDER_RADIUS);\r
+    key6Button_->SetStyle(STYLE_BACKGROUND_COLOR, Color::Gray().full);\r
+    key6Button_->SetStyle(STYLE_BACKGROUND_OPA, BUTTON_BACKGROUND_OPA);\r
+    key6Button_->SetStyleForState(STYLE_BORDER_RADIUS, DIAL_BUTTON_BORDER_RADIUS, UIButton::PRESSED);\r
+    key6Button_->SetStyleForState(STYLE_BACKGROUND_COLOR, Color::Gray().full, UIButton::PRESSED);\r
+    key6Button_->SetStyleForState(STYLE_BACKGROUND_OPA, BUTTON_BACKGROUND_OPA, UIButton::PRESSED);\r
+    key6Button_->SetOnClickListener(this);\r
+    container_->Add(key6Button_);\r
+\r
+    keyStarButton_ = new UILabelButton();\r
+    if (keyStarButton_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "PhoneMenuDialPage keyStarButton_ new fail");\r
+        return;\r
+    }\r
+    keyStarButton_->SetPosition(FOUR_COLUMN_COLOR_BUTTON_POS_X, SECOND_ROW_COLOR_BUTTON_POS_Y, DIAL_NORMAL_BUTTON_WIDTH,\r
+                                DIAL_NORMAL_BUTTON_HEIGHT);\r
+    keyStarButton_->SetViewId(KEY_STAR_BUTTON_ID);\r
+    LOADIMG::LoadBtnImage(keyStarButton_, PHONEMENU_IMAGE, IMAGE_PHONEMENU_STAR_KEY, IMAGE_PHONEMENU_STAR_KEY);\r
+    keyStarButton_->SetOnClickListener(this);\r
+    container_->Add(keyStarButton_);\r
+\r
+    key7Button_ = new UILabelButton();\r
+    if (key7Button_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "PhoneMenuDialPage key7Button_ new fail");\r
+        return;\r
+    }\r
+    key7Button_->SetPosition(FIRST_COLUMN_COLOR_BUTTON_POS_X, THIRD_ROW_COLOR_BUTTON_POS_Y, DIAL_NORMAL_BUTTON_WIDTH,\r
+                             DIAL_NORMAL_BUTTON_HEIGHT);\r
+    key7Button_->SetViewId(KEY_7_BUTTON_ID);\r
+    key7Button_->SetText("7");\r
+    key7Button_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, DIAL_FONT_SIZE);\r
+    key7Button_->SetStyle(STYLE_BORDER_RADIUS, DIAL_BUTTON_BORDER_RADIUS);\r
+    key7Button_->SetStyle(STYLE_BACKGROUND_COLOR, Color::Gray().full);\r
+    key7Button_->SetStyle(STYLE_BACKGROUND_OPA, BUTTON_BACKGROUND_OPA);\r
+    key7Button_->SetStyleForState(STYLE_BORDER_RADIUS, DIAL_BUTTON_BORDER_RADIUS, UIButton::PRESSED);\r
+    key7Button_->SetStyleForState(STYLE_BACKGROUND_COLOR, Color::Gray().full, UIButton::PRESSED);\r
+    key7Button_->SetStyleForState(STYLE_BACKGROUND_OPA, BUTTON_BACKGROUND_OPA, UIButton::PRESSED);\r
+    key7Button_->SetOnClickListener(this);\r
+    container_->Add(key7Button_);\r
+\r
+    key8Button_ = new UILabelButton();\r
+    if (key8Button_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "PhoneMenuDialPage key8Button_ new fail");\r
+        return;\r
+    }\r
+    key8Button_->SetPosition(SECOND_COLUMN_COLOR_BUTTON_POS_X, THIRD_ROW_COLOR_BUTTON_POS_Y, DIAL_NORMAL_BUTTON_WIDTH,\r
+                             DIAL_NORMAL_BUTTON_HEIGHT);\r
+    key8Button_->SetViewId(KEY_8_BUTTON_ID);\r
+    key8Button_->SetText("8");\r
+    key8Button_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, DIAL_FONT_SIZE);\r
+    key8Button_->SetStyle(STYLE_BORDER_RADIUS, DIAL_BUTTON_BORDER_RADIUS);\r
+    key8Button_->SetStyle(STYLE_BACKGROUND_COLOR, Color::Gray().full);\r
+    key8Button_->SetStyle(STYLE_BACKGROUND_OPA, BUTTON_BACKGROUND_OPA);\r
+    key8Button_->SetStyleForState(STYLE_BORDER_RADIUS, DIAL_BUTTON_BORDER_RADIUS, UIButton::PRESSED);\r
+    key8Button_->SetStyleForState(STYLE_BACKGROUND_COLOR, Color::Gray().full, UIButton::PRESSED);\r
+    key8Button_->SetStyleForState(STYLE_BACKGROUND_OPA, BUTTON_BACKGROUND_OPA, UIButton::PRESSED);\r
+    key8Button_->SetOnClickListener(this);\r
+    container_->Add(key8Button_);\r
+\r
+    key9Button_ = new UILabelButton();\r
+    if (key9Button_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "PhoneMenuDialPage key9Button_ new fail");\r
+        return;\r
+    }\r
+    key9Button_->SetPosition(THIRD_COLUMN_COLOR_BUTTON_POS_X, THIRD_ROW_COLOR_BUTTON_POS_Y, DIAL_NORMAL_BUTTON_WIDTH,\r
+                             DIAL_NORMAL_BUTTON_HEIGHT);\r
+    key9Button_->SetViewId(KEY_9_BUTTON_ID);\r
+    key9Button_->SetText("9");\r
+    key9Button_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, DIAL_FONT_SIZE);\r
+    key9Button_->SetStyle(STYLE_BORDER_RADIUS, DIAL_BUTTON_BORDER_RADIUS);\r
+    key9Button_->SetStyle(STYLE_BACKGROUND_COLOR, Color::Gray().full);\r
+    key9Button_->SetStyle(STYLE_BACKGROUND_OPA, BUTTON_BACKGROUND_OPA);\r
+    key9Button_->SetStyleForState(STYLE_BORDER_RADIUS, DIAL_BUTTON_BORDER_RADIUS, UIButton::PRESSED);\r
+    key9Button_->SetStyleForState(STYLE_BACKGROUND_COLOR, Color::Gray().full, UIButton::PRESSED);\r
+    key9Button_->SetStyleForState(STYLE_BACKGROUND_OPA, BUTTON_BACKGROUND_OPA, UIButton::PRESSED);\r
+    key9Button_->SetOnClickListener(this);\r
+    container_->Add(key9Button_);\r
+\r
+    keyPoundButton_ = new UILabelButton();\r
+    if (keyPoundButton_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "PhoneMenuDialPage keyPoundButton_ new fail");\r
+        return;\r
+    }\r
+    keyPoundButton_->SetPosition(FOUR_COLUMN_COLOR_BUTTON_POS_X, THIRD_ROW_COLOR_BUTTON_POS_Y, DIAL_NORMAL_BUTTON_WIDTH,\r
+                                 DIAL_NORMAL_BUTTON_HEIGHT);\r
+    keyPoundButton_->SetViewId(KEY_POUND_BUTTON_ID);\r
+    LOADIMG::LoadBtnImage(keyPoundButton_, PHONEMENU_IMAGE, IMAGE_PHONEMENU_POUND_KEY, IMAGE_PHONEMENU_POUND_KEY);\r
+    keyPoundButton_->SetOnClickListener(this);\r
+    container_->Add(keyPoundButton_);\r
+\r
+    key0Button_ = new UILabelButton();\r
+    if (key0Button_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "PhoneMenuDialPage key0Button_ new fail");\r
+        return;\r
+    }\r
+    key0Button_->SetPosition(FIRST_COLUMN_COLOR_BUTTON_POS_X, FOUR_ROW_COLOR_BUTTON_POS_Y, DIAL_WIDE_BUTTON_WIDTH,\r
+                             DIAL_WIDE_BUTTON_HEIGHT);\r
+    key0Button_->SetViewId(KEY_0_BUTTON_ID);\r
+    key0Button_->SetText("0");\r
+    key0Button_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, DIAL_FONT_SIZE);\r
+    key0Button_->SetStyle(STYLE_BORDER_RADIUS, DIAL_BUTTON_BORDER_RADIUS);\r
+    key0Button_->SetStyle(STYLE_BACKGROUND_COLOR, Color::Gray().full);\r
+    key0Button_->SetStyle(STYLE_BACKGROUND_OPA, BUTTON_BACKGROUND_OPA);\r
+    key0Button_->SetStyleForState(STYLE_BORDER_RADIUS, DIAL_BUTTON_BORDER_RADIUS, UIButton::PRESSED);\r
+    key0Button_->SetStyleForState(STYLE_BACKGROUND_COLOR, Color::Gray().full, UIButton::PRESSED);\r
+    key0Button_->SetStyleForState(STYLE_BACKGROUND_OPA, BUTTON_BACKGROUND_OPA, UIButton::PRESSED);\r
+    key0Button_->SetOnClickListener(this);\r
+    container_->Add(key0Button_);\r
+\r
+    diagButton_ = new UILabelButton();\r
+    if (diagButton_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "PhoneMenuDialPage diagButton_ new fail");\r
+        return;\r
+    }\r
+    diagButton_->SetPosition(THIRD_COLUMN_COLOR_BUTTON_POS_X, FOUR_ROW_COLOR_BUTTON_POS_Y, DIAL_WIDE_BUTTON_WIDTH,\r
+                             DIAL_WIDE_BUTTON_HEIGHT);\r
+    diagButton_->SetViewId(DIAL_BUTTON_ID);\r
+    diagButton_->SetStyle(STYLE_BORDER_RADIUS, DIAL_BUTTON_BORDER_RADIUS);\r
+    LOADIMG::LoadBtnImage(diagButton_, PHONEMENU_IMAGE, IMAGE_PHONEMENU_CALL, IMAGE_PHONEMENU_CALL);\r
+    diagButton_->SetOnClickListener(this);\r
+    container_->Add(diagButton_);\r
+\r
+    AddViewToPageContainer(container_);\r
+}\r
+\r
+PhoneMenuDialPage::PhoneMenuDialPage()\r
+{\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "PhoneMenuDialPage::PhoneMenuDialPage");\r
+}\r
+\r
+PhoneMenuDialPage::~PhoneMenuDialPage()\r
+{\r
+    if (container_ != nullptr) {\r
+        container_->RemoveAll();\r
+        delete container_;\r
+        container_ = nullptr;\r
+    }\r
+    if (dialNumberLabel_ != nullptr) {\r
+        delete dialNumberLabel_;\r
+        dialNumberLabel_ = nullptr;\r
+    }\r
+    if (deleteButton_ != nullptr) {\r
+        delete deleteButton_;\r
+        deleteButton_ = nullptr;\r
+    }\r
+    if (diagButton_ != nullptr) {\r
+        delete diagButton_;\r
+        diagButton_ = nullptr;\r
+    }\r
+    if (keyStarButton_ != nullptr) {\r
+        delete keyStarButton_;\r
+        keyStarButton_ = nullptr;\r
+    }\r
+    if (keyPoundButton_ != nullptr) {\r
+        delete keyPoundButton_;\r
+        keyPoundButton_ = nullptr;\r
+    }\r
+    if (key0Button_ != nullptr) {\r
+        delete key0Button_;\r
+        key0Button_ = nullptr;\r
+    }\r
+    if (key1Button_ != nullptr) {\r
+        delete key1Button_;\r
+        key1Button_ = nullptr;\r
+    }\r
+    if (key2Button_ != nullptr) {\r
+        delete key2Button_;\r
+        key2Button_ = nullptr;\r
+    }\r
+    if (key3Button_ != nullptr) {\r
+        delete key3Button_;\r
+        key3Button_ = nullptr;\r
+    }\r
+    if (key4Button_ != nullptr) {\r
+        delete key4Button_;\r
+        key4Button_ = nullptr;\r
+    }\r
+    if (key5Button_ != nullptr) {\r
+        delete key5Button_;\r
+        key5Button_ = nullptr;\r
+    }\r
+    if (key6Button_ != nullptr) {\r
+        delete key6Button_;\r
+        key6Button_ = nullptr;\r
+    }\r
+    if (key7Button_ != nullptr) {\r
+        delete key7Button_;\r
+        key7Button_ = nullptr;\r
+    }\r
+    if (key8Button_ != nullptr) {\r
+        delete key8Button_;\r
+        key8Button_ = nullptr;\r
+    }\r
+    if (key9Button_ != nullptr) {\r
+        delete key9Button_;\r
+        key9Button_ = nullptr;\r
+    }\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "PhoneMenuDialPage::~PhoneMenuDialPage");\r
+}\r
+\r
+bool PhoneMenuDialPage::OnDrag(UIView &view, const DragEvent &event)\r
+{\r
+    if ((event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT) && (event.GetDeltaX() > X_DRAG_OFFSET) &&\r
+        (event.GetDeltaX() > (DOUBLES * MATH_ABS(event.GetDeltaY())))) {\r
+            NativeAbility::GetInstance().SwitchPageInSlice(PhoneMenuPages::PHONE_MENU_MAIN_PAGE,\r
+                TransitionType::TRANSITION_INVALID, false);\r
+    }\r
+    return true;\r
+}\r
+\r
+bool PhoneMenuDialPage::OnClick(UIView &view, const ClickEvent &event)\r
+{\r
+    UILabelButton *button = dynamic_cast<UILabelButton *>(&view);\r
+    if (button == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "PhoneMenuDialPage::OnClick dynamic_cast view fail");\r
+        return false;\r
+    }\r
+    if (strcmp(view.GetViewId(), DELETE_BUTTON_ID) == 0) {\r
+        if (!dialNumber_.empty()) {\r
+            dialNumber_.pop_back();\r
+            dialNumberLabel_->SetText(dialNumber_.c_str());\r
+            dialNumberLabel_->Invalidate();\r
+        }\r
+    } else if (strcmp(view.GetViewId(), DIAL_BUTTON_ID) == 0) {\r
+        if (GetBtConnectStatus() != PROFILE_STATE_CONNECTED) {\r
+            NativeAbility::GetInstance().SwitchPageInSlice(PhoneMenuPages::PHONE_MENU_DISCONNECT_PAGE,\r
+                TransitionType::TRANSITION_INVALID, false);\r
+            return false;\r
+        }\r
+        SetMicMute(false);\r
+        PhoneMenuCallerLogModel::GetInstance()->SetMicMute(false);\r
+        if (DialCall((unsigned char *)dialNumber_.c_str(), dialNumber_.size()) != OHOS_SUCCESS) {\r
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "PhoneMenuDialPage::OnClick DialCall[fail]");\r
+        }\r
+        PhoneMenuCallerLogModel::GetInstance()->SaveCurPage();\r
+    } else {\r
+        if (strcmp(view.GetViewId(), KEY_STAR_BUTTON_ID) == 0) {\r
+            dialNumber_ += "*";\r
+        } else if (strcmp(view.GetViewId(), KEY_POUND_BUTTON_ID) == 0) {\r
+            dialNumber_ += "#";\r
+        } else {\r
+            dialNumber_ += button->GetText();\r
+        }\r
+        dialNumberLabel_->SetText(dialNumber_.c_str());\r
+        dialNumberLabel_->Invalidate();\r
+    }\r
+    return true;\r
+}\r
+}
\ No newline at end of file
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/phonemenu/src/PhoneMenuDisconnectPage.cpp b/code/sdk/application/wearable/evb/nativeapp/nativeui/phonemenu/src/PhoneMenuDisconnectPage.cpp
new file mode 100644 (file)
index 0000000..1b46710
--- /dev/null
@@ -0,0 +1,94 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: PhoneMenuDisconnectPage\r
+ * Create: 2025-07-12\r
+ */\r
+#include "SlicePageFactory.h"\r
+#include "NativeAbility.h"\r
+#include "AppViewIDs.h"\r
+#include "wearable_log.h"\r
+#include "phonemenu/PhoneMenuView.h"\r
+#include "phonemenu/PhoneMenuDisconnectPage.h"\r
+\r
+namespace OHOS {\r
+static constexpr uint16_t LABEL_FONT = 32;\r
+static constexpr uint16_t LABEL_XPOS = 30;\r
+static constexpr uint16_t LABEL_YPOS = 257;\r
+static constexpr uint16_t LABEL_WIDTH = 396;\r
+static constexpr uint16_t LABEL_HEIGHT = 50;\r
+static constexpr uint16_t IMAGE_XPOS = 176;\r
+static constexpr uint16_t IMAGE_YPOS = 115;\r
+\r
+REGIST_SLICE_PAGE(VIEW_PHONE_MENU, PhoneMenuPages::PHONE_MENU_DISCONNECT_PAGE, PhoneMenuDisconnectPage, false);\r
+\r
+void PhoneMenuDisconnectPage::OnStart(void *data)\r
+{\r
+    container_ = new UIScrollView();\r
+    if (container_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "PhoneMenuDisconnectPage container_ new fail");\r
+        return;\r
+    }\r
+    container_->SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);\r
+    container_->SetOnDragListener(this);\r
+\r
+    text_ = new UILabel();\r
+    if (text_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "PhoneMenuDisconnectPage text_ new fail");\r
+        return;\r
+    }\r
+    text_->SetPosition(LABEL_XPOS, LABEL_YPOS, LABEL_WIDTH, LABEL_HEIGHT);\r
+    text_->SetText("设备未连接,请连接设备!");\r
+    text_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+    text_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, LABEL_FONT);\r
+    container_->Add(text_);\r
+\r
+    image_ = new UIImageView();\r
+    if (image_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "PhoneMenuDisconnectPage image_ new fail");\r
+        return;\r
+    }\r
+    image_->SetPosition(IMAGE_XPOS, IMAGE_YPOS);\r
+    LOADIMG::LoadImageViewImg(image_, PHONEMENU_IMAGE, IMAGE_PHONEMENU_DISCONNECT);\r
+    container_->Add(image_);\r
+\r
+    AddViewToPageContainer(container_);\r
+}\r
+\r
+PhoneMenuDisconnectPage::PhoneMenuDisconnectPage()\r
+{\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "PhoneMenuDisconnectPage::PhoneMenuDisconnectPage");\r
+}\r
+\r
+PhoneMenuDisconnectPage::~PhoneMenuDisconnectPage()\r
+{\r
+    if (container_ != nullptr) {\r
+        container_->RemoveAll();\r
+        delete container_;\r
+        container_ = nullptr;\r
+    }\r
+    if (text_ != nullptr) {\r
+        delete text_;\r
+        text_ = nullptr;\r
+    }\r
+    if (image_ != nullptr) {\r
+        delete image_;\r
+        image_ = nullptr;\r
+    }\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "PhoneMenuDisconnectPage::~PhoneMenuDisconnectPage");\r
+}\r
+\r
+bool PhoneMenuDisconnectPage::OnDrag(UIView &view, const DragEvent &event)\r
+{\r
+    if ((event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT) && (event.GetDeltaX() > X_DRAG_OFFSET) &&\r
+        (event.GetDeltaX() > (DOUBLES * MATH_ABS(event.GetDeltaY())))) {\r
+        NativeAbility::GetInstance().SwitchPageInSlice(PhoneMenuPages::PHONE_MENU_MAIN_PAGE,\r
+            TransitionType::TRANSITION_INVALID, false);\r
+    }\r
+    return true;\r
+}\r
+\r
+bool PhoneMenuDisconnectPage::OnClick(UIView &view, const ClickEvent &event)\r
+{\r
+    return false;\r
+}\r
+}
\ No newline at end of file
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/phonemenu/src/PhoneMenuMainItemView.cpp b/code/sdk/application/wearable/evb/nativeapp/nativeui/phonemenu/src/PhoneMenuMainItemView.cpp
new file mode 100644 (file)
index 0000000..d80c76e
--- /dev/null
@@ -0,0 +1,57 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: PhoneMenuMainItemView\r
+ * Create: 2025-07-12\r
+ */\r
+\r
+#include "UiConfig.h"\r
+#include "main/LoadImg.h"\r
+#include "phonemenu/PhoneMenuMainItemView.h"\r
+\r
+namespace OHOS {\r
+static constexpr uint16_t BG_GROUP_X = 0;\r
+static constexpr uint16_t BG_GROUP_Y = 0;\r
+static constexpr uint16_t BG_GROUP_W = 426;\r
+static constexpr uint16_t BG_GROUP_H = 96;\r
+static constexpr uint16_t BG_BACKGROUND_OPA = 80;\r
+static constexpr uint16_t BG_BORDER_RADIUS = 48;\r
+static constexpr uint16_t ICON_X = 8;\r
+static constexpr uint16_t ICON_Y = 8;\r
+static constexpr uint16_t LABEL_X = 101;\r
+static constexpr uint16_t LABEL_Y = 22;\r
+static constexpr uint16_t LABEL_W = 150;\r
+static constexpr uint16_t LABEL_H = 53;\r
+static constexpr uint16_t LABEL_FONT = 32;\r
+\r
+PhoneMenuMainItemView::PhoneMenuMainItemView()\r
+{\r
+    bg_.SetPosition(BG_GROUP_X, BG_GROUP_Y, BG_GROUP_W, BG_GROUP_H);\r
+    bg_.SetStyle(STYLE_BACKGROUND_OPA, BG_BACKGROUND_OPA);\r
+    bg_.SetStyle(STYLE_BACKGROUND_COLOR, Color::Gray().full);\r
+    bg_.SetStyle(STYLE_BORDER_RADIUS, BG_BORDER_RADIUS);\r
+\r
+    icon_.SetPosition(ICON_X, ICON_Y);\r
+\r
+    label_.SetPosition(LABEL_X, LABEL_Y, LABEL_W, LABEL_H);\r
+    label_.SetFont(DEFAULT_VECTOR_FONT_FILENAME, LABEL_FONT);\r
+    label_.SetAlign(TEXT_ALIGNMENT_LEFT, TEXT_ALIGNMENT_CENTER);\r
+\r
+    Add(&bg_);\r
+    Add(&icon_);\r
+    Add(&label_);\r
+}\r
+\r
+PhoneMenuMainItemView::~PhoneMenuMainItemView()\r
+{\r
+    Remove(&icon_);\r
+    Remove(&label_);\r
+    Remove(&bg_);\r
+}\r
+\r
+void PhoneMenuMainItemView::SetItemInfo(const PhoneMenuItem &itemInfo)\r
+{\r
+    label_.SetText(itemInfo.label);\r
+    LOADIMG::LoadImageViewImg(&icon_, PHONEMENU_IMAGE, itemInfo.iconResId);\r
+    SetViewId(itemInfo.viewId);\r
+}\r
+}  // namespace OHOS
\ No newline at end of file
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/phonemenu/src/PhoneMenuMainPage.cpp b/code/sdk/application/wearable/evb/nativeapp/nativeui/phonemenu/src/PhoneMenuMainPage.cpp
new file mode 100644 (file)
index 0000000..4450257
--- /dev/null
@@ -0,0 +1,152 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: PhoneMenuMainPage\r
+ * Create: 2025-07-12\r
+ */\r
+#include "SlicePageFactory.h"\r
+#include "NativeAbility.h"\r
+#include "AppViewIDs.h"\r
+#include "wearable_log.h"\r
+#include "phonemenu/PhoneMenuView.h"\r
+#include "phonemenu/PhoneMenuMainPage.h"\r
+\r
+namespace OHOS {\r
+static constexpr uint16_t LABEL_POS_X = 97;\r
+static constexpr uint16_t LABEL_POS_Y = 41;\r
+static constexpr uint16_t LABEL_WIDTH = 260;\r
+static constexpr uint16_t LABEL_HEIGHT = 53;\r
+static constexpr uint16_t LABEL_FONT_SIZE = 40;\r
+static constexpr uint16_t LIST_POS_X = 14;\r
+static constexpr uint16_t LIST_POS_Y = 116;\r
+static constexpr uint16_t LIST_WIDTH = 426;\r
+static constexpr uint16_t LIST_HEIGHT = 330;\r
+static constexpr uint16_t LIST_ITEM_W = 426;\r
+static constexpr uint16_t LIST_ITEM_H = 110;\r
+static constexpr uint16_t CONTAINER_TOP_BLANK_SIZE = 40;\r
+static constexpr uint16_t CONTAINER_BOTTOM_BLANK_SIZE = 100;\r
+\r
+REGIST_SLICE_PAGE(VIEW_PHONE_MENU, PhoneMenuPages::PHONE_MENU_MAIN_PAGE, PhoneMenuMainPage, true);\r
+\r
+static PhoneMenuMainPage *g_PhoneMenuMainPageInstance = nullptr;\r
+\r
+static UIView *CreateViewCb(uint8_t type)\r
+{\r
+    PhoneMenuMainItemView *item = new PhoneMenuMainItemView();\r
+    if (item == nullptr) {\r
+        return nullptr;\r
+    }\r
+    item->SetPosition(0, 0, LIST_ITEM_W, LIST_ITEM_H);\r
+    item->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+    item->SetTouchable(true);\r
+    item->SetOnClickListener(g_PhoneMenuMainPageInstance);\r
+    return item;\r
+}\r
+\r
+static void UpdateViewCb(UIView *view, void *data, uint8_t type)\r
+{\r
+    if (view == nullptr || data == nullptr) {\r
+        return;\r
+    }\r
+    PhoneMenuMainItemView *item = dynamic_cast<PhoneMenuMainItemView *>(view);\r
+    if (item == nullptr) {\r
+        return;\r
+    }\r
+    PhoneMenuItem *itemInfo = static_cast<PhoneMenuItem *>(data);\r
+    item->SetItemInfo(*itemInfo);\r
+}\r
+\r
+void PhoneMenuMainPage::OnStart(void *data)\r
+{\r
+    container_ = new UIScrollView();\r
+    if (container_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "PhoneMenuMainPage container_ new fail");\r
+        return;\r
+    }\r
+    container_->SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);\r
+    container_->SetOnDragListener(this);\r
+    container_->SetScrollBlankSize(CONTAINER_TOP_BLANK_SIZE, UIAbstractScroll::Direction::TOP);\r
+    container_->SetScrollBlankSize(CONTAINER_BOTTOM_BLANK_SIZE, UIAbstractScroll::Direction::BOTTOM);\r
+\r
+    titleLabel_ = new UILabel();\r
+    if (titleLabel_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "PhoneMenuMainPage titleLabel_ new fail");\r
+        return;\r
+    }\r
+    titleLabel_->SetPosition(LABEL_POS_X, LABEL_POS_Y, LABEL_WIDTH, LABEL_HEIGHT);\r
+    titleLabel_->SetText("电话");\r
+    titleLabel_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+    titleLabel_->SetFont(BOLD_VECTOR_FONT_FILENAME, LABEL_FONT_SIZE);\r
+    container_->Add(titleLabel_);\r
+\r
+    phoneMenuList_ = new UISimpleList();\r
+    if (phoneMenuList_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "PhoneMenuMainPage phoneMenuList_ new fail");\r
+        return;\r
+    }\r
+    phoneMenuList_->SetPosition(LIST_POS_X, LIST_POS_Y, LIST_WIDTH, LIST_HEIGHT);\r
+    phoneMenuList_->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+    phoneMenuList_->SetBoundaryIntercept(DragEvent::DIRECTION_TOP_TO_BOTTOM, false);\r
+    phoneMenuList_->SetBoundaryIntercept(DragEvent::DIRECTION_BOTTOM_TO_TOP, false);\r
+\r
+    for (uint8_t i = 0; i < PHOEN_MENU_ITEM_NUM; ++i) {\r
+        Contents content;\r
+        content.createFunc = CreateViewCb;\r
+        content.updateFunc = UpdateViewCb;\r
+        content.type = 0;\r
+        content.data = reinterpret_cast<void *>(&phoneMenu_[i]);\r
+        phoneMenuList_->AddContent(content);\r
+    }\r
+    phoneMenuList_->RefreshList();\r
+    container_->Add(phoneMenuList_);\r
+\r
+    AddViewToPageContainer(container_);\r
+}\r
+\r
+PhoneMenuMainPage::PhoneMenuMainPage()\r
+{\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "PhoneMenuMainPage::PhoneMenuMainPage");\r
+    g_PhoneMenuMainPageInstance = this;\r
+}\r
+\r
+PhoneMenuMainPage::~PhoneMenuMainPage()\r
+{\r
+    if (container_ != nullptr) {\r
+        container_->RemoveAll();\r
+        delete container_;\r
+        container_ = nullptr;\r
+    }\r
+    if (titleLabel_ != nullptr) {\r
+        delete titleLabel_;\r
+        titleLabel_ = nullptr;\r
+    }\r
+    if (phoneMenuList_ != nullptr) {\r
+        delete phoneMenuList_;\r
+        phoneMenuList_ = nullptr;\r
+    }\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "PhoneMenuMainPage::~PhoneMenuMainPage");\r
+}\r
+\r
+bool PhoneMenuMainPage::OnDrag(UIView &view, const DragEvent &event)\r
+{\r
+    if ((event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT) && (event.GetDeltaX() > X_DRAG_OFFSET) &&\r
+        (event.GetDeltaX() > (DOUBLES * MATH_ABS(event.GetDeltaY())))) {\r
+        NativeAbility::GetInstance().ChangeSliceToApplist();\r
+    }\r
+    return true;\r
+}\r
+\r
+bool PhoneMenuMainPage::OnClick(UIView &view, const ClickEvent &event)\r
+{\r
+    if (strcmp(view.GetViewId(), PHONE_MENU_ITEM_CONTACTS_BOOKS) == 0) {\r
+        NativeAbility::GetInstance().SwitchPageInSlice(PhoneMenuPages::PHONE_MENU_CONTACTS_PAGE,\r
+            TransitionType::TRANSITION_INVALID, false);\r
+    } else if (strcmp(view.GetViewId(), PHONE_MENU_ITEM_RECENT_CALL) == 0) {\r
+        NativeAbility::GetInstance().SwitchPageInSlice(PhoneMenuPages::PHONE_MENU_CALLER_LOG_PAGE,\r
+            TransitionType::TRANSITION_INVALID, false);\r
+    } else if (strcmp(view.GetViewId(), PHONE_MENU_ITEM_DIAL) == 0) {\r
+        NativeAbility::GetInstance().SwitchPageInSlice(PhoneMenuPages::PHONE_MENU_DIAL_PAGE,\r
+            TransitionType::TRANSITION_INVALID, false);\r
+    }\r
+    return true;\r
+}\r
+}
\ No newline at end of file
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/phonemenu/src/PhoneMenuPresenter.cpp b/code/sdk/application/wearable/evb/nativeapp/nativeui/phonemenu/src/PhoneMenuPresenter.cpp
new file mode 100644 (file)
index 0000000..fd166ed
--- /dev/null
@@ -0,0 +1,13 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: PhoneMenuPresenter\r
+ * Create: 2025-07-12\r
+ */\r
+\r
+#include "NativeRegisterManager.h"\r
+#include "phonemenu/PhoneMenuView.h"\r
+#include "phonemenu/PhoneMenuPresenter.h"\r
+\r
+namespace OHOS {\r
+REGIST_MENU(VIEW_PHONE_MENU, PhoneMenuView, PhoneMenuPresenter, PHONEMENU_ICON, PHONEMENU_ICON, "通话菜单");\r
+}
\ No newline at end of file
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/phonemenu/src/PhoneMenuSync.cpp b/code/sdk/application/wearable/evb/nativeapp/nativeui/phonemenu/src/PhoneMenuSync.cpp
new file mode 100644 (file)
index 0000000..4f1e684
--- /dev/null
@@ -0,0 +1,133 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: PhoneMenuSync\r
+ * Create: 2025-07-12\r
+ */\r
+\r
+#include "cJSON.h"\r
+#include "wearable_log.h"\r
+#include "phonemenu/PhoneMenuSync.h"\r
+\r
+namespace OHOS {\r
+std::list<Contacts> PhoneMenuSync::list_;\r
+uint32_t PhoneMenuSync::WriteFileContact(const std::string &filePath, std::string &content)\r
+{\r
+    std::ofstream output(filePath);\r
+    if (!output.is_open()) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "no file");\r
+        return JSON_FILE_OPEN_FAIL;\r
+    }\r
+    output << content;\r
+    output.close();\r
+    return OK;\r
+}\r
+\r
+uint32_t PhoneMenuSync::ReadFileContact(const std::string &filePath)\r
+{\r
+    std::ifstream input(filePath.c_str());\r
+    if (!input.is_open()) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "no file");\r
+        return JSON_FILE_OPEN_FAIL;\r
+    }\r
+    std::stringstream buffer;\r
+    buffer << input.rdbuf();\r
+    std::string content = buffer.str();\r
+    int intsize = sizeof(content);\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "PhoneMenuSync::PhoneMenuSync [%s]", content.c_str());\r
+    ParseContactsMsg(content);\r
+    PrintContacts();\r
+    return OK;\r
+}\r
+\r
+uint32_t PhoneMenuSync::ParseContactsMsg(std::string &msgContent)\r
+{\r
+    WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "ParseContactsMsg %s\r\n", msgContent.c_str());\r
+    cJSON *root = cJSON_Parse(msgContent.c_str());\r
+    if (root == NULL) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "parse_contacts_msg cJSON_Parse, fail = %p\r\n", root);\r
+        return JSON_PARSE_FAIL;\r
+    }\r
+    if (!cJSON_IsArray(root)) {\r
+        cJSON_Delete(root);\r
+        return JSON_TYPE_FAIL;\r
+    }\r
+    list_.clear();\r
+    int arraySize = cJSON_GetArraySize(root);\r
+    for (int i = 0; i < arraySize; ++i) {\r
+        cJSON *item = cJSON_GetArrayItem(root, i);\r
+        if (cJSON_IsObject(item)) {\r
+            cJSON *cidJson = cJSON_GetObjectItem(item, "cid");\r
+            cJSON *nameJson = cJSON_GetObjectItem(item, "name");\r
+            cJSON *phoneJson = cJSON_GetObjectItem(item, "phone");\r
+            if (cidJson == nullptr || nameJson == nullptr || phoneJson == nullptr) {\r
+                return JSON_KEY_FAIL;\r
+            }\r
+            Contacts contacts;\r
+            contacts.cid_ = cidJson->valuestring;\r
+            contacts.name_ = nameJson->valuestring;\r
+            contacts.phone_ = phoneJson->valuestring;\r
+            list_.push_back(contacts);\r
+            WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "cid [%s], name [%s], phone [%s]", contacts.cid_.c_str(),\r
+                          contacts.name_.c_str(), contacts.phone_.c_str());\r
+        }\r
+    }\r
+    cJSON_Delete(root);\r
+    return OK;\r
+}\r
+\r
+std::list<Contacts> &PhoneMenuSync::GetContacts()\r
+{\r
+    return list_;\r
+}\r
+\r
+uint32_t PhoneMenuSync::PrintContacts()\r
+{\r
+    for (auto &x : list_) {\r
+        WEARABLE_LOGI(WEARABLE_LOG_MODULE_MSG_CENTER, "cid[%s] name[%s] phone[%s]", x.cid_.c_str(), x.name_.c_str(),\r
+                      x.phone_.c_str());\r
+    }\r
+    return OK;\r
+}\r
+\r
+uint32_t PhoneMenuSync::LookContacts(std::string &contacts)\r
+{\r
+    cJSON *contactsArrayObj = cJSON_CreateArray();\r
+    if (!contactsArrayObj) {\r
+        return JSON_CREATE_FAIL;\r
+    }\r
+    for (auto &contacts : list_) {\r
+        cJSON *contactsObj = cJSON_CreateObject();\r
+        if (!contactsObj) {\r
+            cJSON_Delete(contactsArrayObj);\r
+            return JSON_CREATE_FAIL;\r
+        }\r
+        cJSON_AddItemToObject(contactsObj, "cid", cJSON_CreateString(contacts.cid_.c_str()));\r
+        cJSON_AddItemToObject(contactsObj, "name", cJSON_CreateString(contacts.name_.c_str()));\r
+        cJSON_AddItemToObject(contactsObj, "phone", cJSON_CreateString(contacts.phone_.c_str()));\r
+        cJSON_AddItemToArray(contactsArrayObj, contactsObj);\r
+    }\r
+    char *jsonStr = cJSON_Print(contactsArrayObj);\r
+    if (!jsonStr) {\r
+        cJSON_Delete(contactsArrayObj);\r
+        return JSON_TO_STRING_FAIL;\r
+    }\r
+    contacts = jsonStr;\r
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_MSG_CENTER, "msg_center_lookup_contacts [%s]", jsonStr);\r
+    cJSON_Delete(contactsArrayObj);\r
+    free(jsonStr);\r
+    jsonStr = nullptr;\r
+    return OK;\r
+}\r
+\r
+uint32_t PhoneMenuSync::CleanFileContacts(const std::string &filePath)\r
+{\r
+    std::ofstream output(filePath);\r
+    if (!output.is_open()) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "no file");\r
+        return JSON_FILE_OPEN_FAIL;\r
+    }\r
+    output.close();\r
+    list_.clear();\r
+    return OK;\r
+}\r
+}
\ No newline at end of file
index 66b8897..2c4184e 100644 (file)
@@ -641,8 +641,10 @@ static void ScoStateChanged(const bd_addr_t &bdAddr, hfp_sco_connect_state_t sta
             if (g_scoFlag != HFP_SCO_STATE_CONNECTED) {
                 g_scoFlag = HFP_SCO_STATE_CONNECTED;
                 CopyBdAddr(bdAddr);
-                ScoConnectPro();
-                WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[ScoStateChanged] SCO connecting!");
+                GraphicService::GetInstance()->PostGraphicEvent([]() {
+                    ScoConnectPro();
+                    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[ScoStateChanged] SCO connecting!");
+                });
             }
             break;
         case HFP_SCO_STATE_CONNECTED:
@@ -881,7 +883,7 @@ int GetCallLog(CallLogInfo **info, int *num)
 {
     FILE *fp = fopen(CALL_LOG_PATH, "rb");
     if (fp == nullptr) {
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[AddToCallLog] fopen %s failed!", CALL_LOG_PATH);
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[GetCallLog] fopen %s failed!", CALL_LOG_PATH);
         return OHOS_FAILURE;
     }
 
@@ -1335,19 +1337,19 @@ static void CallStateChanged(const bd_addr_t &bdAddr, const PhoneHfpCallInfo &ca
             break;
         case HFP_HF_CALL_STATE_DIALING: // 呼出,正在拨号
             PhoneServiceScreenCtr(1);
-            CallChangeDialPro(call);
+            GraphicService::GetInstance()->PostGraphicEvent([call]() {  CallChangeDialPro(call); });
             break;
-        case HFP_HF_CALL_STATE_ALERTING: // 呼出,对方响铃
+        case HFP_HF_CALL_STATE_ALERTING:  // 呼出,对方响铃
             PhoneServiceScreenCtr(1);
-            CallChangeAlertPro(call);
+            GraphicService::GetInstance()->PostGraphicEvent([call]() {  CallChangeAlertPro(call); });
             break;
-        case HFP_HF_CALL_STATE_INCOMING: // 呼入
+        case HFP_HF_CALL_STATE_INCOMING:  // 呼入
             PhoneServiceScreenCtr(1);
-            CallChangeIncomePro(call);
+            GraphicService::GetInstance()->PostGraphicEvent([call]() {  CallChangeIncomePro(call); });
             break;
-        case HFP_HF_CALL_STATE_WAITING: // 呼入等待
+        case HFP_HF_CALL_STATE_WAITING:  // 呼入等待
             PhoneServiceScreenCtr(1);
-            CallChangeIncomePro(call);
+            GraphicService::GetInstance()->PostGraphicEvent([call]() {  CallChangeIncomePro(call); });
             break;
         case HFP_HF_CALL_STATE_FINISHED: // 拒接/结束电话
             CallChangeFinishPro(call);
@@ -1365,10 +1367,6 @@ static void CallStateChanged(const bd_addr_t &bdAddr, const PhoneHfpCallInfo &ca
     } else {
         g_currCallState = call.state;
     }
-
-    if (g_currCallNum == 0) {
-        g_completeCallFlag = false;
-    }
 }
 
 static void CallStateChangedCb(const bd_addr_t *bdAddr, const hfp_hf_calls_info_t *call)
@@ -1637,7 +1635,7 @@ int RejectIncomingCall(void)
     }
 
     if (phoneCall == nullptr) {
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[AcceptIncomingCall] no incoming");
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[RejectIncomingCall] no incoming");
         return OHOS_SUCCESS;
     }
 
index 410d073..c939183 100644 (file)
-/*\r
- * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved.\r
- * Description: Player view\r
- * Author:\r
- * Create: 2021-07-26\r
- */\r
-\r
-#include "player/PlayersModel.h"\r
-#include "thread_adapter.h"\r
-#include "UiConfig.h"\r
-#include "bts_avrcp_controller.h"\r
-#include "bts_avrcp_target.h"\r
-#include "bts_a2dp_source.h"\r
-#include "bluetooth/BluetoothModel.h"\r
-\r
-namespace OHOS {\r
-\r
-static constexpr int VOLUME_MAXIMUM = 100;\r
-static constexpr int VOLUME_MINIMUM = 0;\r
-static constexpr int VOLUME_PER_CHANGE = 10;\r
-\r
-#define BUFFER_SIZE 15\r
-static MutexId g_mutex;\r
-PlayersModel::PlayersModel()\r
-{\r
-    g_mutex = MUTEX_InitValue();\r
-}\r
-\r
-PlayersModel::~PlayersModel()\r
-{\r
-    listPlayers.Clear();\r
-}\r
-\r
-bool PlayersModel::FetchedPlayersCallBack(PlayersMsg *playersMsg)\r
-{\r
-    if (listPlayers.IsEmpty()) {\r
-        return false;\r
-    } else {\r
-        MUTEX_Lock(g_mutex);\r
-        *playersMsg = listPlayers.Front();\r
-        listPlayers.PopFront();\r
-        MUTEX_Unlock(g_mutex);\r
-    }\r
-    return true;\r
-}\r
-\r
-void PlayersModel::PushPlayersData(PlayersMsg playersMsg)\r
-{\r
-    MUTEX_Lock(g_mutex);\r
-    listPlayers.PushBack(playersMsg);\r
-    MUTEX_Unlock(g_mutex);\r
-}\r
-\r
-PlayersModel *PlayersModel::GetInstance()\r
-{\r
-    static PlayersModel instance;\r
-    return &instance;\r
-}\r
-\r
-std::string PlayersModel::GetPlayerUri(void)\r
-{\r
-    return uri;\r
-}\r
-\r
-void PlayersModel::SetPlayerUri(std::string src)\r
-{\r
-    uri = src;\r
-}\r
-\r
-void PlayersModel::SetPlayButtonState(bool value)\r
-{\r
-    playButtonState = value;\r
-}\r
-\r
-int PlayersModel::PlayerStat()\r
-{\r
-    int32_t ret;\r
-\r
-    // 设置回调函数\r
-    playerCtr->SetPlayerCallback(playerCallback);\r
-    // 申请资源\r
-    source = std::make_shared<Source>(uri, header);\r
-    if (source.get() == nullptr) {\r
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "source new fail");\r
-        return OHOS_FAILURE;\r
-    }\r
-    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Player uri %s.", uri.c_str());\r
-    playerCtr->SetSource(*source);\r
-    playerCtr->Prepare();\r
-    ret = playerCtr->GetDuration(duration_);\r
-    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[%s,%d] GetDuration:%lld, ret:%d", __func__, __LINE__, duration_, ret);\r
-    if (!isActivateAudioInterrupt) {\r
-        // 申请焦点\r
-        AudioManager& amIntance = AudioManager::GetInstance();\r
-        sessionId = amIntance.MakeSessionId();\r
-        if (sessionId == AUDIO_SESSION_ID_NONE) {\r
-            WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "session invalid");\r
-            return OHOS_FAILURE;\r
-        }\r
-        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MakeSessionId  %d", sessionId);\r
-        playerInterruptListener = std::make_shared<PlayerInterruptListener>();\r
-        if (playerInterruptListener.get() == nullptr) {\r
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "playerInterruptListener new fail");\r
-            return OHOS_FAILURE;\r
-        }\r
-        playerInterruptListener->SetOwner(playerCtr);\r
-        interrupt = {AUDIO_STREAM_MUSIC, sessionId, playerInterruptListener};\r
-            // 激活音频中断 5s超时\r
-        if (amIntance.ActivateAudioInterrupt(interrupt) == INTERRUPT_FAILED) {\r
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ActivateAudioInterrupt faild");\r
-            return OHOS_FAILURE;\r
-        }\r
-        isActivateAudioInterrupt = true;\r
-    }\r
-    playerCtr->SetAudioSessionId(sessionId);\r
-    // 播放\r
-    ret = playerCtr->Play();\r
-    if (ret != 0) {\r
-        playerCtr->Stop(); // 暂停\r
-        playerCtr->Reset(); // 初始化\r
-        PlayersPresenter *playersPresenter = PlayersPresenter::GetInstance();\r
-        if (playersPresenter != nullptr) {\r
-            playersPresenter->PlayerbackReset();\r
-            SetCircleProgress(100); // 100:进度100%\r
-            playersPresenter->SetPlaybackProgress(circleProgress);\r
-        } else {\r
-            SetPlayButtonState(false);\r
-            SetCircleProgress(100); // 100:进度100%\r
-        }\r
-        AudioManager::GetInstance().DeactivateAudioInterrupt(interrupt);\r
-        isActivateAudioInterrupt = false;\r
-    }\r
-    return OHOS_SUCCESS;\r
-}\r
-\r
-bool PlayersModel::GetAudioInitStatus(void)\r
-{\r
-    return audioInitStatus;\r
-}\r
-\r
-void PlayersModel::AudioInit(void)\r
-{\r
-    if (audioInitStatus) {\r
-        return;\r
-    }\r
-    AudioManager& amIntance = AudioManager::GetInstance();\r
-    audioInitStatus = amIntance.Initialize();\r
-    playerCtr = std::make_shared<Player>();\r
-    if (playerCtr.get() == nullptr) {\r
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "playerCtr new fail");\r
-        return;\r
-    }\r
-    playerCallback = std::make_shared<PlayerCallbackImpl>();\r
-    if (playerCallback.get() == nullptr) {\r
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "playerCallback new fail");\r
-        return;\r
-    }\r
-}\r
-\r
-void PlayersModel::SetCircleProgress(int64_t value)\r
-{\r
-    circleProgress = value;\r
-}\r
-\r
-int16_t PlayersModel::GetCurrentIndex(void)\r
-{\r
-    return currentIndex;\r
-}\r
-\r
-void PlayersModel::SetCurrentIndex(int16_t value)\r
-{\r
-    currentIndex = value;\r
-}\r
-\r
-int16_t PlayersModel::GetPlayerModel(void)\r
-{\r
-    return playerModel;\r
-}\r
-\r
-void PlayersModel::SetPlayerModel(int16_t value)\r
-{\r
-    playerModel = value;\r
-}\r
-\r
-void PlayersModel::SetPlayerModelAddOne(void)\r
-{\r
-    playerModel++;\r
-}\r
-\r
-void PlayersModel::PlaySwitching(void)\r
-{\r
-    PlayersMsg playersMsg1;\r
-    playersMsg1.playerModel = GetPlayerModel();\r
-    PushPlayersData(playersMsg1);\r
-    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "PlaySwitching playerModel1 %d!!!", GetPlayerModel());\r
-    int32_t ret;\r
-    PlayersMsg playersMsg;\r
-    if (FetchedPlayersCallBack(&playersMsg)) {\r
-        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "FetchedPlayersCallBack true");\r
-        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Stop to play");\r
-        switch (playersMsg.playerModel) {\r
-            case PlayerModelState::LOOP:\r
-                // 循环\r
-                WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "LoopingPlayout!!!");\r
-                LoopingPlayout();\r
-                break;\r
-            case PlayerModelState::SEQUENCE:\r
-                // 顺序\r
-                WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SequencePlayout!!!");\r
-                SequencePlayout();\r
-                break;\r
-            case PlayerModelState::REPEATS:\r
-                // 重复\r
-                WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "RepeatsPlayout!!!");\r
-                ret = PlayersModel::GetInstance()->playerCtr->Stop(); // 停止\r
-                WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Stop, ret:%d", ret);\r
-                ret = PlayersModel::GetInstance()->playerCtr->Reset();\r
-                WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Reset, ret:%d", ret);\r
-                PlayersModel::GetInstance()->PlayerStat(); // 播放\r
-                break;\r
-            case PlayerModelState::RANDOM:\r
-                // 随机\r
-                WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "RandomPlayout!!!");\r
-                RandomPlayout();\r
-                break;\r
-            default:\r
-                break;\r
-        }\r
-    }\r
-}\r
-\r
-int PlayersModel::PlayerInit(void)\r
-{\r
-    sliceId = PlayersListGroup::GetInstance()->GetCase(currentIndex);\r
-    if (sliceId == nullptr) {\r
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "GetCase %d sliceId err !!!", currentIndex);\r
-        char strFile[BUFFER_SIZE] = "No music files";\r
-        sliceId = strFile;\r
-    }\r
-    std::string strSongName = sliceId;\r
-    std::string pureName = strSongName.substr(0, strSongName.rfind("."));\r
-    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "PlayerInit, url: %s ", sliceId);\r
-    std::string strSrcMusic(APP_MUSIC_PATH);\r
-    std::string tempStr("/");\r
-    std::string strName = sliceId;\r
-    uri = strSrcMusic + tempStr + strName;\r
-    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "PlayerInit end!");\r
-    PlayersPresenter *playersPresenter = PlayersPresenter::GetInstance();\r
-    if (playersPresenter == nullptr) {\r
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "PlayerInit playersPresenter GetInstance fail");\r
-        return OHOS_FAILURE;\r
-    }\r
-    playersPresenter->SetTitleSetText(pureName.c_str());\r
-    playersPresenter->SetPlaybackProgress(circleProgress);\r
-    playersPresenter->SetPlayerState(playButtonState);\r
-    return 0;\r
-}\r
-\r
-void PlayersModel::NextSong(int16_t index)\r
-{\r
-    SetCurrentIndex(index);\r
-    // 播放\r
-    sliceId = PlayersListGroup::GetInstance()->GetCase(index);\r
-    if (sliceId == nullptr) {\r
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "GetCase %d sliceId err!!!", index);\r
-        return;\r
-    }\r
-    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "GetCase sliceId %s.", sliceId);\r
-    std::string strSrcMusic(APP_MUSIC_PATH);\r
-    std::string tempStr("/");\r
-    std::string strName = sliceId;\r
-    SetPlayerUri(strSrcMusic + tempStr + strName);\r
-    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "uri: %s.", GetPlayerUri().c_str());\r
-    std::string strSongName = sliceId;\r
-    std::string pureName = strSongName.substr(0, strSongName.rfind("."));\r
-    PlayersPresenter *playersPresenter = PlayersPresenter::GetInstance();\r
-    if (playersPresenter != nullptr) {\r
-        playersPresenter->SetTitleSetText(pureName.c_str());\r
-        playersPresenter->SetPlaybackProgress(0); // 0:进度0%\r
-    }\r
-    int32_t ret;\r
-    int32_t playerState;\r
-    playerCtr->GetPlayerState(playerState);\r
-    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "playerState Value %d.", playerState);\r
-    if ((playerState == PlayerStates::PLAYER_STARTED) || (playerState == PlayerStates::PLAYER_PLAYBACK_COMPLETE)) {\r
-        /* start play */\r
-        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "start play, 160.");\r
-        ret = playerCtr->Stop(); // 停止\r
-        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Stop, ret:%d", ret);\r
-        ret = playerCtr->Reset();\r
-        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Reset, ret:%d", ret);\r
-        ret = PlayerStat(); // 播放\r
-        if (ret != 0) {\r
-            /* stop and exit */\r
-            ret = playerCtr->Stop(); // 停止\r
-            ret = playerCtr->Reset();\r
-        }\r
-    } else if (playerState == PlayerStates::PLAYER_PAUSED || (playerState == PlayerStates::PLAYER_IDLE)) {\r
-        ret = playerCtr->Reset();\r
-        AudioManager::GetInstance().DeactivateAudioInterrupt(interrupt);\r
-        ClearActivateAudioInterrupt();\r
-        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Reset, ret:%d", ret);\r
-    }\r
-}\r
-\r
-void PlayersModel::LoopingPlayout()\r
-{\r
-    int16_t index;\r
-    List<PlayerCaseInfo> &playersCaseList = PlayersListGroup::GetInstance()->GetCase();\r
-    index = GetCurrentIndex();\r
-    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "LoopingPlayout, index %d.", index);\r
-    if ((index > playersCaseList.Size() - 1) || (index < 0)) {\r
-        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "currentIndex err");\r
-        SetCurrentIndex(0);\r
-        return;\r
-    }\r
-    if (GetPlayerModel() == PlayerModelState::RANDOM) {\r
-        RandomPlayout();\r
-        return;\r
-    } else {\r
-        index++; // 下一曲\r
-    }\r
-    if (index > playersCaseList.Size() - 1) {\r
-        index = 0;\r
-    }\r
-    NextSong(index);\r
-    SetCircleProgress(0); // 0:进度0%\r
-}\r
-\r
-void PlayersModel::SequencePlayout()\r
-{\r
-    int16_t index;\r
-    List<PlayerCaseInfo> &playersCaseList = PlayersListGroup::GetInstance()->GetCase();\r
-    index = GetCurrentIndex();\r
-    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SequencePlayout, index %d.", index);\r
-    if ((index > playersCaseList.Size() - 1) || (index < 0)) {\r
-        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "currentIndex err");\r
-        SetCurrentIndex(0);\r
-        return;\r
-    }\r
-    index++; // 下一曲\r
-    if (index > playersCaseList.Size() - 1) {\r
-        playerCtr->Stop(); // 暂停\r
-        playerCtr->Reset(); // 初始化\r
-        PlayersPresenter *playersPresenter = PlayersPresenter::GetInstance();\r
-        if (playersPresenter != nullptr) {\r
-            playersPresenter->PlayerbackReset();\r
-        } else {\r
-            SetPlayButtonState(false);\r
-        }\r
-        SetCircleProgress(100); // 100:进度100%\r
-        index = playersCaseList.Size() - 1;\r
-    }\r
-    NextSong(index);\r
-}\r
-\r
-void PlayersModel::RandomPlayout()\r
-{\r
-    int16_t random;\r
-    int16_t indexMax;\r
-    srand((unsigned)time(nullptr));\r
-    List<PlayerCaseInfo> &playersCaseList = PlayersListGroup::GetInstance()->GetCase();\r
-    indexMax = playersCaseList.Size() - 1;\r
-    random = (rand() % (indexMax + 1));\r
-    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "RANDOM %d.", random);\r
-    if ((random > playersCaseList.Size() - 1) || (random < 0)) {\r
-        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "random err");\r
-        SetCurrentIndex(0);\r
-        return;\r
-    }\r
-    if (GetCurrentIndex() == random) {\r
-        random++;\r
-        if (random > playersCaseList.Size() - 1) {\r
-            random = 0;\r
-        }\r
-    }\r
-    NextSong(random);\r
-    SetCircleProgress(0); // 0:进度0%\r
-}\r
-\r
-void PlayersModel::PreviousPlayout()\r
-{\r
-    int16_t index;\r
-    List<PlayerCaseInfo> &playersCaseList = PlayersListGroup::GetInstance()->GetCase();\r
-    index = GetCurrentIndex();\r
-    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "PreviousPlayout, index %d.", index);\r
-    if ((index > playersCaseList.Size() - 1) || (index < 0)) {\r
-        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "currentIndex err");\r
-        SetCurrentIndex(0);\r
-        return;\r
-    }\r
-    index--; // 上一曲\r
-    if (index < 0) {\r
-        index = playersCaseList.Size() - 1;\r
-    }\r
-    NextSong(index);\r
-    SetCircleProgress(0); // 0:进度0%\r
-}\r
-\r
-std::shared_ptr<Player> PlayersModel::GetPlayerCtr()\r
-{\r
-    return playerCtr;\r
-}\r
-\r
-std::shared_ptr<PlayerInterruptListener> PlayersModel::GetPlayerIntrptListener(void)\r
-{\r
-    return playerInterruptListener;\r
-}\r
-\r
-int PlayersModel::GetPlayerState(void)\r
-{\r
-    int state;\r
-    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[PlayersModel] GetPlayerState");\r
-\r
-    if (playerCtr.get() == nullptr) {\r
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "playerCtr.get() is nullptr!!");\r
-        return ERR_RET;\r
-    }\r
-    playerCtr->GetPlayerState(state);\r
-    return state;\r
-}\r
-\r
-bool PlayersModel::HasPlayerPlayed(void)\r
-{\r
-    int state = GetPlayerState();\r
-    if (state == ERR_RET) {\r
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Get Player State failed!!");\r
-        return false;\r
-    }\r
-    if (state != PlayerStates::PLAYER_STARTED && state != PlayerStates::PLAYER_PAUSED &&\r
-        state != PlayerStates::PLAYER_STOPPED && state != PlayerStates::PLAYER_PLAYBACK_COMPLETE) {\r
-        if (!isStopAndReset) {\r
-            return false;\r
-        }\r
-    }\r
-    return true;\r
-}\r
-\r
-/* 蓝牙连接的音频控制,对按钮属性进行设置 */\r
-void PlayersModel::ConncetBtResetButton()\r
-{\r
-    int32_t connCtState = avrcp_ct_get_device_connect_state(BluetoothModel::GetInstance()->GetLastConnedAddr());\r
-    int32_t connTgState = avrcp_tg_get_device_connect_state(BluetoothModel::GetInstance()->GetLastConnedAddr());\r
-    if (connCtState == PROFILE_STATE_CONNECTED || connTgState == PROFILE_STATE_CONNECTED) {\r
-        if (PlayersPresenter::GetInstance() == nullptr) {\r
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "PlayersPresenter::GetInstance() == nullptr");\r
-            return;\r
-        }\r
-        PlayersPresenter::GetInstance()->PlayerHeadsetReset();\r
-    }\r
-}\r
-\r
-int PlayersModel::PlayerPlay(void)\r
-{\r
-    int state;\r
-    int ret;\r
-    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[PlayersModel] PlayerPlay");\r
-\r
-    state = GetPlayerState();\r
-    if (state == ERR_RET) {\r
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Get state of player failed!!");\r
-        return EXECUTE_FUNC_FAILED;\r
-    }\r
-\r
-    if (playerCtr.get() == nullptr) {\r
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "playerCtr.get() is nullptr!!");\r
-        return EXECUTE_FUNC_FAILED;\r
-    }\r
-    if (state == PlayerStates::PLAYER_PAUSED || state == PlayerStates::PLAYER_STOPPED) {           // 暂停状态则直接开始\r
-        ret = playerCtr->Play();\r
-        if (ret != 0) {\r
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Play err, ret:%d", ret);\r
-            return EXECUTE_FUNC_FAILED;\r
-        }\r
-        PlayersModel::GetInstance()->SetPlayButtonState(true);      // 播放控件图形同步\r
-        ConncetBtResetButton(); // 蓝牙连接的音频控制,对按钮属性进行设置\r
-        return NORMAL;\r
-    } else if (state == PlayerStates::PLAYER_STARTED || state == PlayerStates::PLAYER_PLAYBACK_COMPLETE) {   // 已经在播放状态则不做操作\r
-        return SONG_ALREADY_PLAY;\r
-    } else {                  // 其它情况的处理\r
-        ret = PlayersModel::GetInstance()->PlayerStat();\r
-        if (ret != 0) {\r
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "PlayerStat err, ret:%d", ret);\r
-            return EXECUTE_FUNC_FAILED;\r
-        }\r
-        PlayersModel::GetInstance()->SetPlayButtonState(true);      // 播放控件图形同步\r
-        ConncetBtResetButton();\r
-        return NORMAL;\r
-    }\r
-}\r
-\r
-int PlayersModel::PlayerPause(void)\r
-{\r
-    int state;\r
-    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[PlayersModel] PlayerPause");\r
-\r
-    state = GetPlayerState();\r
-    if (state == ERR_RET) {\r
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Get state of player failed!!");\r
-        return EXECUTE_FUNC_FAILED;\r
-    }\r
-\r
-    if (playerCtr.get() == nullptr) {\r
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "playerCtr.get() is nullptr!!");\r
-        return EXECUTE_FUNC_FAILED;\r
-    }\r
-    if (state == PlayerStates::PLAYER_PAUSED) {           // 暂停状态则不操作\r
-        return SONG_ALREADY_PAUSE;\r
-    } else if (state == PlayerStates::PLAYER_STARTED || state == PlayerStates::PLAYER_PLAYBACK_COMPLETE) {\r
-        int ret = playerCtr->Pause();\r
-        if (ret != 0) {\r
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Pause err, ret:%d!!", ret);\r
-            return EXECUTE_FUNC_FAILED;\r
-        } else {\r
-            PlayersModel::GetInstance()->SetPlayButtonState(false);\r
-            ConncetBtResetButton();\r
-            return NORMAL;\r
-        }\r
-    } else if (state == PlayerStates::PLAYER_STOPPED) {\r
-        return SONG_ALREADY_STOP;\r
-    }\r
-    return NORMAL;\r
-}\r
-\r
-int PlayersModel::PlayerStop(void)\r
-{\r
-    int state;\r
-    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[PlayersModel] PlayerStop");\r
-    state = GetPlayerState();\r
-    if (state == ERR_RET) {\r
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Get state of player failed!!");\r
-        return EXECUTE_FUNC_FAILED;\r
-    }\r
-    if (playerCtr.get() == nullptr) {\r
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "playerCtr.get() is nullptr!!");\r
-        return EXECUTE_FUNC_FAILED;\r
-    }\r
-    if (state == PlayerStates::PLAYER_STARTED || state == PlayerStates::PLAYER_PLAYBACK_COMPLETE) {\r
-        int ret = playerCtr->Stop();\r
-        if (ret != 0) {\r
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Stop err, ret:%d", ret);\r
-            return EXECUTE_FUNC_FAILED;\r
-        }\r
-        ret = playerCtr->Reset();\r
-        if (ret != 0) {\r
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Reset err, ret:%d", ret);\r
-            return EXECUTE_FUNC_FAILED;\r
-        } else {\r
-            isStopAndReset = true;\r
-            PlayersModel::GetInstance()->SetPlayButtonState(false);\r
-            PlayersModel::GetInstance()->SetCircleProgress(0);\r
-            ConncetBtResetButton();\r
-        }\r
-        AudioManager::GetInstance().DeactivateAudioInterrupt(interrupt);\r
-        return NORMAL;\r
-    } else if (state == PlayerStates::PLAYER_PAUSED) {\r
-        int ret = playerCtr->Reset();\r
-        if (ret != 0) {\r
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Reset err, ret:%d", ret);\r
-            return EXECUTE_FUNC_FAILED;\r
-        } else {\r
-            PlayersModel::GetInstance()->SetPlayButtonState(false);\r
-            PlayersModel::GetInstance()->SetCircleProgress(0);\r
-            ConncetBtResetButton();\r
-        }\r
-        AudioManager::GetInstance().DeactivateAudioInterrupt(interrupt);\r
-        return NORMAL;\r
-    } else if (state == PlayerStates::PLAYER_STOPPED) {\r
-        return SONG_ALREADY_STOP;\r
-    }\r
-    return NORMAL;\r
-}\r
-\r
-int PlayersModel::PreSongOperate(void)\r
-{\r
-    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[PlayersModel] PreSongOperate");\r
-\r
-    PlayersModel::GetInstance()->PreviousPlayout();\r
-    PlayersModel::GetInstance()->SetPlayButtonState(true);\r
-    return NORMAL;\r
-}\r
-\r
-int PlayersModel::NextSongOperate(void)\r
-{\r
-    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[PlayersModel] NextSongOperate");\r
-\r
-    PlayersModel::GetInstance()->LoopingPlayout();\r
-    PlayersModel::GetInstance()->SetPlayButtonState(true);\r
-    return NORMAL;\r
-}\r
-\r
-int PlayersModel::IncreaseVolume(void)    // 不带界面增加音量\r
-{\r
-    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[PlayersModel] IncreaseVolume");\r
-\r
-    int curSound = AudioManager::GetInstance().GetVolume(AUDIO_STREAM_MUSIC);\r
-    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Presound is %d", curSound);\r
-    if (curSound > VOLUME_MAXIMUM - VOLUME_PER_CHANGE) {\r
-            curSound = VOLUME_MAXIMUM;\r
-    } else {\r
-        curSound += VOLUME_PER_CHANGE;\r
-    }\r
-    AudioManager::GetInstance().SetVolume(AUDIO_STREAM_MUSIC, curSound);\r
-    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Now music sound is %d", curSound);\r
-    return NORMAL;\r
-}\r
-\r
-int PlayersModel::DecreaseVolume(void)    // 不带界面减小音量\r
-{\r
-    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[PlayersModel] DecreaseVolume");\r
-\r
-    int curSound = AudioManager::GetInstance().GetVolume(AUDIO_STREAM_MUSIC);\r
-    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Presound is %d", curSound);\r
-    if (curSound < VOLUME_MINIMUM + VOLUME_PER_CHANGE) {\r
-            curSound = VOLUME_MINIMUM;\r
-    } else {\r
-        curSound -= VOLUME_PER_CHANGE;\r
-    }\r
-    AudioManager::GetInstance().SetVolume(AUDIO_STREAM_MUSIC, curSound);\r
-    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Now music sound is %d", curSound);\r
-    return NORMAL;\r
-}\r
-\r
-int32_t PlayersModel::GetPlayerstatus()\r
-{\r
-    int32_t playerState;\r
-    if (playerCtr.get() == nullptr) {\r
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "PlayersModel::GetPlayerstatus playerCtr is nullptr");\r
-        return EXECUTE_FUNC_FAILED;\r
-    }\r
-    playerCtr->GetPlayerState(playerState);\r
-\r
-    switch (playerState) {\r
-        case PLAYER_STARTED:\r
-            playerState = AVRCP_PLAY_STATUS_PLAYING;\r
-            break;\r
-        case PLAYER_PAUSED:\r
-            playerState = AVRCP_PLAY_STATUS_PAUSED;\r
-            break;\r
-        case PLAYER_STOPPED:\r
-            playerState = AVRCP_PLAY_STATUS_STOPPED;\r
-            break;\r
-        default:\r
-            playerState = AVRCP_PLAY_STATUS_STOPPED;\r
-            break;\r
-    }\r
-    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[PlayerModel::GetPlayerstatus]status = [%d]", playerState);\r
-    return playerState;\r
-}\r
-\r
-void PlayersModel::SetBTMusicPlay(avrcp_key_operation_t notification)\r
-{\r
-    int ret;\r
-    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[PlayerModel] SetBTMusicPlay");\r
-    if (BluetoothModel::GetInstance()->GetLastConnedAddr() == nullptr) {\r
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[PlayerModel::SetBTMusicPlay] GetLastConnedAddr is nullptr");\r
-        return;\r
-    }\r
-    if (notification == AVRCP_KEY_PLAY) {\r
-        ret = a2dp_src_start_playing(BluetoothModel::GetInstance()->GetLastConnedAddr());  // 设置耳机的状态为播放\r
-        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[PlayerModel::SetBTMusicPlay] A2dpSrcStartPlaying ret:%d", ret);\r
-        avrcp_tg_notify_playback_status_changed(PlayersModel::GetInstance()->GetPlayerstatus());\r
-    } else if (notification == AVRCP_KEY_PAUSE) {\r
-        ret = a2dp_src_suspend_playing(BluetoothModel::GetInstance()->GetLastConnedAddr());\r
-        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[PlayerModel::SetBTMusicPlay] A2dpSrcSuspendPlaying ret:%d", ret); // 设置耳机的状态暂停\r
-        avrcp_tg_notify_playback_status_changed(PlayersModel::GetInstance()->GetPlayerstatus());\r
-    }\r
-}\r
-// 蓝牙连接和本地的音乐播放\r
-int32_t PlayersModel::ConnectBtAndLocalPlay(int32_t connCtState, int32_t connTgState, int32_t playerState)\r
-{\r
-    int ret;\r
-    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[PlayerModel] ConnectBtAndLocalPlay connCtState = %d connTgState = %d", connCtState, connTgState);\r
-    avrcp_key_operation_t playNotification = AVRCP_KEY_PLAY;\r
-    if (PlayersModel::GetInstance()->GetPlayerCtr() == nullptr) {\r
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[PlayersModel::ConnectBtAndLocalPlay] BT GetPlayerCtr is nullptr ");\r
-        return -1;\r
-    }\r
-    if (connCtState == HFP_SCO_STATE_CONNECTED || connTgState == HFP_SCO_STATE_CONNECTED) {\r
-        if (playerState == PlayerStates::PLAYER_PAUSED) {\r
-                if (playerInterruptListener->IsInterruptedPaused()) {\r
-                    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Paused by interrupt, dont resume");\r
-                    return -1;\r
-                }\r
-                ret = PlayersModel::GetInstance()->GetPlayerCtr()->Play(); // 暂停后的播放\r
-                PlayersModel::GetInstance()->SetBTMusicPlay(playNotification);\r
-        } else {\r
-                ret = PlayersModel::GetInstance()->PlayerStat(); // 蓝牙连接播放\r
-                if (ret != 0) {\r
-                    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[PlayersModel::ConnBtAndLocalPlay] BTPlayerStat err, ret:%d", ret);\r
-                }\r
-                PlayersModel::GetInstance()->SetBTMusicPlay(playNotification);\r
-        }\r
-    } else {\r
-        if (playerState == PlayerStates::PLAYER_PAUSED) {\r
-                WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "PLAYER_PAUSED play, 122.");\r
-                if (playerInterruptListener->IsInterruptedPaused()) {\r
-                    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Paused by interrupt, dont resume");\r
-                    return -1;\r
-                }\r
-                ret = PlayersModel::GetInstance()->GetPlayerCtr()->Play();\r
-        } else {\r
-                ret = PlayersModel::GetInstance()->PlayerStat(); // 本地播放\r
-                if (ret != 0) {\r
-                    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "PlayerStat err, ret:%d", ret);\r
-                }\r
-        }\r
-    }\r
-    return ret;\r
-}\r
-\r
-// 蓝牙连接和本地音乐的暂停\r
-int32_t PlayersModel::ConnectBtAndLocalPause(int32_t connCtState, int32_t connTgState)\r
-{\r
-    int32_t ret = 0;\r
-    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[PlayerModel] ConnectBtAndLocalPause");\r
-    avrcp_key_operation_t playNotification = AVRCP_KEY_PAUSE;\r
-    if (connCtState == HFP_SCO_STATE_CONNECTED || connTgState == HFP_SCO_STATE_CONNECTED) {\r
-        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "state == BTUNSELECTED, 105.");\r
-        if (PlayersModel::GetInstance()->GetPlayerCtr() == nullptr) {\r
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[PlayersModel::ConnectBtAndLocalPause] BT GetPlayerCtr is nullptr");\r
-            return -1;\r
-        }\r
-        ret = PlayersModel::GetInstance()->GetPlayerCtr()->Pause(); // 蓝牙连接暂停\r
-        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BT Music Pause, ret:%d", ret);\r
-        PlayersModel::GetInstance()->SetBTMusicPlay(playNotification);\r
-    } else {\r
-        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "state == UNSELECTED, 105.");\r
-        ret = PlayersModel::GetInstance()->GetPlayerCtr()->Pause(); // 本地暂停\r
-        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Pause, ret:%d", ret);\r
-    }\r
-    return ret;\r
-}\r
-\r
-void PlayersModel::ClearActivateAudioInterrupt()\r
-{\r
-    isActivateAudioInterrupt = false;\r
-}\r
-\r
-void  PlayersModel::GetDuration(int64_t &duration)\r
-{\r
-    duration = duration_;\r
-}\r
-\r
+/*
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.
+ * Description: PlayersModel
+ * Create: 2025-03-23
+ */
+
+#include "thread_adapter.h"
+#include "UiConfig.h"
+#include "player/PlayersModel.h"
+
+namespace OHOS {
+
+static constexpr int VOLUME_MAXIMUM = 100;
+static constexpr int VOLUME_MINIMUM = 0;
+static constexpr int VOLUME_PER_CHANGE = 10;
+
+#define BUFFER_SIZE 15
+static MutexId g_mutex;
+PlayersModel::PlayersModel()
+{
+    g_mutex = MUTEX_InitValue();
+}
+
+PlayersModel::~PlayersModel()
+{
+    listPlayers.Clear();
+}
+
+bool PlayersModel::FetchedPlayersCallBack(PlayersMsg *playersMsg)
+{
+    if (listPlayers.IsEmpty()) {
+        return false;
+    } else {
+        MUTEX_Lock(g_mutex);
+        *playersMsg = listPlayers.Front();
+        listPlayers.PopFront();
+        MUTEX_Unlock(g_mutex);
+    }
+    return true;
+}
+
+void PlayersModel::PushPlayersData(PlayersMsg playersMsg)
+{
+    MUTEX_Lock(g_mutex);
+    listPlayers.PushBack(playersMsg);
+    MUTEX_Unlock(g_mutex);
+}
+
+PlayersModel *PlayersModel::GetInstance()
+{
+    static PlayersModel instance;
+    return &instance;
+}
+
+std::string PlayersModel::GetPlayerUri(void)
+{
+    return uri;
+}
+
+void PlayersModel::SetPlayerUri(std::string src)
+{
+    uri = src;
+}
+
+void PlayersModel::SetPlayButtonState(bool value)
+{
+    playButtonState = value;
+}
+
+int PlayersModel::PlayerStat()
+{
+    int32_t ret;
+
+    // 设置回调函数
+    playerCtr->SetPlayerCallback(playerCallback);
+    // 申请资源
+    source = std::make_shared<Source>(uri, header);
+    if (source.get() == nullptr) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "source new fail");
+        return OHOS_FAILURE;
+    }
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Player uri %s.", uri.c_str());
+    playerCtr->SetSource(*source);
+    playerCtr->Prepare();
+    ret = playerCtr->GetDuration(duration_);
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[%s,%d] GetDuration:%lld, ret:%d", __func__, __LINE__, duration_, ret);
+    if (!isActivateAudioInterrupt) {
+        // 申请焦点
+        AudioManager& amIntance = AudioManager::GetInstance();
+        sessionId = amIntance.MakeSessionId();
+        if (sessionId == AUDIO_SESSION_ID_NONE) {
+            WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "session invalid");
+            return OHOS_FAILURE;
+        }
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MakeSessionId  %d", sessionId);
+        playerInterruptListener = std::make_shared<PlayerInterruptListener>();
+        if (playerInterruptListener.get() == nullptr) {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "playerInterruptListener new fail");
+            return OHOS_FAILURE;
+        }
+        playerInterruptListener->SetOwner(playerCtr);
+        interrupt = {AUDIO_STREAM_MUSIC, sessionId, playerInterruptListener};
+            // 激活音频中断 5s超时
+        if (amIntance.ActivateAudioInterrupt(interrupt) == INTERRUPT_FAILED) {
+            WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ActivateAudioInterrupt faild");
+            return OHOS_FAILURE;
+        }
+        isActivateAudioInterrupt = true;
+    }
+    playerCtr->SetAudioSessionId(sessionId);
+    // 播放
+    ret = playerCtr->Play();
+    if (ret != 0) {
+        playerCtr->Stop(); // 暂停
+        playerCtr->Reset(); // 初始化
+        
+        PlayersView *playersView = PlayersView::GetInstance();
+        if (playersView != nullptr) {
+            playersView->SetPlayerButtonState(UICheckBox::UICheckBoxState::UNSELECTED);
+            SetCircleProgress(100); // 100:进度100%
+            playersView->SetPlaybackProgress(circleProgress);
+        } else {
+            SetPlayButtonState(false);
+            SetCircleProgress(100); // 100:进度100%
+        }
+        AudioManager::GetInstance().DeactivateAudioInterrupt(interrupt);
+        isActivateAudioInterrupt = false;
+    }
+    return OHOS_SUCCESS;
+}
+
+bool PlayersModel::GetAudioInitStatus(void)
+{
+    return audioInitStatus;
+}
+
+void PlayersModel::AudioInit(void)
+{
+    if (audioInitStatus) {
+        return;
+    }
+    AudioManager& amIntance = AudioManager::GetInstance();
+    audioInitStatus = amIntance.Initialize();
+    playerCtr = std::make_shared<Player>();
+    if (playerCtr.get() == nullptr) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "playerCtr new fail");
+        return;
+    }
+    playerCallback = std::make_shared<PlayerCallbackImpl>();
+    if (playerCallback.get() == nullptr) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "playerCallback new fail");
+        return;
+    }
+}
+
+void PlayersModel::SetCircleProgress(int64_t value)
+{
+    circleProgress = value;
+}
+
+int16_t PlayersModel::GetCurrentIndex(void)
+{
+    return currentIndex;
+}
+
+void PlayersModel::SetCurrentIndex(int16_t value)
+{
+    currentIndex = value;
+}
+
+int16_t PlayersModel::GetPlayerModel(void)
+{
+    return playerModel;
+}
+
+void PlayersModel::SetPlayerModel(int16_t value)
+{
+    playerModel = value;
+}
+
+void PlayersModel::SetPlayerModelAddOne(void)
+{
+    playerModel++;
+}
+
+void PlayersModel::PlaySwitching(void)
+{
+    PlayersMsg playersMsg1;
+    playersMsg1.playerModel = GetPlayerModel();
+    PushPlayersData(playersMsg1);
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "PlaySwitching playerModel1 %d!!!", GetPlayerModel());
+    int32_t ret;
+    PlayersMsg playersMsg;
+    if (FetchedPlayersCallBack(&playersMsg)) {
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "FetchedPlayersCallBack true");
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Stop to play");
+        switch (playersMsg.playerModel) {
+            case PlayerModelState::LOOP:
+                // 循环
+                WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "LoopingPlayout!!!");
+                LoopingPlayout();
+                break;
+            case PlayerModelState::SEQUENCE:
+                // 顺序
+                WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SequencePlayout!!!");
+                SequencePlayout();
+                break;
+            case PlayerModelState::REPEATS:
+                // 重复
+                WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "RepeatsPlayout!!!");
+                ret = PlayersModel::GetInstance()->playerCtr->Stop(); // 停止
+                WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Stop, ret:%d", ret);
+                ret = PlayersModel::GetInstance()->playerCtr->Reset();
+                WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Reset, ret:%d", ret);
+                PlayersModel::GetInstance()->PlayerStat(); // 播放
+                break;
+            case PlayerModelState::RANDOM:
+                // 随机
+                WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "RandomPlayout!!!");
+                RandomPlayout();
+                break;
+            default:
+                break;
+        }
+    }
+}
+
+int PlayersModel::PlayerInit(void)
+{
+    sliceId = PlayersListGroup::GetInstance()->GetCase(currentIndex);
+    if (sliceId == nullptr) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "GetCase %d sliceId err !!!", currentIndex);
+        char strFile[BUFFER_SIZE] = "No music files";
+        sliceId = strFile;
+    }
+    std::string strSongName = sliceId;
+    std::string pureName = strSongName.substr(0, strSongName.rfind("."));
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "PlayerInit, url: %s ", sliceId);
+    std::string strSrcMusic(APP_MUSIC_PATH);
+    std::string tempStr("/");
+    std::string strName = sliceId;
+    uri = strSrcMusic + tempStr + strName;
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "PlayerInit end!");
+    PlayersView *playersView = PlayersView::GetInstance();
+    if (playersView == nullptr) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "PlayerInit playersView GetInstance fail");
+        return OHOS_FAILURE;
+    }
+    playersView->TitleSetText(pureName.c_str());
+    playersView->SetPlaybackProgress(circleProgress);
+    playersView->SetPlayerState(playButtonState);
+    return 0;
+}
+
+void PlayersModel::NextSong(int16_t index)
+{
+    SetCurrentIndex(index);
+    // 播放
+    sliceId = PlayersListGroup::GetInstance()->GetCase(index);
+    if (sliceId == nullptr) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "GetCase %d sliceId err!!!", index);
+        return;
+    }
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "GetCase sliceId %s.", sliceId);
+    std::string strSrcMusic(APP_MUSIC_PATH);
+    std::string tempStr("/");
+    std::string strName = sliceId;
+    SetPlayerUri(strSrcMusic + tempStr + strName);
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "uri: %s.", GetPlayerUri().c_str());
+    std::string strSongName = sliceId;
+    std::string pureName = strSongName.substr(0, strSongName.rfind("."));
+    PlayersView *playersView = PlayersView::GetInstance();
+    if (playersView != nullptr) {
+        playersView->TitleSetText(pureName.c_str());
+        playersView->SetPlaybackProgress(0); // 0:进度0%
+    }
+    int32_t ret;
+    int32_t playerState;
+    playerCtr->GetPlayerState(playerState);
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "playerState Value %d.", playerState);
+    if ((playerState == PlayerStates::PLAYER_STARTED) || (playerState == PlayerStates::PLAYER_PLAYBACK_COMPLETE)) {
+        /* start play */
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "start play, 160.");
+        ret = playerCtr->Stop(); // 停止
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Stop, ret:%d", ret);
+        ret = playerCtr->Reset();
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Reset, ret:%d", ret);
+        ret = PlayerStat(); // 播放
+        if (ret != 0) {
+            /* stop and exit */
+            ret = playerCtr->Stop(); // 停止
+            ret = playerCtr->Reset();
+        }
+    } else if (playerState == PlayerStates::PLAYER_PAUSED || (playerState == PlayerStates::PLAYER_IDLE)) {
+        ret = playerCtr->Reset();
+        AudioManager::GetInstance().DeactivateAudioInterrupt(interrupt);
+        ClearActivateAudioInterrupt();
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Reset, ret:%d", ret);
+    }
+}
+
+void PlayersModel::LoopingPlayout()
+{
+    int16_t index;
+    List<PlayerCaseInfo> &playersCaseList = PlayersListGroup::GetInstance()->GetCase();
+    index = GetCurrentIndex();
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "LoopingPlayout, index %d.", index);
+    if ((index > playersCaseList.Size() - 1) || (index < 0)) {
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "currentIndex err");
+        SetCurrentIndex(0);
+        return;
+    }
+    if (GetPlayerModel() == PlayerModelState::RANDOM) {
+        RandomPlayout();
+        return;
+    } else {
+        index++; // 下一曲
+    }
+    if (index > playersCaseList.Size() - 1) {
+        index = 0;
+    }
+    NextSong(index);
+    SetCircleProgress(0); // 0:进度0%
+}
+
+void PlayersModel::SequencePlayout()
+{
+    int16_t index;
+    List<PlayerCaseInfo> &playersCaseList = PlayersListGroup::GetInstance()->GetCase();
+    index = GetCurrentIndex();
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SequencePlayout, index %d.", index);
+    if ((index > playersCaseList.Size() - 1) || (index < 0)) {
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "currentIndex err");
+        SetCurrentIndex(0);
+        return;
+    }
+    index++; // 下一曲
+    if (index > playersCaseList.Size() - 1) {
+        playerCtr->Stop(); // 暂停
+        playerCtr->Reset(); // 初始化
+        PlayersView *playersView = PlayersView::GetInstance();
+        if (playersView != nullptr) {
+            playersView->SetPlayerButtonState(UICheckBox::UICheckBoxState::UNSELECTED);
+        } else {
+            SetPlayButtonState(false);
+        }
+        SetCircleProgress(100); // 100:进度100%
+        index = playersCaseList.Size() - 1;
+    }
+    NextSong(index);
+}
+
+void PlayersModel::RandomPlayout()
+{
+    int16_t random;
+    int16_t indexMax;
+    srand((unsigned)time(nullptr));
+    List<PlayerCaseInfo> &playersCaseList = PlayersListGroup::GetInstance()->GetCase();
+    indexMax = playersCaseList.Size() - 1;
+    random = (rand() % (indexMax + 1));
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "RANDOM %d.", random);
+    if ((random > playersCaseList.Size() - 1) || (random < 0)) {
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "random err");
+        SetCurrentIndex(0);
+        return;
+    }
+    if (GetCurrentIndex() == random) {
+        random++;
+        if (random > playersCaseList.Size() - 1) {
+            random = 0;
+        }
+    }
+    NextSong(random);
+    SetCircleProgress(0); // 0:进度0%
+}
+
+void PlayersModel::PreviousPlayout()
+{
+    int16_t index;
+    List<PlayerCaseInfo> &playersCaseList = PlayersListGroup::GetInstance()->GetCase();
+    index = GetCurrentIndex();
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "PreviousPlayout, index %d.", index);
+    if ((index > playersCaseList.Size() - 1) || (index < 0)) {
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "currentIndex err");
+        SetCurrentIndex(0);
+        return;
+    }
+    index--; // 上一曲
+    if (index < 0) {
+        index = playersCaseList.Size() - 1;
+    }
+    NextSong(index);
+    SetCircleProgress(0); // 0:进度0%
+}
+
+std::shared_ptr<Player> PlayersModel::GetPlayerCtr()
+{
+    return playerCtr;
+}
+
+std::shared_ptr<PlayerInterruptListener> PlayersModel::GetPlayerIntrptListener(void)
+{
+    return playerInterruptListener;
+}
+
+int PlayersModel::GetPlayerState(void)
+{
+    int state;
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[PlayersModel] GetPlayerState");
+
+    if (playerCtr.get() == nullptr) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "playerCtr.get() is nullptr!!");
+        return ERR_RET;
+    }
+    playerCtr->GetPlayerState(state);
+    return state;
+}
+
+bool PlayersModel::HasPlayerPlayed(void)
+{
+    int state = GetPlayerState();
+    if (state == ERR_RET) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Get Player State failed!!");
+        return false;
+    }
+    if (state != PlayerStates::PLAYER_STARTED && state != PlayerStates::PLAYER_PAUSED &&
+        state != PlayerStates::PLAYER_STOPPED && state != PlayerStates::PLAYER_PLAYBACK_COMPLETE) {
+        if (!isStopAndReset) {
+            return false;
+        }
+    }
+    return true;
+}
+
+/* 蓝牙连接的音频控制,对按钮属性进行设置 */
+void PlayersModel::ConncetBtResetButton()
+{
+    int32_t connCtState = avrcp_ct_get_device_connect_state(SettingBluetoothModel::GetInstance()->GetLastConnedAddr());
+    int32_t connTgState = avrcp_tg_get_device_connect_state(SettingBluetoothModel::GetInstance()->GetLastConnedAddr());
+    if (connCtState == PROFILE_STATE_CONNECTED || connTgState == PROFILE_STATE_CONNECTED) {
+        if (PlayersView::GetInstance() == nullptr) {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "PlayersView::GetInstance() == nullptr");
+            return;
+        }
+        PlayersView::GetInstance()->PlayerHeadsetReset();
+    }
+}
+
+int PlayersModel::PlayerPlay(void)
+{
+    int state;
+    int ret;
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[PlayersModel] PlayerPlay");
+
+    state = GetPlayerState();
+    if (state == ERR_RET) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Get state of player failed!!");
+        return EXECUTE_FUNC_FAILED;
+    }
+
+    if (playerCtr.get() == nullptr) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "playerCtr.get() is nullptr!!");
+        return EXECUTE_FUNC_FAILED;
+    }
+    if (state == PlayerStates::PLAYER_PAUSED || state == PlayerStates::PLAYER_STOPPED) {           // 暂停状态则直接开始
+        if (playerInterruptListener->IsInterruptedPaused()) {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Paused by interrupt, dont resume");
+            return EXECUTE_FUNC_FAILED;
+        }
+        ret = playerCtr->Play();
+        if (ret != 0) {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Play err, ret:%d", ret);
+            return EXECUTE_FUNC_FAILED;
+        }
+        PlayersModel::GetInstance()->SetPlayButtonState(true);      // 播放控件图形同步
+        ConncetBtResetButton(); // 蓝牙连接的音频控制,对按钮属性进行设置
+        return NORMAL;
+    } else if (state == PlayerStates::PLAYER_STARTED || state == PlayerStates::PLAYER_PLAYBACK_COMPLETE) {   // 已经在播放状态则不做操作
+        return SONG_ALREADY_PLAY;
+    } else {                  // 其它情况的处理
+        ret = PlayersModel::GetInstance()->PlayerStat();
+        if (ret != 0) {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "PlayerStat err, ret:%d", ret);
+            return EXECUTE_FUNC_FAILED;
+        }
+        PlayersModel::GetInstance()->SetPlayButtonState(true);      // 播放控件图形同步
+        ConncetBtResetButton();
+        return NORMAL;
+    }
+}
+
+int PlayersModel::PlayerPause(void)
+{
+    int state;
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[PlayersModel] PlayerPause");
+
+    state = GetPlayerState();
+    if (state == ERR_RET) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Get state of player failed!!");
+        return EXECUTE_FUNC_FAILED;
+    }
+
+    if (playerCtr.get() == nullptr) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "playerCtr.get() is nullptr!!");
+        return EXECUTE_FUNC_FAILED;
+    }
+    if (state == PlayerStates::PLAYER_PAUSED) {           // 暂停状态则不操作
+        return SONG_ALREADY_PAUSE;
+    } else if (state == PlayerStates::PLAYER_STARTED || state == PlayerStates::PLAYER_PLAYBACK_COMPLETE) {
+        int ret = playerCtr->Pause();
+        if (ret != 0) {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Pause err, ret:%d!!", ret);
+            return EXECUTE_FUNC_FAILED;
+        } else {
+            PlayersModel::GetInstance()->SetPlayButtonState(false);
+            ConncetBtResetButton();
+            return NORMAL;
+        }
+    } else if (state == PlayerStates::PLAYER_STOPPED) {
+        return SONG_ALREADY_STOP;
+    }
+    return NORMAL;
+}
+
+int PlayersModel::PlayerStop(void)
+{
+    int state;
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[PlayersModel] PlayerStop");
+    state = GetPlayerState();
+    if (state == ERR_RET) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Get state of player failed!!");
+        return EXECUTE_FUNC_FAILED;
+    }
+    if (playerCtr.get() == nullptr) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "playerCtr.get() is nullptr!!");
+        return EXECUTE_FUNC_FAILED;
+    }
+    if (state == PlayerStates::PLAYER_STARTED || state == PlayerStates::PLAYER_PLAYBACK_COMPLETE) {
+        int ret = playerCtr->Stop();
+        if (ret != 0) {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Stop err, ret:%d", ret);
+            return EXECUTE_FUNC_FAILED;
+        }
+        ret = playerCtr->Reset();
+        if (ret != 0) {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Reset err, ret:%d", ret);
+            return EXECUTE_FUNC_FAILED;
+        } else {
+            isStopAndReset = true;
+            PlayersModel::GetInstance()->SetPlayButtonState(false);
+            PlayersModel::GetInstance()->SetCircleProgress(0);
+            ConncetBtResetButton();
+        }
+        AudioManager::GetInstance().DeactivateAudioInterrupt(interrupt);
+        return NORMAL;
+    } else if (state == PlayerStates::PLAYER_PAUSED) {
+        int ret = playerCtr->Reset();
+        if (ret != 0) {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Reset err, ret:%d", ret);
+            return EXECUTE_FUNC_FAILED;
+        } else {
+            PlayersModel::GetInstance()->SetPlayButtonState(false);
+            PlayersModel::GetInstance()->SetCircleProgress(0);
+            ConncetBtResetButton();
+        }
+        AudioManager::GetInstance().DeactivateAudioInterrupt(interrupt);
+        return NORMAL;
+    } else if (state == PlayerStates::PLAYER_STOPPED) {
+        return SONG_ALREADY_STOP;
+    }
+    return NORMAL;
+}
+
+int PlayersModel::PreSongOperate(void)
+{
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[PlayersModel] PreSongOperate");
+
+    PlayersModel::GetInstance()->PreviousPlayout();
+    PlayersModel::GetInstance()->SetPlayButtonState(true);
+    return NORMAL;
+}
+
+int PlayersModel::NextSongOperate(void)
+{
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[PlayersModel] NextSongOperate");
+
+    PlayersModel::GetInstance()->LoopingPlayout();
+    PlayersModel::GetInstance()->SetPlayButtonState(true);
+    return NORMAL;
+}
+
+int PlayersModel::IncreaseVolume(void)    // 不带界面增加音量
+{
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[PlayersModel] IncreaseVolume");
+
+    int curSound = AudioManager::GetInstance().GetVolume(AUDIO_STREAM_MUSIC);
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Presound is %d", curSound);
+    if (curSound > VOLUME_MAXIMUM - VOLUME_PER_CHANGE) {
+            curSound = VOLUME_MAXIMUM;
+    } else {
+        curSound += VOLUME_PER_CHANGE;
+    }
+    AudioManager::GetInstance().SetVolume(AUDIO_STREAM_MUSIC, curSound);
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Now music sound is %d", curSound);
+    return NORMAL;
+}
+
+int PlayersModel::DecreaseVolume(void)    // 不带界面减小音量
+{
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[PlayersModel] DecreaseVolume");
+
+    int curSound = AudioManager::GetInstance().GetVolume(AUDIO_STREAM_MUSIC);
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Presound is %d", curSound);
+    if (curSound < VOLUME_MINIMUM + VOLUME_PER_CHANGE) {
+            curSound = VOLUME_MINIMUM;
+    } else {
+        curSound -= VOLUME_PER_CHANGE;
+    }
+    AudioManager::GetInstance().SetVolume(AUDIO_STREAM_MUSIC, curSound);
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Now music sound is %d", curSound);
+    return NORMAL;
+}
+
+int32_t PlayersModel::GetPlayerstatus()
+{
+    int32_t playerState;
+    if (playerCtr.get() == nullptr) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "PlayersModel::GetPlayerstatus playerCtr is nullptr");
+        return EXECUTE_FUNC_FAILED;
+    }
+    playerCtr->GetPlayerState(playerState);
+
+    switch (playerState) {
+        case PLAYER_STARTED:
+            playerState = AVRCP_PLAY_STATUS_PLAYING;
+            break;
+        case PLAYER_PAUSED:
+            playerState = AVRCP_PLAY_STATUS_PAUSED;
+            break;
+        case PLAYER_STOPPED:
+            playerState = AVRCP_PLAY_STATUS_STOPPED;
+            break;
+        default:
+            playerState = AVRCP_PLAY_STATUS_STOPPED;
+            break;
+    }
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[PlayerModel::GetPlayerstatus]status = [%d]", playerState);
+    return playerState;
+}
+
+void PlayersModel::SetBTMusicPlay(avrcp_key_operation_t notification)
+{
+    int ret;
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[PlayerModel] SetBTMusicPlay");
+    if (SettingBluetoothModel::GetInstance()->GetLastConnedAddr() == nullptr) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[PlayerModel::SetBTMusicPlay] GetLastConnedAddr is nullptr");
+        return;
+    }
+    if (notification == AVRCP_KEY_PLAY) {
+        ret = a2dp_src_start_playing(SettingBluetoothModel::GetInstance()->GetLastConnedAddr());  // 设置耳机的状态为播放
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[PlayerModel::SetBTMusicPlay] A2dpSrcStartPlaying ret:%d", ret);
+        avrcp_tg_notify_playback_status_changed(PlayersModel::GetInstance()->GetPlayerstatus());
+    } else if (notification == AVRCP_KEY_PAUSE) {
+        ret = a2dp_src_suspend_playing(SettingBluetoothModel::GetInstance()->GetLastConnedAddr());
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[PlayerModel::SetBTMusicPlay] A2dpSrcSuspendPlaying ret:%d", ret); // 设置耳机的状态暂停
+        avrcp_tg_notify_playback_status_changed(PlayersModel::GetInstance()->GetPlayerstatus());
+    }
+}
+// 蓝牙连接和本地的音乐播放
+int32_t PlayersModel::ConnectBtAndLocalPlay(int32_t connCtState, int32_t connTgState, int32_t playerState)
+{
+    int ret;
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[PlayerModel] ConnectBtAndLocalPlay connCtState = %d connTgState = %d", connCtState, connTgState);
+    avrcp_key_operation_t playNotification = AVRCP_KEY_PLAY;
+    if (PlayersModel::GetInstance()->GetPlayerCtr() == nullptr) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[PlayersModel::ConnectBtAndLocalPlay] BT GetPlayerCtr is nullptr ");
+        return -1;
+    }
+    if (connCtState == HFP_SCO_STATE_CONNECTED || connTgState == HFP_SCO_STATE_CONNECTED) {
+        if (playerState == PlayerStates::PLAYER_PAUSED) {
+                if (playerInterruptListener->IsInterruptedPaused()) {
+                    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Paused by interrupt, dont resume");
+                    return -1;
+                }
+                ret = PlayersModel::GetInstance()->GetPlayerCtr()->Play(); // 暂停后的播放
+                PlayersModel::GetInstance()->SetBTMusicPlay(playNotification);
+        } else {
+                ret = PlayersModel::GetInstance()->PlayerStat(); // 蓝牙连接播放
+                if (ret != 0) {
+                    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[PlayersModel::ConnBtAndLocalPlay] BTPlayerStat err, ret:%d", ret);
+                }
+                PlayersModel::GetInstance()->SetBTMusicPlay(playNotification);
+        }
+    } else {
+        if (playerState == PlayerStates::PLAYER_PAUSED) {
+                WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "PLAYER_PAUSED play, 122.");
+                if (playerInterruptListener->IsInterruptedPaused()) {
+                    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Paused by interrupt, dont resume");
+                    return -1;
+                }
+                ret = PlayersModel::GetInstance()->GetPlayerCtr()->Play();
+        } else {
+                ret = PlayersModel::GetInstance()->PlayerStat(); // 本地播放
+                if (ret != 0) {
+                    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "PlayerStat err, ret:%d", ret);
+                }
+        }
+    }
+    return ret;
+}
+
+// 蓝牙连接和本地音乐的暂停
+int32_t PlayersModel::ConnectBtAndLocalPause(int32_t connCtState, int32_t connTgState)
+{
+    int32_t ret = 0;
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[PlayerModel] ConnectBtAndLocalPause");
+    avrcp_key_operation_t playNotification = AVRCP_KEY_PAUSE;
+    if (connCtState == HFP_SCO_STATE_CONNECTED || connTgState == HFP_SCO_STATE_CONNECTED) {
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "state == BTUNSELECTED, 105.");
+        if (PlayersModel::GetInstance()->GetPlayerCtr() == nullptr) {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[PlayersModel::ConnectBtAndLocalPause] BT GetPlayerCtr is nullptr");
+            return -1;
+        }
+        ret = PlayersModel::GetInstance()->GetPlayerCtr()->Pause(); // 蓝牙连接暂停
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BT Music Pause, ret:%d", ret);
+        PlayersModel::GetInstance()->SetBTMusicPlay(playNotification);
+    } else {
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "state == UNSELECTED, 105.");
+        ret = PlayersModel::GetInstance()->GetPlayerCtr()->Pause(); // 本地暂停
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Pause, ret:%d", ret);
+    }
+    return ret;
+}
+
+void PlayersModel::ClearActivateAudioInterrupt()
+{
+    isActivateAudioInterrupt = false;
+}
+
+void  PlayersModel::GetDuration(int64_t &duration)
+{
+    duration = duration_;
+}
+
 }
\ No newline at end of file
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/player/src/PlayersMusicItemView.cpp b/code/sdk/application/wearable/evb/nativeapp/nativeui/player/src/PlayersMusicItemView.cpp
new file mode 100644 (file)
index 0000000..8d0f742
--- /dev/null
@@ -0,0 +1,61 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: PlayersMusicItemView\r
+ * Create: 2025-03-23\r
+ */\r
+\r
+#include "UiConfig.h"\r
+#include "common/image_cache_manager.h"\r
+#include "ui_resource_date.h"\r
+#include "wearable_log.h"\r
+#include "player/PlayersMusicItemView.h"\r
+\r
+namespace OHOS {\r
+constexpr uint16_t STYLE_BORDER_WIDTH_VALUE = 4;\r
+constexpr uint16_t STYLE_BORDER_RADIUS_VALUE = 12;\r
+constexpr uint16_t LABEL_BUTTON_HEIGHT = 64;\r
+static constexpr uint32 BUTTON_STYLE_BACKGROUND_COLOR_VALUE = 0xFF333333;\r
+PlayersMusicItemView::PlayersMusicItemView()\r
+{\r
+    WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "PlayersMusicItemView");\r
+    labelButton_.SetPosition(0, 0);\r
+    labelButton_.Resize(HORIZONTAL_RESOLUTION, LABEL_BUTTON_HEIGHT);\r
+    labelButton_.SetStyleForState(STYLE_BORDER_WIDTH, STYLE_BORDER_WIDTH_VALUE, UIButton::RELEASED);\r
+    labelButton_.SetStyleForState(STYLE_BORDER_WIDTH, STYLE_BORDER_WIDTH_VALUE, UIButton::PRESSED);\r
+    labelButton_.SetStyleForState(STYLE_BORDER_WIDTH, STYLE_BORDER_WIDTH_VALUE, UIButton::INACTIVE);\r
+    labelButton_.SetStyleForState(STYLE_BORDER_OPA, 0, UIButton::RELEASED);\r
+    labelButton_.SetStyleForState(STYLE_BORDER_OPA, 0, UIButton::PRESSED);\r
+    labelButton_.SetStyleForState(STYLE_BORDER_OPA, 0, UIButton::INACTIVE);\r
+    labelButton_.SetStyleForState(STYLE_BORDER_RADIUS, STYLE_BORDER_RADIUS_VALUE, UIButton::RELEASED);\r
+    labelButton_.SetStyleForState(STYLE_BORDER_RADIUS, STYLE_BORDER_RADIUS_VALUE, UIButton::PRESSED);\r
+    labelButton_.SetStyleForState(STYLE_BORDER_RADIUS, STYLE_BORDER_RADIUS_VALUE, UIButton::INACTIVE);\r
+    labelButton_.SetStyleForState(STYLE_BACKGROUND_COLOR, BUTTON_STYLE_BACKGROUND_COLOR_VALUE, UIButton::RELEASED);\r
+    labelButton_.SetStyleForState(STYLE_BACKGROUND_COLOR, BUTTON_STYLE_BACKGROUND_COLOR_VALUE, UIButton::PRESSED);\r
+    labelButton_.SetStyleForState(STYLE_BACKGROUND_COLOR, BUTTON_STYLE_BACKGROUND_COLOR_VALUE, UIButton::INACTIVE);\r
+    labelButton_.SetFont(DEFAULT_VECTOR_FONT_FILENAME, 24); // 24: means font size\r
+    labelButton_.SetAlign(TEXT_ALIGNMENT_CENTER);\r
+    labelButton_.SetLabelPosition(24, 0); // 24: lable x-coordinate\r
+    Add(&labelButton_);\r
+}\r
+\r
+PlayersMusicItemView::~PlayersMusicItemView()\r
+{\r
+    Remove(&labelButton_);\r
+}\r
+\r
+void PlayersMusicItemView::SetItemInfo(const PlayerCaseInfo itemInfo)\r
+{\r
+    itemInfo_ = itemInfo;\r
+    std::string strSongName = itemInfo.sliceId;\r
+    std::string pureName = strSongName.substr(0, strSongName.rfind("."));\r
+    labelButton_.SetText(pureName.c_str());\r
+    labelButton_.SetViewIndex(itemInfo.index);\r
+    WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "pureName.c_str(%s)", pureName.c_str());\r
+    WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "pureName.index(%d)", itemInfo.index);\r
+}\r
+\r
+PlayerCaseInfo PlayersMusicItemView::GetItem()\r
+{\r
+    return itemInfo_;\r
+}\r
+}
\ No newline at end of file
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/player/src/PlayersMusicListGroup.cpp b/code/sdk/application/wearable/evb/nativeapp/nativeui/player/src/PlayersMusicListGroup.cpp
new file mode 100644 (file)
index 0000000..413f75a
--- /dev/null
@@ -0,0 +1,203 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: PlayersMusicListGroup\r
+ * Created: 2025-06\r
+ */\r
+\r
+#include <string>\r
+#include <sys/types.h>\r
+#include <dirent.h>\r
+#include <iostream>\r
+#include <cstdlib>\r
+#include <ctime>\r
+#include <unistd.h>\r
+#include "AppViewIDs.h"\r
+#include "NativeAbility.h"\r
+#include "main/LoadImg.h"\r
+#include "wearable_log.h"\r
+#include "UiConfig.h"\r
+#include "common/image_cache_manager.h"\r
+#include "ui_resource_image.h"\r
+#include "graphic_service.h"\r
+#include "phoneservice/PhoneService.h"\r
+#include "phonemenu/PhoneMenuView.h"\r
+#include "main/VolumeSettingView.h"\r
+#include "settings/common/SettingCommon.h"\r
+#include "player/PlayersPresenter.h"\r
+#include "player/PlayersModel.h"\r
+#include "player/PlayersMusicListGroup.h"\r
+#include "bts_avrcp_controller.h"\r
+#include "bts_avrcp_target.h"\r
+#include "player/PlayersMusicItemView.h"\r
+#include "player/PlayersMusicListGroup.h"\r
+\r
+namespace OHOS {\r
+constexpr uint16_t ITEM_HEIGHT = 64;\r
+static PlayersMusicListGroup* g_pPlayersMusicListGroup = nullptr;\r
+\r
+PlayersMusicListGroup::PlayersMusicListGroup()\r
+{\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "PlayersMusicListGroup::PlayersMusicListGroup");\r
+    g_pPlayersMusicListGroup = this;\r
+    SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);\r
+    SetDraggable(true);\r
+    SetTouchable(true);\r
+    SetOnClickListener(this);\r
+    SetOnDragListener(this);\r
+    musicList_ = new UISimpleList();\r
+    if (musicList_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "list new fail");\r
+        return;\r
+    }\r
+    musicList_->SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);\r
+    musicList_->SetDraggable(true);\r
+    musicList_->SetTouchable(true);\r
+    musicList_->SetThrowDrag(true);\r
+    musicList_->SetOnDragListener(this);\r
+    musicList_->SetOnClickListener(this);\r
+    musicList_->SetStartIndex(0);\r
+    RefreshMusicList();\r
+    musicList_->Invalidate();\r
+    Add(musicList_);\r
+}\r
+\r
+PlayersMusicListGroup* PlayersMusicListGroup::GetInstance(void)\r
+{\r
+    return g_pPlayersMusicListGroup;\r
+}\r
+\r
+static UIView* CreateViewCb(uint8_t type)\r
+{\r
+    PlayersMusicItemView* item = new PlayersMusicItemView();\r
+    if (item == nullptr) {\r
+        return nullptr;\r
+    }\r
+    item->SetPosition(0, 0);\r
+    item->Resize(HORIZONTAL_RESOLUTION, ITEM_HEIGHT);\r
+    item->SetTouchable(true);\r
+    item->SetOnClickListener(g_pPlayersMusicListGroup);\r
+    return item;\r
+}\r
+\r
+static void UpdateViewCb(UIView* view, void* data, uint8_t type)\r
+{\r
+    PlayersMusicItemView* item = dynamic_cast<PlayersMusicItemView*>(view);\r
+    if (view == nullptr || data == nullptr || item == nullptr) {\r
+        return;\r
+    }\r
+    PlayerCaseInfo* content = static_cast<PlayerCaseInfo *>(data);\r
+    item->SetItemInfo(*content);\r
+}\r
+\r
+void PlayersMusicListGroup::RefreshMusicList()\r
+{\r
+    List<PlayerCaseInfo> &playersCaseList = PlayersListGroup::GetInstance()->GetCase();\r
+    int size = playersCaseList.Size();\r
+\r
+    musicList_->ClearAll();\r
+    musicList_->ScrollTo(0);\r
+    ListNode<PlayerCaseInfo> *node = playersCaseList.Head();\r
+    while (node != playersCaseList.End()) {\r
+        Contents content;\r
+        content.createFunc = CreateViewCb;\r
+        content.updateFunc = UpdateViewCb;\r
+        content.type = 0;\r
+        PlayerCaseInfo &itemData = node->data_;\r
+        content.data = reinterpret_cast<void *>(&itemData);\r
+        WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "PlayerCaseInfo.itemData(%s)", itemData.sliceId);\r
+        musicList_->AddContent(content);\r
+        node = node->next_;\r
+    }\r
+    musicList_->RefreshList();\r
+}\r
+\r
+PlayersMusicListGroup::~PlayersMusicListGroup()\r
+{\r
+    RemoveAll();\r
+    if (musicList_ != nullptr) {\r
+        musicList_->ClearAll();\r
+        delete musicList_;\r
+        musicList_ = nullptr;\r
+    }\r
+    g_pPlayersMusicListGroup = nullptr;\r
+    ImageCacheManager::GetInstance().UnloadAllInMultiRes(PLAYER_IAMGES);\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "PlayersMusicListGroup::~PlayersMusicListGroup");\r
+}\r
+\r
+void PlayersMusicListGroup::BtnOnListData(UIView& view)\r
+{\r
+    index_ = view.GetViewIndex();\r
+    List<PlayerCaseInfo> &playersCaseList = PlayersListGroup::GetInstance()->GetCase();\r
+    ListNode<PlayerCaseInfo>* node = playersCaseList.Begin();\r
+    for (uint16_t i = 0; i < index_; i++) {\r
+        node = node->next_;\r
+    }\r
+    sliceId_ = node->data_.sliceId;\r
+    WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "pureName.index_(%d)", index_);\r
+    WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "pureName.sliceId(%s)", sliceId_);\r
+}\r
+\r
+bool PlayersMusicListGroup::OnClick(UIView &view, const ClickEvent &event)\r
+{\r
+    UNUSED(event);\r
+    int ret;\r
+    int32_t playerState;\r
+    uint8_t state = UICheckBox::UICheckBoxState::MAX_STATUS_NUM;\r
+    PlayersView *playersView = PlayersView::GetInstance();\r
+    if (playersView == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "playersView null!");\r
+        return false;\r
+    }\r
+    BtnOnListData(view);\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BtnOnClickListListener sliceId_: %s.", sliceId_);\r
+    // 标记当前播放歌曲index_\r
+    PlayersModel::GetInstance()->SetCurrentIndex(index_);\r
+    // 本地播放文件路径和状态\r
+    std::string strSrcMusic(APP_MUSIC_PATH);\r
+    std::string tempStr("/");\r
+    std::string strName = sliceId_;\r
+    PlayersModel::GetInstance()->SetPlayerUri(strSrcMusic + tempStr + strName);\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "uri: %s.", PlayersModel::GetInstance()->GetPlayerUri().c_str());\r
+    std::string strSongName = sliceId_;\r
+    std::string pureName = strSongName.substr(0, strSongName.rfind("."));\r
+    playersView->TitleSetText(pureName.c_str());\r
+    SetVisible(false);\r
+    // 刷新UI\r
+    RootView::GetInstance()->Invalidate();\r
+\r
+    state = playersView->GetPlayerButtonState();\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "state %d", state);\r
+    if (state == UICheckBox::UICheckBoxState::UNSELECTED) {\r
+        playersView->SetPlayerButtonState(UICheckBox::UICheckBoxState::SELECTED);\r
+        /* start play */\r
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "play");\r
+        PlayersModel::GetInstance()->GetPlayerCtr()->GetPlayerState(playerState);\r
+        if (playerState == PlayerStates::PLAYER_PAUSED) {\r
+            ret = PlayersModel::GetInstance()->GetPlayerCtr()->Reset();\r
+            WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Reset, ret:%d", ret);\r
+        }\r
+        PlayersModel::GetInstance()->PlayerStat(); // 播放\r
+    } else if (state == UICheckBox::UICheckBoxState::SELECTED) {\r
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "List to play");\r
+        PlayersModel::GetInstance()->GetPlayerCtr()->GetPlayerState(playerState);\r
+        if (playerState == PlayerStates::PLAYER_STARTED) {\r
+            ret = PlayersModel::GetInstance()->GetPlayerCtr()->Stop(); // 停止\r
+            WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Stop, ret:%d", ret);\r
+            ret = PlayersModel::GetInstance()->GetPlayerCtr()->Reset();\r
+            WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Reset, ret:%d", ret);\r
+        }\r
+        PlayersModel::GetInstance()->PlayerStat();\r
+    }\r
+    return true;\r
+}\r
+\r
+bool PlayersMusicListGroup::OnDrag(UIView &view, const DragEvent &event)\r
+{\r
+    UNUSED(view);\r
+    if ((event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT) && (event.GetDeltaX() > X_DRAG_OFFSET) &&\r
+        (event.GetDeltaX() > (DOUBLES * MATH_ABS(event.GetDeltaY())))) {\r
+            SetVisible(false);\r
+    }\r
+    return true;\r
+}\r
+}
\ No newline at end of file
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/player/src/PlayersOptionGroup.cpp b/code/sdk/application/wearable/evb/nativeapp/nativeui/player/src/PlayersOptionGroup.cpp
new file mode 100644 (file)
index 0000000..7df910f
--- /dev/null
@@ -0,0 +1,242 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: PlayersOptionGroup\r
+ * Created: 2025-06\r
+ */\r
+\r
+#include <string>\r
+#include <sys/types.h>\r
+#include <dirent.h>\r
+#include <iostream>\r
+#include <cstdlib>\r
+#include <ctime>\r
+#include <unistd.h>\r
+#include "AppViewIDs.h"\r
+#include "NativeAbility.h"\r
+#include "main/LoadImg.h"\r
+#include "wearable_log.h"\r
+#include "UiConfig.h"\r
+#include "common/image_cache_manager.h"\r
+#include "ui_resource_image.h"\r
+#include "graphic_service.h"\r
+#include "phoneservice/PhoneService.h"\r
+#include "phonemenu/PhoneMenuView.h"\r
+#include "main/VolumeSettingView.h"\r
+#include "settings/common/SettingCommon.h"\r
+#include "player/PlayersPresenter.h"\r
+#include "player/PlayersModel.h"\r
+#include "bts_avrcp_controller.h"\r
+#include "bts_avrcp_target.h"\r
+#include "player/PlayersOptionGroup.h"\r
+\r
+namespace OHOS {\r
+static constexpr int16_t BUTTON_X = 320;\r
+static constexpr int16_t BUTTON_X2 = 313;\r
+static constexpr int16_t WATCH_BUTTON_Y = 104;\r
+static constexpr int16_t PHONE_BUTTON_Y = 194;\r
+static constexpr int16_t BLUETOOTH_BUTTON_Y = 278;\r
+static constexpr int16_t BUTTON_SIZE = 55;\r
+static constexpr int16_t LABEL_WIDTH = 155;\r
+static constexpr int16_t LABEL_HEIGHT = 40;\r
+static constexpr int16_t LABEL_X = 155;\r
+static constexpr int16_t WATCH_LABEL_Y = 108;\r
+static constexpr int16_t PHONE_LABEL_Y = 199;\r
+static constexpr int16_t BLUETOOTH_LABEL_Y = 290;\r
+static constexpr int16_t IMAGE_X = 50;\r
+static constexpr int16_t WATCH_IMAGE_Y = 98;\r
+static constexpr int16_t PHONE_IMAGE_Y = 187;\r
+static constexpr int16_t BLUETOOTH_IMAGE_Y = 278;\r
+static constexpr int16_t IMAGE_SIZE = 75;\r
+static constexpr char* BLUETOOTH_BUTTON = "BLUETOOTH_BUTTON";\r
+static PlayersOptionGroup* g_pPlayersOptionGroup = nullptr;\r
+\r
+PlayersOptionGroup::PlayersOptionGroup()\r
+{\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "PlayersOptionGroup::PlayersOptionGroup");\r
+    g_pPlayersOptionGroup = this;\r
+    SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);\r
+    SetDraggable(true);\r
+    SetTouchable(true);\r
+    SetOnClickListener(this);\r
+    SetOnDragListener(this);\r
+    InitImage();\r
+    InitButton();\r
+    InitLabel();\r
+}\r
+\r
+PlayersOptionGroup::~PlayersOptionGroup()\r
+{\r
+    RemoveAll();\r
+    if (watchLabel_ != nullptr) {\r
+        delete watchLabel_;\r
+        watchLabel_ = nullptr;\r
+    }\r
+    if (phoneLabel_ != nullptr) {\r
+        delete phoneLabel_;\r
+        phoneLabel_ = nullptr;\r
+    }\r
+    if (bluetoothLabel_ != nullptr) {\r
+        delete bluetoothLabel_;\r
+        bluetoothLabel_ = nullptr;\r
+    }\r
+    if (watchImage_ != nullptr) {\r
+        delete watchImage_;\r
+        watchImage_ = nullptr;\r
+    }\r
+    if (phoneImage_ != nullptr) {\r
+        delete phoneImage_;\r
+        phoneImage_ = nullptr;\r
+    }\r
+    if (bluetoothImage_ != nullptr) {\r
+        delete bluetoothImage_;\r
+        bluetoothImage_ = nullptr;\r
+    }\r
+    if (watchButton_ != nullptr) {\r
+        delete watchButton_;\r
+        watchButton_ = nullptr;\r
+    }\r
+    if (phoneButton_ != nullptr) {\r
+        delete phoneButton_;\r
+        phoneButton_ = nullptr;\r
+    }\r
+    if (bluetoothButton_ != nullptr) {\r
+        delete bluetoothButton_;\r
+        bluetoothButton_ = nullptr;\r
+    }\r
+    if (deleteButton != nullptr) {\r
+        delete deleteButton;\r
+        deleteButton = nullptr;\r
+    }\r
+    g_pPlayersOptionGroup = nullptr;\r
+    ImageCacheManager::GetInstance().UnloadAllInMultiRes(PLAYER_IAMGES);\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "PlayersOptionGroup::~PlayersOptionGroup");\r
+}\r
+\r
+void PlayersOptionGroup::InitButton()\r
+{\r
+    if (watchButton_ == nullptr) {\r
+        watchButton_ = new UIRadioButton("MusicCategory");\r
+        if (watchButton_ == nullptr) {\r
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "watchButton UIRadio new fail");\r
+            return;\r
+        }\r
+    }\r
+\r
+    watchButton_->SetPosition(BUTTON_X, WATCH_BUTTON_Y, BUTTON_SIZE, BUTTON_SIZE);\r
+    watchButton_->SetOnClickListener(this);\r
+    watchButton_->SetTouchable(false);\r
+\r
+    if (phoneButton_ == nullptr) {\r
+        phoneButton_ = new UIRadioButton("MusicCategory");\r
+        if (phoneButton_ == nullptr) {\r
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "phoneButton UIRadio new fail");\r
+            return;\r
+        }\r
+    }\r
+    phoneButton_->SetPosition(BUTTON_X, PHONE_BUTTON_Y, BUTTON_SIZE, BUTTON_SIZE);\r
+    phoneButton_->SetOnClickListener(this);\r
+    phoneButton_->SetTouchable(false);\r
+\r
+    if (bluetoothButton_ == nullptr) {\r
+        bluetoothButton_ = new UIButton();\r
+        if (bluetoothButton_ == nullptr) {\r
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "settingButton UIButton new fail");\r
+            return;\r
+        }\r
+    }\r
+    bluetoothButton_->SetPosition(BUTTON_X2, BLUETOOTH_BUTTON_Y, BUTTON_SIZE, BUTTON_SIZE);\r
+    bluetoothButton_->SetOnClickListener(this);\r
+    bluetoothButton_->SetImageSrc(PNG_SETTTING_BUTTON_IMAGE, PNG_SETTTING_BUTTON_IMAGE);\r
+    bluetoothButton_->SetViewId(BLUETOOTH_BUTTON);\r
+    Add(watchButton_);\r
+    Add(phoneButton_);\r
+    Add(bluetoothButton_);\r
+}\r
+\r
+void PlayersOptionGroup::InitLabel()\r
+{\r
+    if (watchLabel_ == nullptr) {\r
+        watchLabel_ = new UILabel();\r
+        if (watchLabel_ == nullptr) {\r
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "watchLabel new fail");\r
+            return ;\r
+        }\r
+    }\r
+\r
+    watchLabel_->SetPosition(LABEL_X, WATCH_LABEL_Y, LABEL_WIDTH, LABEL_HEIGHT);\r
+    watchLabel_->SetText("手表音乐");\r
+    watchLabel_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, FONT_THIRTY_SIZE);\r
+    if (phoneLabel_ == nullptr) {\r
+        phoneLabel_ = new UILabel();\r
+        if (phoneLabel_ == nullptr) {\r
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "phoneLabel new fail");\r
+            return ;\r
+        }\r
+    }\r
+    phoneLabel_->SetPosition(LABEL_X, PHONE_LABEL_Y, LABEL_WIDTH, LABEL_HEIGHT);\r
+    phoneLabel_->SetText("手机音乐");\r
+    phoneLabel_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, FONT_THIRTY_SIZE);\r
+    if (bluetoothLabel_ == nullptr) {\r
+        bluetoothLabel_ = new UILabel();\r
+        if (bluetoothLabel_ == nullptr) {\r
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "bluetoothLabel new fail");\r
+            return ;\r
+        }\r
+    }\r
+    bluetoothLabel_->SetPosition(LABEL_X, BLUETOOTH_LABEL_Y, LABEL_WIDTH, LABEL_HEIGHT);\r
+    bluetoothLabel_->SetText("蓝牙音乐");\r
+    bluetoothLabel_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, FONT_THIRTY_SIZE);\r
+    Add(watchLabel_);\r
+    Add(phoneLabel_);\r
+    Add(bluetoothLabel_);\r
+}\r
+\r
+void PlayersOptionGroup::InitImage()\r
+{\r
+    watchImage_ = new UIImageView();\r
+    if (watchImage_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "watchImage new fail");\r
+        return ;\r
+    }\r
+    watchImage_->SetPosition(IMAGE_X, WATCH_IMAGE_Y, IMAGE_SIZE, IMAGE_SIZE);\r
+    watchImage_->SetSrc(PNG_WATCH_IMAGE);\r
+\r
+    phoneImage_ = new UIImageView();\r
+    if (phoneImage_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "phoneImage new fail");\r
+        return ;\r
+    }\r
+    phoneImage_->SetPosition(IMAGE_X, PHONE_IMAGE_Y, IMAGE_SIZE, IMAGE_SIZE);\r
+    phoneImage_->SetSrc(PNG_PHONE_IMAGE);\r
+\r
+    bluetoothImage_ = new UIImageView();\r
+    if (bluetoothImage_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "bluetoothImage new fail");\r
+        return ;\r
+    }\r
+    bluetoothImage_->SetPosition(IMAGE_X, BLUETOOTH_IMAGE_Y, IMAGE_SIZE, IMAGE_SIZE);\r
+    bluetoothImage_->SetSrc(PNG_BLUETOOTH_IMAGE);\r
+    Add(watchImage_);\r
+    Add(phoneImage_);\r
+    Add(bluetoothImage_);\r
+}\r
+\r
+bool PlayersOptionGroup::OnClick(UIView &view, const ClickEvent &event)\r
+{\r
+    UNUSED(event);\r
+    if (strcmp(view.GetViewId(), BLUETOOTH_BUTTON) == 0) {\r
+        NativeAbility::GetInstance().SwitchSlice(VIEW_SETTING, SettingPageId::BLUETOOTH_PAGE);\r
+    }\r
+    return true;\r
+}\r
+\r
+bool PlayersOptionGroup::OnDrag(UIView &view, const DragEvent &event)\r
+{\r
+    UNUSED(view);\r
+    if ((event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT) && (event.GetDeltaX() > X_DRAG_OFFSET) &&\r
+        (event.GetDeltaX() > (DOUBLES * MATH_ABS(event.GetDeltaY())))) {\r
+            SetVisible(false);\r
+    }\r
+    return true;\r
+}\r
+}
\ No newline at end of file
index 8571cc9..65ca982 100644 (file)
@@ -1,32 +1,27 @@
 /*
- * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved.
- * Description: Player view
- * Author:
- * Create: 2021-07-26
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.
+ * Description: PlayersPresenter
+ * Created: 2025-06-05
  */
 #include <sys/types.h>
 #include <dirent.h>
 #include <iostream>
 #include <cstdlib>
 #include <ctime>
-#include "player/PlayersPresenter.h"
 #include "wearable_log.h"
 #include "common/image_cache_manager.h"
 #include "UiConfig.h"
 #include "ui_resource_image.h"
-#include "player/PlayersView.h"
 #include "player/PlayersModel.h"
-#include "bluetooth/BluetoothPresenter.h"
 #include "graphic_service.h"
 #include "phoneservice/PhoneService.h"
 #include "main/MainViewSample.h"
-
+#include "phonemenu/PhoneMenuView.h"
 #include "bts_avrcp_controller.h"
 #include "bts_avrcp_target.h"
+#include "player/PlayersPresenter.h"
 
 namespace OHOS {
-static PlayerOnDragListener *g_pPlayerOnDragListener = nullptr;
-static JumpView *g_pJumpView = nullptr;
 static PlayersPresenter *g_pPlayersPresenter = nullptr;
 
 PlayersPresenter *PlayersPresenter::GetInstance(void)
@@ -42,351 +37,8 @@ PlayersPresenter::PlayersPresenter()
 
 PlayersPresenter::~PlayersPresenter()
 {
-    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "~PlayersPresenter");
     g_pPlayersPresenter = nullptr;
-}
-
-JumpView *JumpView::GetInstance(void)
-{
-    return g_pJumpView;
-}
-
-JumpView::JumpView()
-{
-    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "JumpView::JumpView");
-    g_pJumpView = this;
-    preProcessView[BLUETOOTHEARPHONEVIEW] = &JumpView::ChangeBluetoothEarPhoneView;
-    preProcessView[BLUETOOTHEARLISTVIEW] = &JumpView::ChangeBluetoothEarListView;
-    preProcessView[BLUETOOTHDEVICELISTVIEW] = &JumpView::ChangeBluetoothDeviceListView;
-    preProcessView[BLUETOOTHEOPTIONSVIEW] = &JumpView::ChangeBluetoothOptionsView;
-    preProcessView[BLUETOOTHRECONNECTVIEW] = &JumpView::ChangeBluetoothReconnectView;
-    preProcessView[TIPSSUCCMESSAGEVIEW] = &JumpView::ChangeTipsSuccMessageView;
-    preProcessView[TIPSCONNFAILMESSAGEVIEW] = &JumpView::ChangeTipsConnFailMessageView;
-    preProcessView[TIPSFAILMESSAGEVIEW] = &JumpView::ChangeTipsFailMessageView;
-    preProcessView[BLUETOOTHEVIEW] = &JumpView::ChangeBluetoothView;
-}
-
-JumpView::~JumpView()
-{
-    delete bluetoothEarPhoneView;
-    bluetoothEarPhoneView = nullptr;
-    delete bluetoothOptionsView;
-    bluetoothOptionsView = nullptr;
-    delete bluetoothEarListView;
-    bluetoothEarListView = nullptr;
-    delete bluetoothReconnectView;
-    bluetoothReconnectView = nullptr;
-    delete bluetoothDeviceListView;
-    bluetoothDeviceListView = nullptr;
-    delete tipsSuccMessageView;
-    tipsSuccMessageView = nullptr;
-    delete tipsConnFailMessageView;
-    tipsConnFailMessageView = nullptr;
-    delete tipsFailMessageView;
-    tipsFailMessageView = nullptr;
-    delete bluetoothView;
-    bluetoothView = nullptr;
-    int i;
-    for (i = BLUETOOTHEARPHONEVIEW; i <= BLUETOOTHEJUMP_MAX; i++) {
-        container[i] = nullptr;
-    }
-    g_pJumpView = nullptr;
-}
-
-bool JumpView::ChangeBluetoothEarPhoneView(int16_t hideView, int16_t thisView)
-{
-    UNUSED(hideView);
-    if (container[thisView] == nullptr) {
-        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ChangeBluetoothEarPhoneView");
-        bluetoothEarPhoneView = new BluetoothEarPhoneView();
-        if (bluetoothEarPhoneView == nullptr) {
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "bluetoothEarPhoneView new fail");
-            return false;
-        }
-        UIViewGroup *group = bluetoothEarPhoneView->InitShowUpView(); // init view
-        if (group == nullptr) {
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "group nullptr fail");
-            return false;
-        }
-        container[thisView] = group;
-        MainViewSample::GetInstance()->GetRootContainer()->Add(container[thisView]);
-    }
-    // 动画开始
-    bluetoothEarPhoneView->BtAnimatorStart();
-    // 蓝牙扫描&清空列表
-    bluetoothEarPhoneView->BtEnable();
-    return true;
-}
-
-bool JumpView::ChangeBluetoothEarListView(int16_t hideView, int16_t thisView)
-{
-    if (container[thisView] == nullptr) {
-        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ChangeBluetoothEarListView");
-        bluetoothEarListView = new BluetoothEarListView();
-        if (bluetoothEarListView == nullptr) {
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "bluetoothEarListView new fail");
-            return false;
-        }
-        UIViewGroup *group = bluetoothEarListView->InitShowUpView(); // init view
-        if (group == nullptr) {
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "group nullptr fail");
-            return false;
-        }
-        container[thisView] = group;
-        MainViewSample::GetInstance()->GetRootContainer()->Add(container[thisView]);
-    } else {
-        // 刷新列表
-        UIList *scanList = bluetoothEarListView->GetScanUIList();
-        if (scanList == nullptr) {
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "OnClick scanList nullptr");
-            return false;
-        }
-        scanList->RefreshList();
-    }
-    ResetEarListView(hideView);
-    return true;
-}
-
-bool JumpView::ChangeBluetoothView(int16_t hideView, int16_t thisView)
-{
-    UNUSED(hideView);
-    if (container[thisView] == nullptr) {
-        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ChangeBluetoothView");
-        bluetoothView = new BluetoothView();
-        if (bluetoothView == nullptr) {
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "bluetoothView new fail");
-            return false;
-        }
-        // init view
-        UIViewGroup *group = bluetoothView->LoadBluetoothView();
-        if (group == nullptr) {
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "group nullptr fail");
-            return false;
-        }
-        container[thisView] = group;
-        MainViewSample::GetInstance()->GetRootContainer()->Add(container[thisView]);
-    }
-    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "JumpView::ChangeBluetoothView");
-    BluetoothModel::GetInstance()->SetTagConnectView(false);
-    return true;
-}
-
-bool JumpView::ChangeBluetoothOptionsView(int16_t hideView, int16_t thisView)
-{
-    UNUSED(hideView);
-    if (container[thisView] == nullptr) {
-        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ChangeBluetoothOptionsView");
-        bluetoothOptionsView = new BluetoothOptionsView();
-        if (bluetoothOptionsView == nullptr) {
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "bluetoothOptionsView new fail");
-            return false;
-        }
-        // init view
-        UIViewGroup *group = bluetoothOptionsView->InitShowUpView();
-        if (group == nullptr) {
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "group nullptr fail");
-            return false;
-        }
-        container[thisView] = group;
-        MainViewSample::GetInstance()->GetRootContainer()->Add(container[thisView]);
-    }
-    return true;
-}
-
-bool JumpView::ChangeBluetoothDeviceListView(int16_t hideView, int16_t thisView)
-{
-    UNUSED(hideView);
-    if (container[thisView] == nullptr) {
-        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ChangeBluetoothDeviceListView");
-        bluetoothDeviceListView = new BluetoothDeviceListView();
-        if (bluetoothDeviceListView == nullptr) {
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "bluetoothDeviceListView new fail");
-            return false;
-        }
-        // init view
-        UIViewGroup *group = bluetoothDeviceListView->InitShowUpView();
-        if (group == nullptr) {
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Device group nullptr fail");
-            return false;
-        }
-        container[thisView] = group;
-        MainViewSample::GetInstance()->GetRootContainer()->Add(container[thisView]);
-    } else {
-        // 刷新列表
-        UIList *deviceList = bluetoothDeviceListView->GetDeviceUIList();
-        if (deviceList == nullptr) {
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "OnClick deviceList nullptr");
-            return false;
-        }
-        deviceList->RefreshList();
-    }
-    if (bluetoothDeviceListView == nullptr) {
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "OnClick bluetoothDeviceListView new fail");
-        return false;
-    }
-    bluetoothDeviceListView->RefreshText();
-
-    return true;
-}
-
-bool JumpView::ChangeBluetoothReconnectView(int16_t hideView, int16_t thisView)
-{
-    UNUSED(hideView);
-    if (container[thisView] == nullptr) {
-        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ChangeBluetoothReconnectView");
-        bluetoothReconnectView = new BluetoothReconnectView();
-        if (bluetoothReconnectView == nullptr) {
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "bluetoothReconnectView new fail");
-            return false;
-        }
-        // init view
-        UIViewGroup *group = bluetoothReconnectView->InitShowUpView();
-        if (group == nullptr) {
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "group nullptr fail");
-            return false;
-        }
-        container[thisView] = group;
-        MainViewSample::GetInstance()->GetRootContainer()->Add(container[thisView]);
-    }
-    BluetoothModel::GetInstance()->SetTagDisconnectView(true);
-    bluetoothReconnectView->RefreshBluetoothNameLabel();
-    bluetoothReconnectView->BtReconnectStart();
-    return true;
-}
-
-void JumpView::ResetEarListView(int16_t hideView)
-{
-    if (bluetoothEarListView == nullptr) {
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "MainBluetoothView::ResetEarListView bluetoothEarListView == nullptr");
-        return;
-    }
-    bluetoothEarListView->SetCancelConnedRequestButtonRemove();
-    if (hideView == BLUETOOTHEARPHONEVIEW) {
-        bluetoothEarListView->SetTitleLabel("正在扫描");
-        bluetoothEarListView->SetNewEquipmentButtonRemove();
-    } else if (hideView == TIPSCONNFAILMESSAGEVIEW) {
-        bluetoothEarListView->SetTitleLabel("扫描完成");
-        bluetoothEarListView->SetNewEquipmentButtonAdd();
-        RootView::GetInstance()->Invalidate();
-    }
-}
-
-bool JumpView::ChangeTipsSuccMessageView(int16_t hideView, int16_t thisView)
-{
-    UNUSED(hideView);
-    if (container[thisView] == nullptr) {
-        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ChangeTipsSuccMessageView");
-        tipsSuccMessageView = new TipsSuccMessageView();
-        if (tipsSuccMessageView == nullptr) {
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "tipsSuccMessageView new fail");
-            return false;
-        }
-        // init view
-        UIViewGroup *group = tipsSuccMessageView->ShowUpViewInit();
-        if (group == nullptr) {
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "group nullptr fail");
-            return false;
-        }
-        container[thisView] = group;
-        MainViewSample::GetInstance()->GetRootContainer()->Add(container[thisView]);
-    }
-    return true;
-}
-
-bool JumpView::ChangeTipsConnFailMessageView(int16_t hideView, int16_t thisView)
-{
-    UNUSED(hideView);
-    if (container[thisView] == nullptr) {
-        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ChangeTipsConnFailMessageView");
-        tipsConnFailMessageView = new TipsConnFailMessageView();
-        if (tipsConnFailMessageView == nullptr) {
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "tipsConnFailMessageView new fail");
-            return false;
-        }
-        // init view
-        UIViewGroup *group = tipsConnFailMessageView->ShowUpViewInit();
-        if (group == nullptr) {
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "group nullptr fail");
-            return false;
-        }
-        container[thisView] = group;
-        MainViewSample::GetInstance()->GetRootContainer()->Add(container[thisView]);
-    }
-    if (bluetoothReconnectView == nullptr) {
-        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "GapAclStateChangedCallback bluetoothReconnectView == nullptr");
-    } else {
-            container[BLUETOOTHRECONNECTVIEW]->SetVisible(false);
-            WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ChangeTipsConnFailMessageView SetVisible(false)");
-    }
-    return true;
-}
-
-bool JumpView::ChangeTipsFailMessageView(int16_t hideView, int16_t thisView)
-{
-    UNUSED(hideView);
-    if (container[thisView] == nullptr) {
-        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ChangeTipsFailMessageView");
-        tipsFailMessageView = new TipsFailMessageView();
-        if (tipsFailMessageView == nullptr) {
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "tipsFailMessageView new fail");
-            return false;
-        }
-        // init view
-        UIViewGroup *group = tipsFailMessageView->ShowUpViewInit();
-        if (group == nullptr) {
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "group nullptr fail");
-            return false;
-        }
-        container[thisView] = group;
-        MainViewSample::GetInstance()->GetRootContainer()->Add(container[thisView]);
-    }
-    return true;
-}
-
-bool JumpView::CheckViewParam(int16_t hideView, int16_t showView)
-{
-    if (showView < 0 || showView >= BLUETOOTHEJUMP_MAX) {
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "JumpView::CheckViewParam showView err.");
-        return false;
-    }
-
-    if (hideView < 0 || hideView > BLUETOOTHEJUMP_MAX) {
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "JumpView::CheckViewParam showView err.");
-        return false;
-    }
-
-    if (hideView != BLUETOOTHEJUMP_MAX) {
-        if (container[hideView] == nullptr) {
-            return false;
-        }
-        container[hideView]->SetVisible(false);
-    }
-
-    if (hideView == BLUETOOTHEARLISTVIEW || showView == BLUETOOTHEARLISTVIEW) {
-        BluetoothModel::GetInstance()->SetTagScanDeviceClicked(false);
-    }
-
-    return true;
-}
-
-void JumpView::ChangeView(int16_t hideView, int16_t showView)
-{
-    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "JumpView:: ChangeView %d", hideView);
-    if (!CheckViewParam(hideView, showView)) {
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "JumpView::ChangeView check param err %d %d.", hideView, showView);
-        return;
-    }
-
-    PreprosssChangeView tmpPreProcessView = preProcessView[showView];
-
-    if (!(this->*tmpPreProcessView)(hideView, showView)) {
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "JumpView::ChangeView %d %d failed", showView, hideView);
-        return;
-    }
-    container[showView]->SetVisible(true);
-    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "JumpView:: ChangeView end!!!%d", showView);
-    RootView::GetInstance()->Invalidate();
-    BluetoothModel::GetInstance()->SetCurView(showView);
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "~PlayersPresenter");
 }
 
 PlayersListGroup::~PlayersListGroup()
@@ -425,6 +77,7 @@ void PlayersListGroup::SetUpListCase()
 
 List<PlayerCaseInfo>& PlayersListGroup::GetCase()
 {
+    WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "playersCaseList_.Size(%d)", playersCaseList_->Size());
     return *playersCaseList_;
 }
 
@@ -477,174 +130,6 @@ int PlayersListGroup::GetAllFiles(List<PlayerCaseInfo> *playersCaseList)
     return OHOS_SUCCESS;
 }
 
-ButtonOnClickListener::~ButtonOnClickListener()
-{
-    delete volumeSettingView;
-    volumeSettingView = nullptr;
-}
-
-// Button OnClick
-void ButtonOnClickListener::PlayerButtonOnClick()
-{
-    PlayersView *playersView = PlayersView::GetInstance();
-    if (playersView == nullptr) {
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "playersView GetInstance fail");
-        return;
-    }
-
-    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "playerButton OnClick");
-    uint8_t state = UICheckBox::UICheckBoxState::MAX_STATUS_NUM;
-    int32_t playerState;
-    int32_t connCtState = avrcp_ct_get_device_connect_state(BluetoothModel::GetInstance()->GetLastConnedAddr());
-    int32_t connTgState = avrcp_tg_get_device_connect_state(BluetoothModel::GetInstance()->GetLastConnedAddr());
-
-    state = playersView->GetPlayerButtonState();
-    if (PlayersModel::GetInstance()->GetPlayerCtr() == nullptr) {
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "PlayersModel::GetInstance()->GetPlayerCtr() nullptr");
-        return;
-    }
-    PlayersModel::GetInstance()->GetPlayerCtr()->GetPlayerState(playerState);
-    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "buttonState = %d playerState = %d", state, playerState);
-    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "connCtState = %d connTgState = %d", connCtState, connTgState);
-
-    if (GetCurrCallNum() != 0 && GetScoConnectState() == HFP_SCO_STATE_CONNECTED) {
-        if (state == UICheckBox::UICheckBoxState::SELECTED) {
-            playersView->SetPlayerButtonState(UICheckBox::UICheckBoxState::UNSELECTED);
-        } else {
-            playersView->SetPlayerButtonState(UICheckBox::UICheckBoxState::SELECTED);
-        }
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[PlayerButtonOnClick] calling phone");
-        return;
-    }
-    if (state == UICheckBox::UICheckBoxState::SELECTED) {
-        /* start play */
-        PlayersModel::GetInstance()->ConnectBtAndLocalPlay(connCtState, connTgState, playerState);
-    } else if (state == UICheckBox::UICheckBoxState::UNSELECTED) {
-        PlayersModel::GetInstance()->ConnectBtAndLocalPause(connCtState, connTgState);
-    }
-}
-
-void ButtonOnClickListener::SoundButtonOnClick()
-{
-    PlayersView *playersView = PlayersView::GetInstance();
-    if (playersView == nullptr) {
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SoundButtonOnClick playersView nullptr err");
-        return;
-    }
-    if (volumeSettingView == nullptr) {
-        volumeSettingView = new VolumeSettingView();
-        if (volumeSettingView == nullptr) {
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "volumeSetting nullptr err");
-            return;
-        }
-        if (!volumeSettingView->SetUpVolume()) {
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "volumeSetting SetUpVolume fail");
-            return;
-        }
-        MainViewSample::GetInstance()->GetRootContainer()->Add(volumeSettingView);
-    }
-    int32_t volume = AudioManager::GetInstance().GetVolume(AUDIO_STREAM_MUSIC);
-    WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "current volume = %d", volume);
-    volumeSettingView->GetProgress()->SetValue(volume);
-    if (volume == 0) {
-        ImageInfo *image = ImageCacheManager::GetInstance().LoadOneInMultiRes(PLAYER_MUTE_BUTTON, PLAYER_IAMGES);
-        volumeSettingView->GetDecreaseButton()->SetImageSrc(image, image);
-    }
-    VolumeSliderEventListener *volumeSliderEventListener = volumeSettingView->GetVolumeEventListener();
-    if (volumeSliderEventListener == nullptr) {
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SoundButtonOnClick volumeSliderEventListener nullptr err");
-        return;
-    }
-    volumeSliderEventListener->SetPlayerCoefficients(VOLUMEPLAYERS); // 进度条系数
-    playersView->SetVisible(false);
-    volumeSettingView->SetVisible(true);
-    // 刷新UI
-    RootView::GetInstance()->Invalidate();
-}
-
-void ButtonOnClickListener::OptionsButtonOnClick()
-{
-    PlayersView *playersView = PlayersView::GetInstance();
-    if (playersView == nullptr) {
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "OptionsButtonOnClick playersView nullptr err");
-        return;
-    }
-    JumpView *jumpView = JumpView::GetInstance();
-    if (jumpView == nullptr) {
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "jumpView GetInstance fail");
-        return;
-    }
-    playersView->SetVisible(false);
-    jumpView->ChangeView(JumpView::BluetoothJumpViewNum::BLUETOOTHEJUMP_MAX,
-                         JumpView::BluetoothJumpViewNum::BLUETOOTHEVIEW);
-}
-
-void ButtonOnClickListener::PlayerModelButtonOnClick()
-{
-    PlayersView *playersView = PlayersView::GetInstance();
-    if (playersView == nullptr) {
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "PlayerModelButtonOnClick playersView nullptr err");
-        return;
-    }
-    switch (PlayersModel::GetInstance()->GetPlayerModel()) {
-        case LOOP:
-            playersView->PlayerModelButtonSetSrc(PLAYER_PLAYERSMODEL_LOOP); // 循环
-            break;
-        case SEQUENCE:
-            playersView->PlayerModelButtonSetSrc(PLAYER_PLAYERSMODEL_SEQUENCE); // 顺序
-            break;
-        case REPEATS:
-            playersView->PlayerModelButtonSetSrc(PLAYER_PLAYERSMODEL_REPEATS); // 重复
-            break;
-        case RANDOM:
-            playersView->PlayerModelButtonSetSrc(PLAYER_PLAYERSMODEL_RANDOM); // 随机
-            break;
-        default:
-            break;
-    }
-    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "playerModel %d", PlayersModel::GetInstance()->GetPlayerModel());
-}
-
-bool ButtonOnClickListener::OnClick(UIView& view, const ClickEvent& event)
-{
-    UNUSED(view);
-    UNUSED(event);
-    PlayersView *playersView = PlayersView::GetInstance();
-    if (playersView == nullptr) {
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "PlayersView::GetInstance");
-        return false;
-    }
-    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ButtonOnClickListener OnClick");
-    if (view_ == (UIView *)playersView->GetPlayerButton()) {
-        PlayerButtonOnClick();
-    } else if (view_ == (UIView *)playersView->GetNextButton()) {
-        if (playersView->GetPlaybackProgress() != nullptr) {
-            playersView->GetPlaybackProgress()->SetValue(0); // 0:进度0%
-            playersView->GetPlaybackProgress()->Invalidate();
-        }
-        PlayersModel::GetInstance()->LoopingPlayout();
-    } else if (view_ == (UIView *)playersView->GetPreButton()) {
-        if (playersView->GetPlaybackProgress() != nullptr) {
-            playersView->GetPlaybackProgress()->SetValue(0); // 0:进度0%
-            playersView->GetPlaybackProgress()->Invalidate();
-        }
-        PlayersModel::GetInstance()->PreviousPlayout();
-    } else if (view_ == (UIView *)playersView->GetPlayerModelButton()) {
-        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "playerModelButton OnClick");
-        PlayersModel::GetInstance()->SetPlayerModelAddOne();
-        if (PlayersModel::GetInstance()->GetPlayerModel() > RANDOM) {
-            PlayersModel::GetInstance()->SetPlayerModel(LOOP);
-        }
-        PlayerModelButtonOnClick();
-    } else if (view_ == (UIView *)playersView->GetSoundButton()) {
-        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "soundButton OnClick");
-        SoundButtonOnClick();
-    } else if (view_ == (UIView *)playersView->GetOptionsButton()) {
-        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "optionsButton OnClick");
-        OptionsButtonOnClick();
-    }
-    return true;
-}
 
 // 播放器回调
 PlayerCallbackImpl::PlayerCallbackImpl()
@@ -662,13 +147,11 @@ void PlayerCallbackImpl::OnPlaybackComplete()
     GraphicService::GetInstance()->PostGraphicEvent([] {
         PlayersView *playersView = PlayersView::GetInstance();
         if (playersView != nullptr) {
-            if (playersView->GetPlaybackProgress() != nullptr) {
-                playersView->GetPlaybackProgress()->SetValue(100); // 100:进度100%
-                playersView->GetPlaybackProgress()->Invalidate();
-            }
+            playersView->SetPlaybackProgress(100); // 100:进度100%
         }
     });
-    usleep(20000);
+    int sleepTime = 20000;
+    usleep(sleepTime);
     GraphicService::GetInstance()->PostGraphicEvent(std::bind(&PlayersModel::PlaySwitching, PlayersModel::GetInstance()));
 }
 
@@ -781,17 +264,10 @@ static void Pause(void)
         return;
     }
 
-    PlayersView *playersView = PlayersView::GetInstance();
-
     player->GetPlayerState(state);
     if (state == PLAYER_STARTED) {
         ret = player->Pause();
         if (ret == 0) {
-            if (playersView == nullptr) {
-                PlayersModel::GetInstance()->SetPlayButtonState(false);
-            } else {
-                playersView->SetPlayerButtonState(UICheckBox::UICheckBoxState::UNSELECTED);
-            }
             PlayerIntrptListener->RestFlag();
             PlayerIntrptListener->SetPaused(true);
             WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[PlayerInterruptListener::PausePlayer]");
@@ -822,17 +298,10 @@ static void Resume(void)
         return;
     }
 
-    PlayersView *playersView = PlayersView::GetInstance();
-
     player->GetPlayerState(state);
     if (state == PLAYER_PAUSED && PlayerIntrptListener->IsPaused()) {
         ret = player->Play();
         if (ret == 0) {
-            if (playersView == nullptr) {
-                PlayersModel::GetInstance()->SetPlayButtonState(true);
-            } else {
-                playersView->SetPlayerButtonState(UICheckBox::UICheckBoxState::SELECTED);
-            }
             PlayerIntrptListener->RestFlag();
             PlayerIntrptListener->SetResumed(true);
             WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[PlayerInterruptListener::ResumePlayer]");
@@ -843,8 +312,10 @@ static void Resume(void)
 void PlayerInterruptListener::ResumePlayer(void)
 {
     WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[PlayerInterruptListener::ResumePlayer] start");
-    usleep(500000); // 确保界面切换完成
-    if (NativeAbility::GetInstance().GetCurSliceId() == VIEW_MAEKPHONE_SAMPLE ||
+    int sleepTime = 500000;
+    usleep(sleepTime); // 确保界面切换完成
+    if (NativeAbility::GetInstance().GetCurTargetId() ==
+        (VIEW_PHONE_MENU | static_cast<uint32_t>(PhoneMenuPages::PHONE_MENU_CALLING_PAGE) << PAGE_OFFSET) ||
         (GetCurrCallState() != HFP_HF_CALL_STATE_FINISHED && GetScoConnectState() == HFP_SCO_STATE_CONNECTED)) {
         WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[PlayerInterruptListener::ResumePlayer] this is in calling");
         return; // 通话界面,禁止音乐恢复播放
@@ -888,512 +359,4 @@ void PlayerInterruptListener::OnInterrupt(int32_t type, int32_t hint)
         }
     }
 }
-
-PlayerOnDragListener::PlayerOnDragListener()
-{
-    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "PlayerOnDragListener");
-    g_pPlayerOnDragListener = this;
-}
-
-PlayerOnDragListener::~PlayerOnDragListener()
-{
-    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "~PlayerOnDragListener");
-    g_pPlayerOnDragListener = nullptr;
-}
-
-PlayerOnDragListener *PlayerOnDragListener::GetInstance(void)
-{
-    return g_pPlayerOnDragListener;
-}
-
-void PlayerOnDragListener::OnDragChangView(const DragEvent& event, int16_t hideView, int16_t showView, bool isStopScan)
-{
-    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "OnDragChangeView=%d showView=%d", hideView, showView);
-    if (event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT) {
-        if (isStopScan) {
-            BluetoothEarPhoneView *bluetoothEarPhoneView = BluetoothEarPhoneView::GetInstance();
-            if (bluetoothEarPhoneView == nullptr) {
-                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "bluetoothEarPhoneView GetInstance fail");
-                return;
-            }
-            bluetoothEarPhoneView->BtAnimatorStop();
-            bluetoothEarPhoneView->StopBtDiscovery();
-        }
-        // 跳转设置页面
-        JumpView *jumpView = JumpView::GetInstance();
-        if (jumpView == nullptr) {
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "jumpView GetInstance fail");
-            return;
-        }
-        jumpView->ChangeView(hideView, showView);
-    }
-}
-
-void PlayerOnDragListener::OnDragChangBluetoothView(const DragEvent& event)
-{
-    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "OnDragChangBluetoothView");
-    if (event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT) {
-        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "DIRECTION_LEFT_TO_RIGHT");
-        PlayersView *playersView = PlayersView::GetInstance();
-        if (playersView == nullptr) {
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "playersView GetInstance fail");
-            return;
-        }
-        BluetoothView *bluetoothView = BluetoothView::GetInstance();
-        if (bluetoothView == nullptr) {
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "bluetoothView GetInstance fail");
-            return;
-        }
-        bluetoothView->group->SetVisible(false);
-        playersView->SetVisible(true);
-        // 刷新UI
-        RootView::GetInstance()->Invalidate();
-    }
-}
-
-void PlayerOnDragListener::DropEarPhoneView(const DragEvent& event)
-{
-    bool ret = BluetoothModel::GetInstance()->IsTagReturnToDeviceListView();
-    if (ret) {
-        OnDragChangView(event, JumpView::BluetoothJumpViewNum::BLUETOOTHEARPHONEVIEW,
-                        JumpView::BluetoothJumpViewNum::BLUETOOTHDEVICELISTVIEW, true);
-    } else {
-        OnDragChangView(event, JumpView::BluetoothJumpViewNum::BLUETOOTHEARPHONEVIEW,
-                        JumpView::BluetoothJumpViewNum::BLUETOOTHEVIEW, true);
-    }
-}
-
-void PlayerOnDragListener::DropEarListView(const DragEvent& event)
-{
-    bool ret = BluetoothModel::GetInstance()->IsTagScanDeviceClicked();
-    if (ret) {
-        BluetoothCaseInfo *caseInfo = BluetoothModel::GetInstance()->GetTempMacValue();
-        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "PlayerOnDragListener::DropEarListView Addr: %02x%02x%02x%02x%02x%02x",
-                      caseInfo->addr[5], caseInfo->addr[4], caseInfo->addr[3], /* mac下标 0 1 2 3 4 5 */
-                      caseInfo->addr[2], caseInfo->addr[1], caseInfo->addr[0]); /* mac下标 0 1 2 3 4 5 */
-        errcode_t retVal = gap_disconnect_remote_device((const bd_addr_t *)caseInfo->addr);
-        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "PlayerOnDragListener::DropEarListView gap_disconnect_remote_device retVal = %d", retVal);
-    }
-    BluetoothItemView *pbItermView = BluetoothModel::GetInstance()->GetConnectionView();
-    if (pbItermView == nullptr) {
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "OnDragEnd The GetConnectionView nullptr.");
-    } else {
-        pbItermView->ConnectAnimatorStop();
-        BluetoothModel::GetInstance()->SetConnectionView(nullptr);
-    }
-    OnDragChangView(event, JumpView::BluetoothJumpViewNum::BLUETOOTHEARLISTVIEW,
-                    JumpView::BluetoothJumpViewNum::BLUETOOTHEVIEW, true);
-}
-
-bool PlayerOnDragListener::OnDragEnd(UIView& view, const DragEvent& event)
-{
-    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "PlayerOnDragListener::OnDragEnd- %s", view.GetViewId());
-    if (view.GetViewId() == nullptr) {
-        return true;
-    }
-    if (strcmp(view.GetViewId(), BLUETOOTH_EAR_PHONE_VIEW) == 0) {
-        DropEarPhoneView(event);
-    } else if (strcmp(view.GetViewId(), TIPS_SUCC_MESSAGE_VIEW) == 0) {
-        OnDragChangView(event, JumpView::BluetoothJumpViewNum::TIPSSUCCMESSAGEVIEW,
-                        JumpView::BluetoothJumpViewNum::BLUETOOTHDEVICELISTVIEW, false);
-    } else if (strcmp(view.GetViewId(), TIPS_FAIL_MESSAGE_VIEW) == 0) {
-        OnDragChangView(event, JumpView::BluetoothJumpViewNum::TIPSFAILMESSAGEVIEW,
-                        JumpView::BluetoothJumpViewNum::BLUETOOTHEARPHONEVIEW, false);
-    } else if (strcmp(view.GetViewId(), TIPS_CONN_FAIL_MESSAGE_VIEW) == 0) {
-        CorrespondingJump(event, JumpView::BluetoothJumpViewNum::TIPSCONNFAILMESSAGEVIEW);
-    } else if (strcmp(view.GetViewId(), BLUETOOTH_EARLIST_VIEW) == 0) {
-        DropEarListView(event);
-    } else if (strcmp(view.GetViewId(), BLUETOOTH_RECONNECT_VIEW) == 0) {
-        BluetoothModel::GetInstance()->SetTagDisconnectView(false);
-        CorrespondingJump(event, JumpView::BluetoothJumpViewNum::BLUETOOTHRECONNECTVIEW);
-        BluetoothReconnectView *bluetoothReconnectView = BluetoothReconnectView::GetInstance();
-        if (bluetoothReconnectView != nullptr) {
-            bluetoothReconnectView->BtReconnectStop();
-        }
-    } else if (strcmp(view.GetViewId(), BLUETOOTH_OPTIONS_VIEW) == 0) {
-        OnDragChangView(event, JumpView::BluetoothJumpViewNum::BLUETOOTHEOPTIONSVIEW,
-                        JumpView::BluetoothJumpViewNum::BLUETOOTHDEVICELISTVIEW, false);
-    } else if (strcmp(view.GetViewId(), BLUETOOTH_VIEW) == 0) {
-        OnDragChangBluetoothView(event);
-    } else if (strcmp(view.GetViewId(), BLUETOOTH_DEVICE_LIST_VIEW) == 0) {
-        OnDragChangView(event, JumpView::BluetoothJumpViewNum::BLUETOOTHDEVICELISTVIEW,
-                        JumpView::BluetoothJumpViewNum::BLUETOOTHEVIEW, false);
-    }
-    return true;
-}
-
-
-void PlayerOnDragListener::CorrespondingJump(const DragEvent& event, int16_t hideView)
-{
-    BluetoothModel *bluetoothModel = BluetoothModel::GetInstance();
-    if (bluetoothModel == nullptr) {
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "MainBluetoothView::DropView bluetoothModel == nullptr");
-            return;
-        }
-    if (bluetoothModel->GetTagReconnectJump()) {
-        OnDragChangView(event, hideView,
-                        JumpView::BluetoothJumpViewNum::BLUETOOTHEOPTIONSVIEW, false);
-    } else {
-        std::list<BluetoothCaseInfo> &bluetoothScanList = BluetoothModel::GetInstance()->GetCase();
-        bool ret = bluetoothScanList.empty();
-        if (!ret) {
-            OnDragChangView(event, hideView,
-                            JumpView::BluetoothJumpViewNum::BLUETOOTHEARLISTVIEW, false);
-        } else {
-            OnDragChangView(event, hideView,
-                            JumpView::BluetoothJumpViewNum::BLUETOOTHEARPHONEVIEW, false);
-        }
-    }
-    return;
-}
-
-bool PlayerOnDragListener::OnDrag(UIView& view, const DragEvent& event)
-{
-    UNUSED(view);
-    if (event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT) {
-        PlayersView *playersView = PlayersView::GetInstance();
-        if (playersView == nullptr) {
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "PlayerbackReset playersView GetInstance fail");
-            return false;
-        }
-        playersView->SetPlayerListGroupStatus(false);
-        RootView::GetInstance()->Invalidate();
-    }
-    return false;
-}
-
-void PlayersPresenter::OnClickRescanButton(void)
-{
-    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "RescanButtonOnClickListener OnClick");
-    // 跳转正在搜索界面
-    JumpView *jumpView = JumpView::GetInstance();
-    if (jumpView == nullptr) {
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "jumpView GetInstance fail");
-        return;
-    }
-    jumpView->ChangeView(JumpView::BluetoothJumpViewNum::BLUETOOTHEARLISTVIEW,
-                         JumpView::BluetoothJumpViewNum::BLUETOOTHEARPHONEVIEW);
-    return;
-}
-void PlayersPresenter::OnClickNewEquipmentButton(void)
-{
-    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "NewEquipmentButtonOnClickListener OnClick");
-    BluetoothModel::GetInstance()->SetTagReturnToDeviceListView(true);
-    // 跳转正在搜索界面
-    JumpView *jumpView = JumpView::GetInstance();
-    if (jumpView == nullptr) {
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "jumpView GetInstance fail");
-        return;
-    }
-    jumpView->ChangeView(JumpView::BluetoothJumpViewNum::BLUETOOTHDEVICELISTVIEW,
-                         JumpView::BluetoothJumpViewNum::BLUETOOTHEARPHONEVIEW);
-    return;
-}
-
-void PlayersPresenter::OnClickCancelConnedRequestButton(void)
-{
-    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "CancelConnedRequestButton OnClick");
-    BluetoothCaseInfo *caseInfo = BluetoothModel::GetInstance()->GetTempMacValue();
-    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ClickCancelConnedRequestButton Addr: %02x%02x%02x%02x%02x%02x",
-                  caseInfo->addr[5], caseInfo->addr[4], caseInfo->addr[3], /* mac下标 0 1 2 3 4 5 */
-                  caseInfo->addr[2], caseInfo->addr[1], caseInfo->addr[0]); /* mac下标 0 1 2 3 4 5 */
-    errcode_t retVal = gap_disconnect_remote_device((const bd_addr_t *)caseInfo->addr);
-    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "OnClickCancelConnedRequestButton DisconnectRemoteDevice retVal = %d", retVal);
-
-    BluetoothModel::GetInstance()->SetTagScanDeviceClicked(false);
-    // 刷新列表
-    BluetoothEarListView *bluetoothEarListView = BluetoothEarListView::GetInstance();
-    if (bluetoothEarListView == nullptr) {
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ClickCancelConnedRequestButton bluetoothEarListView nullptr");
-        return;
-    }
-    if (bluetoothEarListView->GetScanUIList() == nullptr) {
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ClickCancelConnedRequestButton GetScanUIList nullptr");
-        return;
-    }
-    bluetoothEarListView->GetScanUIList()->RefreshList();
-    bluetoothEarListView->SetCancelConnedRequestButtonRemove();
-    bluetoothEarListView->SetTitleLabel("扫描完成");
-
-    BluetoothItemView *pbItermView = BluetoothModel::GetInstance()->GetConnectionView();
-    if (pbItermView == nullptr) {
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HandleBeforeChangeView The GetConnectionView get failed.");
-        return;
-    }
-    pbItermView->ConnectAnimatorStop();
-    BluetoothModel::GetInstance()->SetConnectionView(nullptr);
-    bluetoothEarListView->SetNewEquipmentButtonAdd();
-    RootView::GetInstance()->Invalidate();
-    return;
-}
-
-void PlayersPresenter::OnClickButtonUnpair(void)
-{
-    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "PlayersPresenter::OnClick BLUETOOTH_UNPAIR_BUTTON");
-    BluetoothModel::GetInstance()->SetTagConnectNew(false);
-    BluetoothOptionsView *bluetoothOptionsView = BluetoothOptionsView::GetInstance();
-    if (bluetoothOptionsView == nullptr) {
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "bluetoothOptionsView GetInstance fail");
-        return;
-    }
-    bluetoothOptionsView->SetUnpair(); // 取消配对
-    // 删除对应设备列表节点
-    bd_addr_t bdAddr = bluetoothOptionsView->GetCurrentAddr();
-    List<BluetoothCaseInfo> &bluetoothCaseList = BluetoothModel::GetInstance()->GetConnedDevicesCase();
-    ListNode<BluetoothCaseInfo> *node = bluetoothCaseList.Begin();
-    if (node == nullptr) {
-        return;
-    }
-    while (node != bluetoothCaseList.End()) {
-        if ((bdAddr.addr[0] == node->data_.addr[0]) && (bdAddr.addr[1] == node->data_.addr[1])
-            && (bdAddr.addr[2] == node->data_.addr[2]) && (bdAddr.addr[3] == node->data_.addr[3])
-            && (bdAddr.addr[4] == node->data_.addr[4]) && (bdAddr.addr[5] == node->data_.addr[5])) {
-            WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "bdAddr true");
-            bluetoothCaseList.Remove(node);
-        }
-        node = node->next_;
-    }
-
-    // 跳转并刷新列表
-    JumpView *jumpView = JumpView::GetInstance();
-    if (jumpView == nullptr) {
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "jumpView GetInstance fail");
-        return;
-    }
-    jumpView->ChangeView(JumpView::BluetoothJumpViewNum::BLUETOOTHEOPTIONSVIEW,
-                         JumpView::BluetoothJumpViewNum::BLUETOOTHDEVICELISTVIEW);
-}
-
-void PlayersPresenter::OnClickButtonOptionOne(void)
-{
-    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "PlayersPresenter::OnClick BLUETOOTH_OPTIONONE_BUTTON");
-    JumpView *jumpView = JumpView::GetInstance();
-    if (jumpView == nullptr) {
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "jumpView GetInstance fail");
-        return;
-    }
-    BluetoothOptionsView *bluetoothOptionsView = BluetoothOptionsView::GetInstance();
-    if (bluetoothOptionsView == nullptr) {
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "bluetoothOptionsView GetInstance fail");
-        return;
-    }
-    BluetoothModel::GetInstance()->SetBtStatus();
-    if (BluetoothModel::GetInstance()->GetAclConnected()) {
-        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "PlayersPresenter::OnClickButtonOptionOne GetAclConnected()");
-        BluetoothModel::GetInstance()->SetTagConnectNew(false);
-        bluetoothOptionsView->SetBtDisconnect();
-        jumpView->ChangeView(JumpView::BluetoothJumpViewNum::BLUETOOTHEOPTIONSVIEW,
-                             JumpView::BluetoothJumpViewNum::BLUETOOTHDEVICELISTVIEW);
-    } else {
-        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "PlayersPresenter::OnClickButtonOptionOne GetAclConnected() fail");
-        BluetoothModel::GetInstance()->SetTagReconnectJump(true);
-        // 重连动画
-        jumpView->ChangeView(JumpView::BluetoothJumpViewNum::BLUETOOTHEOPTIONSVIEW,
-                             JumpView::BluetoothJumpViewNum::BLUETOOTHRECONNECTVIEW);
-        // 判断是否正在连接
-        bd_addr_t *lastAddr = BluetoothModel::GetInstance()->GetLastConnedAddr();
-        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BluetoothPresenter::ClickOptionsOneButton lastAddr: %02x%02x%02x%02x%02x%02x",
-                      lastAddr->addr[5], lastAddr->addr[4], lastAddr->addr[3], /* mac下标 0 1 2 3 4 5 */
-                      lastAddr->addr[2], lastAddr->addr[1], lastAddr->addr[0]); /* mac下标 0 1 2 3 4 5 */
-        if (bt_is_acl_connected(lastAddr)) {
-            BluetoothModel::GetInstance()->SetTagConnectNew(true);
-            bluetoothOptionsView->SetBtDisconnect();
-        } else {
-            BluetoothCaseInfo *caseInfo = BluetoothModel::GetInstance()->GetTempMacValue();
-            errcode_t retVal = BluetoothModel::GetInstance()->ConnectRemoteDevice((const bd_addr_t *)&caseInfo->addr);
-            WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ClickOptionsOneButton ConnectRemoteDevice retVal = %d", retVal);
-        }
-    }
-}
-
-
-void PlayersPresenter::OnClickSetting(void)
-{
-    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "PlayersPresenter::OnClick BLUETOOTH_SETTING_BUTTON");
-    JumpView *jumpView = JumpView::GetInstance();
-    if (jumpView == nullptr) {
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "jumpView GetInstance fail");
-        return;
-    }
-    BluetoothModel *bluetoothModel = BluetoothModel::GetInstance();
-    if (bluetoothModel == nullptr) {
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "PlayersPresenter::OnClickSetting BluetoothModel GetInstance fail");
-        return;
-    }
-    bluetoothModel->SetTagConnectView(true);
-    bluetoothModel->SetBluetoothCalleridStatus(CALLERPLAYERS);
-    BluetoothModel::GetInstance()->SetTagReturnToDeviceListView(false);
-    // 设备列表
-    List<BluetoothCaseInfo> &bluetoothCaseList = BluetoothModel::GetInstance()->GetConnedDevicesCase();
-    bool ret = bluetoothCaseList.IsEmpty();
-    if (!ret) {
-        jumpView->ChangeView(JumpView::BluetoothJumpViewNum::BLUETOOTHEVIEW,
-                             JumpView::BluetoothJumpViewNum::BLUETOOTHDEVICELISTVIEW);
-    } else {
-        jumpView->ChangeView(JumpView::BluetoothJumpViewNum::BLUETOOTHEVIEW,
-                             JumpView::BluetoothJumpViewNum::BLUETOOTHEARPHONEVIEW);
-    }
-}
-
-void PlayersPresenter::OnClickDelete(void)
-{
-    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "PlayersPresenter::OnClick BLUETOOTH_DELETE_BUTTON");
-}
-
-void PlayersPresenter::OnClickSuccBack(void)
-{
-    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "PlayersPresenter::OnClick BLUETOOTH_SUCC_BACK_BUTTON");
-    JumpView *jumpView = JumpView::GetInstance();
-    if (jumpView == nullptr) {
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "jumpView GetInstance fail");
-        return;
-    }
-    jumpView->ChangeView(JumpView::BluetoothJumpViewNum::TIPSSUCCMESSAGEVIEW,
-                         JumpView::BluetoothJumpViewNum::BLUETOOTHDEVICELISTVIEW);
-}
-
-void PlayersPresenter::OnClickConnFailBack(void)
-{
-    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "PlayersPresenter::OnClick BLUETOOTH_CONN_FAIL_BACK_BUTTON");
-    JumpView *jumpView = JumpView::GetInstance();
-    if (jumpView == nullptr) {
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "jumpView GetInstance fail");
-        return;
-    }
-    jumpView->ChangeView(JumpView::BluetoothJumpViewNum::TIPSCONNFAILMESSAGEVIEW,
-                         JumpView::BluetoothJumpViewNum::BLUETOOTHRECONNECTVIEW);
-    BluetoothCaseInfo *caseInfo = BluetoothModel::GetInstance()->GetTempMacValue();
-    errcode_t retVal = BluetoothModel::GetInstance()->ConnectRemoteDevice((const bd_addr_t *)&caseInfo->addr);
-    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "OnClickConnFailBack ConnectRemoteDevice retVal = %d", retVal);
-}
-
-void PlayersPresenter::OnClickFailBack(void)
-{
-    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "PlayersPresenter::OnClick BLUETOOTH_FAIL_BACK_BUTTON");
-    JumpView *jumpView = JumpView::GetInstance();
-    if (jumpView == nullptr) {
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "jumpView GetInstance fail");
-        return;
-    }
-    jumpView->ChangeView(JumpView::BluetoothJumpViewNum::TIPSFAILMESSAGEVIEW,
-                         JumpView::BluetoothJumpViewNum::BLUETOOTHEARPHONEVIEW);
-}
-
-struct PlayersOnClickMapper {
-    const char *id;
-    void (PlayersPresenter::*func)(void);
-};
-
-static const PlayersOnClickMapper OnClickMapper[] = {
-    {BLUETOOTH_RESCAN_BUTTON, &PlayersPresenter::OnClickRescanButton},
-    {BLUETOOTH_NEWEQUIPMENT_BUTTON, &PlayersPresenter::OnClickNewEquipmentButton},
-    {BLUETOOTH_CANCELCONNEDREQUEST_BUTTON, &PlayersPresenter::OnClickCancelConnedRequestButton},
-    {BLUETOOTH_UNPAIR_BUTTON, &PlayersPresenter::OnClickButtonUnpair},
-    {BLUETOOTH_OPTIONONE_BUTTON, &PlayersPresenter::OnClickButtonOptionOne},
-    {BLUETOOTH_SETTING_BUTTON, &PlayersPresenter::OnClickSetting},
-    {BLUETOOTH_DELETE_BUTTON, &PlayersPresenter::OnClickDelete},
-    {BLUETOOTH_SUCC_BACK_BUTTON, &PlayersPresenter::OnClickSuccBack},
-    {BLUETOOTH_CONN_FAIL_BACK_BUTTON, &PlayersPresenter::OnClickConnFailBack},
-    {BLUETOOTH_FAIL_BACK_BUTTON, &PlayersPresenter::OnClickFailBack}
-};
-
-bool PlayersPresenter::OnClick(UIView &view, const ClickEvent &event)
-{
-    uint16_t i;
-    UNUSED(event);
-    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "PlayersPresenter::OnClick %s", view.GetViewId());
-    for (i = 0; i < sizeof(OnClickMapper) / sizeof(OnClickMapper[0]); i++) {
-        if (strcmp(view.GetViewId(), OnClickMapper[i].id) == 0) {
-            (this->*(OnClickMapper[i].func))();
-            WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "PlayersPresenter::OnClick i %d", i);
-            return true;
-        }
-    }
-    return false;
-}
-
-void PlayersPresenter::SetTitleSetText(const char *text)
-{
-    PlayersView *playersView = PlayersView::GetInstance();
-    if (playersView == nullptr) {
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SetTitleSetText playersView GetInstance fail");
-        return;
-    }
-    if (playersView->GetTitleLabel() == nullptr) {
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SetTitleSetText titleLabel nullptr");
-        return;
-    }
-    playersView->TitleSetText(text);
-}
-
-void PlayersPresenter::SetPlaybackProgress(int64_t value)
-{
-    PlayersView *playersView = PlayersView::GetInstance();
-    if (playersView == nullptr) {
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SetPlaybackProgress playersView GetInstance fail");
-        return;
-    }
-    UICircleProgress *playbackProgress = playersView->GetPlaybackProgress();
-    if (playbackProgress == nullptr) {
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "playbackProgress nullptr err");
-        return;
-    }
-    playbackProgress->SetValue(value);
-    playbackProgress->Invalidate();
-}
-
-void PlayersPresenter::SetPlayerState(bool value)
-{
-    PlayersView *playersView = PlayersView::GetInstance();
-    if (playersView == nullptr) {
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SetPlayerState playersView GetInstance fail");
-        return;
-    }
-    if (value) {
-        playersView->SetPlayerButtonState(UICheckBox::UICheckBoxState::SELECTED);
-        PlayersModel::GetInstance()->SetPlayButtonState(false);
-    }
-}
-
-void PlayersPresenter::PlayerbackReset(void)
-{
-    PlayersView *playersView = PlayersView::GetInstance();
-    if (playersView == nullptr) {
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "PlayerbackReset playersView GetInstance fail");
-        return;
-    }
-    playersView->SetPlayerButtonState(UICheckBox::UICheckBoxState::UNSELECTED);
-}
-
-// 播放器按钮复位
-void PlayersPresenter::PlayerHeadsetReset(void)
-{
-    PlayersView *playersView = PlayersView::GetInstance();
-    if (playersView == nullptr) {
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "PlayerbackReset playersView GetInstance fail");
-        return;
-    }
-
-    if (playersView->GetPlayerButtonState() == UICheckBox::UICheckBoxState::UNSELECTED) {
-        playersView->SetPlayerButtonState(UICheckBox::UICheckBoxState::SELECTED);
-    } else {
-        playersView->SetPlayerButtonState(UICheckBox::UICheckBoxState::UNSELECTED);
-    }
-
-}
-
-void PlayersPresenter::ShowPlayerListGroup()
-{
-    PlayersView *playersView = PlayersView::GetInstance();
-    if (playersView == nullptr) {
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "PlayerbackReset playersView GetInstance fail");
-        return;
-    }
-    // 添加list
-    playersView->SetPlayerListGroupStatus(true);
-    // 刷新UI
-    RootView::GetInstance()->Invalidate();
-    return;
-}
-
 } // namespace OHOS
index 3c10323..668ce39 100644 (file)
@@ -7,25 +7,58 @@
 #include <cstdlib>
 #include <unistd.h>
 #include "common/image_cache_manager.h"
+#include "phoneservice/PhoneService.h"
+#include "main/LoadImg.h"
 #include "ui_resource_image.h"
-#include "player/PlayersView.h"
 #include "UiConfig.h"
 #include "player/PlayersModel.h"
-#include "player/PlayersCaseListAdapter.h"
+#include "player/PlayersMusicItemView.h"
+#include "bts_avrcp_target.h"
+#include "bts_avrcp_controller.h"
 #include "main/MainViewSample.h"
+#include "player/PlayersView.h"
 
 namespace OHOS {
 static PlayersView* g_pPlayersView = nullptr;
-
-#define STEP_LABEL_X 166
-#define STEP_LABEL_Y 30
-#define TEXT_WIDTH 120
-#define TEXT_HEIGHT 30
+static constexpr uint16_t PROGRESS_PERCENTAGE = 100;
+static constexpr uint16_t PLAYER_PERIOD = 500;
+
+static constexpr int16_t NEXT_BUTTON_POSITION_X = 331;
+static constexpr int16_t PRE_BUTTON_POSITION_X = 31;
+static constexpr int16_t BUTTON_POSITION_Y_ONE = 168;
+static constexpr int16_t PLAY_MODE_BUTTON_POSITION_X = 87;
+static constexpr int16_t SOUND_BUTTON_POSITION_X = 176;
+static constexpr int16_t OPTION_BUTTON_POSITION_X = 284;
+static constexpr int16_t BUTTON_POSITION_Y_TWO = 316;
+static constexpr int16_t PULL_BUTTON_POSITION_X = 178;
+static constexpr int16_t PULL_BUTTON_POSITION_Y = 394;
+static constexpr int16_t PLAY_OR_PAUSE_BUTTON_POSITION_X = 140;
+static constexpr int16_t PLAY_OR_PAUSE_BUTTON_POSITION_Y = 139;
+static constexpr int16_t PLAY_OR_PAUSE_BUTTON_SIZE = 172;
+static constexpr int16_t MUSIC_NAME_LABEL_POSITION_X = 72;
+static constexpr int16_t MUSIC_NAME_LABEL_POSITION_Y = 35;
+static constexpr int16_t MUSIC_NAME_LABEL_WIDTH = 300;
+static constexpr int16_t MUSIC_NAME_LABEL_HEIGHT = 53;
+static constexpr int16_t MUSIC_AUTHOR_LABEL_POSITIO0N_X = 77;
+static constexpr int16_t MUSIC_AUTHOR_LABEL_POSITION_Y = 92;
+static constexpr int16_t MUSIC_AUTHOR_LABEL_WIDTH = 300;
+static constexpr int16_t MUSIC_AUTHOR_LABEL_HEIGHT = 38;
+static constexpr char* NEXT_SONG_BUTTON = "NEXT_SONG_BUTTON";
+static constexpr char* PRE_SONG_BUTTON = "PRE_SONG_BUTTON";
+static constexpr char* PLAY_OR_PAUSE_BUTTON = "PLAY_OR_PAUSE_BUTTON";
+static constexpr char* PLAYMODE_CHANGE_BUTTON = "PLAYMODE_CHANGE_BUTTON";
+static constexpr char* VOICE_ADJUST_BUTTON = "VOICE_ADJUST_BUTTON";
+static constexpr char* OPTIONS_BUTTON = "OPTIONS_BUTTON";
+static constexpr char* PULL_BUTTON = "PULL_BUTTON";
 
 PlayersView::PlayersView()
 {
     WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "PlayersView::PlayersView");
     SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);
+    SetDraggable(true);
+    SetTouchable(true);
+    SetOnClickListener(this);
+    SetOnDragListener(this);
     g_pPlayersView = this;
 }
 
@@ -38,54 +71,85 @@ PlayersView::~PlayersView()
             PlayersModel::GetInstance()->SetPlayButtonState(true);
         }
         RemoveAll();
-        listGroup->RemoveAll();
-        delete list;
-        list = nullptr;
-        delete playerlistener;
-        playerlistener = nullptr;
-        delete playerButton;
-        playerButton = nullptr;
-        delete soundlistener;
-        soundlistener = nullptr;
-        delete nextButton;
-        nextButton = nullptr;
-        delete nextlistener;
-        nextlistener = nullptr;
-        delete preButton;
-        preButton = nullptr;
-        TearDownView();
-        delete adapterText;
-        adapterText = nullptr;
-        delete backGround;
-        delete titleLabel;
-        delete subTitleLabel;
-        backGround = nullptr;
-        titleLabel = nullptr;
-        subTitleLabel = nullptr;
-        delete playbackProgress;
-        playbackProgress = nullptr;
-        delete jumpView;
-        jumpView = nullptr;
-        delete playersPresenter;
-        playersPresenter = nullptr;
-        delete playerOnDragListener;
-        playerOnDragListener = nullptr;
+        if (bgImg_ != nullptr) {
+            delete bgImg_;
+            bgImg_ = nullptr;
+        }
+        if (musicNameLabel_ != nullptr) {
+            delete musicNameLabel_;
+            musicNameLabel_ = nullptr;
+        }
+        if (musicAuthorLabel_ != nullptr) {
+            delete musicAuthorLabel_;
+            musicAuthorLabel_ = nullptr;
+        }
+        if (optionsButton_ != nullptr) {
+            delete optionsButton_;
+            optionsButton_ = nullptr;
+        }
+        if (preButton_ != nullptr) {
+            delete preButton_;
+            preButton_ = nullptr;
+        }
+        if (nextButton_ != nullptr) {
+            delete nextButton_;
+            nextButton_ = nullptr;
+        }
+        if (soundButton_ != nullptr) {
+            delete soundButton_;
+            soundButton_ = nullptr;
+        }
+        if (playModelChangeButton_ != nullptr) {
+            delete playModelChangeButton_;
+            playModelChangeButton_ = nullptr;
+        }
+        if (pullButton_ != nullptr) {
+            delete pullButton_;
+            pullButton_ = nullptr;
+        }
+        if (playerOrPauseButton_ != nullptr) {
+            delete playerOrPauseButton_;
+            playerOrPauseButton_ = nullptr;
+        }
+        if (playbackProgress_ != nullptr) {
+            delete playbackProgress_;
+            playbackProgress_ = nullptr;
+        }
+        if (volumeSettingView_ != nullptr) {
+            delete volumeSettingView_;
+            volumeSettingView_ = nullptr;
+        }
+        if (playerOptionGroup_ != nullptr) {
+            delete playerOptionGroup_;
+            playerOptionGroup_ = nullptr;
+        }
+        if (playersMusicListGroup != nullptr) {
+            delete playersMusicListGroup;
+            playersMusicListGroup = nullptr;
+        }
     }
     g_pPlayersView = nullptr;
 }
 
 void PlayersView::TitleSetText(const char *text)
 {
-    titleLabel->SetText(text);
-    titleLabel->SetLineBreakMode(UILabel::LINE_BREAK_MARQUEE);
-    titleLabel->SetAlign(UITextLanguageAlignment::TEXT_ALIGNMENT_CENTER,
-                         UITextLanguageAlignment::TEXT_ALIGNMENT_CENTER);
+    if (musicNameLabel_ == nullptr) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "PlayersView::TitleSetText musicNameLabel_ is null");
+        return;
+    }
+
+    if (text && *text) {
+        musicNameLabel_->SetText(text);
+    } else {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "PlayersView::TitleSetText text nullptr");
+        musicNameLabel_->SetText("Music Name");
+    }
 }
 
 void PlayersView::PlayerModelButtonSetSrc(uint32_t playMode)
 {
     ImageInfo *image = ImageCacheManager::GetInstance().LoadOneInMultiRes(playMode, PLAYER_IAMGES);
-    playerModelButton->SetSrc(image);
+    playModelChangeButton_->SetSrc(image);
 }
 
 int16_t PlayersView::GetVolumeRank(void)
@@ -103,81 +167,36 @@ void PlayersView::SetVolumeAddOne(void)
     volumeSet++;
 }
 
-UIButton *PlayersView::GetPullButton(void)
-{
-    return pullButton;
-}
-
-UIButton *PlayersView::GetOptionsButton(void)
-{
-    return optionsButton;
-}
-
-UIButton *PlayersView::GetPreButton(void)
-{
-    return preButton;
-}
-
-UIButton *PlayersView::GetNextButton(void)
-{
-    return nextButton;
-}
-
-UILabel *PlayersView::GetTitleLabel(void)
-{
-    return titleLabel;
-}
-
-UICheckBox *PlayersView::GetPlayerButton(void)
-{
-    return playerButton;
-}
-
-UIImageView *PlayersView::GetSoundButton(void)
-{
-    return soundButton;
-}
-
-UICircleProgress *PlayersView::GetPlaybackProgress(void)
-{
-    return playbackProgress;
-}
-
-UIImageView *PlayersView::GetPlayerModelButton(void)
+UICheckBox::UICheckBoxState PlayersView::GetPlayerButtonState(void)
 {
-    return playerModelButton;
+    return playerOrPauseButton_->GetState();
 }
 
-UICheckBox::UICheckBoxState PlayersView::GetPlayerButtonState(void)
+void PlayersView::SetPlayerState(bool value)
 {
-    return playerButton->GetState();
+    if (value) {
+        SetPlayerButtonState(UICheckBox::UICheckBoxState::SELECTED);
+        PlayersModel::GetInstance()->SetPlayButtonState(false);
+    }
 }
 
 void PlayersView::SetPlayerButtonState(UICheckBox::UICheckBoxState state)
 {
-    if (playerButton == nullptr) {
+    if (playerOrPauseButton_ == nullptr) {
         WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "PlayersView::SetPlayerButtonState playerButton nullptr");
         return;
     }
-    return playerButton->SetState(state);
-}
-
-UIList *PlayersView::GetPlayerList(void)
-{
-    return list;
+    return playerOrPauseButton_->SetState(state);
 }
 
-void PlayersView::SetPlayerListGroupStatus(bool status)
+void PlayersView::SetPlaybackProgress(int8_t value)
 {
-    if (listGroup == nullptr) {
-        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "PlayersView listGroup is nullptr");
+    if (playbackProgress_ == nullptr) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "PlayersView::playbackProgress_ nullptr");
         return;
     }
-    UIView *vew = MainViewSample::GetInstance()->GetMainViewGroup();
-    if (vew != nullptr) {
-        vew->SetVisible(!status);
-    }
-    listGroup->SetVisible(status);
+    playbackProgress_->SetValue(value);
+    playbackProgress_->Invalidate();
     return;
 }
 
@@ -186,429 +205,379 @@ void PlayersView::SetPlayerCtrVolume(float leftVolume, float rightVolume)
     PlayersModel::GetInstance()->GetPlayerCtr()->SetVolume(leftVolume, rightVolume);
 }
 
-void PlayersView::TearDownView()
+PlayersView* PlayersView::GetInstance(void)
 {
-    delete prelistener;
-    prelistener = nullptr;
-    delete playerModelButton;
-    playerModelButton = nullptr;
-    delete modellistener;
-    modellistener = nullptr;
-    delete soundButton;
-    soundButton = nullptr;
-    delete optionslistener;
-    optionslistener = nullptr;
-    delete optionsButton;
-    optionsButton = nullptr;
-    delete pullButton;
-    pullButton = nullptr;
-    delete listGroup;
-    listGroup = nullptr;
+    return g_pPlayersView;
 }
 
-PlayersView* PlayersView::GetInstance(void)
+bool PlayersView::InitView(void)
 {
-    return g_pPlayersView;
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "PlayersView InitView");
+    InitImage();
+    InitButton();
+    InitLabel();
+    InitCircleProgress();
+    InitSoundAdjust();
+    InitOption();
+    InitListView();
+    Invalidate();
+    return true;
 }
 
-// list
-void PlayersView::ShowUpListView()
+void PlayersView::InitButton()
 {
-    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ShowUpListView");
-    listGroup = new UIViewGroup();
-    if (listGroup == nullptr) {
+    if (nextButton_ == nullptr) {
+        nextButton_ = new UIImageView();
+    }
+    if (preButton_ == nullptr) {
+        preButton_ = new UIImageView();
+    }
+    if (playerOrPauseButton_ == nullptr) {
+        playerOrPauseButton_ = new UICheckBox();
+    }
+    if (playModelChangeButton_ == nullptr) {
+        playModelChangeButton_ = new UIImageView();
+    }
+    if (soundButton_ == nullptr) {
+        soundButton_ = new UIImageView();
+    }
+    if (optionsButton_ == nullptr) {
+        optionsButton_ = new UIImageView();
+    }
+    if (pullButton_ == nullptr) {
+        pullButton_ = new UIImageView();
+    }
+    if ((nextButton_ == nullptr) || (preButton_ == nullptr) || (optionsButton_ == nullptr)
+        || (soundButton_ == nullptr) || (playModelChangeButton_ == nullptr) || (pullButton_ == nullptr)) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "UIButton new fail");
+        return;
+    }
+    if ((playerOrPauseButton_ == nullptr)) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "playerOrPauseButton_ new fail");
         return;
     }
-    listGroup->SetPosition(0, 0);
-    listGroup->Resize(VERTICAL_RESOLUTION, HORIZONTAL_RESOLUTION);
 
-    // list type
-    if (adapterText == nullptr) {
-        adapterText = new PlayersCaseListAdapter();
-        if (adapterText == nullptr) {
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "adapterText new fail");
-            return;
-        }
+    nextButton_->SetPosition(NEXT_BUTTON_POSITION_X, BUTTON_POSITION_Y_ONE);
+    nextButton_->SetViewId(NEXT_SONG_BUTTON);
+    LOADIMG::LoadImageViewImg(nextButton_, PLAYER_IAMGES, PLAYER_NEXT_BUTTON);
+    nextButton_->SetTouchable(true);
+    nextButton_->SetOnClickListener(this);
+
+    preButton_->SetPosition(PRE_BUTTON_POSITION_X, BUTTON_POSITION_Y_ONE);
+    preButton_->SetViewId(PRE_SONG_BUTTON);
+    LOADIMG::LoadImageViewImg(preButton_, PLAYER_IAMGES, PLAYER_PRE_BUTTOW);
+    preButton_->SetTouchable(true);
+    preButton_->SetOnClickListener(this);
+
+    ImageInfo *image;
+    ImageInfo *hlImage;
+    playerOrPauseButton_->SetPosition(PLAY_OR_PAUSE_BUTTON_POSITION_X, PLAY_OR_PAUSE_BUTTON_POSITION_Y,
+                                      PLAY_OR_PAUSE_BUTTON_SIZE, PLAY_OR_PAUSE_BUTTON_SIZE);
+    playerOrPauseButton_->SetViewId(PLAY_OR_PAUSE_BUTTON);
+    playerOrPauseButton_->SetOnClickListener(this);
+    image = ImageCacheManager::GetInstance().LoadOneInMultiRes(PLAYER_PLAYER, PLAYER_IAMGES);
+    hlImage = ImageCacheManager::GetInstance().LoadOneInMultiRes(PLAYER_PLAYERHIGHLIGHT, PLAYER_IAMGES);
+    playerOrPauseButton_->SetImages(hlImage, image);
+
+    playModelChangeButton_->SetPosition(PLAY_MODE_BUTTON_POSITION_X, BUTTON_POSITION_Y_TWO);
+    playModelChangeButton_->SetViewId(PLAYMODE_CHANGE_BUTTON);
+    SetUpPlayerMode();
+    playModelChangeButton_->SetTouchable(true);
+    playModelChangeButton_->SetOnClickListener(this);
+
+    soundButton_->SetPosition(SOUND_BUTTON_POSITION_X, BUTTON_POSITION_Y_TWO);
+    soundButton_->SetViewId(VOICE_ADJUST_BUTTON);
+    LOADIMG::LoadImageViewImg(soundButton_, PLAYER_IAMGES, PLAYER_SOUND_IMAGE);
+    soundButton_->SetTouchable(true);
+    soundButton_->SetOnClickListener(this);
+
+    optionsButton_->SetPosition(OPTION_BUTTON_POSITION_X, BUTTON_POSITION_Y_TWO);
+    optionsButton_->SetViewId(OPTIONS_BUTTON);
+    LOADIMG::LoadImageViewImg(optionsButton_, PLAYER_IAMGES, PLAYER_OPTIONS_IMAGE);
+    optionsButton_->SetTouchable(true);
+    optionsButton_->SetOnClickListener(this);
+
+    pullButton_->SetPosition(PULL_BUTTON_POSITION_X, PULL_BUTTON_POSITION_Y);
+    pullButton_->SetViewId(PULL_BUTTON);
+    pullButton_->SetSrc(PNG_PULLUP_BUTTON);
+    pullButton_->SetTouchable(true);
+    pullButton_->SetOnClickListener(this);
+
+    Add(nextButton_);
+    Add(preButton_);
+    Add(optionsButton_);
+    Add(soundButton_);
+    Add(playModelChangeButton_);
+    Add(playerOrPauseButton_);
+    Add(pullButton_);
+}
+
+void PlayersView::InitLabel()
+{
+    musicNameLabel_ = new UILabel();
+    if (musicNameLabel_ == nullptr) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "musicNameLabel_ new fail");
+        return;
     }
-    if (list == nullptr) {
-        list = new UIList(UIList::VERTICAL);
-        if (list == nullptr) {
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "list new fail");
-            return;
-        }
-        list->SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);
-        list->SetStartIndex(0); // 0 : list start index
-        list->SetAdapter(adapterText);
-    }
-    listGroup->Add(list);
-    MainViewSample::GetInstance()->GetRootContainer()->Add(listGroup);
-    UIView::OnDragListener *dragListener = (UIView::OnDragListener*)OHOS::PlayerOnDragListener::GetInstance();
-    if (dragListener == nullptr) {
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "PlayersView::OnDragListener fail");
+    musicNameLabel_->SetPosition(MUSIC_NAME_LABEL_POSITION_X, MUSIC_NAME_LABEL_POSITION_Y,
+                                 MUSIC_NAME_LABEL_WIDTH, MUSIC_NAME_LABEL_HEIGHT);
+    musicNameLabel_->SetText("Music Name");
+    musicNameLabel_->SetLineBreakMode(UILabel::LINE_BREAK_MARQUEE);
+    musicNameLabel_->SetAlign(UITextLanguageAlignment::TEXT_ALIGNMENT_CENTER,
+                              UITextLanguageAlignment::TEXT_ALIGNMENT_CENTER);
+    musicNameLabel_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, FONT_FORTY_SIZE);
+    Add(musicNameLabel_);
+
+    musicAuthorLabel_ = new UILabel();
+    if (musicAuthorLabel_ == nullptr) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "musicAuthorLabel_ new fail");
         return;
     }
-    listGroup->SetDraggable(true);
-    listGroup->SetTouchable(true);
-    listGroup->SetOnDragListener(dragListener);
-    listGroup->SetVisible(false);
-    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ShowUpListView end");
+    musicAuthorLabel_->SetPosition(MUSIC_AUTHOR_LABEL_POSITIO0N_X, MUSIC_AUTHOR_LABEL_POSITION_Y,
+                                   MUSIC_AUTHOR_LABEL_WIDTH, MUSIC_AUTHOR_LABEL_HEIGHT);
+    musicAuthorLabel_->SetText("Musical Authors");
+    musicAuthorLabel_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, FONT_THIRTY_SIZE); // 30:font data
+    musicAuthorLabel_->SetAlign(UITextLanguageAlignment::TEXT_ALIGNMENT_CENTER,
+                                UITextLanguageAlignment::TEXT_ALIGNMENT_CENTER);
+    Add(musicAuthorLabel_);
 }
 
-void PlayersView::SetUpButton(UIButton *btn, const Point& point,
-                              int16_t width, int16_t height, UIView::OnClickListener *listener)
+void PlayersView::InitImage()
 {
-    if (btn == nullptr) {
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "PlayersView::SetUpButton nullptr");
+    bgImg_ = new UIImageView();
+    if (bgImg_ == nullptr) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "bgImg_ new fail");
         return;
     }
-    Add(btn);
-    btn->SetPosition(point.x, point.y, width, height);
-    btn->SetOnClickListener(listener);
+    bgImg_->SetPosition(0, 0);
+    LOADIMG::LoadImageViewImg(bgImg_, PLAYER_IAMGES, PLAYER_BACK_GROUND);
+    Add(bgImg_);
 }
 
-int PlayersView::ShowUpCheckBoxButton()
+void PlayersView::InitCircleProgress()
 {
-    ImageInfo *image;
-    ImageInfo *hlImage;
-    if (playerButton == nullptr) {
-        playerButton = new UICheckBox();
+    playbackProgress_ = new UICircleProgress();
+    if (playbackProgress_ == nullptr) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "playbackProgress_ new fail");
+        return;
     }
-    if (soundButton == nullptr) {
-        soundButton = new UIImageView();
+    playbackProgress_->SetPosition(140, 139, 172, 172); // 140:x 139:y 172:width 172:height
+    playbackProgress_->SetCenterPosition(86, 86); // 86:x 86:y
+    playbackProgress_->SetRange(PLAY_PROGRESS_MAX, PLAY_PROGRESS_MIN);
+    playbackProgress_->SetRadius(86); // 86:radius
+    playbackProgress_->SetStartAngle(0);
+    playbackProgress_->SetEndAngle(360); // 360: end angle
+    playbackProgress_->SetValue(0);
+    playbackProgress_->SetBackgroundStyle(STYLE_LINE_COLOR, Color::Gray().full);
+    playbackProgress_->SetForegroundStyle(STYLE_LINE_COLOR, Color::Red().full);
+    playbackProgress_->SetBackgroundStyle(STYLE_LINE_WIDTH, 3); // 3:width
+    playbackProgress_->SetForegroundStyle(STYLE_LINE_WIDTH, 3); // 3:width
+    Add(playbackProgress_);
+}
+
+void PlayersView::InitSoundAdjust()
+{
+    volumeSettingView_ = new VolumeSettingView();
+    if (volumeSettingView_ == nullptr) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "volumeSetting nullptr err");
+        return;
     }
-    if ((playerButton == nullptr) || (soundButton == nullptr)) {
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new fail");
-        return OHOS_FAILURE;
+    if (!volumeSettingView_->SetUpVolume()) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "volumeSetting SetUpVolume fail");
+        return;
     }
-    playerlistener = new ButtonOnClickListener(reinterpret_cast<UIView*>(playerButton));
-    if (playerlistener == nullptr) {
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "playerlistener new fail");
-        return OHOS_FAILURE;
+    int32_t volume = AudioManager::GetInstance().GetVolume(AUDIO_STREAM_MUSIC);
+    WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "current volume = %d", volume);
+    volumeSettingView_->GetProgress()->SetValue(volume);
+    if (volume == 0) {
+        ImageInfo *image = ImageCacheManager::GetInstance().LoadOneInMultiRes(PLAYER_MUTE_BUTTON, PLAYER_IAMGES);
+        volumeSettingView_->GetDecreaseButton()->SetImageSrc(image, image);
     }
-    playerButton->SetPosition(140, 139, 172, 172); // 140:x 139:y 172:width 172:height
-    playerButton->SetOnClickListener(playerlistener);
-    image = ImageCacheManager::GetInstance().LoadOneInMultiRes(PLAYER_PLAYER, PLAYER_IAMGES);
-    hlImage = ImageCacheManager::GetInstance().LoadOneInMultiRes(PLAYER_PLAYERHIGHLIGHT, PLAYER_IAMGES);
-    playerButton->SetImages(hlImage, image);
-    Add(playerButton);
-
-    soundlistener = new ButtonOnClickListener(reinterpret_cast<UIView*>(soundButton));
-    if (soundlistener == nullptr) {
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "soundlistener new fail");
-        return OHOS_FAILURE;
+    volumeSliderEventListener_ = volumeSettingView_->GetVolumeEventListener();
+    if (volumeSliderEventListener_ == nullptr) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SoundButtonOnClick volumeSliderEventListener_ nullptr err");
+        return;
     }
-    soundButton->SetTouchable(true);
-    soundButton->SetPosition(178, 316, 95, 76); // 178:x 316:y 95:width 76:height
-    soundButton->SetOnClickListener(soundlistener);
-    if (!LoadPlayerImage(soundButton, PLAYER_SOUND_IMAGE)) {
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "playerModelButton LoadPlayerImage fail");
-        return false;
+    volumeSettingView_->SetVisible(false);
+    Add(volumeSettingView_);
+}
+
+void PlayersView::InitOption()
+{
+    playerOptionGroup_ = new PlayersOptionGroup(); // 打开BluetoothView对应的group
+    if (playerOptionGroup_ == nullptr) {
+        return;
     }
-    Add(soundButton);
-    return OHOS_SUCCESS;
+    playerOptionGroup_->SetVisible(false);
+    Add(playerOptionGroup_);
 }
 
-int PlayersView::ShowUpButton()
+void PlayersView::InitListView()
 {
-    struct Point pointBtn;
-    ImageInfo *image;
-    pointBtn.x = 331; // 331:x
-    pointBtn.y = 168; // 168:y
-    nextlistener = new ButtonOnClickListener(reinterpret_cast<UIView*>(nextButton));
-    if (nextlistener == nullptr) {
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "nextlistener new fail");
-        return OHOS_FAILURE;
-    }
-    SetUpButton(nextButton, pointBtn, 93, 116, nextlistener); // 93:width 116:height
-    image = ImageCacheManager::GetInstance().LoadOneInMultiRes(PLAYER_NEXT_BUTTON, PLAYER_IAMGES);
-    nextButton->SetImageSrc(image, image);
-    pointBtn.x = 31; // 31:x
-    pointBtn.y = 168; // 168:y
-    prelistener = new ButtonOnClickListener(reinterpret_cast<UIView*>(preButton));
-    if (prelistener == nullptr) {
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "prelistener new fail");
-        return OHOS_FAILURE;
-    }
-    SetUpButton(preButton, pointBtn, 86, 116, prelistener); // 86:width 116:height
-    image = ImageCacheManager::GetInstance().LoadOneInMultiRes(PLAYER_PRE_BUTTOW, PLAYER_IAMGES);
-    preButton->SetImageSrc(image, image);
-
-    pointBtn.x = 87; // 87:x
-    pointBtn.y = 316; // 316:y
-    modellistener = new ButtonOnClickListener(reinterpret_cast<UIView*>(playerModelButton));
-    if (modellistener == nullptr) {
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "modellistener new fail");
-        return OHOS_FAILURE;
-    }
-    playerModelButton->SetTouchable(true);
-    playerModelButton->SetPosition(pointBtn.x, pointBtn.y, 95, 76); // 95:width 76:height
-    playerModelButton->SetOnClickListener(modellistener);
-    if (!ShowUpPlayerMode()) {
-        return OHOS_FAILURE;
-    }
-    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "playerModel %d", PlayersModel::GetInstance()->GetPlayerModel());
-    Add(playerModelButton);
-
-    return OHOS_SUCCESS;
-}
-
-bool PlayersView::ShowUpPlayerMode()
+    // 遍历文件名到list链表
+    PlayersListGroup::GetInstance()->SetUpListCase();
+    PlayersModel::GetInstance()->PlayerInit();
+    playersMusicListGroup = new PlayersMusicListGroup(); // 打开BluetoothView对应的group
+    if (playersMusicListGroup == nullptr) {
+        return;
+    }
+    playersMusicListGroup->SetVisible(false);
+    Add(playersMusicListGroup);
+}
+
+void PlayersView::SetUpPlayerMode()
 {
     if (PlayersModel::GetInstance()->GetPlayerModel() == LOOP) {
-        if (!LoadPlayerImage(playerModelButton, PLAYER_PLAYERSMODEL_LOOP)) {
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "load PLAYER_PLAYERSMODEL_LOOP fail");
-            return false;
-        }
+        LOADIMG::LoadImageViewImg(playModelChangeButton_, PLAYER_IAMGES, PLAYER_PLAYERSMODEL_LOOP);
     } else if (PlayersModel::GetInstance()->GetPlayerModel() == SEQUENCE) {
-        if (!LoadPlayerImage(playerModelButton, PLAYER_PLAYERSMODEL_SEQUENCE)) {
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "load PLAYERSMODEL_SEQUENCE fail");
-            return false;
-        }
+        LOADIMG::LoadImageViewImg(playModelChangeButton_, PLAYER_IAMGES, PLAYER_PLAYERSMODEL_SEQUENCE);
     } else if (PlayersModel::GetInstance()->GetPlayerModel() == REPEATS) {
-        if (!LoadPlayerImage(playerModelButton, PLAYER_PLAYERSMODEL_REPEATS)) {
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "load PLAYERSMODEL_REPEATS fail");
-            return false;
-        }
+        LOADIMG::LoadImageViewImg(playModelChangeButton_, PLAYER_IAMGES, PLAYER_PLAYERSMODEL_REPEATS);
     } else if (PlayersModel::GetInstance()->GetPlayerModel() == RANDOM) {
-        if (!LoadPlayerImage(playerModelButton, PLAYER_PLAYERSMODEL_RANDOM)) {
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "load PLAYERSMODEL_RANDOM fail");
-            return false;
-        }
+        LOADIMG::LoadImageViewImg(playModelChangeButton_, PLAYER_IAMGES, PLAYER_PLAYERSMODEL_RANDOM);
     }
-    return true;
 }
 
-int PlayersView::ShowUpButtonView()
+void PlayersView::PlayerHeadsetReset()
 {
-    int32_t ret = ShowUpCheckBoxButton();
-    if (ret == OHOS_FAILURE) {
-        return OHOS_FAILURE;
-    }
-    if (nextButton == nullptr) {
-        nextButton = new UIButton();
-    }
-    if (preButton == nullptr) {
-        preButton = new UIButton();
-    }
-    if (optionsButton == nullptr) {
-        optionsButton = new UIButton();
-    }
-    if (pullButton == nullptr) {
-        pullButton = new UIButton();
-    }
-    if (playerModelButton == nullptr) {
-        playerModelButton = new UIImageView();
-    }
-    if ((nextButton == nullptr) || (preButton == nullptr) || (playerModelButton == nullptr) || (optionsButton == nullptr) ||
-        (pullButton == nullptr)) {
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "UIButton new fail");
-        return OHOS_FAILURE;
-    }
-    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ShowUpButtonView");
-
-    ret = ShowUpButton();
-    if (ret == OHOS_FAILURE) {
-        return OHOS_FAILURE;
-    }
-    ret = ShowUpButtonOptions();
-    if (ret == OHOS_FAILURE) {
-        return OHOS_FAILURE;
-    }
-    ret = ShowUpCircleProgress();
-    if (ret == OHOS_FAILURE) {
-        return OHOS_FAILURE;
+    if (playerOrPauseButton_->GetState() == UICheckBox::UICheckBoxState::UNSELECTED) {
+        SetPlayerButtonState(UICheckBox::UICheckBoxState::SELECTED);
+    } else {
+        SetPlayerButtonState(UICheckBox::UICheckBoxState::UNSELECTED);
     }
-    return OHOS_SUCCESS;
 }
 
-int PlayersView::ShowUpButtonOptions()
-{
-    struct Point pointBtn;
-    pointBtn.x = 284; // 284 : x
-    pointBtn.y = 316; // 316 : y
-    optionslistener = new ButtonOnClickListener(reinterpret_cast<UIView*>(optionsButton));
-    if (optionslistener == nullptr) {
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "optionslistener new fail");
-        return OHOS_FAILURE;
-    }
-    SetUpButton(optionsButton, pointBtn, 75, 76, optionslistener); // 75:width 76:height
-    ImageInfo *image = ImageCacheManager::GetInstance().LoadOneInMultiRes(PLAYER_OPTIONS_IMAGE, PLAYER_IAMGES);
-    optionsButton->SetImageSrc(image, image);
-
-    pointBtn.x = 178; // 178:x
-    pointBtn.y = 394; // 394:y
-    SetUpButton(pullButton, pointBtn, 95, 48, nullptr); // 95:width 48:height
-    pullButton->SetImageSrc(PNG_PULLBUTTON_FACE_IMAGE, PNG_PULLBUTTON_FACE_IMAGE);
-    return OHOS_SUCCESS;
-}
-
-int PlayersView::ShowUpCircleProgress()
-{
-    if (playbackProgress == nullptr) {
-        playbackProgress = new UICircleProgress();
-        if (playbackProgress == nullptr) {
-            WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "playbackProgress new fail");
-            return OHOS_FAILURE;
-        }
-    }
-    playbackProgress->SetPosition(140, 139, 172, 172); // 140:x 139:y 172:width 172:height
-    playbackProgress->SetCenterPosition(86, 86); // 86:x 86:y
-    playbackProgress->SetRange(PLAY_PROGRESS_MAX, PLAY_PROGRESS_MIN);
-    playbackProgress->SetRadius(86); // 86:radius
-    playbackProgress->SetStartAngle(0);
-    playbackProgress->SetEndAngle(360); // 360: end angle
-    playbackProgress->SetValue(0);
-    playbackProgress->SetBackgroundStyle(STYLE_LINE_COLOR, Color::Gray().full);
-    playbackProgress->SetForegroundStyle(STYLE_LINE_COLOR, Color::Red().full);
-    playbackProgress->SetBackgroundStyle(STYLE_LINE_WIDTH, 3); // 3:width
-    playbackProgress->SetForegroundStyle(STYLE_LINE_WIDTH, 3); // 3:width
-    Add(playbackProgress);
-    return OHOS_SUCCESS;
-}
-
-void PlayersView::CreateJumpView(void)
+void PlayersView::PreLoad(void)
 {
-    if (jumpView == nullptr) {
-        jumpView = new JumpView();
-        if (jumpView == nullptr) {
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "jumpView new fail");
-            return;
+    if (!viewiInitStatus) {
+        if (InitView()) {
+            viewiInitStatus = true;
         }
     }
 }
 
-void PlayersView::CreatePlayersPresenter(void)
+void PlayersView::UnLoad(void)
 {
-    if (playersPresenter == nullptr) {
-        playersPresenter = new PlayersPresenter();
-        if (playersPresenter == nullptr) {
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "playersPresenter new fail");
-            return;
-        }
-    }
+    // Players's usage scenes is complicated, so we do not release it's resources inner slice.
 }
 
-void PlayersView::CreatePlayerOnDragListener(void)
+void PlayersView::OnInactive(void)
 {
-    if (playerOnDragListener == nullptr) {
-        playerOnDragListener = new PlayerOnDragListener();
-        if (playerOnDragListener == nullptr) {
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "playerOnDragListener new fail");
-            return;
-        }
-    }
+    volumeSettingView_->SetVisible(false);
+    playersMusicListGroup->SetVisible(false);
+    SetVisible(true);
 }
-bool PlayersView::InitBackGround(void)
+
+bool PlayersView::OnClick(UIView &view, const ClickEvent &event)
 {
-    if (backGround == nullptr) {
-        backGround = new UIImageView();
-        if (backGround == nullptr) {
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "backGround new fail");
-            return false;
+    UNUSED(event);
+    if (strcmp(view.GetViewId(), NEXT_SONG_BUTTON) == 0) {
+        playbackProgress_->SetValue(0); // 0:进度0%
+        playbackProgress_->Invalidate();
+        PlayersModel::GetInstance()->LoopingPlayout();
+    } else if (strcmp(view.GetViewId(), PRE_SONG_BUTTON) == 0) {
+        playbackProgress_->SetValue(0); // 0:进度0%
+        playbackProgress_->Invalidate();
+        PlayersModel::GetInstance()->PreviousPlayout();
+    } else if (strcmp(view.GetViewId(), PLAY_OR_PAUSE_BUTTON) == 0) {
+        PlayOrPauseButtonOnClick();
+    } else if (strcmp(view.GetViewId(), PLAYMODE_CHANGE_BUTTON) == 0) {
+        PlayersModel::GetInstance()->SetPlayerModelAddOne();
+        if (PlayersModel::GetInstance()->GetPlayerModel() > RANDOM) {
+            PlayersModel::GetInstance()->SetPlayerModel(LOOP);
         }
-    }
-    backGround->SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);
-    if (!LoadPlayerImage(backGround, PLAYER_BACK_GROUND)) {
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "backGround LoadPlayerImage fail");
-        return false;
-    }
-    Add(backGround);
+        SetUpPlayerMode();
+    } else if (strcmp(view.GetViewId(), VOICE_ADJUST_BUTTON) == 0) {
+        volumeSliderEventListener_->SetPlayerCoefficients(VOLUMEPLAYERS); // 进度条系数
+        volumeSettingView_->SetVisible(true);
+    } else if (strcmp(view.GetViewId(), OPTIONS_BUTTON) == 0) {
+        playerOptionGroup_->SetVisible(true);
+    } else if (strcmp(view.GetViewId(), PULL_BUTTON) == 0) {
+        // 无对应的逻辑代码,预留接口
+    }
+    Invalidate();
     return true;
 }
 
-void PlayersView::CreatePlayerMusicName()
+void PlayersView::PlayOrPauseButtonOnClick()
 {
-    if (titleLabel == nullptr) {
-        titleLabel = new UILabel();
-        if (titleLabel == nullptr) {
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "titleLabel new fail");
-            return;
-        }
+    uint8_t state = UICheckBox::UICheckBoxState::MAX_STATUS_NUM;
+    int32_t playerState;
+    int32_t connCtState = avrcp_ct_get_device_connect_state(SettingBluetoothModel::GetInstance()->GetLastConnedAddr());
+    int32_t connTgState = avrcp_tg_get_device_connect_state(SettingBluetoothModel::GetInstance()->GetLastConnedAddr());
+
+    state = playerOrPauseButton_->GetState();
+    if (PlayersModel::GetInstance()->GetPlayerCtr() == nullptr) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "PlayersModel::GetInstance()->GetPlayerCtr() nullptr");
+        return;
     }
-    titleLabel->SetPosition(127, 35, 200, 53); // 127:x 35:y 200:width 53:height
-    titleLabel->SetText("Music Name");
-    titleLabel->SetFont(DEFAULT_VECTOR_FONT_FILENAME, FONT_FORTY_SIZE);
-    Add(titleLabel);
+    PlayersModel::GetInstance()->GetPlayerCtr()->GetPlayerState(playerState);
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "buttonState = %d playerState = %d", state, playerState);
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "connCtState = %d connTgState = %d", connCtState, connTgState);
 
-    if (subTitleLabel == nullptr) {
-        subTitleLabel = new UILabel();
-        if (subTitleLabel == nullptr) {
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "subTitleLabel new fail");
-            return;
+    if (GetCurrCallNum() != 0 && GetScoConnectState() == HFP_SCO_STATE_CONNECTED) {
+        if (state == UICheckBox::UICheckBoxState::SELECTED) {
+            playerOrPauseButton_->SetState(UICheckBox::UICheckBoxState::UNSELECTED);
+        } else {
+            playerOrPauseButton_->SetState(UICheckBox::UICheckBoxState::SELECTED);
         }
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[PlayerButtonOnClick] calling phone");
+        return;
+    }
+    if (state == UICheckBox::UICheckBoxState::SELECTED) {
+        /* start play */
+        PlayersModel::GetInstance()->ConnectBtAndLocalPlay(connCtState, connTgState, playerState);
+    } else if (state == UICheckBox::UICheckBoxState::UNSELECTED) {
+        PlayersModel::GetInstance()->ConnectBtAndLocalPause(connCtState, connTgState);
     }
-    subTitleLabel->SetPosition(77, 92, 300, 38); // 77:x 92:y 300:width 38:height
-    subTitleLabel->SetText("Musical Authors");
-    subTitleLabel->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 30); // 30:font data
-    subTitleLabel->SetAlign(UITextLanguageAlignment::TEXT_ALIGNMENT_CENTER, UITextLanguageAlignment::TEXT_ALIGNMENT_CENTER);
-    Add(subTitleLabel);
-    return;
 }
 
 bool PlayersView::OnDragEvent(const DragEvent& event)
 {
-    /* 300: y limit of drag start point */
-    if ((event.GetDragDirection() == DragEvent::DIRECTION_BOTTOM_TO_TOP) && (event.GetStartPoint().y > 300)) {
-        PlayersPresenter::GetInstance()->ShowPlayerListGroup();
-        return true;
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "PlayersView OnDrage");
+    int yMoveDistance = 300;
+    if ((event.GetDragDirection() == DragEvent::DIRECTION_BOTTOM_TO_TOP) &&
+        (event.GetStartPoint().y > yMoveDistance)) {
+            PlayersMusicListGroup::GetInstance()->RefreshMusicList();
+            playersMusicListGroup->SetVisible(true);
+            return true;
     }
-
+    Invalidate();
     return false;
 }
 
-bool PlayersView::InitView(void)
+void PlayersView::Update(void)
 {
-    int ret;
-    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, " PlayersView InitView");
-
-    if (!InitBackGround()) {
-        return false;
+    if (playbackProgress_ == nullptr) {
+        return;
     }
+    int32_t playerState = 0;
+    PlayersModel::GetInstance()->GetPlayerCtr()->GetPlayerState(playerState);
 
-    CreatePlayerMusicName();
-    // changeView
-    CreateJumpView();
-    // OnClick
-    CreatePlayersPresenter();
-    // OnDrag
-    CreatePlayerOnDragListener();
-    // 按键设置
-    ret = ShowUpButtonView();
-    if (ret == OHOS_FAILURE) {
-        return false;
+    if (playerState == PLAYER_STARTED) {
+        SetPlayerButtonState(UICheckBox::UICheckBoxState::SELECTED);
+    } else {
+        SetPlayerButtonState(UICheckBox::UICheckBoxState::UNSELECTED);
     }
-    // 遍历文件名到list链表
-    PlayersListGroup::GetInstance()->SetUpListCase();
-    PlayersModel::GetInstance()->PlayerInit();
-    ShowUpListView();
-    SetTouchable(true);
-    SetDraggable(true);
-    return true;
-}
 
-void PlayersView::PreLoad(void)
-{
-    if (!viewiInitStatus) {
-        if (InitView()) {
-            viewiInitStatus = true;
+    if (playerState == PLAYER_STARTED) {
+        PlayersModel::GetInstance()->GetPlayerCtr()->GetCurrentTime(playerCurrentTime_);
+        PlayersModel::GetInstance()->GetDuration(playerMusicDuration_);
+        if (playerMusicDuration_ != 0) {
+            playerProgressValue_ = (playerCurrentTime_ * PROGRESS_PERCENTAGE) / playerMusicDuration_;
+            WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "playerProgressValue_ %lld", playerProgressValue_);
+        } else {
+            playerProgressValue_ = 100; // 100: max progress value
         }
+        PlayersModel::GetInstance()->SetCircleProgress(playerProgressValue_);
+        playbackProgress_->SetValue(playerProgressValue_);
+        playbackProgress_->Invalidate();
     }
 }
 
-void PlayersView::UnLoad(void)
+uint32_t PlayersView::GetPeriod(void)
 {
-    // Players's usage scenes is complicated, so we do not release it's resources inner slice.
+    return PLAYER_PERIOD;
 }
 
-bool PlayersView::LoadPlayerImage(UIImageView *view, uint32_t resId)
-{
-    std::string file = PLAYER_IAMGES;
-    ImageInfo* image = ImageCacheManager::GetInstance().LoadOneInMultiRes(resId, file);
-    if (image == nullptr) {
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "PlayersView::LoadPlayerImage %x fail", resId);
-        return false;
-    }
-    view->SetSrc(image);
-    return true;
-}
 }
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/quickaccess/FloatAccessView.cpp b/code/sdk/application/wearable/evb/nativeapp/nativeui/quickaccess/FloatAccessView.cpp
new file mode 100644 (file)
index 0000000..84411d2
--- /dev/null
@@ -0,0 +1,326 @@
+ /*
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025. All rights reserved.
+ * Description: FloatAccessView
+ * Author: Hisi Graphic Team
+ * Created: 2025-09
+ */
+
+#include <string>
+#include <cmath>
+#include "NativeRegisterManager.h"
+#include "wearable_log.h"
+#include "components/root_view.h"
+#include "common/screen.h"
+#include "common/image_cache_manager.h"
+#include "TransitionType.h"
+#include "NativeAbility.h"
+#include "kv_store.h"
+#include "easing_equation.h"
+#include "quickaccess/FloatAccessView.h"
+
+namespace OHOS {
+constexpr uint16_t ITEM_SIZE = 60;
+constexpr uint16_t ITEM_PADDING = 10;
+constexpr uint16_t VIEW_ID_VALUE_LEN = 4;
+constexpr uint16_t EXT_OFFSET = 50;
+constexpr uint16_t MAX_FILE_NAME_LENGTH = 7;
+
+inline bool ItemIsNotNull(AppItem item)
+{
+    return item.id != VIEW_INVALID;
+}
+
+FloatAccessView* FloatAccessView::GetInstance(void)
+{
+    static FloatAccessView instance;
+    return &instance;
+}
+
+void FloatAccessView::AddItem(AppItem item, uint8_t index)
+{
+    if (index >= MAX_ITEM_SIZE) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "index value must smaller than 3");
+        return;
+    }
+    items_[index] = item;
+    SaveAppItemsData();
+}
+
+void FloatAccessView::DeleteItem(const char* label)
+{
+    if (label == nullptr) {
+        return;
+    }
+    for (int i = 0; i < MAX_ITEM_SIZE; ++i) {
+        if (strcmp(items_[i].label, label) == 0) {
+            items_[i] = {};
+            SaveAppItemsData();
+            return;
+        }
+    }
+}
+
+AppItem FloatAccessView::GetItem(uint8_t index)
+{
+    if (index >= MAX_ITEM_SIZE) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "index value must smaller than 3");
+        return {};
+    }
+    return items_[index];
+}
+
+void FloatAccessView::OnItemClick(const std::string& name)
+{
+    uint32_t targetId = NativeAbility::GetInstance().GetCurTargetId();
+    uint16_t curSlice = static_cast<uint16_t>(targetId & SLICE_MASK);
+    
+    for (int i = 0; i < MAX_ITEM_SIZE; ++i) {
+        if (strcmp(items_[i].label, name.c_str()) == 0 && curSlice != items_[i].id) {
+            // 添加点击应用标记 (进入应用时,退出悬浮框,并且不显示退出动画)
+            isClickItem_ = true;
+            WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "FloatAccessView::OnClick viewid = %d", items_[i].id);
+            NativeAbility::GetInstance().ChangeSlice(items_[i].id, TransitionType::TRANSITION_ZOOM);
+            return;
+        }
+    }
+}
+
+bool FloatAccessView::OnClick(UIView& view, const ClickEvent& event)
+{
+    ExitView();
+    return false;
+}
+
+void FloatAccessView::EnterApp()
+{
+    uint32_t targetId = NativeAbility::GetInstance().GetCurTargetId();
+    uint16_t curSlice = static_cast<uint16_t>(targetId & SLICE_MASK);
+    
+    for (int i = 0; i < MAX_ITEM_SIZE; ++i) {
+        // 快捷应用存在且不为当前应用,则进入应用页
+        if (curSlice != (items_[i].id)) {
+            WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "FloatAccessView::OnClick viewid = %d", items_[i].id);
+            NativeAbility::GetInstance().ChangeSlice(items_[i].id, TransitionType::TRANSITION_ZOOM);
+            return;
+        }
+    }
+}
+
+void FloatAccessView::InitView()
+{
+    if (!isInitView_) {
+        LoadAppItemsData();
+        if (GetItemSize() == 0) {
+            return;
+        } else if (GetItemSize() == 1) {
+            EnterApp();
+        } else {
+            Resize(Screen::GetInstance().GetWidth() + EXT_OFFSET, Screen::GetInstance().GetHeight() + EXT_OFFSET);
+            SetStyle(STYLE_BACKGROUND_OPA, 100); // opa 100
+            SetDraggable(false);
+            SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);
+            floatBoxView_ = new UIFloatBoxView();
+            enterCallback_ = new FloatAnimatorCallback(floatBoxView_);
+            if (floatBoxView_ == nullptr || enterCallback_  == nullptr) {
+                WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "FloatAccessView::InitView failed, can't alloc memory");
+                return;
+            }
+            floatBoxView_->SetOnItemClickListener(this);
+            floatBoxView_->SetOnClickListener(this);
+            floatBoxView_->SetPosition(EXT_OFFSET, EXT_OFFSET,
+                        Screen::GetInstance().GetWidth(), Screen::GetInstance().GetHeight());
+            floatBoxView_->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);
+            floatBoxView_->SetItemSize(ITEM_SIZE);
+            floatBoxView_->SetItemSpacing(ITEM_PADDING);
+            floatBoxView_->SetDragFactor(0.4f); // 0.4 : factor
+            floatBoxView_->SetAccFactor(0.5f);  // 0.5 : factor
+            floatBoxView_->SetAlignAvgSpeed(5.0f); // 5.0 : factor
+            AddAppItemsData();
+            Add(floatBoxView_);
+            isInitView_ = true;
+        }
+    }
+}
+
+void FloatAccessView::ShowView()
+{
+    if (!isInitView_) {
+        InitView();
+    }
+    if (enterCallback_ == nullptr || enterCallback_->GetState() == Animator::START) {
+        return;
+    }
+    isShowView_ = true;
+    RootView::GetInstance()->AddSystemView(this);
+    Invalidate();
+    enterCallback_->DoEnter();
+}
+
+void FloatAccessView::ExitView()
+{
+    if (!isInitView_ || !isShowView_ || enterCallback_ == nullptr || enterCallback_->GetState() == Animator::START) {
+        return;
+    }
+    if (isClickItem_) {
+        CleanView();
+        return;
+    }
+    SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);
+    enterCallback_->DoExit();
+}
+
+void FloatAccessView::CleanView()
+{
+    RootView::GetInstance()->RemoveSystemView(this);
+    RemoveAll();
+    if (floatBoxView_ != nullptr) {
+        delete floatBoxView_;
+        floatBoxView_ = nullptr;
+    }
+    if (enterCallback_ != nullptr) {
+        delete enterCallback_;
+        enterCallback_ = nullptr;
+    }
+    isInitView_ = false;
+    isShowView_ = false;
+    isClickItem_ = false;
+}
+
+bool FloatAccessView::IsShowView()
+{
+    return isShowView_;
+}
+
+uint8_t FloatAccessView::GetItemSize()
+{
+    uint8_t count = 0;
+    for (int i = 0; i< MAX_ITEM_SIZE; i++) {
+        if (ItemIsNotNull(items_[i])) {
+            ++count;
+        }
+    }
+    return count;
+}
+
+void FloatAccessView::LoadAppItemsData()
+{
+    // 只加载一次
+    if (isLoadData_) {
+        return;
+    }
+    char quick[MAX_ITEM_SIZE][VIEW_ID_VALUE_LEN] = {0, 0, 0};
+    // 从文件中读取快捷应用的viewId
+    (void)UtilsGetValue("quick1", quick[0], VIEW_ID_VALUE_LEN); // 0: index
+    (void)UtilsGetValue("quick2", quick[1], VIEW_ID_VALUE_LEN); // 1: index
+    (void)UtilsGetValue("quick3", quick[2], VIEW_ID_VALUE_LEN); // 2: index
+
+    List<AppItem>& nativeAppLists = NativeRegisterManager::GetInstance().GetNativeAppLists();
+    uint8_t registerNativeAppNum = nativeAppLists.Size();
+    ListNode<AppItem>* appNode = nativeAppLists.Head();
+    for (int32_t index = 0; index < registerNativeAppNum; index++) {
+        const char* viewIdStr = std::to_string(appNode->data_.id).c_str();
+        // 根据id设置应用的信息
+        for (int k = 0; k < MAX_ITEM_SIZE; k++) {
+            if (strcmp(viewIdStr, quick[k]) == 0) {
+                items_[k] = appNode->data_;
+                break;
+            }
+        }
+        appNode = appNode->next_;
+    }
+    isLoadData_ = true;
+}
+
+void FloatAccessView::AddAppItemsData()
+{
+    if (floatBoxView_ == nullptr) {
+        return;
+    }
+    FloatItem items[MAX_ITEM_SIZE];
+    int cnt = 0;
+    for (int i = 0; i < MAX_ITEM_SIZE; i++) {
+        if (ItemIsNotNull(items_[i])) {
+            std::string s(items_[i].label);
+            ImageInfo* image = ImageCacheManager::GetInstance().LoadSingleRes(items_[i].iconSmall);
+            items[cnt++] = {s, image};
+        }
+    }
+    floatBoxView_->AddItems(items, cnt);
+}
+
+void FloatAccessView::SaveAppItemsData()
+{
+    char dest[MAX_FILE_NAME_LENGTH] = "quick"; // quick1,quick2,quick3 
+    dest[MAX_FILE_NAME_LENGTH - 1] = '\0';
+    for (int i = 0; i<MAX_ITEM_SIZE; i++) {
+        if (ItemIsNotNull(items_[i])) {
+            dest[MAX_FILE_NAME_LENGTH - 2] = '1'+ i;   // 2: 变量数字在倒数第二个位置
+            (void)UtilsSetValue(dest, std::to_string(items_[i].id).c_str());
+        }
+    }
+}
+
+/**
+ * @Param overshot : 超出位置占位移的比例
+ * @Param peakTime : 到达峰值的时间(0~1)
+ */
+double ReboundFunc(double distance, double t, double duration,
+                            double overshot = 0.3, double peakTime = 0.6) {
+    if (t <= 0) return 0.0;
+    if (t >= duration) return distance;
+
+    double x = t / duration;
+    double peakPosition = distance * (1 + overshot);
+
+    // 使用三次贝塞尔曲线控制点确保连续性
+    if (x < peakTime) {
+        // 三次曲线: 曲速到峰值
+        double p = x / peakTime;
+        return distance * (3 * p * p - 2 * p * p * p) + (peakPosition - distance) * p * p; // 3,2: 阶数
+    } else {
+        // 平滑回弹曲线: 从峰值回弹
+        double r = (x - peakTime) / (1 - peakTime);
+        return peakPosition - (peakPosition - distance) * (3 * r * r - 2 * r * r * r); // 3,2: 阶数
+    }
+}
+
+void FloatAnimatorCallback::Callback(UIView *view)
+{
+    UIFloatBoxView* floatBoxView_ = dynamic_cast<UIFloatBoxView*>(view);
+    int16_t pos;
+    if (isExit_) {
+        pos = EasingEquation::QuadEaseOut(startPos_, endPos_, animator_->GetRunTime(), animator_->GetTime());
+    } else {
+        // 进入时使用反弹动画
+        int16_t totalTime = 100;  // 100: 表示总时间为100份
+        int16_t curTime = EasingEquation::LinearEaseNone(0, totalTime, animator_->GetRunTime(), animator_->GetTime());
+        int distance = endPos_ - startPos_;
+        pos = startPos_ + ReboundFunc(distance, curTime, totalTime);
+    }
+    floatBoxView_->SetPosition(pos, pos);
+    floatBoxView_->Invalidate();
+}
+
+void FloatAnimatorCallback::DoEnter()
+{
+    isExit_ = false;
+    startPos_ = EXT_OFFSET;
+    endPos_ = -10;  // -10 end pos
+    animator_->Start();
+}
+
+void FloatAnimatorCallback::DoExit()
+{
+    isExit_ = true;
+    startPos_ = 0;
+    endPos_ = EXT_OFFSET;
+    animator_->Start();
+}
+
+void FloatAnimatorCallback::OnStop(UIView& view)
+{
+    if (isExit_) {
+        FloatAccessView::GetInstance()->CleanView();
+    }
+}
+}
\ No newline at end of file
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/recent_app/src/LoadingFragment.cpp b/code/sdk/application/wearable/evb/nativeapp/nativeui/recent_app/src/LoadingFragment.cpp
new file mode 100644 (file)
index 0000000..85e45db
--- /dev/null
@@ -0,0 +1,36 @@
+/*
+ * Copyright (c) CompanyNameMagicTag 2025-2025. All rights reserved.
+ * Description: LoadingFragment.cpp
+ * Author:
+ * Create: 2025-07-17
+ */
+
+#include "recent_app/LoadingFragment.h"
+#include "wearable_log.h"
+
+namespace OHOS {
+static constexpr uint8_t DEFAULT_TEXT_SIZE = 30;
+
+void LoadingFragment::OnCreateView(void* data)
+{
+    loadingLabel_ = new UILabel();
+    if (loadingLabel_ == nullptr) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new UILabel fail");
+        return;
+    }
+    fragmentView_.Add(loadingLabel_);
+    loadingLabel_->SetText("Loading...");
+    loadingLabel_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, DEFAULT_TEXT_SIZE);
+    loadingLabel_->Resize(300, 100); // 300, 100: size
+    loadingLabel_->LayoutCenterOfParent();
+    loadingLabel_->SetAlign(UITextLanguageAlignment::TEXT_ALIGNMENT_CENTER,
+        UITextLanguageAlignment::TEXT_ALIGNMENT_CENTER);
+}
+
+void LoadingFragment::OnDestroyView()
+{
+    if (loadingLabel_ != nullptr) {
+        delete loadingLabel_;
+    }
+}
+}
\ No newline at end of file
index 63b9a66..7926144 100644 (file)
@@ -23,68 +23,10 @@ namespace OHOS {
 
 REGIST_SLICE(VIEW_RECENT_APP, RecentAppView, RecentAppPresenter);
 
-    RecentAppPresenter::RecentAppPresenter()
-    {
-        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "RecentAppPresenter::RecentAppPresenter()");
-    }
-
-    RecentAppPresenter::~RecentAppPresenter() {}
-
-    void RecentAppPresenter::OnResume()
-    {
-        if (view_ != nullptr) {
-            view_->LoadContent();
-        }
-    }
-
-    bool RecentAppPresenter::OnClick(UIView &view, const ClickEvent &event)
-    {
-        UIRollerView* roller = view_->GetRollerView();
-        if (roller == nullptr) {
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "roller is nullptr!");
-            return false;
-        }
-
-        UIViewGroup* currentItemGroup = roller->GetCurrentItem();
-        if (currentItemGroup == nullptr) {
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "currentItemGroup is nullptr!");
-            return false;
-        }
-
-        std::string itemName = roller->GetCurrentItemName();
-        std::string prefix(itemName.begin(), itemName.begin() + RECENT_ITEM_PREFIX_LEN);
-        std::string name(itemName.begin() + RECENT_ITEM_PREFIX_LEN, itemName.end());
-
-        uint32_t sliceId = 0;
-        bool isNativeSlice = true;
-        if (prefix == RECENT_ITEM_NATIVE_PREFIX) {
-            sliceId = static_cast<uint32_t>(std::stoul(name));
-        } else {
-            isNativeSlice = false;
-        }
-
-        const char* viewId = view.GetViewId();
-        if (viewId != nullptr && strcmp(viewId, RECENT_APP_DELETE_BTN_ID) == 0) {
-            if (isNativeSlice) {
-                RecentManager::GetInstance()->RemoveRecentApp(sliceId);
-            } else {
-                RecentManager::GetInstance()->RemoveRecentApp(name.c_str());
-            }
-            roller->RemoveItem(itemName);
-            return true;
-        }
-
-        Point clickPoint = event.GetCurrentPos();
-        Rect rect = currentItemGroup->GetChildrenHead()->GetRect();
-        if (rect.IsContains(clickPoint)) {
-            if (isNativeSlice) {
-                NativeAbility::GetInstance().ChangeSlice(sliceId);
-            } else {
-#ifdef JS_ENABLE
-                StartJsApp(const_cast<char*>(name.c_str()));
-#endif
-            }
-        }
-        return true;
+void RecentAppPresenter::OnResume()
+{
+    if (view_ != nullptr) {
+        view_->OnResume();
     }
 }
+}
index 7924320..42bf4d4 100644 (file)
@@ -14,6 +14,7 @@
  */
 
 #include "recent_app/RecentAppView.h"
+#include "recent_app/RollerRecentAppFragment.h"
 #include "wearable_log.h"
 #include "common/image_cache_manager.h"
 #include "common/screen.h"
 #include "RecentManager.h"
 
 namespace OHOS {
-static constexpr uint8_t DEFAULT_TEXT_SIZE = 30;
-RecentAppView::RecentAppView()
-{
-    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "RecentAppView::RecentAppView");
-    loadingAnimCb_.SetRecentAppView(this);
-}
 
 RecentAppView::~RecentAppView()
 {
-    if (roller_ != nullptr) {
-        delete roller_;
+    if (loadingFragment_ != nullptr) {
+        loadingFragment_->DestroyView();
+        delete loadingFragment_;
+        loadingFragment_ = nullptr;
+    }
+    if (rencentAppFragment_ != nullptr) {
+        rencentAppFragment_->DestroyView();
+        delete rencentAppFragment_;
+        rencentAppFragment_ = nullptr;
     }
     if (loadingAnim_ != nullptr) {
         if (loadingAnim_->GetState() != Animator::STOP) {
@@ -39,166 +41,66 @@ RecentAppView::~RecentAppView()
         }
         delete loadingAnim_;
     }
-    if (loadingLabel_ != nullptr) {
-        delete loadingLabel_;
-    }
-    if (noRecentAppLabel_ != nullptr) {
-        delete noRecentAppLabel_;
-    }
-    if (delBtn_ != nullptr) {
-        delete delBtn_;
-    }
     WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "RecentAppView::~RecentAppView");
 }
 
 void RecentAppView::OnStart(void)
 {
-    UIViewGroup* container = GetRootContainer();
+    loadingAnimCb_.SetRecentAppView(this);
 
-    loadingLabel_ = new UILabel();
-    if (loadingLabel_ == nullptr) {
-        return;
+    if (loadingFragment_ == nullptr) {
+        loadingFragment_ = new LoadingFragment();
     }
-    container->Add(loadingLabel_);
-    loadingLabel_->SetText("Loading...");
-    loadingLabel_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, DEFAULT_TEXT_SIZE);
-    loadingLabel_->Resize(300, 100); // 300, 100: size
-    loadingLabel_->LayoutCenterOfParent();
-    loadingLabel_->SetAlign(UITextLanguageAlignment::TEXT_ALIGNMENT_CENTER,
-        UITextLanguageAlignment::TEXT_ALIGNMENT_CENTER);
+    loadingFragment_->GetFragmentView()->SetPosition(0, 0, GetRootContainer()->GetWidth(),
+                                                     GetRootContainer()->GetHeight());
+    loadingFragment_->CreateView();
+    AddViewToRootContainer(loadingFragment_->GetFragmentView());
 }
 
-void RecentAppView::LoadContent()
+void RecentAppView::OnResume()
 {
     if (viewiInitStatus_) {
         return;
     }
 
-    UIViewGroup* rootContainer = GetRootContainer();
     if (!RecentManager::GetInstance()->IsUpdateCompleted()) {
-        loadingAnim_ = new Animator(&loadingAnimCb_, roller_, 0, true);
+        loadingAnim_ = new Animator(&loadingAnimCb_, nullptr, 0, true);
         if (loadingAnim_ == nullptr) {
             return;
         }
         loadingAnim_->Start();
     } else {
-        LoadRecentAppContent();
+        LoadContent();
     }
     viewiInitStatus_ = true;
 }
 
-void RecentAppView::LoadingAnimCb::Callback(UIView* view)
-{
-    if (RecentManager::GetInstance()->IsUpdateCompleted()) {
-        recentAppView_->LoadRecentAppContent();
-    }
-}
-
-void RecentAppView::AddRecentAppToRoller()
+void RecentAppView::LoadContent()
 {
-    const List<RecentAppInfo*>& recent = RecentManager::GetInstance()->GetRecentApps();
-    ListNode<RecentAppInfo*>* node = recent.Begin();
-    std::string alignItemName = "";
-    while (node != recent.End()) {
-        RecentAppInfo* appInfo = node->data_;
-        ImageInfo* imgInfo = appInfo->snapshot;
-        std::string name;
-        if (appInfo->isNativeSlice) {
-            name = RECENT_ITEM_NATIVE_PREFIX + std::to_string(appInfo->targetId & SLICE_MASK);
-        } else {
-            name = RECENT_ITEM_JS_PREFIX + appInfo->bundleName;
-        }
-        if (imgInfo->data != nullptr) {
-            roller_->AddItem(name, imgInfo);
-        } else {
-            std::string path(appInfo->snapshot->file, appInfo->snapshot->fileLen);
-            if (appInfo->snapshot->resId == 0) {
-                imgInfo = ImageCacheManager::GetInstance().LoadSingleRes(path);
-            } else {
-                imgInfo = ImageCacheManager::GetInstance().LoadOneInMultiRes(appInfo->snapshot->resId, path);
-            }
-
-            if (imgInfo == nullptr) {
-                GRAPHIC_LOGE("Load res failed: %s", path.c_str());
-                node = node->next_;
-                continue;
-            }
-            roller_->AddItem(name, imgInfo);
-        }
-        node = node->next_;
-        if (alignItemName == "") {
-            alignItemName = name;
-        }
+    if (loadingAnim_ != nullptr) {
+        loadingAnim_->Stop();
     }
-    roller_->SetCurrentItem(alignItemName);
-}
 
-void RecentAppView::InitRecentApps()
-{
-    if (delBtn_ == nullptr) {
-        delBtn_ = new UILabelButton();
-    }
-    if (delBtn_ == nullptr) {
-        GRAPHIC_LOGE("new delBtn_ failed!");
-        return;
+    if (loadingFragment_ != nullptr) {
+        loadingFragment_->GetFragmentView()->SetVisible(false);
     }
-
-    if (roller_ == nullptr) {
-        roller_ = new UIRollerView(false);
+    if (rencentAppFragment_ == nullptr) {
+        rencentAppFragment_ = new RollerRecentAppFragment();
     }
-    if (roller_ == nullptr) {
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new UIRollerView fail");
-        return;
+    if (rencentAppFragment_ != nullptr) {
+        rencentAppFragment_->GetFragmentView()->SetPosition(0, 0, GetRootContainer()->GetWidth(),
+                                                            GetRootContainer()->GetHeight());
+        rencentAppFragment_->CreateView();
+        AddViewToRootContainer(rencentAppFragment_->GetFragmentView());
+    } else {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new RollerRecentAppFragment failed!");
     }
-
-    UIView::OnClickListener* onClickListener = dynamic_cast<UIView::OnClickListener*>(presenter_);
-
-    GetRootContainer()->Add(roller_);
-    roller_->SetPosition(0, 0, Screen::GetInstance().GetWidth(), Screen::GetInstance().GetHeight());
-    roller_->SetItemSize(250, 250); // 250: item size
-    roller_->SetThrowDrag(true);
-    roller_->SetItemPadding(80); // 80: item padding
-    roller_->SetCamDistance(380); // 380: Camera distance
-    roller_->SetCamY(48); // 48: camY
-    roller_->SetOnClickListener(onClickListener);
-
-    GetRootContainer()->Add(delBtn_);
-    delBtn_->Resize(120, 50); // 120,50: width and height
-    delBtn_->LayoutCenterOfParent(0, 180); // 180: y offset
-    delBtn_->SetText("delete");
-    delBtn_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, DEFAULT_TEXT_SIZE);
-    delBtn_->SetViewId(RECENT_APP_DELETE_BTN_ID);
-    delBtn_->SetOnClickListener(onClickListener);
-
-    AddRecentAppToRoller();
 }
 
-void RecentAppView::LoadRecentAppContent()
+void RecentAppView::LoadingAnimCb::Callback(UIView* view)
 {
-    if (loadingAnim_ != nullptr) {
-        loadingAnim_->Stop();
-    }
-
-    if (loadingLabel_ != nullptr) {
-        loadingLabel_->SetVisible(false);
-    }
-
-    uint32_t size = RecentManager::GetInstance()->GetCurrentSize();
-    if (size == 0) {
-        if (noRecentAppLabel_ == nullptr) {
-            noRecentAppLabel_ = new UILabel();
-        }
-        if (noRecentAppLabel_ != nullptr) {
-            GetRootContainer()->Add(noRecentAppLabel_);
-            noRecentAppLabel_->SetText("No Recent App.");
-            noRecentAppLabel_->Resize(300, 100); // 300, 100: size
-            noRecentAppLabel_->LayoutCenterOfParent();
-            noRecentAppLabel_->SetAlign(UITextLanguageAlignment::TEXT_ALIGNMENT_CENTER,
-                UITextLanguageAlignment::TEXT_ALIGNMENT_CENTER);
-        }
-        return;
+    if (RecentManager::GetInstance()->IsUpdateCompleted()) {
+        recentAppView_->LoadContent();
     }
-
-    InitRecentApps();
 }
 }
\ No newline at end of file
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/recent_app/src/RollerRecentAppFragment.cpp b/code/sdk/application/wearable/evb/nativeapp/nativeui/recent_app/src/RollerRecentAppFragment.cpp
new file mode 100644 (file)
index 0000000..86420b1
--- /dev/null
@@ -0,0 +1,180 @@
+/*
+ * Copyright (c) CompanyNameMagicTag 2025-2025. All rights reserved.
+ * Description: RollerRecentAppFragment.cpp
+ * Author:
+ * Create: 2025-07-17
+ */
+
+#include "recent_app/RollerRecentAppFragment.h"
+#include "wearable_log.h"
+#include "common/image_cache_manager.h"
+#include "common/screen.h"
+#include "Slice.h"
+#include "RecentManager.h"
+#include "NativeAbility.h"
+#include "msg_center_customer.h"
+
+namespace OHOS {
+static constexpr uint8_t DEFAULT_TEXT_SIZE = 30;
+
+void RollerRecentAppFragment::OnCreateView(void* data)
+{
+    LoadRecentAppContent();
+}
+
+void RollerRecentAppFragment::OnDestroyView()
+{
+    if (rollerContainer_ != nullptr) {
+        delete rollerContainer_;
+    }
+    if (noRecentAppLabel_ != nullptr) {
+        delete noRecentAppLabel_;
+    }
+    if (delBtn_ != nullptr) {
+        delete delBtn_;
+    }
+}
+
+void RollerRecentAppFragment::LoadRecentAppContent()
+{
+    uint32_t size = RecentManager::GetInstance()->GetCurrentSize();
+    if (size == 0) {
+        if (noRecentAppLabel_ == nullptr) {
+            noRecentAppLabel_ = new UILabel();
+        }
+        if (noRecentAppLabel_ != nullptr) {
+            fragmentView_.Add(noRecentAppLabel_);
+            noRecentAppLabel_->SetText("No Recent App.");
+            noRecentAppLabel_->Resize(300, 100); // 300, 100: size
+            noRecentAppLabel_->LayoutCenterOfParent();
+            noRecentAppLabel_->SetAlign(UITextLanguageAlignment::TEXT_ALIGNMENT_CENTER,
+                UITextLanguageAlignment::TEXT_ALIGNMENT_CENTER);
+        }
+        return;
+    }
+
+    InitRecentApps();
+}
+
+void RollerRecentAppFragment::InitRecentApps()
+{
+    if (delBtn_ == nullptr) {
+        delBtn_ = new UILabelButton();
+    }
+    if (delBtn_ == nullptr) {
+        GRAPHIC_LOGE("new UILabelButton failed!");
+        return;
+    }
+
+    if (rollerContainer_ == nullptr) {
+        rollerContainer_ = new UIRollerView(false);
+    }
+    if (rollerContainer_ == nullptr) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new UIRollerView fail");
+        return;
+    }
+
+    fragmentView_.Add(rollerContainer_);
+    rollerContainer_->SetPosition(0, 0, Screen::GetInstance().GetWidth(), Screen::GetInstance().GetHeight());
+    rollerContainer_->SetItemSize(250, 250); // 250: item size
+    rollerContainer_->SetThrowDrag(true);
+    rollerContainer_->SetItemPadding(80); // 80: item padding
+    rollerContainer_->SetCamDistance(380); // 380: Camera distance
+    rollerContainer_->SetCamY(48); // 48: camY
+    rollerContainer_->SetOnClickListener(this);
+
+    fragmentView_.Add(delBtn_);
+    delBtn_->Resize(120, 50); // 120,50: width and height
+    delBtn_->LayoutCenterOfParent(0, 180); // 180: y offset
+    delBtn_->SetText("delete");
+    delBtn_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, DEFAULT_TEXT_SIZE);
+    delBtn_->SetViewId(RECENT_APP_DELETE_BTN_ID);
+    delBtn_->SetOnClickListener(this);
+
+    AddRecentAppToRoller();
+}
+
+void RollerRecentAppFragment::AddRecentAppToRoller()
+{
+    const List<RecentAppInfo*>& recent = RecentManager::GetInstance()->GetRecentApps();
+    ListNode<RecentAppInfo*>* node = recent.Begin();
+    std::string alignItemName = "";
+    while (node != recent.End()) {
+        RecentAppInfo* appInfo = node->data_;
+        ImageInfo* imgInfo = appInfo->snapshot;
+        std::string name;
+        if (appInfo->isNativeSlice) {
+            name = RECENT_ITEM_NATIVE_PREFIX + std::to_string(appInfo->targetId & SLICE_MASK);
+        } else {
+            name = RECENT_ITEM_JS_PREFIX + appInfo->bundleName;
+        }
+        if (imgInfo->data != nullptr) {
+            rollerContainer_->AddItem(name, imgInfo);
+        } else {
+            std::string path(appInfo->snapshot->file, appInfo->snapshot->fileLen);
+            if (appInfo->snapshot->resId == 0) {
+                imgInfo = ImageCacheManager::GetInstance().LoadSingleRes(path);
+            } else {
+                imgInfo = ImageCacheManager::GetInstance().LoadOneInMultiRes(appInfo->snapshot->resId, path);
+            }
+
+            if (imgInfo == nullptr) {
+                GRAPHIC_LOGE("Load res failed: %s", path.c_str());
+                node = node->next_;
+                continue;
+            }
+            rollerContainer_->AddItem(name, imgInfo);
+        }
+        node = node->next_;
+        if (alignItemName == "") {
+            alignItemName = name;
+        }
+    }
+    rollerContainer_->SetCurrentItem(alignItemName);
+}
+
+bool RollerRecentAppFragment::OnClick(UIView &view, const ClickEvent &event)
+{
+    UIViewGroup* currentItemGroup = rollerContainer_->GetCurrentItem();
+    if (currentItemGroup == nullptr) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "currentItemGroup is nullptr!");
+        return false;
+    }
+
+    std::string itemName = rollerContainer_->GetCurrentItemName();
+    std::string prefix(itemName.begin(), itemName.begin() + RECENT_ITEM_PREFIX_LEN);
+    std::string name(itemName.begin() + RECENT_ITEM_PREFIX_LEN, itemName.end());
+
+    uint32_t sliceId = 0;
+    bool isNativeSlice = true;
+    if (prefix == RECENT_ITEM_NATIVE_PREFIX) {
+        sliceId = static_cast<uint32_t>(std::stoul(name));
+    } else {
+        isNativeSlice = false;
+    }
+
+    const char* viewId = view.GetViewId();
+    if (viewId != nullptr && strcmp(viewId, RECENT_APP_DELETE_BTN_ID) == 0) {
+        if (isNativeSlice) {
+            RecentManager::GetInstance()->RemoveRecentApp(sliceId);
+        } else {
+            RecentManager::GetInstance()->RemoveRecentApp(name.c_str());
+        }
+        rollerContainer_->RemoveItem(itemName);
+        return true;
+    }
+
+    Point clickPoint = event.GetCurrentPos();
+    Rect rect = currentItemGroup->GetChildrenHead()->GetRect();
+    if (rect.IsContains(clickPoint)) {
+        if (isNativeSlice) {
+            NativeAbility::GetInstance().ChangeSlice(sliceId);
+        } else {
+#ifdef JS_ENABLE
+            StartJsApp(const_cast<char*>(name.c_str()));
+#endif
+        }
+    }
+    return true;
+}
+}
\ No newline at end of file
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/recent_app/src/SlipFlowRecentAppFragment.cpp b/code/sdk/application/wearable/evb/nativeapp/nativeui/recent_app/src/SlipFlowRecentAppFragment.cpp
new file mode 100644 (file)
index 0000000..48b71b1
--- /dev/null
@@ -0,0 +1,214 @@
+/*
+ * Copyright (c) CompanyNameMagicTag 2025-2025. All rights reserved.
+ * Description: SlipFlowRecentAppFragment.cpp
+ * Author:
+ * Create: 2025-07-17
+ */
+
+#include "recent_app/SlipFlowRecentAppFragment.h"
+#include "wearable_log.h"
+#include "common/image_cache_manager.h"
+#include "common/screen.h"
+#include "Slice.h"
+#include "RecentManager.h"
+#include "NativeAbility.h"
+#include "msg_center_customer.h"
+
+namespace OHOS {
+void SlipFlowRecentAppFragment::OnCreateView(void* data)
+{
+    LoadRecentAppContent();
+}
+
+void SlipFlowRecentAppFragment::OnDestroyView()
+{
+    if (slipFlowContainer_ != nullptr) {
+        UIViewGroup* child = dynamic_cast<UIViewGroup*>(slipFlowContainer_->GetChildrenHead());
+        while (child != nullptr) {
+            UIView* node = child->GetChildrenHead();
+            child = dynamic_cast<UIViewGroup*>(child->GetNextSibling());
+            delete node;
+        }
+        delete slipFlowContainer_;
+    }
+    if (noRecentAppLabel_ != nullptr) {
+        delete noRecentAppLabel_;
+    }
+    if (slipUpNoticeLabel_ != nullptr) {
+        delete slipUpNoticeLabel_;
+    }
+}
+
+void SlipFlowRecentAppFragment::LoadRecentAppContent()
+{
+    uint32_t size = RecentManager::GetInstance()->GetCurrentSize();
+    if (size == 0) {
+        if (noRecentAppLabel_ == nullptr) {
+            noRecentAppLabel_ = new UILabel();
+        }
+        if (noRecentAppLabel_ != nullptr) {
+            fragmentView_.Add(noRecentAppLabel_);
+            noRecentAppLabel_->SetText("No Recent App.");
+            noRecentAppLabel_->Resize(300, 100); // 300, 100: size
+            noRecentAppLabel_->LayoutCenterOfParent();
+            noRecentAppLabel_->SetAlign(UITextLanguageAlignment::TEXT_ALIGNMENT_CENTER,
+                UITextLanguageAlignment::TEXT_ALIGNMENT_CENTER);
+        }
+        return;
+    }
+
+    InitRecentApps();
+}
+
+void SlipFlowRecentAppFragment::InitRecentApps()
+{
+    if (slipFlowContainer_ == nullptr) {
+        slipFlowContainer_ = new UISlipflowView();
+    }
+    if (slipFlowContainer_ == nullptr) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new UISlipflowView fail");
+        return;
+    }
+    if (slipUpNoticeLabel_ == nullptr) {
+        slipUpNoticeLabel_ = new UILabel();
+    }
+    if (slipUpNoticeLabel_ == nullptr) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new UILabel fail");
+        return;
+    }
+
+    fragmentView_.Add(slipFlowContainer_);
+    slipFlowContainer_->SetPosition(0, 0, Screen::GetInstance().GetWidth(), Screen::GetInstance().GetHeight());
+    slipFlowContainer_->SetThrowDrag(true);
+    slipFlowContainer_->SetOnClickListener(this);
+    slipFlowContainer_->SetOnSlipflowListener(this);
+    AddRecentAppToSlipFlow();
+
+    slipUpNoticeLabel_->SetPosition(127, 400, 200, 50); // 127 400 200 50: label position
+    slipUpNoticeLabel_->SetTextColor(Color::White());
+    slipUpNoticeLabel_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);
+    slipUpNoticeLabel_->SetText("继续上滑删除");
+    slipUpNoticeLabel_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 30); // 30 : font size
+    slipUpNoticeLabel_->SetVisible(false);
+    fragmentView_.Add(slipUpNoticeLabel_);
+}
+
+void SlipFlowRecentAppFragment::AddImageToSlipFlow(int index)
+{
+    UIImageView* image = new UIImageView();
+    image->SetViewId(appNames_[index].c_str());
+    image->SetSrc(appImgInfos_[index]);
+    image->Resize(250, 250); // 250: page size
+    image->SetResizeMode(UIImageView::ImageResizeMode::FILL);
+    image->SetAutoEnable(false);
+    slipFlowContainer_->Add(image);
+    image->LayoutCenterOfParent();
+}
+
+void SlipFlowRecentAppFragment::AddRecentAppToSlipFlow()
+{
+    const List<RecentAppInfo*>& recent = RecentManager::GetInstance()->GetRecentApps();
+    ListNode<RecentAppInfo*>* node = recent.Begin();
+    while (node != recent.End()) {
+        RecentAppInfo* appInfo = node->data_;
+        ImageInfo* imgInfo = appInfo->snapshot;
+        std::string name;
+        if (appInfo->isNativeSlice) {
+            name = RECENT_ITEM_NATIVE_PREFIX + std::to_string(appInfo->targetId & SLICE_MASK);
+        } else {
+            name = RECENT_ITEM_JS_PREFIX + appInfo->bundleName;
+        }
+        if (imgInfo->data == nullptr) {
+            std::string path(appInfo->snapshot->file, appInfo->snapshot->fileLen);
+            if (appInfo->snapshot->resId == 0) {
+                imgInfo = ImageCacheManager::GetInstance().LoadSingleRes(path);
+            } else {
+                imgInfo = ImageCacheManager::GetInstance().LoadOneInMultiRes(appInfo->snapshot->resId, path);
+            }
+
+            if (imgInfo == nullptr) {
+                GRAPHIC_LOGE("Load res failed: %s", path.c_str());
+                node = node->next_;
+                continue;
+            }
+        }
+        appNames_.PushBack(name);
+        appImgInfos_.PushBack(imgInfo);
+        node = node->next_;
+    }
+    int index = appNames_.Size() - 1;
+    while (index >= 0) {
+        AddImageToSlipFlow(index);
+        index--;
+    }
+}
+
+bool SlipFlowRecentAppFragment::OnClick(UIView &view, const ClickEvent &event)
+{
+    std::string itemName(slipFlowContainer_->GetCurrentView()->GetViewId());
+    std::string prefix(itemName.begin(), itemName.begin() + RECENT_ITEM_PREFIX_LEN);
+    std::string name(itemName.begin() + RECENT_ITEM_PREFIX_LEN, itemName.end());
+    UIViewGroup* currentItemGroup = dynamic_cast<UIViewGroup *>(slipFlowContainer_->GetCurrentView());
+    if (currentItemGroup == nullptr) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "currentItemGroup is nullptr!");
+        return false;
+    }
+    uint32_t sliceId = 0;
+    bool isNativeSlice = true;
+    if (prefix == RECENT_ITEM_NATIVE_PREFIX) {
+        sliceId = static_cast<uint32_t>(std::stoul(name));
+    } else {
+        isNativeSlice = false;
+    }
+    Point clickPoint = event.GetCurrentPos();
+    Rect rect = currentItemGroup->GetChildrenHead()->GetRect();
+    if (rect.IsContains(clickPoint)) {
+        if (isNativeSlice) {
+            NativeAbility::GetInstance().ChangeSlice(sliceId);
+        } else {
+#ifdef JS_ENABLE
+            StartJsApp(const_cast<char*>(name.c_str()));
+#endif
+        }
+    }
+    return true;
+}
+
+void SlipFlowRecentAppFragment::OnScrollUpStart()
+{
+    slipUpNoticeLabel_->SetVisible(true);
+}
+
+void SlipFlowRecentAppFragment::OnScrollUpEnd()
+{
+    slipUpNoticeLabel_->SetVisible(false);
+}
+
+bool SlipFlowRecentAppFragment::OnRemove(UIView* view)
+{
+    if (view == nullptr) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Remove view is nullptr!");
+        return false;
+    }
+    std::string itemName(view->GetViewId());
+    std::string prefix(itemName.begin(), itemName.begin() + RECENT_ITEM_PREFIX_LEN);
+    std::string name(itemName.begin() + RECENT_ITEM_PREFIX_LEN, itemName.end());
+    uint32_t sliceId = 0;
+    bool isNativeSlice = true;
+    if (prefix == RECENT_ITEM_NATIVE_PREFIX) {
+        sliceId = static_cast<uint32_t>(std::stoul(name));
+    } else {
+        isNativeSlice = false;
+    }
+    if (view->GetViewId() != nullptr) {
+        if (isNativeSlice) {
+            RecentManager::GetInstance()->RemoveRecentApp(sliceId);
+        } else {
+            RecentManager::GetInstance()->RemoveRecentApp(name.c_str());
+        }
+    }
+    delete view;
+    view = nullptr;
+    return true;
+}
+}
\ No newline at end of file
index 47a30ab..2365d34 100644 (file)
@@ -6,7 +6,6 @@
 \r
 #include "restoredefaults/RestoreDefaultsPresenter.h"\r
 #include "restoredefaults/RestoreDefaultsView.h"\r
-#include "bluetooth/BluetoothModel.h"\r
 #include "bts_br_gap.h"\r
 #include "drag_event.h"\r
 #include "cmsis_os.h"\r
@@ -119,7 +118,6 @@ void RestoreDefaultsPresenter::ConfirmOnClick()
             bundleInfos = nullptr;\r
         }\r
     }\r
-    StopwatchModel::GetInstance().ClearData();\r
     uapi_system_reboot(SYSTEM_SOFT_REBOOT);\r
     return;\r
 }\r
index 991ee59..b958659 100644 (file)
@@ -75,10 +75,11 @@ static void EnterAod()
         ElementName *elementName = AbilityMsClient::GetInstance().GetTopAbility();
         if (elementName != nullptr) {
             g_pre_bundle_name = elementName->bundleName;
+            FreeElement(elementName);
         }
         g_is_native = false;
     }
-    NativeAbility::GetInstance().ChangeSlice(VIEW_AOD);
+    NativeAbility::GetInstance().EnterAod();
 }
 
 static void ExitAod()
@@ -89,11 +90,15 @@ static void ExitAod()
         uint16_t sliceId = NativeAbility::GetInstance().GetPreTargetId() & SLICE_MASK;
         for (uint16_t i = 0; i < sizeof(ignore_slice_ids) / sizeof(uint16_t); i++) {
             if (ignore_slice_ids[i] == sliceId) {
-                NativeAbility::GetInstance().ChangeSlice(sliceId);
+                NativeAbility::GetInstance().ExitAod(sliceId);
                 return;
             }
         }
-        NativeAbility::GetInstance().ChangeSlice(VIEW_MAIN_SAMPLE);
+        if (OHOS::MainViewSample::GetInstance() != nullptr && !OHOS::MainViewSample::GetInstance()->IsMainClockPage()) {
+            // 当前页面为主表盘的其他页面时,切换回主表盘页面
+            OHOS::MainViewSample::GetInstance()->SwitchToClockPage();
+        }
+        NativeAbility::GetInstance().ExitAod(VIEW_MAIN_SAMPLE);
     } else {
         if (!g_is_native) {
             Want *want = new Want();
@@ -109,7 +114,7 @@ static void ExitAod()
             return;
         }
         uint32_t preId = NativeAbility::GetInstance().GetPreTargetId();
-        NativeAbility::GetInstance().SwitchSlice(preId & SLICE_MASK, preId >> PAGE_OFFSET);
+        NativeAbility::GetInstance().ExitAod(preId);
     }
 }
 
index 6be2328..c94c4c9 100644 (file)
@@ -45,7 +45,6 @@ void ScreenModels::InitKvStorage(void)
     int ret = UtilsSetEnv("../bin");
     WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "UtilsSetEnv ../user ret = %d", ret);
 #endif
-
 }
 
 void ScreenModels::LoadAppMultiImages(std::string file, uint32_t startId, uint32_t lastId)
@@ -77,6 +76,5 @@ void ScreenModels::PreLoadAppimages(void)
     LoadAppMultiImages(CLOCK_IAMGES, CLOCK_HAND24HOUR_IMAGE_PATH, CLOCK_TUESDAY_IMAGE_PATH);
     LoadAppMultiImages(COMPASS_IAMGES, COMPASS_ROTATE_CENTER_IMAGE, COMPASS_COMPASS);
     LoadAppMultiImages(DROPDOWN_IAMGES, DROPDOWN_DROPDOWN_BLUETOOTH, DROPDOWN_DROPDOWN_BRI_SCREEN_B);
-    LoadAppMultiImages(HEART_IAMGES, HEART_HEARTRATECOOR, HEART_HEARTRATE_TOP);
 }
 }
index fbf508e..b50403c 100644 (file)
@@ -1,14 +1,18 @@
-/*
- * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved.
- * Description: SettingPresenter.cpp
- * Author:
- * Create: 2021-11-23
- */
-
-#include "settings/SettingView.h"
-#include "settings/SettingPresenter.h"
-#include "NativeRegisterManager.h"
-
-namespace OHOS {
-REGIST_MENU(VIEW_SETTING, SettingView, SettingPresenter, PNG_APPLIST_SETTING_IMAGE, PNG_APPLIST_DEFAULT_IMG, "设置");
-}
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SettingPresenter\r
+ * Create: 2025-06-01\r
+ */\r
+#include "NativeRegisterManager.h"\r
+#include "settings/common/SettingCommon.h"\r
+#include "settings/SettingView.h"\r
+#include "settings/SettingPresenter.h"\r
+\r
+namespace OHOS {\r
+REGIST_MENU(VIEW_SETTING, SettingView, SettingPresenter, SETTING_ICON, SETTING_ICON, "设置");\r
+\r
+SettingPresenter::~SettingPresenter()\r
+{\r
+    ImageCacheManager::GetInstance().UnloadAllInMultiRes(SETTING_IMAGE);\r
+}\r
+}\r
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/settings/src/common/SettingBluetoothItemGroup.cpp b/code/sdk/application/wearable/evb/nativeapp/nativeui/settings/src/common/SettingBluetoothItemGroup.cpp
new file mode 100644 (file)
index 0000000..103d5f1
--- /dev/null
@@ -0,0 +1,129 @@
+/*
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.
+ * Description: SettingBluetoothItemView
+ * Created: 2025-06-05
+ */
+
+#include "wearable_log.h"
+#include "ui_resource_settings.h"
+#include "common/image_cache_manager.h"
+#include "settings/model/SettingBluetoothModel.h"
+#include "settings/common/SettingBluetoothItemGroup.h"
+
+namespace OHOS {
+static constexpr int16_t BLUETOOTH_ITEM_X = 14;
+static constexpr int16_t BLUETOOTH_ITEM_WIDTH = 426;
+static constexpr int16_t BLUETOOTH_ITEM_HEIGHT = 129;
+static constexpr int16_t BLUETOOTH_ITEM_ICON1_X = 30;
+static constexpr int16_t BLUETOOTH_ITEM_ICON1_Y = 35;
+static constexpr int16_t BLUETOOTH_ITEM_ICON2_X = 378;
+static constexpr int16_t BLUETOOTH_ITEM_ICON2_Y = 46;
+static constexpr int16_t BLUETOOTH_ITEM_LABEL1_X = 110;
+static constexpr int16_t BLUETOOTH_ITEM_LABEL1_Y = 15;
+static constexpr int16_t BLUETOOTH_ITEM_LABEL1_STATUS_EXIST_Y = 33;
+static constexpr int16_t BLUETOOTH_ITEM_LABEL2_Y = 57;
+static constexpr int16_t BLUETOOTH_ITEM_CHARTLINE_X = 20;
+static constexpr int16_t BLUETOOTH_ITEM_CHARTLINE_Y = 78;
+static constexpr int16_t BLUETOOTH_ITEM_CHARTLINE_WIDTH = 450;
+static constexpr int16_t BLUETOOTH_ITEM_CHARTLINE_HEIGHT = 2;
+static constexpr int16_t BLUETOOTH_ITEM_ITEM_BUTTON_WIDTH = 390;
+static constexpr int16_t BLUETOOTH_ITEM_ITEM_BUTTON_HEIGHT = 83;
+static constexpr int16_t BLUETOOTH_ITEM_ITEM_LABEL_WIDTH = 240;
+static constexpr int16_t BLUETOOTH_ITEM_ITEM_LABEL_HEIGHT = 40;
+static constexpr int16_t BLUETOOTH_ITEM_ITEM_FONT_SIZE = 32;
+static constexpr int16_t BLUETOOTH_ITEM_IMAGE_SIZE = 300;
+static constexpr int16_t BLUETOOTH_ITEM_CONNSTATE_SIZE = 30;
+
+SettingBluetoothItemGroup::SettingBluetoothItemGroup()
+{
+    SetPosition(BLUETOOTH_ITEM_X, 0, BLUETOOTH_ITEM_WIDTH, BLUETOOTH_ITEM_HEIGHT);
+
+    SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);
+    SetStyle(STYLE_BACKGROUND_COLOR, Color::Gray().full);
+    SetTouchable(true);
+    SetUpChild();
+    ImageInfo* image =
+        ImageCacheManager::GetInstance().LoadOneInMultiRes(IMAGE_BG, SETTING_IMAGE);
+    background_.SetSrc(image);
+    background_.SetPosition(0, 0);
+
+    Add(&background_);
+    Add(&icon_);
+    Add(&deviceName_);
+    Add(&connectStatus_);
+    Add(&conn_);
+}
+
+SettingBluetoothItemGroup::~SettingBluetoothItemGroup()
+{
+    Remove(&background_);
+    Remove(&icon_);
+    Remove(&deviceName_);
+    Remove(&connectStatus_);
+    Remove(&conn_);
+}
+
+void SettingBluetoothItemGroup::SetItemInfo(const BtCaseInfo* itemInfo)
+{
+    if (memcpy_s(itemInfo_.deviceName, BD_NAME_LEN, itemInfo->deviceName, BD_NAME_LEN) != 0) {
+        return;
+    }
+    if (memcpy_s(itemInfo_.addr, BD_ADDR_LEN, itemInfo->addr, BD_ADDR_LEN) != 0) {
+        return;
+    }
+    itemInfo_.connect_status = itemInfo->connect_status;
+    itemInfo_.rssi = itemInfo->rssi;
+    deviceName_.SetText((const char*)itemInfo_.deviceName);
+    WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "SettingBluetoothItemGroup::SetItemInfo %s", itemInfo_.deviceName);
+    WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "SettingBluetoothItemGroup::connect_status %s", itemInfo_.connect_status.c_str());
+    ImageInfo* image = ImageCacheManager::GetInstance().LoadOneInMultiRes(IMAGE_BLUETOOTH, SETTING_IMAGE);
+    icon_.SetSrc(image);
+    connectStatus_.SetText(itemInfo_.connect_status.c_str());
+    if (itemInfo_.connect_status == "已连接") {
+        image = ImageCacheManager::GetInstance().LoadOneInMultiRes(IMAGE_CONNECT, SETTING_IMAGE);
+        conn_.SetSrc(image);
+        conn_.SetVisible(true);
+    } else {
+        conn_.SetVisible(false);
+    }
+    if (itemInfo_.connect_status == "") {
+        deviceName_.SetPosition(BLUETOOTH_ITEM_LABEL1_X, BLUETOOTH_ITEM_LABEL1_STATUS_EXIST_Y);
+        deviceName_.SetVisible(true);
+        connectStatus_.SetVisible(false);
+    } else {
+        deviceName_.SetPosition(BLUETOOTH_ITEM_LABEL1_X, BLUETOOTH_ITEM_LABEL1_Y);
+        deviceName_.SetVisible(true);
+        connectStatus_.SetVisible(true);
+    }
+}
+
+BtCaseInfo& SettingBluetoothItemGroup::GetItem()
+{
+    return itemInfo_;
+}
+
+void SettingBluetoothItemGroup::SetUpChild()
+{
+    icon_.SetPosition(BLUETOOTH_ITEM_ICON1_X, BLUETOOTH_ITEM_ICON1_Y);
+    icon_.SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);
+
+    conn_.SetPosition(BLUETOOTH_ITEM_ICON2_X, BLUETOOTH_ITEM_ICON2_Y);
+    conn_.SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);
+
+    deviceName_.Resize(BLUETOOTH_ITEM_ITEM_LABEL_WIDTH, BLUETOOTH_ITEM_ITEM_LABEL_HEIGHT);
+    deviceName_.SetFont(DEFAULT_VECTOR_FONT_FILENAME, BLUETOOTH_ITEM_ITEM_FONT_SIZE);
+    deviceName_.SetAlign(TEXT_ALIGNMENT_LEFT, TEXT_ALIGNMENT_CENTER);
+    deviceName_.SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);
+    deviceName_.SetStyle(STYLE_TEXT_OPA, OPA_OPAQUE);
+    deviceName_.SetStyle(STYLE_TEXT_COLOR, Color::White().full);
+    deviceName_.SetLineBreakMode(UILabel::LINE_BREAK_MARQUEE);
+
+    connectStatus_.SetPosition(BLUETOOTH_ITEM_LABEL1_X, BLUETOOTH_ITEM_LABEL2_Y);
+    connectStatus_.Resize(BLUETOOTH_ITEM_ITEM_LABEL_WIDTH, BLUETOOTH_ITEM_ITEM_LABEL_HEIGHT);
+    connectStatus_.SetFont(DEFAULT_VECTOR_FONT_FILENAME, BLUETOOTH_ITEM_CONNSTATE_SIZE);
+    connectStatus_.SetAlign(TEXT_ALIGNMENT_LEFT, TEXT_ALIGNMENT_CENTER);
+    connectStatus_.SetStyle(STYLE_TEXT_OPA, OPA_OPAQUE);
+    connectStatus_.SetStyle(STYLE_TEXT_COLOR, Color::White().full);
+    connectStatus_.SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);
+}
+}
\ No newline at end of file
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/settings/src/common/SettingCardAddItemGroup.cpp b/code/sdk/application/wearable/evb/nativeapp/nativeui/settings/src/common/SettingCardAddItemGroup.cpp
new file mode 100644 (file)
index 0000000..b62e2f7
--- /dev/null
@@ -0,0 +1,78 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SettingCardAddItemGroup\r
+ * Create: 2025-06-01\r
+ */\r
+#include "settings/common/SettingCommon.h"\r
+#include "settings/common/SettingCardAddItemGroup.h"\r
+\r
+namespace OHOS {\r
+static constexpr int16_t SETTING_CARD_ADD_ITEM_WIDTH = 157;\r
+static constexpr int16_t SETTING_CARD_ADD_ITEM_HEIGHT = 397;\r
+static constexpr int16_t SETTING_CARD_ADD_ITEM_MARGIN = 15;\r
+static constexpr int16_t SETTING_CARD_ADD_ITEM_IMAGE_WIDTH = 157;\r
+static constexpr int16_t SETTING_CARD_ADD_ITEM_IMAGE_HEIGHT = 157;\r
+static constexpr int16_t SETTING_CARD_ITEM_BUTTON_X = 4;\r
+static constexpr int16_t SETTING_CARD_ITEM_BUTTON_Y = 202;\r
+static constexpr int16_t SETTING_CARD_ITEM_BUTTON_WIDTH = 150;\r
+static constexpr int16_t SETTING_CARD_ITEM_BUTTON_HEIGHT = 70;\r
+\r
+SettingCardAddItemGroup::SettingCardAddItemGroup()\r
+{\r
+    SetPosition(0, 0, SETTING_CARD_ADD_ITEM_WIDTH, SETTING_CARD_ADD_ITEM_HEIGHT);\r
+    SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
+    SetStyle(STYLE_BACKGROUND_OPA, UN_OPACITY);\r
+    SetStyle(STYLE_MARGIN_LEFT, SETTING_CARD_ADD_ITEM_MARGIN);\r
+    SetStyle(STYLE_MARGIN_RIGHT, SETTING_CARD_ADD_ITEM_MARGIN);\r
+\r
+    image_.SetAutoEnable(false);\r
+    image_.SetPosition(0, 0, SETTING_CARD_ADD_ITEM_IMAGE_WIDTH, SETTING_CARD_ADD_ITEM_IMAGE_HEIGHT);\r
+    image_.SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
+    image_.SetStyle(STYLE_BACKGROUND_OPA, UN_OPACITY);\r
+    image_.SetResizeMode(UIImageView::CONTAIN);\r
+\r
+    button_.SetPosition(SETTING_CARD_ITEM_BUTTON_X, SETTING_CARD_ITEM_BUTTON_Y);\r
+    button_.Resize(SETTING_CARD_ITEM_BUTTON_WIDTH, SETTING_CARD_ITEM_BUTTON_HEIGHT);\r
+    button_.SetStyleForState(STYLE_BACKGROUND_COLOR, Color::Black().full, UIButton::PRESSED);\r
+    button_.SetStyleForState(STYLE_BACKGROUND_COLOR, Color::Black().full, UIButton::RELEASED);\r
+    button_.SetStyleForState(STYLE_BACKGROUND_COLOR, Color::Black().full, UIButton::INACTIVE);\r
+    button_.SetStyleForState(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT, UIButton::PRESSED);\r
+    button_.SetStyleForState(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT, UIButton::RELEASED);\r
+    button_.SetStyleForState(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT, UIButton::INACTIVE);\r
+\r
+    Add(&image_);\r
+    Add(&button_);\r
+}\r
+\r
+SettingCardAddItemGroup::~SettingCardAddItemGroup()\r
+{\r
+    if (imageData_ != nullptr && imageSrc_ != nullptr) {\r
+        ImageCacheManager::GetInstance().UnloadSingleRes(imageSrc_);\r
+        imageData_ = nullptr;\r
+        imageSrc_ = nullptr;\r
+    }\r
+}\r
+\r
+void SettingCardAddItemGroup::UpdateItemGroup(SettingCardItemData* itemData)\r
+{\r
+    if (imageData_ != nullptr && imageSrc_ != nullptr) {\r
+        // 通过LoadSingleRes加载的图片不会自动释放\r
+        ImageCacheManager::GetInstance().UnloadSingleRes(imageSrc_);\r
+        imageData_ = nullptr;\r
+        imageSrc_ = nullptr;\r
+    }\r
+\r
+    imageSrc_ = itemData->image;\r
+    imageData_ = ImageCacheManager::GetInstance().LoadSingleRes(imageSrc_);\r
+    image_.SetSrc(imageData_);\r
+    if (itemData->isSelect) {\r
+        ImageInfo* image = ImageCacheManager::GetInstance().LoadOneInMultiRes(IMAGE_CARD_ADD_ADDED, SETTING_IMAGE);\r
+        button_.SetImageSrc(image, image);\r
+        button_.SetTouchable(false);\r
+    } else {\r
+        ImageInfo* image = ImageCacheManager::GetInstance().LoadOneInMultiRes(IMAGE_CARD_ADD_ADD, SETTING_IMAGE);\r
+        button_.SetImageSrc(image, image);\r
+        button_.SetTouchable(true);\r
+    }\r
+}\r
+}\r
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/settings/src/common/SettingCardEffectItemGroup.cpp b/code/sdk/application/wearable/evb/nativeapp/nativeui/settings/src/common/SettingCardEffectItemGroup.cpp
new file mode 100644 (file)
index 0000000..79e2f80
--- /dev/null
@@ -0,0 +1,232 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SettingCardEffectItemGroup\r
+ * Create: 2025-04\r
+ */\r
+#include "common/image_cache_manager.h"\r
+#include "gfx_utils/graphic_log.h"\r
+#include "UiConfig.h"\r
+#include "settings/common/SettingCommon.h"\r
+#include "settings/common/SettingCardEffectSample.h"\r
+#include "settings/common/SettingCardEffectItemGroup.h"\r
+\r
+namespace OHOS {\r
+static constexpr int16_t NUMS_2 = 2;\r
+static constexpr int16_t SCREEN_MIDDLE = HORIZONTAL_RESOLUTION / NUMS_2;\r
+static constexpr int16_t ANIMATOR_SICON_SIZE = 148;\r
+static constexpr int16_t ANIMATOR_SICON_POINT_X = (SCREEN_MIDDLE - ANIMATOR_SICON_SIZE) / NUMS_2;\r
+static constexpr int16_t ANIMATOR_SICON_POINT_Y = 150;\r
+static constexpr int16_t BIND_IMAGE_DELAY = 180;\r
+static constexpr int16_t PAUSE_TIME = 800;\r
+static constexpr int16_t ITEM_LABEL_X = 0;\r
+static constexpr int16_t ITEM_LABEL_Y = 320;\r
+static constexpr int16_t ITEM_LABEL_WIDTH = SCREEN_MIDDLE;\r
+static constexpr int16_t ITEM_LABEL_HEIGHT = 40;\r
+static constexpr int16_t SETTING_ITEM_FONT_SIZE = 30;\r
+static constexpr int16_t BACKDROP_ICON_X = ANIMATOR_SICON_POINT_X - 21;\r
+static constexpr int16_t BACKDROP_ICON_Y = ANIMATOR_SICON_POINT_Y - 21;\r
+static constexpr int16_t BACKDROP_ICON_SIZE = 190;\r
+\r
+SettingCardEffectItemGroup::SettingCardEffectItemGroup()\r
+{\r
+    SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);\r
+    SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
+    SetStyle(STYLE_BACKGROUND_OPA, UN_OPACITY);\r
+    SetTouchable(true);\r
+    SetUpChild();\r
+    Add(&leftSelectIcon_);\r
+    Add(&leftPreviewIcon_);\r
+    Add(&leftAnimator_);\r
+    Add(&leftLabel_);\r
+    Add(&rightSelectIcon_);\r
+    Add(&rightPreviewIcon_);\r
+    Add(&rightAnimator_);\r
+    Add(&rightLabel_);\r
+}\r
+\r
+SettingCardEffectItemGroup::~SettingCardEffectItemGroup()\r
+{\r
+    Remove(&leftAnimator_);\r
+    Remove(&leftLabel_);\r
+    Remove(&leftSelectIcon_);\r
+    Remove(&leftPreviewIcon_);\r
+    Remove(&rightSelectIcon_);\r
+    Remove(&rightPreviewIcon_);\r
+    Remove(&rightAnimator_);\r
+    Remove(&rightLabel_);\r
+}\r
+\r
+void SettingCardEffectItemGroup::SetItemInfo(const SettingCardEffectSample& leftItemInfo,\r
+    const SettingCardEffectSample& rightItemInfo)\r
+{\r
+    leftItemInfo_ = leftItemInfo;\r
+    rightItemInfo_ = rightItemInfo;\r
+\r
+    leftLabel_.SetText(leftItemInfo_.label);\r
+    leftSelectIcon_.SetVisible(leftItemInfo_.selected);\r
+\r
+    if (!LoadMultiImages(leftItemInfo_, false)) {\r
+        GRAPHIC_LOGE("leftItemInfo_ cannot open file: %s", leftItemInfo_.resourceImage);\r
+        return;\r
+    }\r
+\r
+    rightLabel_.SetText(rightItemInfo_.label);\r
+    rightSelectIcon_.SetVisible(rightItemInfo_.selected);\r
+\r
+    if (!LoadMultiImages(rightItemInfo_, true)) {\r
+        GRAPHIC_LOGE("rightItemInfo_ cannot open file: %s", rightItemInfo_.resourceImage);\r
+        return;\r
+    }\r
+}\r
+\r
+bool SettingCardEffectItemGroup::LoadMultiImages(SettingCardEffectSample& itemInfo, bool right)\r
+{\r
+    UIImageView* previewIcon = &leftPreviewIcon_;\r
+    UIImageView* selectIcon = &leftSelectIcon_;\r
+    UIImageAnimatorView* animator = &leftAnimator_;\r
+    uint16_t animatorSiconX =  ANIMATOR_SICON_POINT_X;\r
+    if (right) {\r
+        previewIcon = &rightPreviewIcon_;\r
+        selectIcon = &rightSelectIcon_;\r
+        animator = &rightAnimator_;\r
+        animatorSiconX = ANIMATOR_SICON_POINT_X + SCREEN_MIDDLE;\r
+    }\r
+\r
+    if (itemInfo.viewId == CardEffectID::UI_INVALIDE) { // -1: UI_INVALIDE\r
+        previewIcon->SetVisible(false);\r
+        selectIcon->SetVisible(false);\r
+        animator->SetVisible(false);\r
+        GRAPHIC_LOGE("itemInfo.viewId is  UI_INVALIDE");\r
+        return false;\r
+    }\r
+\r
+    FILE* fp = fopen(itemInfo.resourceImage, "rb");\r
+    if (fp == nullptr) {\r
+        GRAPHIC_LOGE("cannot open file: %s", itemInfo.resourceImage);\r
+        return false;\r
+    }\r
+\r
+    previewIcon->SetSrc(ImageCacheManager::GetInstance().\r
+        LoadOneInMultiRes(itemInfo.resIds[0], itemInfo.resourceImage, fp));\r
+    selectIcon->SetSrc(ImageCacheManager::GetInstance().\r
+        LoadOneInMultiRes(itemInfo.backgroundImageId, itemInfo.resourceImage, fp));\r
+\r
+    uint8_t imageNum = itemInfo.resIds.size();\r
+    std::vector<ImageAnimatorInfo> searchImageInfo(imageNum);\r
+    for (uint8_t i = 0; i < imageNum; i++) {\r
+        searchImageInfo[i].imageInfo = ImageCacheManager::GetInstance().LoadOneInMultiRes(\r
+            itemInfo.resIds[i], itemInfo.resourceImage, fp);\r
+        searchImageInfo[i].imageType = IMG_SRC_IMAGE_INFO;\r
+        searchImageInfo[i].pos.x = animatorSiconX;\r
+        searchImageInfo[i].pos.y = ANIMATOR_SICON_POINT_Y;\r
+        searchImageInfo[i].width = ANIMATOR_SICON_SIZE;\r
+        searchImageInfo[i].height = ANIMATOR_SICON_SIZE;\r
+    }\r
+    animator->SetImageAnimatorSrc(searchImageInfo.data(), imageNum, BIND_IMAGE_DELAY);\r
+    fclose(fp);\r
+    return true;\r
+}\r
+\r
+void SettingCardEffectItemGroup::SetUpChild()\r
+{\r
+    InitializeAnimator(leftAnimator_, ANIMATOR_SICON_POINT_X, ANIMATOR_SICON_POINT_Y, ANIMATOR_SICON_SIZE);\r
+\r
+    InitializeIcon(leftPreviewIcon_, ANIMATOR_SICON_POINT_X, ANIMATOR_SICON_POINT_Y, ANIMATOR_SICON_SIZE);\r
+\r
+    InitializeLabel(leftLabel_, ITEM_LABEL_X, ITEM_LABEL_Y, ITEM_LABEL_WIDTH, ITEM_LABEL_HEIGHT);\r
+\r
+    InitializeIcon(leftSelectIcon_, BACKDROP_ICON_X, BACKDROP_ICON_Y, BACKDROP_ICON_SIZE);\r
+\r
+    int rightItemX = SCREEN_MIDDLE + ANIMATOR_SICON_POINT_X;\r
+    InitializeAnimator(rightAnimator_, rightItemX, ANIMATOR_SICON_POINT_Y, ANIMATOR_SICON_SIZE);\r
+\r
+    InitializeIcon(rightPreviewIcon_, rightItemX, ANIMATOR_SICON_POINT_Y, ANIMATOR_SICON_SIZE);\r
+\r
+    rightItemX = SCREEN_MIDDLE + ITEM_LABEL_X;\r
+    InitializeLabel(rightLabel_, rightItemX, ITEM_LABEL_Y, ITEM_LABEL_WIDTH, ITEM_LABEL_HEIGHT);\r
+\r
+    rightItemX = SCREEN_MIDDLE + BACKDROP_ICON_X;\r
+    InitializeIcon(rightSelectIcon_, rightItemX, BACKDROP_ICON_Y, BACKDROP_ICON_SIZE);\r
+}\r
+\r
+void SettingCardEffectItemGroup::InitializeAnimator(UIImageAnimatorView& animator, int x, int y, int size)\r
+{\r
+    animator.SetPosition(x, y);\r
+    animator.Resize(size, size);\r
+    animator.SetStyle(STYLE_IMAGE_OPA, OPA_OPAQUE);\r
+    animator.SetRepeat(true);\r
+    animator.SetTimeOfPause(PAUSE_TIME);\r
+}\r
+\r
+void SettingCardEffectItemGroup::InitializeIcon(UIImageView& icon, int x, int y, int size)\r
+{\r
+    icon.SetPosition(x, y);\r
+    icon.Resize(size, size);\r
+    icon.SetStyle(STYLE_IMAGE_OPA, OPA_OPAQUE);\r
+    icon.SetVisible(true);\r
+}\r
+\r
+void SettingCardEffectItemGroup::InitializeLabel(UILabel& label, int x, int y, int width, int height)\r
+{\r
+    label.SetPosition(x, y);\r
+    label.Resize(width, height);\r
+    label.SetFont(DEFAULT_VECTOR_FONT_FILENAME, SETTING_ITEM_FONT_SIZE);\r
+    label.SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+    label.SetStyle(STYLE_TEXT_OPA, OPA_OPAQUE);\r
+    label.SetStyle(STYLE_TEXT_COLOR, Color::White().full);\r
+    label.SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
+    label.SetStyle(STYLE_BACKGROUND_OPA, OPA_OPAQUE);\r
+}\r
+\r
+CardEffectID SettingCardEffectItemGroup::GetViewId(const ClickEvent& event)\r
+{\r
+    int16_t clickY = event.GetCurrentPos().y;\r
+    int16_t minItemY = BACKDROP_ICON_Y;\r
+    int16_t maxItemY = BACKDROP_ICON_Y + BACKDROP_ICON_SIZE + ITEM_LABEL_HEIGHT;\r
+\r
+    // Check if the click position is within the valid Y-axis range\r
+    if (clickY < minItemY || clickY > maxItemY) {\r
+        // -1 indicates an invalid UI element\r
+        return CardEffectID::UI_INVALIDE;\r
+    }\r
+\r
+    int16_t clickX = event.GetCurrentPos().x;\r
+    int16_t leftItemX = BACKDROP_ICON_X;\r
+    int16_t rightItemX = SCREEN_MIDDLE + BACKDROP_ICON_X;\r
+    int16_t itemWidth = BACKDROP_ICON_SIZE;\r
+    // Check if the click position is within the left item's X-axis range\r
+    if (clickX > leftItemX && clickX < (leftItemX + itemWidth)) {\r
+        return leftItemInfo_.viewId;\r
+    }\r
+\r
+    // Check if the click position is within the right item's X-axis range\r
+    if (clickX > rightItemX && clickX < rightItemX + itemWidth) {\r
+        return rightItemInfo_.viewId;\r
+    }\r
+\r
+    // -1 indicates an invalid UI element\r
+    return CardEffectID::UI_INVALIDE;\r
+}\r
+\r
+void SettingCardEffectItemGroup::SelectedChange()\r
+{\r
+    leftAnimator_.SetVisible(true);\r
+    leftAnimator_.Start();\r
+    leftPreviewIcon_.SetVisible(false);\r
+\r
+    rightAnimator_.SetVisible(true);\r
+    rightAnimator_.Start();\r
+    rightPreviewIcon_.SetVisible(false);\r
+}\r
+\r
+void SettingCardEffectItemGroup::Reset()\r
+{\r
+    leftAnimator_.SetVisible(false);\r
+    leftAnimator_.Stop();\r
+    leftPreviewIcon_.SetVisible(true);\r
+\r
+    rightAnimator_.SetVisible(false);\r
+    rightAnimator_.Stop();\r
+    rightPreviewIcon_.SetVisible(true);\r
+}\r
+}
\ No newline at end of file
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/settings/src/common/SettingCardMgrItemGroup.cpp b/code/sdk/application/wearable/evb/nativeapp/nativeui/settings/src/common/SettingCardMgrItemGroup.cpp
new file mode 100644 (file)
index 0000000..13ec15f
--- /dev/null
@@ -0,0 +1,47 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SettingCardMgrItemGroup\r
+ * Create: 2025-06-01\r
+ */\r
+#include "settings/common/SettingCommon.h"\r
+#include "settings/common/SettingCardMgrItemGroup.h"\r
+\r
+namespace OHOS {\r
+static constexpr int16_t SETTING_CARD_MGR_ITEM_WIDTH = 454;\r
+static constexpr int16_t SETTING_CARD_MGR_ITEM_HEIGHT = 245;\r
+\r
+SettingCardMgrItemGroup::SettingCardMgrItemGroup()\r
+{\r
+    SetPosition(0, 0, SETTING_CARD_MGR_ITEM_WIDTH, SETTING_CARD_MGR_ITEM_HEIGHT);\r
+    SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
+    SetStyle(STYLE_BACKGROUND_OPA, UN_OPACITY);\r
+\r
+    image_.SetAutoEnable(false);\r
+    image_.SetPosition(0, 0, SETTING_CARD_MGR_ITEM_WIDTH, SETTING_CARD_MGR_ITEM_HEIGHT);\r
+    image_.SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
+    image_.SetStyle(STYLE_BACKGROUND_OPA, UN_OPACITY);\r
+    image_.SetResizeMode(UIImageView::CONTAIN);\r
+    Add(&image_);\r
+}\r
+\r
+SettingCardMgrItemGroup::~SettingCardMgrItemGroup()\r
+{\r
+    if (imageData_ != nullptr && imageSrc_ != nullptr) {\r
+        ImageCacheManager::GetInstance().UnloadSingleRes(imageSrc_);\r
+        imageData_ = nullptr;\r
+        imageSrc_ = nullptr;\r
+    }\r
+}\r
+\r
+void SettingCardMgrItemGroup::UpdateItemGroup(SettingCardItemData* itemData)\r
+{\r
+    if (imageData_ != nullptr && imageSrc_ != nullptr) {\r
+        ImageCacheManager::GetInstance().UnloadSingleRes(imageSrc_);\r
+        imageData_ = nullptr;\r
+        imageSrc_ = nullptr;\r
+    }\r
+    imageSrc_ = itemData->image;\r
+    imageData_ = ImageCacheManager::GetInstance().LoadSingleRes(imageSrc_);\r
+    image_.SetSrc(imageData_);\r
+}\r
+}\r
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/settings/src/common/SettingDesktopHomeItemGroup.cpp b/code/sdk/application/wearable/evb/nativeapp/nativeui/settings/src/common/SettingDesktopHomeItemGroup.cpp
new file mode 100644 (file)
index 0000000..64470b0
--- /dev/null
@@ -0,0 +1,64 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SettingDesktopHomeItemGroup\r
+ * Create: 2025-06-01\r
+ */\r
+#include <cstdint>\r
+#include "UiConfig.h"\r
+#include "wearable_log.h"\r
+#include "settings/common/SettingDesktopHomeItemGroup.h"\r
+\r
+namespace OHOS {\r
+static constexpr int16_t SETTING_HOME_ITEM_WIDTH = 153;\r
+static constexpr int16_t SETTING_HOME_ITEM_HEIGHT = 205;\r
+static constexpr int16_t SETTING_HOME_ITEM_MARGIN = 13;\r
+\r
+static constexpr int16_t SETTING_HOME_BUTTON_HEIGHT = 153;\r
+static constexpr int16_t SETTING_HOME_BUTTON_RADIUS = 0;\r
+static constexpr int16_t SETTING_HOME_LABEL_X = 28;\r
+static constexpr int16_t SETTING_HOME_LABEL_Y = 167;\r
+static constexpr int16_t SETTING_HOME_LABEL_WIDTH = 98;\r
+static constexpr int16_t SETTING_HOME_LABEL_HEIGHT = 38;\r
+static constexpr int16_t SETTING_HOME_LABEL_FSIZE = 32;\r
+\r
+SettingDesktopHomeItemGroup::SettingDesktopHomeItemGroup()\r
+{\r
+    SetPosition(0, 0, SETTING_HOME_ITEM_WIDTH, SETTING_HOME_ITEM_HEIGHT);\r
+    SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
+    SetStyle(STYLE_BACKGROUND_OPA, UN_OPACITY);\r
+    SetStyle(STYLE_MARGIN_LEFT, SETTING_HOME_ITEM_MARGIN);\r
+    SetStyle(STYLE_MARGIN_RIGHT, SETTING_HOME_ITEM_MARGIN);\r
+    SetTouchable(true);\r
+\r
+    button_.SetPosition(0, 0, SETTING_HOME_ITEM_WIDTH, SETTING_HOME_BUTTON_HEIGHT);\r
+    button_.SetStyle(STYLE_BORDER_RADIUS, SETTING_HOME_BUTTON_RADIUS);\r
+\r
+    label_.SetPosition(SETTING_HOME_LABEL_X, SETTING_HOME_LABEL_Y);\r
+    label_.Resize(SETTING_HOME_LABEL_WIDTH, SETTING_HOME_LABEL_HEIGHT);\r
+    label_.SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+    label_.SetFont(DEFAULT_VECTOR_FONT_FILENAME, SETTING_HOME_LABEL_FSIZE);\r
+    label_.SetStyle(STYLE_TEXT_COLOR, Color::White().full);\r
+\r
+    Add(&button_);\r
+    Add(&label_);\r
+}\r
+\r
+SettingDesktopHomeItemGroup::~SettingDesktopHomeItemGroup()\r
+{\r
+    RemoveAll();\r
+}\r
+\r
+void SettingDesktopHomeItemGroup::UpdateItemGroup(SettingDesktopHomeItemData* itemData)\r
+{\r
+    SetViewId(itemData->label);\r
+    label_.SetText(itemData->label);\r
+    ImageInfo* select = ImageCacheManager::GetInstance().LoadOneInMultiRes(itemData->selectIcon, SETTING_IMAGE);\r
+    ImageInfo* unselect = ImageCacheManager::GetInstance().LoadOneInMultiRes(itemData->unSelectIcon, SETTING_IMAGE);\r
+    button_.SetImages(select, unselect);\r
+    if (itemData->isSelect) {\r
+        button_.SetState(UICheckBox::SELECTED, true);\r
+    } else {\r
+        button_.SetState(UICheckBox::UNSELECTED, true);\r
+    }\r
+}\r
+}\r
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/settings/src/common/SettingToggleButton.cpp b/code/sdk/application/wearable/evb/nativeapp/nativeui/settings/src/common/SettingToggleButton.cpp
new file mode 100644 (file)
index 0000000..a4b8d26
--- /dev/null
@@ -0,0 +1,121 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SettingToggleButton\r
+ * Create: 2025-06-01\r
+ */\r
+#include "common/image.h"\r
+#include "imgdecode/cache_manager.h"\r
+#include "engines/gfx/gfx_engine_manager.h"\r
+#include "settings/common/SettingToggleButton.h"\r
+\r
+namespace OHOS {\r
+constexpr uint8_t TOGGLE_BTN_UNSELECTED_OPA = 97;\r
+constexpr uint8_t TOGGLE_HALF_NUM = 2;\r
+#if DEFAULT_ANIMATION\r
+constexpr int16_t DEFAULT_ANIMATOR_TIME = 150;\r
+constexpr float BEZIER_CONTROL_POINT_X_1 = 0.2;\r
+constexpr float BEZIER_CONTROL_POINT_X_2 = 0.2;\r
+#endif\r
+\r
+SettingToggleButton::SettingToggleButton()\r
+{\r
+    backgroundOpacity_ = TOGGLE_BTN_UNSELECTED_OPA;\r
+    image_[UNSELECTED].SetSrc("");\r
+    image_[SELECTED].SetSrc("");\r
+#if DEFAULT_ANIMATION\r
+    checkBoxAnimator_.SetTime(DEFAULT_ANIMATOR_TIME);\r
+#endif\r
+    Resize(width_, height_);\r
+}\r
+\r
+void SettingToggleButton::SetTrackPadding(int16_t padding)\r
+{\r
+    trackPadding_ = padding;\r
+}\r
+\r
+void SettingToggleButton::CalculateSize()\r
+{\r
+    width_ = GetWidth() - 1;   // UIView中保存的矩形宽高会比设置的宽高小1\r
+    height_ = GetHeight() - 1;\r
+\r
+    trackCorner_ = height_ / TOGGLE_HALF_NUM;\r
+    thumbRadius_ = trackCorner_ - trackPadding_;\r
+\r
+    Rect contentRect = GetContentRect();\r
+    leftCenter_ = {static_cast<int16_t>(contentRect.GetX() + trackCorner_),\r
+        static_cast<int16_t>(contentRect.GetY() + trackCorner_)};\r
+    rightCenter_ = {static_cast<int16_t>(contentRect.GetX() + width_ - trackCorner_),\r
+        static_cast<int16_t>(contentRect.GetY() + trackCorner_)};\r
+#if DEFAULT_ANIMATION\r
+    if (checkBoxAnimator_.GetState() != Animator::START) {\r
+        currentCenter_ = (state_ == SELECTED) ? rightCenter_ : leftCenter_;\r
+        backgroundOpacity_ = (state_ == SELECTED) ? OPA_OPAQUE : TOGGLE_BTN_UNSELECTED_OPA;\r
+        bgColor_ = (state_ == SELECTED) ? selectedStateColor_ : Color::White();\r
+    }\r
+#else\r
+    currentCenter_ = (state_ == SELECTED) ? rightCenter_ : leftCenter_;\r
+    backgroundOpacity_ = (state_ == SELECTED) ? OPA_OPAQUE : TOGGLE_BTN_UNSELECTED_OPA;\r
+    bgColor_ = (state_ == SELECTED) ? selectedStateColor_ : Color::White();\r
+#endif\r
+    rectMid_.SetRect(contentRect.GetX(), contentRect.GetY(), contentRect.GetX() + width_,\r
+        contentRect.GetY() + (trackCorner_ << 1) + 1);\r
+}\r
+\r
+void SettingToggleButton::OnDraw(BufferInfo& gfxDstBuffer, const Rect& invalidatedArea)\r
+{\r
+    if ((image_[SELECTED].GetSrcType() != IMG_SRC_UNKNOWN) && (image_[UNSELECTED].GetSrcType() != IMG_SRC_UNKNOWN)) {\r
+        UICheckBox::OnDraw(gfxDstBuffer, invalidatedArea);\r
+    } else {\r
+        CalculateSize();\r
+        BaseGfxEngine::GetInstance()->DrawRect(gfxDstBuffer, GetRect(), invalidatedArea, *style_, opaScale_);\r
+        Rect contentRect = GetContentRect();\r
+        Rect trunc = invalidatedArea;\r
+        bool isIntersect = trunc.Intersect(trunc, contentRect);\r
+        if (isIntersect == false) {\r
+            return;\r
+        }\r
+        Style styleUnSelect = StyleDefault::GetBackgroundTransparentStyle();\r
+        styleUnSelect.bgColor_ = bgColor_;\r
+        styleUnSelect.bgOpa_ = backgroundOpacity_;\r
+        styleUnSelect.borderRadius_ = trackCorner_;\r
+        BaseGfxEngine::GetInstance()->DrawRect(gfxDstBuffer, rectMid_, trunc, styleUnSelect, opaScale_);\r
+        ArcInfo arcInfoLeft = {currentCenter_, {0}, thumbRadius_, 0, CIRCLE_IN_DEGREE, nullptr};\r
+        styleUnSelect.lineColor_ = Color::White();\r
+        styleUnSelect.lineWidth_ = thumbRadius_;\r
+        BaseGfxEngine::GetInstance()->DrawArc(gfxDstBuffer, arcInfoLeft, trunc, styleUnSelect, OPA_OPAQUE,\r
+            CapType::CAP_NONE);\r
+    }\r
+}\r
+\r
+#if DEFAULT_ANIMATION\r
+void SettingToggleButton::Callback(UIView* view)\r
+{\r
+    runTime_ = checkBoxAnimator_.GetRunTime();\r
+    float x = static_cast<float>(runTime_) / checkBoxAnimator_.GetTime();\r
+    float coefficient = Interpolation::GetBezierY(x, BEZIER_CONTROL_POINT_X_1, 0, BEZIER_CONTROL_POINT_X_2, 1);\r
+    if (state_ == SELECTED) {\r
+        currentCenter_.y = rightCenter_.y;\r
+        currentCenter_.x = (rightCenter_.x - leftCenter_.x) * coefficient + leftCenter_.x;\r
+        backgroundOpacity_ = TOGGLE_BTN_UNSELECTED_OPA + (OPA_OPAQUE - TOGGLE_BTN_UNSELECTED_OPA) * coefficient;\r
+        bgColor_ = Color::GetMixColor(selectedStateColor_, Color::White(), OPA_OPAQUE * coefficient);\r
+    } else {\r
+        currentCenter_.y = leftCenter_.y;\r
+        currentCenter_.x = rightCenter_.x - (rightCenter_.x - leftCenter_.x) * coefficient;\r
+        backgroundOpacity_ = OPA_OPAQUE - (OPA_OPAQUE - TOGGLE_BTN_UNSELECTED_OPA) * coefficient;\r
+        bgColor_ = Color::GetMixColor(selectedStateColor_, Color::White(), OPA_OPAQUE * (1 - coefficient));\r
+    }\r
+    Invalidate();\r
+}\r
+\r
+void SettingToggleButton::OnStop(UIView& view)\r
+{\r
+    if (state_ == SELECTED) {\r
+        bgColor_ = selectedStateColor_;\r
+    } else {\r
+        bgColor_ = Color::White();\r
+    }\r
+    backgroundOpacity_ = (state_ == SELECTED) ? OPA_OPAQUE : TOGGLE_BTN_UNSELECTED_OPA;\r
+    Invalidate();\r
+}\r
+#endif\r
+} // namespace OHOS
\ No newline at end of file
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/settings/src/common/SettingUnionItemGroup.cpp b/code/sdk/application/wearable/evb/nativeapp/nativeui/settings/src/common/SettingUnionItemGroup.cpp
new file mode 100644 (file)
index 0000000..205d509
--- /dev/null
@@ -0,0 +1,220 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SettingUnionItemGroup\r
+ * Create: 2025-06-01\r
+ */\r
+#include <cstdint>\r
+#include "wearable_log.h"\r
+#include "main/LoadImg.h"\r
+#include "settings/common/SettingUnionItemGroup.h"\r
+\r
+namespace OHOS {\r
+static constexpr int16_t SETTING_PAGE_ITEM_WIDTH = 426;\r
+static constexpr int16_t SETTING_PAGE_ITEM_HEIGHT = 96;\r
+static constexpr int16_t SETTING_PAGE_ITEM_RADIUS = 48;\r
+static constexpr int16_t SETTING_PAGE_ITEM_MARGIN_BOTTON = 15;\r
+static constexpr int8_t SETTING_PAGE_ITEM_ICON_X = 6;\r
+static constexpr int8_t SETTING_PAGE_ITEM_ICON_Y = 6;\r
+static constexpr int8_t SETTING_PAGE_ITEM_ICON_WIDTH = 84;\r
+static constexpr int8_t SETTING_PAGE_ITEM_ICON_HEIGHT = 84;\r
+static constexpr int16_t SETTING_PAGE_ITEM_LABEL_FSIZE = 32;\r
+\r
+static constexpr int16_t SETTING_PAGE_STATIC_LABEL_WIDTH = 260;\r
+static constexpr int16_t SETTING_PAGE_STATIC_LABEL_HEIGHT = 53;\r
+static constexpr int16_t SETTING_PAGE_STATIC_LABEL_X = 83;\r
+static constexpr int16_t SETTING_PAGE_STATIC_LABEL_Y = 25;\r
+static constexpr int16_t SETTING_PAGE_STATIC_LABEL_FSIZE = 38;\r
+\r
+static constexpr int16_t SETTING_PAGE_TOGGLE_X = 312;\r
+static constexpr int16_t SETTING_PAGE_TOGGLE_Y = 24;\r
+static constexpr int16_t SETTING_PAGE_TOGGLE_WIDTH = 84;\r
+static constexpr int16_t SETTING_PAGE_TOGGLE_HEIGHT = 48;\r
+static constexpr int16_t SETTING_PAGE_TOGGLE_TRACK_PADDING = 4;\r
+\r
+static constexpr int16_t SETTING_PAGE_INPAGE_TLABEL_X = 101;\r
+static constexpr int16_t SETTING_PAGE_INPAGE_LABEL_Y = 29;\r
+static constexpr int16_t SETTING_PAGE_INPAGE_LABEL_WIDTH = 38;\r
+static constexpr int16_t SETTING_PAGE_INPAGE_DLABEL_X_OFFSET = 13; // TextLabel后偏移13个像素是DataLabel的起点\r
+static constexpr int16_t SETTING_PAGE_INPAGE_DLABEL_OPA = 127;\r
+static constexpr int16_t SETTING_PAGE_INPAGE_IMAGE_X = 380;\r
+static constexpr int16_t SETTING_PAGE_INPAGE_IMAGE_Y = 33;\r
+static constexpr int16_t SETTING_PAGE_INPAGE_IMAGE_WIDTH = 18;\r
+static constexpr int16_t SETTING_PAGE_INPAGE_IMAGE_HEIGHT = 31;\r
+\r
+SettingUnionItemType SettingUnionItemData::GetUnionItemType()\r
+{\r
+    return type_;\r
+}\r
+\r
+void* SettingUnionItemData::GetUnionItemData()\r
+{\r
+    return &unionItemData_;\r
+}\r
+\r
+SettingUnionItemData::SettingUnionItemData(const PlainTextItemData& itemData) {\r
+    type_ = PLAIN_TEXT;\r
+    unionItemData_.plainTextItemData = itemData;\r
+}\r
+\r
+SettingUnionItemData::SettingUnionItemData(const IconTextToggleItemData& itemData) {\r
+    type_ = ICON_TEXT_TOGGLE;\r
+    unionItemData_.iconTextToggleItemData = itemData;\r
+}\r
+\r
+SettingUnionItemData::SettingUnionItemData(const IconTextNavigationItemData& itemData) {\r
+    type_ = ICON_TEXT_NAVIGATION;\r
+    unionItemData_.iconTextNavigationItemData = itemData;\r
+}\r
+\r
+PlainTextItemView::PlainTextItemView()\r
+{\r
+    SetPosition(0, 0, SETTING_PAGE_ITEM_WIDTH, SETTING_PAGE_ITEM_HEIGHT);\r
+    SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
+    SetStyle(STYLE_BACKGROUND_OPA, UN_OPACITY);\r
+    SetTouchable(false);\r
+\r
+    label_.SetPosition(SETTING_PAGE_STATIC_LABEL_X, SETTING_PAGE_STATIC_LABEL_Y);\r
+    label_.Resize(SETTING_PAGE_STATIC_LABEL_WIDTH, SETTING_PAGE_STATIC_LABEL_HEIGHT);\r
+    label_.SetFont(BOLD_VECTOR_FONT_FILENAME, SETTING_PAGE_STATIC_LABEL_FSIZE);\r
+    label_.SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+    label_.SetStyle(STYLE_TEXT_OPA, OPA_OPAQUE);\r
+    label_.SetStyle(STYLE_TEXT_COLOR, Color::White().full);\r
+    label_.SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
+    label_.SetStyle(STYLE_BACKGROUND_OPA, OPA_OPAQUE);\r
+    Add(&label_);\r
+}\r
+\r
+PlainTextItemView::~PlainTextItemView()\r
+{\r
+    Remove(&label_);\r
+}\r
+\r
+void PlainTextItemView::UpdateViewData(PlainTextItemData* data)\r
+{\r
+    if (data != nullptr) {\r
+        label_.SetText(data->textContent);\r
+        SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+    }\r
+}\r
+\r
+IconTextToggleItemView::IconTextToggleItemView()\r
+{\r
+    SetPosition(0, 0, SETTING_PAGE_ITEM_WIDTH, SETTING_PAGE_ITEM_HEIGHT);\r
+    SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
+    SetStyle(STYLE_BACKGROUND_OPA, UN_OPACITY);\r
+    SetStyle(STYLE_BORDER_RADIUS, SETTING_PAGE_ITEM_RADIUS);\r
+    SetStyle(STYLE_MARGIN_BOTTOM, SETTING_PAGE_ITEM_MARGIN_BOTTON);\r
+    SetTouchable(true);\r
+\r
+    icon_.SetPosition(SETTING_PAGE_ITEM_ICON_X, SETTING_PAGE_ITEM_ICON_Y);\r
+    icon_.Resize(SETTING_PAGE_ITEM_ICON_WIDTH, SETTING_PAGE_ITEM_ICON_HEIGHT);\r
+    icon_.SetStyle(STYLE_IMAGE_OPA, OPA_OPAQUE);\r
+    icon_.SetAutoEnable(false);\r
+    icon_.SetResizeMode(UIImageView::SCALE_DOWN);\r
+\r
+    label_.SetPosition(SETTING_PAGE_INPAGE_TLABEL_X, SETTING_PAGE_INPAGE_LABEL_Y);\r
+    label_.Resize(0, SETTING_PAGE_INPAGE_LABEL_WIDTH);\r
+    label_.SetLineBreakMode(UILabel::LINE_BREAK_ADAPT);\r
+    label_.SetFont(DEFAULT_VECTOR_FONT_FILENAME, SETTING_PAGE_ITEM_LABEL_FSIZE);\r
+    label_.SetAlign(TEXT_ALIGNMENT_LEFT, TEXT_ALIGNMENT_CENTER);\r
+    label_.SetStyle(STYLE_TEXT_OPA, OPA_OPAQUE);\r
+    label_.SetStyle(STYLE_TEXT_COLOR, Color::White().full);\r
+\r
+    toggleButton_.SetPosition(SETTING_PAGE_TOGGLE_X, SETTING_PAGE_TOGGLE_Y);\r
+    toggleButton_.Resize(SETTING_PAGE_TOGGLE_WIDTH, SETTING_PAGE_TOGGLE_HEIGHT);\r
+    toggleButton_.SetTrackPadding(SETTING_PAGE_TOGGLE_TRACK_PADDING);\r
+    toggleButton_.SetTouchable(false);\r
+\r
+    Add(&icon_);\r
+    Add(&label_);\r
+    Add(&toggleButton_);\r
+}\r
+\r
+IconTextToggleItemView::~IconTextToggleItemView()\r
+{\r
+    Remove(&icon_);\r
+    Remove(&label_);\r
+    Remove(&toggleButton_);\r
+}\r
+\r
+void IconTextToggleItemView::UpdateViewData(IconTextToggleItemData* data)\r
+{\r
+    if (data != nullptr) {\r
+        SetStyle(STYLE_BACKGROUND_COLOR, data->bgColor.full);\r
+        SetStyle(STYLE_BACKGROUND_OPA, data->bgOpa);\r
+        icon_.SetSrc(CacheImage(data->icon));\r
+        label_.SetText(data->textContent);\r
+        toggleButton_.SetState(data->selected);\r
+    }\r
+}\r
+\r
+IconTextNavigationItemView::IconTextNavigationItemView()\r
+{\r
+    SetPosition(0, 0, SETTING_PAGE_ITEM_WIDTH, SETTING_PAGE_ITEM_HEIGHT);\r
+    SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
+    SetStyle(STYLE_BACKGROUND_OPA, UN_OPACITY);\r
+    SetStyle(STYLE_BORDER_RADIUS, SETTING_PAGE_ITEM_RADIUS);\r
+    SetStyle(STYLE_MARGIN_BOTTOM, SETTING_PAGE_ITEM_MARGIN_BOTTON);\r
+    SetTouchable(true);\r
+\r
+    icon_.SetPosition(SETTING_PAGE_ITEM_ICON_X, SETTING_PAGE_ITEM_ICON_Y);\r
+    icon_.Resize(SETTING_PAGE_ITEM_ICON_WIDTH, SETTING_PAGE_ITEM_ICON_HEIGHT);\r
+    icon_.SetStyle(STYLE_IMAGE_OPA, OPA_OPAQUE);\r
+    icon_.SetAutoEnable(false);\r
+    icon_.SetResizeMode(UIImageView::SCALE_DOWN);\r
+\r
+    textLabel_.SetPosition(SETTING_PAGE_INPAGE_TLABEL_X, SETTING_PAGE_INPAGE_LABEL_Y);\r
+    textLabel_.Resize(0, SETTING_PAGE_INPAGE_LABEL_WIDTH);\r
+    textLabel_.SetLineBreakMode(UILabel::LINE_BREAK_ADAPT);\r
+    textLabel_.SetAlign(TEXT_ALIGNMENT_LEFT, TEXT_ALIGNMENT_CENTER);\r
+    textLabel_.SetStyle(STYLE_TEXT_OPA, OPA_OPAQUE);\r
+    textLabel_.SetStyle(STYLE_TEXT_COLOR, Color::White().full);\r
+    textLabel_.SetFont(DEFAULT_VECTOR_FONT_FILENAME, SETTING_PAGE_ITEM_LABEL_FSIZE);\r
+\r
+    dataLabel_.Resize(0, SETTING_PAGE_INPAGE_LABEL_WIDTH);\r
+    dataLabel_.SetLineBreakMode(UILabel::LINE_BREAK_ADAPT);\r
+    dataLabel_.SetAlign(TEXT_ALIGNMENT_LEFT, TEXT_ALIGNMENT_CENTER);\r
+    dataLabel_.SetStyle(STYLE_TEXT_OPA, SETTING_PAGE_INPAGE_DLABEL_OPA);\r
+    dataLabel_.SetStyle(STYLE_TEXT_COLOR, Color::White().full);\r
+    dataLabel_.SetFont(DEFAULT_VECTOR_FONT_FILENAME, SETTING_PAGE_ITEM_LABEL_FSIZE);\r
+\r
+    nextImage_.SetPosition(SETTING_PAGE_INPAGE_IMAGE_X, SETTING_PAGE_INPAGE_IMAGE_Y);\r
+    nextImage_.Resize(SETTING_PAGE_INPAGE_IMAGE_WIDTH, SETTING_PAGE_INPAGE_IMAGE_HEIGHT);\r
+    LOADIMG::LoadImageViewImg(&nextImage_, SETTING_IMAGE, IMAGE_MAIN_LIST_ARROW);\r
+    nextImage_.SetStyle(STYLE_IMAGE_OPA, OPA_OPAQUE);\r
+    nextImage_.SetAutoEnable(false);\r
+    nextImage_.SetResizeMode(UIImageView::SCALE_DOWN);\r
+\r
+    Add(&icon_);\r
+    Add(&textLabel_);\r
+    Add(&dataLabel_);\r
+    Add(&nextImage_);\r
+}\r
+\r
+IconTextNavigationItemView::~IconTextNavigationItemView()\r
+{\r
+    Remove(&icon_);\r
+    Remove(&textLabel_);\r
+    Remove(&dataLabel_);\r
+    Remove(&nextImage_);\r
+}\r
+\r
+void IconTextNavigationItemView::UpdateViewData(IconTextNavigationItemData* data)\r
+{\r
+    if (data != nullptr) {\r
+        SetStyle(STYLE_BACKGROUND_COLOR, data->bgColor.full);\r
+        SetStyle(STYLE_BACKGROUND_OPA, data->bgOpa);\r
+        icon_.SetSrc(CacheImage(data->icon));\r
+        textLabel_.SetText(data->textContent);\r
+        dataLabel_.SetVisible(false);\r
+        if (data->dataContent != nullptr) {\r
+            dataLabel_.SetPosition(\r
+                SETTING_PAGE_INPAGE_TLABEL_X + textLabel_.GetTextWidth() + SETTING_PAGE_INPAGE_DLABEL_X_OFFSET,\r
+                SETTING_PAGE_INPAGE_LABEL_Y);\r
+            dataLabel_.SetText(data->dataContent);\r
+            dataLabel_.SetVisible(true);\r
+        }\r
+        nextImage_.SetVisible(data->hasSecondMenu);\r
+    }\r
+}\r
+}
\ No newline at end of file
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/settings/src/model/SettingAboutModel.cpp b/code/sdk/application/wearable/evb/nativeapp/nativeui/settings/src/model/SettingAboutModel.cpp
new file mode 100644 (file)
index 0000000..e2d871e
--- /dev/null
@@ -0,0 +1,51 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SettingAboutModel\r
+ * Create: 2025-06-01\r
+ */\r
+#include "bts_br_gap.h"\r
+#if !defined(_WIN32)\r
+#include "nv.h"\r
+#endif\r
+#include "nv_config/include/common.h"\r
+#include "settings/common/SettingCommon.h"\r
+#include "settings/model/SettingAboutModel.h"\r
+\r
+namespace OHOS {\r
+constexpr static uint8_t SYS_NAME_LEN = 32;\r
+\r
+std::string SettingAboutModel::GetSystemName()\r
+{\r
+#if !defined(_WIN32)\r
+    unsigned char sysName[SYS_NAME_LEN] = "";\r
+    unsigned char sysNameLen = SYS_NAME_LEN;\r
+    if (bluetooth_get_local_name(sysName, &sysNameLen) != ERRCODE_SUCC) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SettingAboutModel::GetSystemName error");\r
+        return "";\r
+    }\r
+    return std::string((const char*)sysName);\r
+#else\r
+    return std::string("WATCH 2 0322");\r
+#endif\r
+}\r
+\r
+std::string SettingAboutModel::GetSystemType()\r
+{\r
+#if !defined(_WIN32)\r
+    sys_product_info_t info = {0};\r
+    uint16_t nvsize = 0;\r
+    errcode_t ret = uapi_nv_read(NV_ID_SYS_PRODUCT_INFO, sizeof(sys_product_info_t), &nvsize, (uint8_t *)&info);\r
+    if (ret != ERRCODE_SUCC) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SettingAboutModel::GetSystemType error, ret=%u", ret);\r
+        return "";\r
+    }\r
+    if (nvsize < sizeof(sys_product_info_t) || info.size == 0) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "invalid system type: nvsize=%u, info.size=%u", nvsize, info.size);\r
+        return "";\r
+    }\r
+    return std::string((const char*)info.name);\r
+#else\r
+    return std::string("WATCH-BX9");\r
+#endif\r
+}\r
+}\r
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/settings/src/model/SettingBluetoothHeadsetEvent.cpp b/code/sdk/application/wearable/evb/nativeapp/nativeui/settings/src/model/SettingBluetoothHeadsetEvent.cpp
new file mode 100644 (file)
index 0000000..e9070b6
--- /dev/null
@@ -0,0 +1,479 @@
+/*
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.
+ * Description: SettingBluetoothHeadsetEvent
+ * Create: 2022-3-22
+ */
+
+#include "settings/model/SettingBluetoothHeadsetEvent.h"
+#include "bts_avrcp_target.h"
+#include "bts_avrcp_controller.h"
+#include "player/PlayersModel.h"
+#include "graphic_service.h"
+
+using namespace OHOS;
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define AVRCP_CT_AUTO_REG_TYPE    1
+uint8_t g_avrcp_tg_local_media_vol = AVRCP_ABSOLUTE_VOLUME_INVALID;
+#define BT_A2DP_MEDIA_VOL_LEVEL 100
+
+bt_avrcp_tg_bts_cbk g_avrcp_tg_audio_cb;
+avrcp_ct_callbacks_t g_avrcp_ct_cb;
+avrcp_tg_callbacks_t g_avrcp_tg_cb;
+SettingBtAvrcpTgInf g_avrcp_srv_inf;
+
+void SettingBtAvrcpVolumeChangedSyncMedia(uint8_t a2dp_volume)
+{
+    WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "[SettingBtAvrcpVolumeChangedSyncMedia]::a2dp_volume = 0x%x\r\n", a2dp_volume);
+    int32_t audio_volume = a2dp_volume * BT_A2DP_MEDIA_VOL_LEVEL / AVRCP_ABSOLUTE_VOLUME_PERCENTAGE_100;
+    AudioManager::GetInstance().SetVolume(AUDIO_STREAM_A2DP_MUSIC, audio_volume); /* 设置增益音量 */
+    g_avrcp_tg_local_media_vol = a2dp_volume;
+    avrcp_tg_notify_volume_changed(a2dp_volume);
+}
+
+/* tg通知媒体状态 */
+static void SettingBtAvrcpTgNotifyMeidaStatus(bt_avrcp_tg_evt_status_param *notifyEventStatusParam)
+{
+    if (notifyEventStatusParam == nullptr || notifyEventStatusParam->event_id >= AVRCP_NOTIFY_EVENT_RESERVED) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[SettingBtAvrcpTgNotifyMeidaStatus] param is error");
+        return;
+    }
+    switch (notifyEventStatusParam->event_id) {
+        case AVRCP_NOTIFY_EVENT_PLAYBACK_STATUS_CHANGED:
+            avrcp_tg_notify_playback_status_changed(*(td_u8 *)notifyEventStatusParam->event_status);
+            break;
+        case AVRCP_NOTIFY_EVENT_TRACK_CHANGED:
+            avrcp_tg_notify_track_changed(*(unsigned long long *)notifyEventStatusParam->event_status);
+            break;
+        case AVRCP_NOTIFY_EVENT_TRACK_REACHED_END:
+            avrcp_tg_notify_track_reached_end();
+            break;
+        case AVRCP_NOTIFY_EVENT_TRACK_REACHED_START:
+            avrcp_tg_notify_track_reached_start();
+            break;
+        case AVRCP_NOTIFY_EVENT_PLAYBACK_POS_CHANGED:
+            avrcp_tg_notify_playback_pos_changed(*(td_u32 *)notifyEventStatusParam->event_status);
+            break;
+        case AVRCP_NOTIFY_EVENT_BATT_STATUS_CHANGED:
+        case AVRCP_NOTIFY_EVENT_SYSTEM_STATUS_CHANGED:
+        case AVRCP_NOTIFY_EVENT_PLAYER_APPLICATION_SETTING_CHANGED:
+            break;
+        case AVRCP_NOTIFY_EVENT_NOW_PLAYING_CONTENT_CHANGED:
+            avrcp_tg_notify_now_playing_content_changed();
+            break;
+        case AVRCP_NOTIFY_EVENT_AVAILABLE_PLAYERS_CHANGED:
+            avrcp_tg_notify_available_players_changed();
+            break;
+        case AVRCP_NOTIFY_EVENT_ADDRESSED_PLAYER_CHANGED:
+            avrcp_tg_notify_addressed_players_changed(*(td_u16 *)notifyEventStatusParam->event_status,
+                *(td_u16 *)(notifyEventStatusParam->event_status + sizeof(td_u16)));
+            break;
+        case AVRCP_NOTIFY_EVENT_UIDS_CHANGED:
+            avrcp_tg_notify_uid_changed(*(td_u16 *)notifyEventStatusParam->event_status);
+            break;
+        case AVRCP_NOTIFY_EVENT_VOLUME_CHANGED:
+            SettingBtAvrcpVolumeChangedSyncMedia(notifyEventStatusParam->event_status[0]);
+            break;
+        case AVRCP_NOTIFY_EVENT_RESERVED:
+            break;
+        default:
+            break;
+    }
+}
+
+void SettingPressButtonStatusCallback(td_u32 keyOperation, td_u32 keyValue)
+{
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[SettingPressButtonStatusCallback]::keyValue = 0x%x  keyOperation = 0x%x",
+        keyValue, keyOperation);
+    GraphicService::GetInstance()->PostGraphicEvent(std::bind(SettingUsingPressButtonStatusCallback, keyOperation, keyValue));
+}
+
+void SettingBtAvrcpTgNotifyVolumeChangedProc(uint8_t a2dp_volume)
+{
+    int32_t audio_volume = a2dp_volume * BT_A2DP_MEDIA_VOL_LEVEL / AVRCP_ABSOLUTE_VOLUME_PERCENTAGE_100;
+    WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "NotifyVolume = %d", audio_volume);
+    AudioManager::GetInstance().SetVolume(AUDIO_STREAM_MUSIC, audio_volume); // 耳机连接手表场景调节手表音量
+}
+
+void SettingUsingPressButtonStatusCallback(td_u32 keyOperation, td_u32 keyValue)
+{
+    bt_avrcp_tg_evt_status_param event;
+    switch (keyOperation) {
+        case AVRCP_KEY_VOLUME_UP: // 耳机控制手表加减音量不走key_operation事件
+        case AVRCP_KEY_VOLUME_DOWN: // 减小音量
+            break;
+        case AVRCP_KEY_MUTE: // 静音
+            event.event_status[0] = AVRCP_ABSOLUTE_VOLUME_PERCENTAGE_0;
+            event.event_id = AVRCP_NOTIFY_EVENT_VOLUME_CHANGED;
+            break;
+        case AVRCP_KEY_PLAY: // 播放
+            (void)PlayersModel::GetInstance()->PlayerPlay();
+            event.event_status[0] = AVRCP_PLAY_STATUS_PLAYING;
+            event.event_id = AVRCP_NOTIFY_EVENT_PLAYBACK_STATUS_CHANGED;
+            break;
+        case AVRCP_KEY_STOP: // 停止
+            (void)PlayersModel::GetInstance()->PlayerStop();
+            event.event_status[0] = AVRCP_PLAY_STATUS_STOPPED;
+            event.event_id = AVRCP_NOTIFY_EVENT_PLAYBACK_STATUS_CHANGED;
+            break;
+        case AVRCP_KEY_PAUSE: // 暂停
+            (void)PlayersModel::GetInstance()->PlayerPause();
+            event.event_status[0] = AVRCP_PLAY_STATUS_PAUSED;
+            event.event_id = AVRCP_NOTIFY_EVENT_PLAYBACK_STATUS_CHANGED;
+            break;
+        case AVRCP_KEY_FORWARD: // 下一曲
+            PlayersModel::GetInstance()->LoopingPlayout();
+            event.event_status[0] = AVRCP_PLAY_STATUS_FWD_SEEK;
+            event.event_id = AVRCP_NOTIFY_EVENT_PLAYBACK_STATUS_CHANGED;
+            break;
+        case AVRCP_KEY_BACKWARD: // 上一曲
+            PlayersModel::GetInstance()->PreviousPlayout();
+            event.event_status[0] = AVRCP_PLAY_STATUS_REV_SEEK;
+            event.event_id = AVRCP_NOTIFY_EVENT_PLAYBACK_STATUS_CHANGED;
+            break;
+        case AVRCP_NOTIFY_EVENT_VOLUME_CHANGED:
+            /* 手机连接手表场景,控制手表喇叭声音 */
+            event.event_status[0] = keyValue;
+            event.event_id = AVRCP_NOTIFY_EVENT_VOLUME_CHANGED;
+            SettingBtAvrcpTgNotifyVolumeChangedProc((uint8_t)keyValue);
+        default:
+            break;
+    }
+
+    SettingBtAvrcpTgNotifyMeidaStatus(&event);
+}
+
+uint8_t SettingBtAvrcpTgGetLocMediaVolume(void)
+{
+    if (g_avrcp_tg_local_media_vol == AVRCP_ABSOLUTE_VOLUME_INVALID) {
+        int32_t audio_volume = AudioManager::GetInstance().GetVolume(AUDIO_STREAM_A2DP_MUSIC);
+        uint8_t a2dp_volume = (uint8_t)(audio_volume * AVRCP_ABSOLUTE_VOLUME_PERCENTAGE_100 / BT_A2DP_MEDIA_VOL_LEVEL);
+        WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "audio_volume 0x%x, a2dp_volume 0x%x\n", audio_volume, a2dp_volume);
+        g_avrcp_tg_local_media_vol = a2dp_volume;
+    }
+
+    WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "get local media volume, a2dp_volume = 0x%x", g_avrcp_tg_local_media_vol);
+    return g_avrcp_tg_local_media_vol;
+}
+
+void SettingMediaStatusCallback(bt_avrcp_tg_evt_status_param *eventStatusParam)
+{
+    if (eventStatusParam == nullptr) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "eventStatusParam is nullptr");
+        return;
+    }
+
+    int32_t playerStatus = PlayersModel::GetInstance()->GetPlayerstatus();
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "playerStatus = %d", playerStatus);
+
+    switch (eventStatusParam->event_id) {
+        case AVRCP_NOTIFY_EVENT_PLAYBACK_STATUS_CHANGED:
+            eventStatusParam->event_status[0] = playerStatus;
+            break;
+        case AVRCP_NOTIFY_EVENT_TRACK_CHANGED:
+        case AVRCP_NOTIFY_EVENT_TRACK_REACHED_END:
+            break;
+        case AVRCP_NOTIFY_EVENT_TRACK_REACHED_START:
+            break;
+        case AVRCP_NOTIFY_EVENT_PLAYBACK_POS_CHANGED:
+            eventStatusParam->event_status[0] = 0xFF;
+            break;
+        case AVRCP_NOTIFY_EVENT_BATT_STATUS_CHANGED:
+        case AVRCP_NOTIFY_EVENT_SYSTEM_STATUS_CHANGED:
+        case AVRCP_NOTIFY_EVENT_PLAYER_APPLICATION_SETTING_CHANGED:
+            break;
+        case AVRCP_NOTIFY_EVENT_NOW_PLAYING_CONTENT_CHANGED:
+            break;
+        case AVRCP_NOTIFY_EVENT_AVAILABLE_PLAYERS_CHANGED:
+            break;
+        case AVRCP_NOTIFY_EVENT_ADDRESSED_PLAYER_CHANGED:
+            break;
+        case AVRCP_NOTIFY_EVENT_UIDS_CHANGED:
+            break;
+        case AVRCP_NOTIFY_EVENT_VOLUME_CHANGED:
+            eventStatusParam->event_status[0] = SettingBtAvrcpTgGetLocMediaVolume();
+            break;
+        case AVRCP_NOTIFY_EVENT_RESERVED:
+            break;
+        default :
+            break;
+    }
+}
+
+void SettingConnCtStateChangedCallback(const bd_addr_t *bdAddr, profile_connect_state_t state)
+{
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "avrcp ct update conn stat:%u", state);
+    if (bdAddr == nullptr) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "bdaddr nullptr");
+        return;
+    }
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SettingConnCtStateChangedCallback addr: %02x%02x%02x%02x%02x%02x ",
+        bdAddr->addr[5], bdAddr->addr[4], bdAddr->addr[3], /* 5 4 3 idx */
+        bdAddr->addr[2], bdAddr->addr[1], bdAddr->addr[0]); /* 2 1 0 idx */
+    (void)memcpy_s(g_avrcp_srv_inf.bd_addr.addr, BD_ADDR_LEN, bdAddr->addr, BD_ADDR_LEN);
+    g_avrcp_srv_inf.avrcp_srv_conn_stat = state;
+}
+
+static bd_addr_t *SettingBtAvrcpSrvGetActiveAddr(void)
+{
+    return &g_avrcp_srv_inf.bd_addr;
+}
+
+void SettingConnectTgStateChangedCallback(const bd_addr_t *bdAddr, profile_connect_state_t state)
+{
+    WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "avrcp tg update conn stat:%u", state);
+    if (bdAddr == nullptr) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "bdaddr nullptr");
+        return;
+    }
+
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SettingConnCtStateChangedCallback addr: %02x%02x%02x%02x%02x%02x ",
+        bdAddr->addr[5], bdAddr->addr[4], bdAddr->addr[3], /* 5 4 3 idx */
+        bdAddr->addr[2], bdAddr->addr[1], bdAddr->addr[0]); /* 2 1 0 idx */
+    (void)memcpy_s(g_avrcp_srv_inf.bd_addr.addr, BD_ADDR_LEN, bdAddr->addr, BD_ADDR_LEN);
+    g_avrcp_srv_inf.avrcp_srv_conn_stat = state;
+
+    /* 手表耳机链接场景时,耳机控制音量是一个事件而非key_operation,故需要在手表侧向耳机注册音量变更事件 */
+    if (state == PROFILE_STATE_CONNECTED) {
+        (void)avrcp_ct_get_supported_events(SettingBtAvrcpSrvGetActiveAddr());
+    }
+}
+
+static void SettingBtAvrcpCtPressButtonRspCallback(const bd_addr_t *bd_addr, int32_t key_operation)
+{
+    if (bd_addr == nullptr) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "null pointer\n");
+        return;
+    }
+    if (g_avrcp_srv_inf.avrcp_button_flag == SETTING_AVRCP_SRV_RELEASED_VALUE) {
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "avrcp ct press button button_flag change:%u->%u\n",
+            g_avrcp_srv_inf.avrcp_button_flag, SETTING_AVRCP_SRV_PRESS_VALUE);
+        g_avrcp_srv_inf.avrcp_button_flag = SETTING_AVRCP_SRV_PRESS_VALUE;
+    }
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "avrcp ct press button cbk key:%d button_flag:%u\n",
+        key_operation, g_avrcp_srv_inf.avrcp_button_flag);
+}
+
+static void SettingBtAvrcpPressReleaseButtonLog(uint32_t key_operation)
+{
+    switch (key_operation) {
+        case AVRCP_KEY_VOLUME_UP:
+            WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "AVRCP_KEY_VOLUME_UP\n");
+            break;
+        case AVRCP_KEY_VOLUME_DOWN:
+            WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "AVRCP_KEY_VOLUME_DOWN\n");
+            break;
+        case AVRCP_KEY_MUTE:
+            WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "AVRCP_KEY_VOLUME_MUTE\n");
+            break;
+        case AVRCP_KEY_PLAY:
+            WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "AVRCP_KEY_PLAY\n");
+            break;
+        case AVRCP_KEY_STOP:
+            WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "AVRCP_KEY_STOP\n");
+            break;
+        case AVRCP_KEY_PAUSE:
+            WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "AVRCP_KEY_PAUSE\n");
+            break;
+        case AVRCP_KEY_FORWARD:
+            WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "AVRCP_KEY_FORWARD\n");
+            break;
+        case AVRCP_KEY_BACKWARD:
+            WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "AVRCP_KEY_BACKWARD\n");
+            break;
+        case AVRCP_NOTIFY_EVENT_VOLUME_CHANGED:
+            WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "AVRCP_EVENT_VOLUME_CHANGED\n");
+            break;
+        default:
+            WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "invalid\n");
+            break;
+    }
+}
+
+static void SettingBtAvrcpCtReleaseButtonRspCallback(const bd_addr_t *bd_addr, int32_t key_operation)
+{
+    UNUSED(bd_addr);
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "avrcp ct release button cbk key:%d\n", key_operation);
+    if (g_avrcp_srv_inf.avrcp_button_flag == SETTING_AVRCP_SRV_PRESS_VALUE) {
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "avrcp ct released button button_flag change:%u->%u\n",
+            g_avrcp_srv_inf.avrcp_button_flag, SETTING_AVRCP_SRV_RELEASED_VALUE);
+        g_avrcp_srv_inf.avrcp_button_flag = SETTING_AVRCP_SRV_RELEASED_VALUE;
+    }
+    SettingBtAvrcpPressReleaseButtonLog((uint32_t)key_operation);
+}
+
+static void SettingBtAvrcpCtSupportCompanyCallback(const bd_addr_t *bd_addr, avrcp_ct_support_company_para_t *company)
+{
+    if (bd_addr == nullptr || company == nullptr || company->company_id == nullptr) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,  "null pointer\n");
+        return;
+    }
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "get company list:");
+    for (uint8_t i = 0; i < company->company_num; i++) {
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, " 0x%x ", *company->company_id);
+    }
+}
+
+static void SettingBtAvrcpCtSupportEventCallback(const bd_addr_t *bd_addr, avrcp_ct_support_event_para_t *event)
+{
+    if (bd_addr == nullptr || event == nullptr || event->event_id == nullptr) {
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "null pointer\n");
+        return;
+    }
+
+    for (uint8_t i = 0; i < event->event_num; i++) {
+        if (event->event_id[i] == AVRCP_NOTIFY_EVENT_VOLUME_CHANGED) {
+            int ret = avrcp_ct_register_notification(bd_addr, event->event_id[i], 0);
+            WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "register event_id: 0x%x, ret = 0x%x", event->event_id[i], ret);
+        }
+    }
+
+    for (uint8_t i = 0; i < event->event_num; i++) {
+        if (event->event_id[i] != AVRCP_NOTIFY_EVENT_VOLUME_CHANGED) {
+            int ret = avrcp_ct_register_notification(bd_addr, event->event_id[i], 0);
+            WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "register event_id: 0x%x, ret = 0x%x", event->event_id[i], ret);
+        }
+    }
+}
+
+static void SettingBtAvrcpCtGetElementAttriCallback(const bd_addr_t *bd_addr, avrcp_ct_element_attr_para_cb_t *attr_cb_para)
+{
+    if (bd_addr == nullptr || attr_cb_para == nullptr || attr_cb_para->attr_value == nullptr) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "null pointer\n");
+        return;
+    }
+
+    for (uint8_t i = 0; i < attr_cb_para->attr_num; i++) {
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "attrId-charaId-valLen: 0x%x-0x%x-%u \n",
+            attr_cb_para->attr_value[i].attr_id,
+            attr_cb_para->attr_value[i].character_set_id,
+            attr_cb_para->attr_value[i].value_len);
+        switch (attr_cb_para->attr_value[i].attr_id) {
+            case AVRCP_CT_ELEMENT_ATTR_TITLE:
+                WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Attr Title:");
+                break;
+            case AVRCP_CT_ELEMENT_ATTR_ARTIST_NAME:
+                WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Attr Name:");
+                break;
+            case AVRCP_CT_ELEMENT_ATTR_ALBUM_NAME:
+                WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Attr Album:");
+                break;
+            case AVRCP_CT_ELEMENT_ATTR_TRACK_NUMBER:
+                WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Attr Track Number:");
+                break;
+            case AVRCP_CT_ELEMENT_ATTR_TOTAL_NUMBER_OF_TRACKS:
+                WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Attr Total Number Of Track:");
+                break;
+            case AVRCP_CT_ELEMENT_ATTR_TRACK_GENRE:
+                WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Attr Track GENRE:");
+                break;
+            case AVRCP_CT_ELEMENT_ATTR_TRACK_PLAYING_TIME:
+                WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Attr Track Playing Time_ms:");
+                break;
+            default:
+                WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Other:");
+                break;
+        }
+
+        uint8_t *value = (uint8_t *)(void *)malloc(attr_cb_para->attr_value[i].value_len + 1);
+        if (attr_cb_para->attr_value[i].value_len > 0 &&  attr_cb_para->attr_value[i].value != nullptr) {
+            if (memcpy_s(value, attr_cb_para->attr_value[i].value_len,
+                attr_cb_para->attr_value[i].value, attr_cb_para->attr_value[i].value_len) != EOK) {
+                free(value);
+                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "memcpy_s fail.");
+                return;
+            }
+        }
+        value[attr_cb_para->attr_value[i].value_len] = '\0';
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, " %s \n", value);
+        free(value);
+    }
+}
+
+static void SettingBtAvrcpCtGetPlayStatusCallback(const bd_addr_t *bd_addr, avrcp_ct_play_status_cb_t *status)
+{
+    if (bd_addr == nullptr || status == nullptr) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "null pointer\n");
+        return;
+    }
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "test get play status songlen:%u, songpos:%u, playstatus:%u:",
+        status->song_length, status->song_position, status->play_status);
+}
+
+static void SettingBtAvrcpCtHdlNotifyVolumeRspCbk(avrcp_ct_notification_value_cb_t *notification)
+{
+    WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "Set local volume: 0x%x\n", notification->volume); /* 注册事件后通知的音量 */
+    SettingBtAvrcpTgNotifyVolumeChangedProc((uint8_t)notification->volume);
+}
+
+static void SettingBtAvrcpCtNotificationCallback(
+    const bd_addr_t *bd_addr, avrcp_notify_event_t event_id, avrcp_ct_notification_value_cb_t *notification)
+{
+    if (bd_addr == nullptr || notification == nullptr) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "null pointer\n");
+        return;
+    }
+
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ct notification cbk event_id:0x%x\n", event_id);
+    bool notify_flag = true;
+    switch (event_id) {
+        case AVRCP_NOTIFY_EVENT_PLAYBACK_STATUS_CHANGED:
+            WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "tg notify ct playback status changed :%u\n",
+                notification->play_status);
+            break;
+        case AVRCP_NOTIFY_EVENT_VOLUME_CHANGED:
+            SettingBtAvrcpCtHdlNotifyVolumeRspCbk(notification);
+            break;
+        case AVRCP_NOTIFY_EVENT_NOW_PLAYING_CONTENT_CHANGED:
+            WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "play conent changed event_id:0x%x\n", event_id);
+            break;
+        case AVRCP_NOTIFY_EVENT_TRACK_CHANGED:
+            WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "track changed event_id:0x%x\n", event_id);
+            break;
+        case AVRCP_NOTIFY_EVENT_TRACK_REACHED_END:
+        case AVRCP_NOTIFY_EVENT_TRACK_REACHED_START:
+        case AVRCP_NOTIFY_EVENT_PLAYBACK_POS_CHANGED:
+        case AVRCP_NOTIFY_EVENT_BATT_STATUS_CHANGED:
+        case AVRCP_NOTIFY_EVENT_SYSTEM_STATUS_CHANGED:
+        case AVRCP_NOTIFY_EVENT_PLAYER_APPLICATION_SETTING_CHANGED:
+        case AVRCP_NOTIFY_EVENT_AVAILABLE_PLAYERS_CHANGED:
+        case AVRCP_NOTIFY_EVENT_ADDRESSED_PLAYER_CHANGED:
+        case AVRCP_NOTIFY_EVENT_UIDS_CHANGED:
+        case AVRCP_NOTIFY_EVENT_RESERVED:
+        default:
+            notify_flag = false;
+            WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "invalid event id event_id:0x%x\n", event_id);
+            break;
+    }
+    if (notify_flag) {
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "notify reg event_id: 0x%x\n", event_id);
+        avrcp_ct_register_notification(bd_addr, event_id, 0); /* TG通知变化后CT重新注册事件 */
+    }
+}
+
+void SettingInitBtHeadsetEvent()
+{
+    g_avrcp_tg_audio_cb.notify_pass_through_status_cbk = SettingPressButtonStatusCallback;
+    g_avrcp_tg_audio_cb.get_media_status_cbk = SettingMediaStatusCallback;
+
+    g_avrcp_tg_cb.conn_state_changed_cb = SettingConnectTgStateChangedCallback;
+
+    g_avrcp_ct_cb.conn_state_changed_cb = SettingConnCtStateChangedCallback;
+    g_avrcp_ct_cb.press_button_cb = SettingBtAvrcpCtPressButtonRspCallback;
+    g_avrcp_ct_cb.release_button_cb = SettingBtAvrcpCtReleaseButtonRspCallback;
+    g_avrcp_ct_cb.supported_companies_cb = SettingBtAvrcpCtSupportCompanyCallback;
+    g_avrcp_ct_cb.supported_event_cb = SettingBtAvrcpCtSupportEventCallback;
+    g_avrcp_ct_cb.element_attr_cb = SettingBtAvrcpCtGetElementAttriCallback;
+    g_avrcp_ct_cb.play_status_cb = SettingBtAvrcpCtGetPlayStatusCallback;
+    g_avrcp_ct_cb.notification_cb = SettingBtAvrcpCtNotificationCallback;
+
+    avrcp_tg_register_callbacks(&g_avrcp_tg_cb);
+    avrcp_ct_register_callbacks(&g_avrcp_ct_cb);
+    bt_avrcp_tg_register_audio_cbk(&g_avrcp_tg_audio_cb);
+}
+#ifdef __cplusplus
+}
+#endif
\ No newline at end of file
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/settings/src/model/SettingBluetoothModel.cpp b/code/sdk/application/wearable/evb/nativeapp/nativeui/settings/src/model/SettingBluetoothModel.cpp
new file mode 100644 (file)
index 0000000..f523243
--- /dev/null
@@ -0,0 +1,1438 @@
+/*
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.
+ * Description: SettingSettingBluetoothModel
+ * Created: 2025-06-05
+ */
+
+#include <cstdint>
+#include "bluetooth/BluetoothWrapper.h"
+#include "player/PlayersModel.h"
+#include "phoneservice/PhoneAudio.h"
+#include "graphic_service.h"
+#include "msg_center.h"
+#include "bts_def.h"
+#include "bts_gatt_stru.h"
+#include "bts_a2dp_source.h"
+#include "bts_gatt_server.h"
+#include "bts_le_gap.h"
+#include "bts_spp.h"
+#include "osal_task.h"
+#ifdef SUPPORT_ALIPAY_SEC
+#include "alipay_feature.h"
+#endif
+#include "bts_a2dp_sink.h"
+#include "bts_feature.h"
+#include "bt_audio_hal_interface.h"
+#include "audio_manager_c_wrapper.h"
+#include "bts_avrcp_target.h"
+#include "msg_center_msg.h"
+#include "client/msg_center_client.h"
+#include "msg_center_protocol.h"
+#include "dfx_channel.h"
+#include "tcxo.h"
+#include "uiservice/ui_service.h"
+#include "network/network_listener.h"
+#if defined(SUPPORT_LWIP) && defined(SUPPORT_BREDR)
+#include "lwip_driver_adapter.h"
+#endif
+#include "main/PullUpDownView.h"
+#include "settings/common/SettingCommon.h"
+#include "settings/page/SettingBluetoothPage.h"
+#include "settings/page/SettingConnectionOpen.h"
+#include "findphone/FindPhoneMainPage.h"
+#include "bluetooth/BluetoothChangeBle.h"
+#include "settings/model/SettingBluetoothModel.h"
+
+namespace OHOS {
+constexpr uint16_t SETTING_BLUETOOTH_CONN_HANDLE = 64;
+constexpr uint16_t SETTING_BLUETOOTH_INTERVAL_TOMAX_MIN = 12;
+constexpr uint16_t SETTING_BLUETOOTH_INTERVAL_TOMAX_MAX = 12;
+constexpr uint16_t SETTING_BLUETOOTH_INTERVAL_TODEFAULT_MIN = 24;
+constexpr uint16_t SETTING_BLUETOOTH_INTERVAL_TODEFAULT_MAX = 48;
+constexpr uint16_t SETTING_BLUETOOTH_LATENCY = 0;
+constexpr uint16_t SETTING_BLUETOOTH_TIMEOUT_MUTIPLIER = 500;
+#define BT_SPP_TASK_STACK_SIZE 2048
+#define BT_SPP_TASK_PRI        20
+#define TEN                    10
+
+static constexpr uint16_t BLUETOOTH_MAX_NUM = 20;
+static constexpr int16_t SETTING_ADDR2 = 2;
+static constexpr int16_t SETTING_ADDR3 = 3;
+static constexpr int16_t SETTING_ADDR4 = 4;
+static constexpr int16_t SETTING_ADDR5 = 5;
+static constexpr int16_t BLUETOOTH_ADDR_SET = 8;
+static constexpr int16_t WRITECB_PARA_LEGNTH_TWO = 2;
+static constexpr int16_t WRITECB_PARA_LEGNTH_NINE = 9;
+static constexpr int16_t WRITECB_PARA_LEGNTH_TEN = 10;
+static constexpr int16_t WAIT_TIME = 50;
+#define MEDIA_A2DP_SNK_INTERFACE 1
+#define A2DP_STREAM_ACCEPT_TIMER_PERIOD 500
+osal_timer g_setting_a2dp_stream_accept_timer = {nullptr, nullptr, 0, 0};
+AudioFormatConfig g_setting_audio_format_config = {AUDIO_DEFAULT, 0, 0};
+static uint16_t g_sample_svr_handle = 0;
+static uint16_t g_sample_characteristic_handle = 0;
+static uint16_t g_diag_characteristic_handle = 0;
+static uint16_t g_diag_desc_handle = 0;
+constexpr uint16_t g_sample_adv_id = 2;
+static bd_addr_t g_bd_addr = { 0 };
+
+SettingBluetoothModel::SettingBluetoothModel()
+{
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SettingBluetoothModel::SettingBluetoothModel");
+}
+
+SettingBluetoothModel *SettingBluetoothModel::GetInstance(void)
+{
+    static SettingBluetoothModel instance;
+    return &instance;
+}
+
+char* SettingBluetoothModel::GetWatchName(void)
+{
+    return watchName_;
+}
+
+// 扫描设备 btEarPhoneList存在数据 设置为1 否则设置为0
+void SettingBluetoothModel::SetEarPhoneListHasData(bool status)
+{
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SettingBluetoothModel EarPhoneListHasData_ =  %d", status);
+    EarPhoneListHasData_ = status;
+}
+
+uint32_t SettingBluetoothModel::GetEarPhoneListHasData()
+{
+    return EarPhoneListHasData_;
+}
+
+void SettingBluetoothModel::SetDeviceName(std::string deviceName)
+{
+    deviceName_ = deviceName;
+}
+
+std::string SettingBluetoothModel::GetDeviceName()
+{
+    return deviceName_;
+}
+
+void SettingBluetoothModel::SetBlueToothConnectStatus(bool status)
+{
+    btConnectStatus_ = status;
+}
+
+bool SettingBluetoothModel::GetBlueToothConnectStatus(void)
+{
+    return btConnectStatus_;
+}
+
+void SettingBluetoothModel::SetConnectFragmentStatus(bool status)
+{
+    connectFragmentStatus_ = status;
+}
+
+bool SettingBluetoothModel::GetConnectFragmentStatus(void)
+{
+    return connectFragmentStatus_;
+}
+
+void SettingBluetoothModel::MoveMatchingDeviceToFront()
+{
+    std::list<BtCaseInfo> matchedItems;
+    std::list<BtCaseInfo> otherItems;
+    if(btScansDevicesList_.size() == 0) {
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MoveMatchingDeviceToFront btScansDevicesList_ size = 0");
+        return;
+    }
+    bd_addr_t bdAddr = *(GetLastConnedAddr());
+    for (auto it = btScansDevicesList_.begin(); it != btScansDevicesList_.end(); ++it) {
+        if ((bdAddr.addr[0] == it->addr[0]) && (bdAddr.addr[1] == it->addr[1])
+                && (bdAddr.addr[SETTING_ADDR2] == it->addr[SETTING_ADDR2])
+                && (bdAddr.addr[SETTING_ADDR3] == it->addr[SETTING_ADDR3])
+                && (bdAddr.addr[SETTING_ADDR4] == it->addr[SETTING_ADDR4])
+                && (bdAddr.addr[SETTING_ADDR5] == it->addr[SETTING_ADDR5])) {
+            matchedItems.push_back(*it);
+        } else {
+            otherItems.push_back(*it);
+        }
+    }
+
+    btScansDevicesList_.clear();
+    btScansDevicesList_.insert(btScansDevicesList_.begin(), matchedItems.begin(), matchedItems.end());
+    btScansDevicesList_.insert(btScansDevicesList_.end(), otherItems.begin(), otherItems.end());
+}
+
+void SettingBluetoothModel::UpdateConnectStatusForDevice()
+{
+    for (auto& item : btScansDevicesList_) {
+        if (std::strcmp(reinterpret_cast<const char*>(item.deviceName), deviceName_.c_str()) == 0) {
+            WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "UpdateConnectStatusForDevice deviceName:%s", item.deviceName);
+            item.connect_status = "连接中...";
+        }
+    }
+}
+
+void SettingBluetoothModel::UpdateDisconnectStatusForDevice(const bd_addr_t &bdAddr)
+{
+    for (auto it = btScansDevicesList_.begin(); it != btScansDevicesList_.end(); ++it) {
+        if ((bdAddr.addr[0] == it->addr[0]) && (bdAddr.addr[1] == it->addr[1])
+                && (bdAddr.addr[SETTING_ADDR2] == it->addr[SETTING_ADDR2])
+                && (bdAddr.addr[SETTING_ADDR3] == it->addr[SETTING_ADDR3])
+                && (bdAddr.addr[SETTING_ADDR4] == it->addr[SETTING_ADDR4])
+                && (bdAddr.addr[SETTING_ADDR5] == it->addr[SETTING_ADDR5])) {
+            it->connect_status = "连接已经断开";
+            WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "UpdateDisconnectStatusForDevice addr: %02x%02x%02x%02x%02x%02x",
+            it->addr[SETTING_ADDR5], it->addr[SETTING_ADDR4], it->addr[SETTING_ADDR3],
+            it->addr[SETTING_ADDR2], it->addr[1], it->addr[0]);
+        }
+    }
+}
+
+void SettingBluetoothModel::UpdateConnectedStatusForDevice(const bd_addr_t &bdAddr)
+{
+    for (auto it = btScansDevicesList_.begin(); it != btScansDevicesList_.end(); ++it) {
+        if ((bdAddr.addr[0] == it->addr[0]) && (bdAddr.addr[1] == it->addr[1])
+                && (bdAddr.addr[SETTING_ADDR2] == it->addr[SETTING_ADDR2])
+                && (bdAddr.addr[SETTING_ADDR3] == it->addr[SETTING_ADDR3])
+                && (bdAddr.addr[SETTING_ADDR4] == it->addr[SETTING_ADDR4])
+                && (bdAddr.addr[SETTING_ADDR5] == it->addr[SETTING_ADDR5])) {
+            it->connect_status = "已连接";
+            WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "UpdateConnectedStatusForDevice addr: %02x%02x%02x%02x%02x%02x",
+            it->addr[SETTING_ADDR5], it->addr[SETTING_ADDR4], it->addr[SETTING_ADDR3],
+            it->addr[SETTING_ADDR2], it->addr[1], it->addr[0]);
+        }
+    }
+}
+
+bool SettingBluetoothModel::GetConnectResultPage()
+{
+    return redirct_;
+}
+
+void SettingBluetoothModel::HandleUnpairRequest(void)
+{
+    bool ret;
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SettingSettingBluetoothModel::HandleUnpairRequest lastConnedAddr_: %02x%02x%02x%02x%02x%02x",
+        selectedDeviceInfo_.addr[SETTING_ADDR5], selectedDeviceInfo_.addr[SETTING_ADDR4], selectedDeviceInfo_.addr[SETTING_ADDR3],
+        selectedDeviceInfo_.addr[SETTING_ADDR2], selectedDeviceInfo_.addr[1], selectedDeviceInfo_.addr[0]);
+    ret = gap_remove_pair((const bd_addr_t*)&selectedDeviceInfo_.addr);
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SettingSettingBluetoothModel::HandleUnpairRequest gap_remove_pair %d", ret);
+}
+
+// 是否需要显示连接成功/失败的页面 在连接新耳机或者断开耳机连接时改变为true
+void SettingBluetoothModel::SetConnectResultPage(bool redirct)
+{
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SettingBuletoothModel::SetRedirect :%d", redirct);
+    redirct_ = redirct;
+}
+
+void SettingBluetoothModel::InitBluetoothInfo(void)
+{
+    errcode_t ret;
+    unsigned char nameLen = BD_NAME_LEN;
+    memset_s(watchName_, sizeof(watchName_), 0, sizeof(watchName_));
+    ret = bluetooth_get_local_name((unsigned char *)watchName_, &nameLen);
+    // 为了实验室测试需要,客户需要自己修改
+    if ((nameLen == strlen("WatchDemo") + 1) && (strcmp("WatchDemo", watchName_) == 0)) {
+        uint32_t currentUs = uapi_tcxo_get_us();
+        WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "currentUs 0x%x", currentUs);
+        // 设置蓝牙名称
+        (void)sprintf_s(watchName_, sizeof(watchName_), "Watch%x", (currentUs & 0xFFFF));
+        ret = bluetooth_set_local_name((unsigned char*)watchName_, strlen((char*)watchName_) + 1);
+        WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "bluetooth_set_local_name %s ret = %u", watchName_, ret);
+
+        //  设置蓝牙地址
+        bd_addr_t addr = {{0x1C, 0x1D, 0x2B, 0x0, 0x0, 0x0} ,0};
+        addr.addr[3] = currentUs & 0xFF;
+        addr.addr[4] = (currentUs & 0XFF00) >> 8;
+        addr.addr[5] = currentUs & 0xFF;
+        ret = bluetooth_set_local_addr(addr.addr, BD_ADDR_LEN);
+        WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "bluetooth_set_local_addr [0x%x:0x%x] ret = %u", addr.addr[0], addr.addr[1], ret);
+    } else {
+        WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "watchName_: %s", watchName_);
+        WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "nameLen: %u", nameLen);
+    }
+}
+
+void SettingBluetoothModel::Init()
+{
+#ifndef SUPPORT_AUTO_OTA
+    errcode_t ret;
+
+    // 设置自动回连,ios一键双连依赖此配置
+    bts_feature_t bts_feature = { 0 };
+    bts_feature.bt_auto_reconnect_closed = 0;
+    ret = bts_set_features(&bts_feature);
+    WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "bt bts_set_features ret = %u", ret);
+
+    ret = enable_bt_stack();
+    WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "bt enable_bt_stack ret = %u", ret);
+
+    // 设置安全连接
+    gap_ble_sec_params_t sec_param = { 1, GAP_BLE_IO_CAPABILITY_NOINPUTNOOUTPUT, 1, GAP_BLE_GAP_SECURITY_MODE1_LEVEL3 };
+    ret = gap_ble_set_sec_param(&sec_param);
+    WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "bt gap_ble_set_sec_param ret = %u", ret);
+
+    InitBluetoothInfo();
+    SettingBtInitCallBacks();
+    wrapper_ble_register();
+#ifdef SUPPORT_ALIPAY_SEC
+    svr_alipay_bluetooth_init();
+#endif
+    SettingBtInitCallBacksEx();
+    SettingBtInitGatts();
+    SettingBtInitSpp();
+
+    /* 实验室测试需要,开机开广播 */
+    BleSettingAdvStart();
+
+    ClearScansDevicesList();
+    SetUpPairedDevicesList();
+#endif
+}
+
+void SettingBluetoothModel::ClearScansDevicesList()
+{
+    btScansDevicesList_.clear();
+}
+
+bool SettingBluetoothModel::CheckExistScanList(BtCaseInfo caseInfo)
+{
+    std::list<BtCaseInfo>::iterator node = btScansDevicesList_.begin();
+    if (btScansDevicesList_.empty()) {
+        return false;
+    }
+    while (node != btScansDevicesList_.end()) {
+        if ((caseInfo.addr[0] == node->addr[0]) && (caseInfo.addr[1] == node->addr[1])
+            && (caseInfo.addr[2] == node->addr[2]) && (caseInfo.addr[3] == node->addr[3])
+            && (caseInfo.addr[4] == node->addr[4]) && (caseInfo.addr[5] == node->addr[5])) {
+            WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "true");
+            return true;
+        }
+        node++;
+    }
+    return false;
+}
+
+std::list<BtCaseInfo>& SettingBluetoothModel::GetScansDevicesList()
+{
+    return btScansDevicesList_;
+}
+
+void SettingBluetoothModel::ScansDevicesListAddCase(BtCaseInfo caseInfo)
+{
+    SetEarPhoneListHasData(true);
+    WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "ScansDevicesListAddCase::caseInfo addr: %02x%02x%02x%02x%02x%02x",
+        caseInfo.addr[5], caseInfo.addr[4], caseInfo.addr[3], /* mac下标 0 1 2 3 4 5 */
+        caseInfo.addr[2], caseInfo.addr[1], caseInfo.addr[0]);
+    if (btScansDevicesList_.size() >= BLUETOOTH_MAX_NUM) {
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "btScansDevicesList_.size is BLUETOOTH_MAX_NUM");
+        return;
+    } else {
+        btScansDevicesList_.push_back(caseInfo);
+    }
+    WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "SettingBluetoothModel::ScansDevicesListAddCase after size: %d", btScansDevicesList_.size());
+    WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "SettingBluetoothModel::ScansDevicesListAddCase %s", caseInfo.deviceName);
+}
+
+void SettingBluetoothModel::SetScansCaseRssi(const bd_addr_t *bdAddr, int rssi)
+{
+    for (auto it = btScansDevicesList_.begin(); it != btScansDevicesList_.end(); it++) {
+        if ((it->addr[0] == bdAddr->addr[0]) && (it->addr[1] == bdAddr->addr[1])
+            && (it->addr[2] == bdAddr->addr[2]) && (it->addr[3] == bdAddr->addr[3])
+            && (it->addr[4] == bdAddr->addr[4]) && (it->addr[5] == bdAddr->addr[5])) {
+                it->rssi = rssi;
+                WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "btScansDevicesList_ rssi:%d deviceName:%s", it->rssi, it->deviceName);
+        }
+    }
+}
+
+
+bool CompBuletoothInfo(const BtCaseInfo& a, const BtCaseInfo& b)
+{
+    if (a.rssi > b.rssi) {
+        return true;
+    }
+    return false;
+}
+
+void SettingBluetoothModel::SortScansCaseRssi()
+{
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SettingBluetoothModel::SortScansCaseRssi");
+    btScansDevicesList_.sort(CompBuletoothInfo);
+}
+
+void SettingBluetoothModel::ResetScanDevicesCase(const BtCaseInfo& caseInfo)
+{
+    for (auto it = btScansDevicesList_.begin(); it != btScansDevicesList_.end(); it++) {
+        if ((it->addr[0] == caseInfo.addr[0]) && (it->addr[1] == caseInfo.addr[1])
+            && (it->addr[2] == caseInfo.addr[2]) && (it->addr[3] == caseInfo.addr[3])
+            && (it->addr[4] == caseInfo.addr[4]) && (it->addr[5] == caseInfo.addr[5])) {
+                (void)memcpy_s(it->deviceName, BD_NAME_LEN,
+                               caseInfo.deviceName, BD_NAME_LEN);
+                WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ResetConnedDevicesCase deviceName:%s", it->deviceName);
+        }
+    }
+}
+
+/* 已配对设备队列 */
+void SettingBluetoothModel::SetPairedDevicesListClear()
+{
+    btPairedDevicesList_->Clear();
+}
+
+void SettingBluetoothModel::SetUpPairedDevicesList()
+{
+    if (btPairedDevicesList_ == nullptr) {
+        btPairedDevicesList_ = new List<BtCaseInfo>();
+        if (btPairedDevicesList_ == nullptr) {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SettingBluetoothModel btPairedDevicesList_ new fail");
+            return;
+        }
+        SetPairedDevicesListClear();
+        unsigned int connedDevicesNum = 0;
+        bool ret = gap_get_paired_devices_num(&connedDevicesNum);
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Setup GetPariedDevicesNum ret = %d, num = %d", ret, connedDevicesNum);
+
+        gap_paired_device_info_t *devInfo = (gap_paired_device_info_t*)malloc(sizeof(gap_paired_device_info_t) *connedDevicesNum);
+        if (devInfo ==  nullptr) {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "DevInfo malloc failed %u", sizeof(gap_paired_device_info_t) *connedDevicesNum);
+            return;
+        }
+        ret =  gap_get_paired_devices_list(devInfo, (int *)&connedDevicesNum);
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SetUpPairedDevicesList gap_get_paired_devices_list ret = %d", ret);
+
+        BtCaseInfo caseInfo{};
+        for (int i = 0; i < static_cast<int>(connedDevicesNum); ++i) {
+            if ((gap_get_device_class((const bd_addr_t *)devInfo[i].addr.addr) & 0x200) != 0) {
+                continue;
+            }
+            (void)memcpy_s(caseInfo.addr, BD_ADDR_LEN, devInfo[i].addr.addr, BD_ADDR_LEN);
+            (void)memcpy_s(caseInfo.deviceName, BD_NAME_LEN, devInfo[i].device_name, BD_NAME_LEN);
+            caseInfo.connect_status = "连接已经断开";
+            AddPairedDevicesCase(caseInfo);
+            btScansDevicesList_.push_back(caseInfo);
+        }
+        free(devInfo);
+    }
+}
+
+void SettingBluetoothModel::AddPairedDevicesCase(BtCaseInfo caseInfo)
+{
+    if (btPairedDevicesList_ == nullptr) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "btPairedDevicesList_ nullptr");
+        return;
+    }
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "AddPairedDevicesCase::caseInfo addr: %02x%02x%02x%02x%02x%02x",
+        caseInfo.addr[5], caseInfo.addr[4], caseInfo.addr[3], /* mac下标 0 1 2 3 4 5 */
+        caseInfo.addr[2], caseInfo.addr[1], caseInfo.addr[0]);
+    if (btPairedDevicesList_->Size() >= BLUETOOTH_MAX_NUM) {
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "btPairedDevicesList_->Size is BLUETOOTH_MAX_NUM");
+        return;
+    } else {
+        btPairedDevicesList_->PushBack(caseInfo);
+    }
+}
+
+List<BtCaseInfo>& SettingBluetoothModel::GetPairedDevicesCase()
+{
+    return *btPairedDevicesList_;
+}
+
+bool SettingBluetoothModel::GetAclConnected(void)
+{
+    return aclConnected_;
+}
+
+void SettingBluetoothModel::SetAclConnected(bool tag)
+{
+    aclConnected_ = tag;
+}
+
+void SettingBluetoothModel::UpdateAclConnectStatus(bool status)
+{
+    aclConnected_ = status;
+    if (PullUpDownView::GetInstance() != nullptr) {
+        PullUpDownView::GetInstance()->UpdateBlueToothStatus(status);
+    }
+}
+
+void SettingBluetoothModel::SetSelectedDeviceInfo(BtCaseInfo *caseInfo)
+{
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SetSelectedDeviceInfo: %02x%02x%02x%02x%02x%02x",
+                  caseInfo->addr[5], caseInfo->addr[4], caseInfo->addr[3], /* macϱê 0 1 2 3 4 5 */
+                  caseInfo->addr[2], caseInfo->addr[1], caseInfo->addr[0]); /* macϱê 0 1 2 3 4 5 */
+    (void)memcpy_s(selectedDeviceInfo_.addr, BD_ADDR_LEN,
+                   caseInfo->addr, BD_ADDR_LEN);
+    (void)memcpy_s(selectedDeviceInfo_.deviceName, BD_NAME_LEN,
+                   caseInfo->deviceName, BD_NAME_LEN);
+}
+
+BtCaseInfo *SettingBluetoothModel::GetSelectedDeviceInfo(void)
+{
+    return &selectedDeviceInfo_;
+}
+
+void SettingBluetoothModel::SetLastConnedAddr(const bd_addr_t *addr)
+{
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SetLastConnedAddr: %02x%02x%02x%02x%02x%02x",
+                  addr->addr[5], addr->addr[4], addr->addr[3], /* macϱê 0 1 2 3 4 5 */
+                  addr->addr[2], addr->addr[1], addr->addr[0]); /* macϱê 0 1 2 3 4 5 */
+    (void)memcpy_s(lastConnedAddr_.addr, BD_ADDR_LEN, addr->addr, BD_ADDR_LEN);
+}
+
+bd_addr_t *SettingBluetoothModel::GetLastConnedAddr(void)
+{
+    return &lastConnedAddr_;
+}
+
+bool SettingBluetoothModel::CheckExistPairedList(BtCaseInfo caseInfo)
+{
+    ListNode<BtCaseInfo> *node = btPairedDevicesList_ ->Begin();
+    if (node == nullptr) {
+        return false;
+    } else if ((caseInfo.addr[0] == 0) && (caseInfo.addr[1] == 0)
+                && (caseInfo.addr[2] == 0) && (caseInfo.addr[3] == 0)
+                && (caseInfo.addr[4] == 0) && (caseInfo.addr[5] == 0)) {
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "CheckExistPairedList false addr: 000000000000");
+        return true;
+    }
+    while (node != btPairedDevicesList_ ->End()) {
+        if ((caseInfo.addr[0] == node->data_.addr[0]) && (caseInfo.addr[1] == node->data_.addr[1])
+            && (caseInfo.addr[2] == node->data_.addr[2]) && (caseInfo.addr[3] == node->data_.addr[3])
+            && (caseInfo.addr[4] == node->data_.addr[4]) && (caseInfo.addr[5] == node->data_.addr[5])) {
+            WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "CheckExistPairedList true");
+            return true;
+        }
+        node = node->next_;
+    }
+    return false;
+}
+
+void SettingBluetoothModel::AddNodeFromPairListToScanList(const bd_addr_t &bdAddr)
+{
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "AddNodeFromPairListToScanList");
+    // 检查扫描设备列表
+    for (auto it = btScansDevicesList_.begin(); it != btScansDevicesList_.end(); ++it) {
+        if (memcmp(it->addr, bdAddr.addr, sizeof(bdAddr.addr)) == 0) {
+            WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "AddNodeFromPairListToScanList btScansDevicesList_ true");
+            return;
+        }
+    }
+
+    // 检查已配对设备列表
+    ListNode<BtCaseInfo> *node = btPairedDevicesList_->Begin();
+    bool found = false;
+    while (node != btPairedDevicesList_->End()) {
+        if (memcmp(node->data_.addr, bdAddr.addr, sizeof(bdAddr.addr)) == 0) {
+            found = true;
+            break;
+        }
+        node = node->next_;
+    }
+
+    if (found) {
+        btScansDevicesList_.push_back(node->data_);
+    } else {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "btScansDevicesList_ error");
+    }
+}
+
+bool SettingBluetoothModel::GetAdvStartState(void)
+{
+    return advStartState_;
+}
+void SettingBluetoothModel::SetAdvStartState(bool state)
+{
+    advStartState_ = state;
+}
+
+int SettingBluetoothModel::ConnectRemoteDevice(const bd_addr_t *addr)
+{
+    /* 恢厂后耳机连接要开启BT广播否则会导致AVRCP无法音量控制 */
+    bool ret = gap_br_set_bt_scan_mode(GAP_SCAN_MODE_CONNECTABLE, 60);
+    if (!ret) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ConnectRemoteDevice gap_br_set_bt_scan_mode ret = 0x%x", ret);
+    }
+    errcode_t retVal = gap_connect_remote_device(addr);
+    WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "ConnectRemoteDevice gap_connect_remote_device ret = 0x%x", retVal);
+    (void)memcpy_s(&remoteConnectAddr_, sizeof(bd_addr_t), addr, sizeof(bd_addr_t));
+    return retVal;
+}
+
+bool SettingBluetoothModel::ConnectRemoteCheck(const bd_addr_t *addr)
+{
+    bool ret;
+    if ((remoteConnectAddr_.addr[0] == addr->addr[0]) && (remoteConnectAddr_.addr[1] == addr->addr[1]) &&
+        (remoteConnectAddr_.addr[2] == addr->addr[2]) && (remoteConnectAddr_.addr[3] == addr->addr[3]) &&
+        (remoteConnectAddr_.addr[4] == addr->addr[4]) && (remoteConnectAddr_.addr[5] == addr->addr[5])) {
+        ret = true;
+        (void)memset_s(&remoteConnectAddr_, sizeof(bd_addr_t), 0, sizeof(bd_addr_t));
+    } else {
+        ret = false;
+    }
+    return ret;
+}
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+// 回调: gap_read_remote_rssi_value 接口的数据上报
+void SettingBtGapReadRemoteRssiEventCallback(const bd_addr_t *bdAddr, int rssi, int status)
+{
+    UNUSED(status);
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SettingBtGapReadRemoteRssiEventCallback addr: %02x%02x%02x%02x%02x%02x",
+        bdAddr->addr[5], bdAddr->addr[4], bdAddr->addr[3], /* mac下标 0 1 2 3 4 5 */
+        bdAddr->addr[2], bdAddr->addr[1], bdAddr->addr[0]); /* mac下标 0 1 2 3 4 5 */
+    SettingBluetoothModel::GetInstance()->SetScansCaseRssi(bdAddr, rssi);
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "bt SettingBtGapReadRemoteRssiEventCallback SetSortCaseRssi: %d status: %d", rssi, status);
+}
+
+// 回调:发现状态变化上报/扫描结束
+void SettingBtGapDiscoveryStateChangedCallback(int status)
+{
+    UNUSED(status);
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "bt SettingBtGapDiscoveryStateChangedCallback %d", status);
+}
+
+static void LoadScanResult()
+{
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "LoadScanResult");
+    SettingBluetoothPage* bluetoothPage = SettingBluetoothPage::GetInstance();
+    if (bluetoothPage == nullptr) {
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "bluetoothPage nullptr");
+        return;
+    }
+    bluetoothPage->SetScanStatus(false);
+
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "LoadScanResult::LoadFindDeviceList");
+    bluetoothPage->LoadFindDeviceList();
+}
+
+void SettingBluetoothModel::SettingBtGapDiscoveryResultCallbakHandle(const bd_addr_t &bdAddr)
+{
+    BtCaseInfo caseInfo{};
+    (void)memcpy_s(caseInfo.addr, BD_ADDR_LEN, bdAddr.addr, BD_ADDR_LEN);
+
+    unsigned char nameLen = BD_NAME_LEN;
+    bool getNameRet = gap_get_device_name(&bdAddr, caseInfo.deviceName, &nameLen);
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "gap_discovery_result_callback getNameRet(bool): %d nameLen: %d name:%s",
+                  getNameRet, nameLen, caseInfo.deviceName);
+
+    if (nameLen == 0) { // 过滤未扫描到名字的设备
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "nameLen == 0 return");
+        return;
+    }
+    // 去重操作
+    bool tag = SettingBluetoothModel::GetInstance()->CheckExistScanList(caseInfo);
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "CheckExistScanList ret = %d", tag);
+    if (!tag) {
+        SettingBluetoothModel::GetInstance()->ScansDevicesListAddCase(caseInfo); // 增加扫描设备信息
+        LoadScanResult();
+        bool ret = gap_read_remote_rssi_value(&bdAddr); // 获取rssi
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "gap_read_remote_rssi_value ret = %d", ret);
+    }
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "bt SettingBtGapDiscoveryResultCallback end");
+}
+
+void SettingBtGapPairStatusChangedCallback(const bd_addr_t *bdAddr, int status)
+{
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SettingBtGapPairStatusChangedCallback addr: ****%02x%02x%02x%02x status: %d\n",
+        bdAddr->addr[3], bdAddr->addr[2], bdAddr->addr[1], bdAddr->addr[0], status); /* addr下标 0 1 2 3 */
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "GAP_PAIR_PAIRED %d", GAP_PAIR_PAIRED);
+    if (status == GAP_PAIR_PAIRED) {
+        if (SettingBluetoothModel::GetInstance()->GetConnectFragmentStatus()) {
+            SettingBluetoothModel::GetInstance()->SetConnectFragmentStatus(false);
+            NativeAbility::GetInstance().SwitchPageInSlice(SettingPageId::MAIN_PAGE,
+                TransitionType::TRANSITION_INVALID, false);
+        }
+    }
+}
+
+void SettingBtGapPairRequestedCallback(const bd_addr_t *bdAddr)
+{
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SettingBtGapPairRequestedCallback addr: ****%02x%02x%02x%02x\n",
+        bdAddr->addr[3], bdAddr->addr[2], bdAddr->addr[1], bdAddr->addr[0]); /* addr下标 0 1 2 3 */
+}
+
+void SettingBtGapPairConfirmedCallback(const bd_addr_t *bdAddr, int req_type, int number)
+{
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SettingBtGapPairConfirmedCallback addr: ****%02x%02x%02x%02x req_type: %d number: %d\n",
+        bdAddr->addr[3], bdAddr->addr[2], bdAddr->addr[1], bdAddr->addr[0], /* addr下标 0 1 2 3 */
+        req_type, number);
+}
+
+// 回调:扫描结果处理/发现结果上报
+void SettingBtGapDiscoveryResultCallback(const bd_addr_t *bdAddr)
+{
+    if ((gap_get_device_class(bdAddr) & DEVICE_MAJOR_CLASS_PHONE) != 0) {
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SettingBtGapDiscoveryResultCallback: Mobile Phone Device");
+        return;
+    }
+
+    if (bdAddr == nullptr) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "addr nullptr");
+        return;
+    }
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "gap_discovery_result_callback addr: %02x%02x%02x%02x%02x%02x",
+        bdAddr->addr[5], bdAddr->addr[4], bdAddr->addr[3], /* mac下标 0 1 2 3 4 5 */
+        bdAddr->addr[2], bdAddr->addr[1], bdAddr->addr[0]); /* mac下标 0 1 2 3 4 5 */
+    GraphicService::GetInstance()->PostGraphicEvent(std::bind(&SettingBluetoothModel::SettingBtGapDiscoveryResultCallbakHandle,
+                                                              SettingBluetoothModel::GetInstance(), *bdAddr));
+}
+
+static void ACLConnectionSuss(const bd_addr_t &bdAddr)
+{
+    // 成功提示
+    WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "ACLConnectionSuss conn success");
+    SettingBluetoothModel::GetInstance()->SetLastConnedAddr(&bdAddr);
+    SettingBluetoothModel::GetInstance()->SetBlueToothConnectStatus(true);
+    SettingBluetoothModel::GetInstance()->UpdateConnectedStatusForDevice(bdAddr);
+    if (SettingBluetoothPage::GetInstance() != nullptr) {
+        SettingBluetoothPage::GetInstance()->LoadFindDeviceList();
+    }
+    if ((SettingBluetoothModel::GetInstance()->GetConnectResultPage() == true) &&
+        (SettingBluetoothPage::GetInstance() != nullptr)) {
+        SettingBluetoothPage::GetInstance()->ShowResultGroup(CONNECT_BLUETOOTH_SUCCESS_FRAGMENT);
+    } else {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "GetConnectResultPage is false or GetInstance is nullptr");
+    }
+    SettingBluetoothModel::GetInstance()->SetConnectResultPage(false);
+}
+
+static void ACLConnectionFail(const bd_addr_t &bdAddr)
+{
+    WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "ACLConnectionFail conn fail");
+    SettingBluetoothModel::GetInstance()->SetBlueToothConnectStatus(false);
+    SettingBluetoothModel::GetInstance()->UpdateDisconnectStatusForDevice(bdAddr);
+    if (SettingBluetoothPage::GetInstance() != nullptr) {
+        SettingBluetoothPage::GetInstance()->LoadFindDeviceList();
+    }
+    if ((SettingBluetoothModel::GetInstance()->GetConnectResultPage()) == true &&
+        (SettingBluetoothPage::GetInstance() != nullptr)) {
+        SettingBluetoothPage::GetInstance()->ShowResultGroup(CONNECT_BLUETOOTH_FAIL_FRAGMENT);
+    }
+    // 失败提示页
+    SettingBluetoothModel::GetInstance()->SetConnectResultPage(false);
+}
+
+void SettingBluetoothModel::SettingBtGapAclStateChangedHandle(gap_acl_state_t state, unsigned int reason, const bd_addr_t &bdAddr)
+{
+    if ((reason == 0x13) || (reason == 0x14) || (reason == 0x15) || (reason == 0x3D) || (reason == 0x08)) { // 连接断开
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "The peer end is disconnected.");
+    } else if (reason == 0x16) { // 主动断开连接
+        BtCaseInfo *onClickBtCaseInfo = SettingBluetoothModel::GetInstance()->GetSelectedDeviceInfo();
+    } else if ((reason == 0xb) || (reason > 0x45)) { // 0xb:重复点击连接按钮 0x45:acl状态最大参数
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "reason is false.");
+    }
+
+    if ((state == GAP_ACL_STATE_CONNECTED) || (state == GAP_ACL_STATE_LE_CONNECTED)) {
+        // 将数据存入设备列表
+        BtCaseInfo *info = GetSelectedDeviceInfo();
+        bool tag = CheckExistPairedList(*info);
+        if ((!tag) && (memcmp(info->addr, bdAddr.addr, BD_ADDR_LEN) == 0)) {
+            AddPairedDevicesCase(*info);
+        }
+        // 从配对的列表里面取出数据 ,将该数据填充进入到ScanList
+        SettingBluetoothModel::GetInstance()->SetLastConnedAddr(&bdAddr);
+        SettingBluetoothModel::GetInstance()->AddNodeFromPairListToScanList(bdAddr);
+        if (SettingBluetoothModel::GetInstance()->ConnectRemoteCheck(&bdAddr)) {
+            int32_t retA2dp = a2dp_src_connect(&bdAddr);
+            if (retA2dp) {
+                ACLConnectionFail(bdAddr);
+            } else {
+                SetLastConnedAddr(&bdAddr);
+            }
+            WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "a2dp_src_connect result 0x%x", retA2dp);
+        }
+    } else {
+        ACLConnectionFail(bdAddr);
+    }
+}
+
+void ChangeBleConnectToMax()
+{
+    if (msg_center_get_trans_channel() == DIAG_FRAME_FID_BT) {
+        gap_conn_param_update_t conn_param = { 0 };
+        conn_param.conn_handle = SETTING_BLUETOOTH_CONN_HANDLE;
+        conn_param.interval_min = SETTING_BLUETOOTH_INTERVAL_TOMAX_MIN;
+        conn_param.interval_max = SETTING_BLUETOOTH_INTERVAL_TOMAX_MAX;
+        conn_param.slave_latency = SETTING_BLUETOOTH_LATENCY;
+        conn_param.timeout_multiplier = SETTING_BLUETOOTH_TIMEOUT_MUTIPLIER;
+        errcode_t ret = gap_ble_connect_param_update(&conn_param);
+        WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "SettingBleConnectCallback change to max interval ret:%d : latency-min:%u latency-max:%u\n",
+                        ret, conn_param.interval_min, conn_param.interval_max);
+    }
+}
+
+void ChangeBleConnectToDefault()
+{
+    if (msg_center_get_trans_channel() == DIAG_FRAME_FID_BT) {
+        gap_conn_param_update_t conn_param = { 0 };
+        conn_param.conn_handle = SETTING_BLUETOOTH_CONN_HANDLE;
+        conn_param.interval_min = SETTING_BLUETOOTH_INTERVAL_TODEFAULT_MIN;
+        conn_param.interval_max = SETTING_BLUETOOTH_INTERVAL_TODEFAULT_MAX;
+        conn_param.slave_latency = SETTING_BLUETOOTH_LATENCY;
+        conn_param.timeout_multiplier = SETTING_BLUETOOTH_TIMEOUT_MUTIPLIER;
+        errcode_t ret = gap_ble_connect_param_update(&conn_param);
+        WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "SettingBleConnectCallback change to default interval ret:%d : latency-min:%u latency-max:%u\n",
+                        ret, conn_param.interval_min, conn_param.interval_max);
+    }
+}
+
+// 回调:ACL连接状态上报
+void SettingBtGapAclStateChangedCallback(const bd_addr_t *bdAddr, gap_acl_state_t state, unsigned int reason)
+{
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "bt SettingGapAclStateChangedCallback state %d, reason %x succ or err", state, reason);
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "addr: %02x%02x%02x%02x%02x%02x",
+        bdAddr->addr[5], bdAddr->addr[4], bdAddr->addr[3], /* mac下标 0 1 2 3 4 5 */
+        bdAddr->addr[2], bdAddr->addr[1], bdAddr->addr[0]); /* mac下标 0 1 2 3 4 5 */
+    static bd_addr_t gapAclConnectAddr{0}; /* 连接后保存手机地址,手表清除手机配对后查询不到class比较手机地址 */
+    if ((gap_get_device_class(bdAddr) & 0x200) != 0 || memcmp(gapAclConnectAddr.addr, bdAddr->addr, BD_ADDR_LEN) == 0) {
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SettingGapAclStateChangedCallback: Mobile Phone Device");
+        if (state == GAP_ACL_STATE_DISCONNECTED) {
+            /* 通知msg_center,ble状态仍用bt状态,此处不区分 */
+            MsgCenterSendMsg(BT_DISCONNECTED_TO_MSGCENTER, 0, nullptr, 0);
+            SendMsgToUIService(BT_DISCONNECTED_TO_UI, 0, nullptr, 0);
+            // send to ace network
+            SettingBluetoothModel::GetInstance()->SetAclConnected(false);
+            net_connect_status_change(NETWORK_TYPE_BLUETOOTH, CONNECTION_STATUS_DISCONNECTED);
+            // 断开蓝牙连接时,若存在查找手机页面,刷新页面为断开页面
+            if (FindPhoneMainPage::GetInstance() != nullptr) {
+                FindPhoneMainPage::GetInstance()->ChangeToDisConnect();
+            }
+#if defined(SUPPORT_LWIP) && defined(SUPPORT_BREDR)
+            lwip_close_bt_pan();
+#endif
+        } else if (state == GAP_ACL_STATE_CONNECTED) {
+            (void)memcpy_s(gapAclConnectAddr.addr, BD_ADDR_LEN, bdAddr->addr, BD_ADDR_LEN);
+            MsgCenterSendMsg(BT_CONNECTED_TO_MSGCENTER, 0, nullptr, 0);
+            SendMsgToUIService(BT_CONNECTED_TO_UI, 0, nullptr, 0);
+            // send to ace network
+            SettingBluetoothModel::GetInstance()->SetAclConnected(true);
+#if defined(SUPPORT_LWIP) && defined(SUPPORT_BREDR)
+            lwip_open_bt_pan();
+#endif
+            net_connect_status_change(NETWORK_TYPE_BLUETOOTH, CONNECTION_STATUS_CONNECTED);
+        }
+        return;
+    }
+
+    GraphicService::GetInstance()->PostGraphicEvent(
+        std::bind(&SettingBluetoothModel::SettingBtGapAclStateChangedHandle, SettingBluetoothModel::GetInstance(), state, reason, *bdAddr));
+}
+
+// 回调:远端设备名称变化
+void SettingBtRemoteNameChangedCallback(const bd_addr_t *bdAddr, const unsigned char *deviceName, unsigned char length)
+{
+    if ((gap_get_device_class(bdAddr) & 0x200) != 0) {
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SettingBtRemoteNameChangedCallback: Mobile Phone Device");
+        return;
+    }
+    BtCaseInfo caseInfo{};
+    if (bdAddr == nullptr) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SettingBtRemoteNameChangedCallback addr nullptr");
+        return;
+    }
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SettingBtRemoteNameChangedCallback addr: %02x%02x%02x%02x%02x%02x",
+                  bdAddr->addr[5], bdAddr->addr[4], bdAddr->addr[3], /* mac下标 0 1 2 3 4 5 */
+                  bdAddr->addr[2], bdAddr->addr[1], bdAddr->addr[0]); /* mac下标 0 1 2 3 4 5 */
+
+    (void)memcpy_s(caseInfo.addr, BD_ADDR_LEN, bdAddr->addr, BD_ADDR_LEN);
+    int ret = memcpy_s(caseInfo.deviceName, BD_NAME_LEN, deviceName, length);
+    if (ret != EOK) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SettingBtRemoteNameChangedCallback memcpy fail!");
+        return;
+    }
+    SettingBluetoothModel::GetInstance()->ResetScanDevicesCase(caseInfo);
+}
+
+void SettingBtIsAcceptConnOnSafeModeCallback(const bd_addr_t *bdAddr, bool *res)
+{
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SettingBtIsAcceptConnOnSafeModeCallback addr: %02x%02x%02x%02x%02x%02x set *res true",
+        bdAddr->addr[5], bdAddr->addr[4], bdAddr->addr[3], /* addr下标 3 4 5 */
+        bdAddr->addr[2], bdAddr->addr[1], bdAddr->addr[0]); /* addr下标 0 1 2 */
+    *res = true;
+}
+
+static void A2dpSettingSrcConnectstateChanged(bd_addr_t *bdAddr, int connState)
+{
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "a2dp_src_connectStateChangedCallback addr: %02x%02x%02x%02x%02x%02x connState: %x",
+        bdAddr->addr[5], bdAddr->addr[4], bdAddr->addr[3], /* 5 4 3 idx */
+        bdAddr->addr[2], bdAddr->addr[1], bdAddr->addr[0], connState); /* 2 1 0 idx */
+    if ((gap_get_device_class(bdAddr) & 0x200) != 0) {
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "a2dp_src_connectstateChangedCb: Mobile Phone Device");
+        return;
+    }
+    if (connState == PROFILE_STATE_CONNECTED) {
+        uint32_t ret = avrcp_ct_connect(bdAddr);
+        WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "avrcp_ct_connect ret = 0x%x", ret);
+        PhoneAudioManagerSetDeviceConnState(OUT_BLUETOOTH_A2DP, AUDIO_DEVICE_CONNECTED);
+        GraphicService::GetInstance()->PostGraphicEvent(std::bind(ACLConnectionSuss, *bdAddr));
+    }
+
+    if (connState == PROFILE_STATE_DISCONNECTED) {
+        PhoneAudioManagerSetDeviceConnState(OUT_BLUETOOTH_A2DP, AUDIO_DEVICE_DISCONNECTED);
+        GraphicService::GetInstance()->PostGraphicEvent(std::bind(ACLConnectionFail, *bdAddr));
+        /* 实验室测试耳机回连场景,用户根据需要调整策略 */
+        bool ret = gap_br_set_bt_scan_mode(GAP_SCAN_MODE_CONNECTABLE_GENERAL_DISCOVERABLE, 60); // start scan
+        if (!ret) {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "a2dp disc: gap_br_set_bt_scan_mode ret = 0x%x", ret);
+        }
+    }
+}
+
+static void A2dpSettingSrcPlayingStateChanged(bd_addr_t *bdAddr, int playState)
+{
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "A2dpSettingSrcPlayingStateChangedCallback addr: %02x%02x%02x%02x%02x%02x playState: %x",
+        bdAddr->addr[5], bdAddr->addr[4], bdAddr->addr[3], /* 5 4 3 idx */
+        bdAddr->addr[2], bdAddr->addr[1], bdAddr->addr[0], playState); /* 2 1 0 idx */
+}
+
+static void A2dpSettingSrcConfigureChanged(bd_addr_t *bdAddr, a2dp_codec_info_t *info)
+{
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "A2dpSettingSrcConfigurationChangedCallback addr: %02x%02x%02x%02x%02x%02x ",
+        bdAddr->addr[5], bdAddr->addr[4], bdAddr->addr[3], /* 5 4 3 idx */
+        bdAddr->addr[2], bdAddr->addr[1], bdAddr->addr[0]); /* 2 1 0 idx */
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "codec_priority: %04x codec_type: %04x sample_rate: %02x bits_per_sample: %02x channel_mode: %02x ",
+        info->codec_priority, info->codec_type, info->sample_rate, info->bits_per_sample, info->channel_mode);
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "codec_specific1: %04x codec_specific2: %04x codec_specific3: %04x codec_specific4: %04x",
+        info->codec_specific1, info->codec_specific2, info->codec_specific3, info->codec_specific4);
+}
+
+static void SettingBleConnStateChangeCallback(unsigned short connId, bd_addr_t *addr, gap_ble_conn_state_t connState,
+                                       gap_ble_pair_state_t pairState, gap_ble_disc_reason_t discReason)
+{
+    WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "SettingBleConnStateChangeCallback connId 0x%x, connState 0x%x, pairState 0x%x",
+                  connId, connState, pairState);
+    if (GAP_BLE_STATE_DISCONNECTED == connState) { // restart ble adv when disconnected
+        /* 通知msg_center,ble状态仍用bt状态,此处不区分 */
+        MsgCenterSendMsg(BT_DISCONNECTED_TO_MSGCENTER, 0, nullptr, 0);
+        msg_center_set_ble_conn_state(GAP_BLE_STATE_DISCONNECTED);
+        // send to ace network
+        net_connect_status_change(NETWORK_TYPE_BLUETOOTH_LE, CONNECTION_STATUS_DISCONNECTED);
+        // 断开蓝牙连接时,若存在查找手机页面,刷新页面为断开页面
+        if (FindPhoneMainPage::GetInstance() != nullptr) {
+            FindPhoneMainPage::GetInstance()->ChangeToDisConnect();
+        }
+    } else {
+        MsgCenterSendMsg(BT_CONNECTED_TO_MSGCENTER, 0, nullptr, 0);
+        msg_center_set_ble_conn_state(GAP_BLE_STATE_CONNECTED);
+        (void)memcpy_s(&g_bd_addr, sizeof(bd_addr_t), addr, sizeof(bd_addr_t));
+        // send to ace network
+        net_connect_status_change(NETWORK_TYPE_BLUETOOTH_LE, CONNECTION_STATUS_CONNECTED);
+    }
+    // send to ace network
+}
+
+static void SettingBleAdvStartStateCallback(uint8_t advId, adv_status_t status)
+{
+    if (g_sample_adv_id == advId) {
+        WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "SettingBleAdvStartStateCallback advId: %d, status:%d\n", advId, status);
+        SettingBluetoothModel::GetInstance()->SetAdvStartState(true);
+    }
+}
+
+static void SettingBleAdvStopCallback(uint8_t advId, adv_status_t status)
+{
+    if (g_sample_adv_id == advId) {
+        WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "SettingBleAdvStopCallback advId: %d, status:%d\n", advId, status);
+        SettingBluetoothModel::GetInstance()->SetAdvStartState(false);
+    }
+}
+
+static void SettingBleAdvTerminateCallback(uint8_t advId, adv_status_t status)
+{
+    if (g_sample_adv_id == advId) {
+        WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "SettingBleAdvTerminateCallback advId: %d, status:%d\n", advId, status);
+        SettingBluetoothModel::GetInstance()->SetAdvStartState(false);
+        // 此处开广播是为了实验室测试需要,客户需要自己修改
+        BleSettingAdvStart();
+    }
+}
+
+static void SettingBtGattsServiceAddCallback(uint8_t serverId, bt_uuid_t *uuid, uint16_t srvcHandle, errcode_t status)
+{
+    if ((uuid->uuid_len == sizeof(uint16_t)) && (*((uint16_t*)uuid->uuid) == 0xF01F)) {
+        WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "SettingBtGattsServiceAddCallback 0x%x 0x%x 0x%x",
+            status, serverId, srvcHandle);
+        uint16_t sample_id = 0xF11F;
+        uint16_t diag_id = 0xF21F;
+        gatts_add_chara_info_t character;
+        uint16_t value = 0;
+
+        memset_s(&character, sizeof(gatts_add_chara_info_t), 0, sizeof(gatts_add_chara_info_t));
+        character.chara_uuid.uuid_len = sizeof(sample_id);
+        memcpy_s(character.chara_uuid.uuid, sizeof(character.chara_uuid.uuid), (char *)&sample_id, sizeof(sample_id));
+        character.permissions = GATT_ATTRIBUTE_PERMISSION_WRITE;
+        character.properties = GATT_CHARACTER_PROPERTY_BIT_WRITE_NO_RSP;
+        character.value_len = (uint16_t)sizeof(value);
+        character.value = (uint8_t *)(&value);
+        int ret = gatts_add_characteristic(serverId, srvcHandle, &character);
+        WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "gatts_add_characteristic sample ret 0x%x", ret);
+
+        memset_s(&character, sizeof(gatts_add_chara_info_t), 0, sizeof(gatts_add_chara_info_t));
+        character.chara_uuid.uuid_len = sizeof(diag_id);
+        memcpy_s(character.chara_uuid.uuid, sizeof(character.chara_uuid.uuid), (char *)&diag_id, sizeof(diag_id));
+        character.permissions = GATT_ATTRIBUTE_PERMISSION_WRITE | GATT_ATTRIBUTE_PERMISSION_READ;
+        character.properties = GATT_CHARACTER_PROPERTY_BIT_WRITE_NO_RSP | GATT_CHARACTER_PROPERTY_BIT_READ | GATT_CHARACTER_PROPERTY_BIT_NOTIFY;
+        character.value_len = (uint16_t)sizeof(value);
+        character.value = (uint8_t *)(&value);
+
+        ret = gatts_add_characteristic(serverId, srvcHandle, &character);
+        WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "gatts_add_characteristic diag ret 0x%x", ret);
+
+        g_sample_svr_handle = srvcHandle;
+    }
+}
+
+static void SettingBtGattsCharacteristicAddCallback(uint8_t serverId, bt_uuid_t *uuid, uint16_t srvcHandle, gatts_add_character_result_t *result, errcode_t status)
+{
+    if ((uuid->uuid_len == sizeof(uint16_t)) && (*((uint16_t*)uuid->uuid) == 0xF11F)) {
+        g_sample_characteristic_handle = result->value_handle;
+        WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "SettingBtGattsCharacteristicAddCallback 0x%x 0x%x 0x%x 0x%x",
+                      status, serverId, srvcHandle, g_sample_characteristic_handle);
+    }
+    if ((uuid->uuid_len == sizeof(uint16_t)) && (*((uint16_t*)uuid->uuid) == 0xF21F)) {
+        g_diag_characteristic_handle = result->value_handle;
+        WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "SettingBtGattsCharacteristicAddCallback 0x%x 0x%x 0x%x 0x%x",
+                      status, serverId, srvcHandle, g_diag_characteristic_handle);
+
+        uint8_t ccc_val[] = { 0x01, 0x00 };
+        uint16_t diag_desc = 0x0229;
+        gatts_add_desc_info_t descriptor;
+        memset_s(&descriptor, sizeof(gatts_add_desc_info_t), 0, sizeof(gatts_add_desc_info_t));
+        descriptor.desc_uuid.uuid_len = sizeof(diag_desc);
+        memcpy_s(descriptor.desc_uuid.uuid, sizeof(descriptor.desc_uuid.uuid), (char *)&diag_desc, sizeof(diag_desc));
+        descriptor.permissions = GATT_ATTRIBUTE_PERMISSION_READ | GATT_ATTRIBUTE_PERMISSION_WRITE;
+        descriptor.value_len = (uint16_t)sizeof(ccc_val);
+        descriptor.value = ccc_val;
+        int ret = gatts_add_descriptor(serverId, srvcHandle, &descriptor);
+        WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "gatts_add_descriptor diag_desc ret 0x%x", ret);
+    }
+
+    if (g_sample_characteristic_handle != 0 && g_diag_characteristic_handle !=0 && g_diag_desc_handle != 0) {
+        int ret = gatts_start_service(serverId, srvcHandle);
+        WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "gatts_start_service ret 0x%x", ret);
+    }
+}
+
+static void SettingBtGattsDescriptorAddCallback(uint8_t serverId, bt_uuid_t *uuid, uint16_t srvcHandle, uint16_t descriptorHandle, errcode_t status)
+{
+    if (g_sample_svr_handle == srvcHandle) {
+        WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "SettingBtGattsDescriptorAddCallback 0x%x 0x%x 0x%x 0x%x",
+            status, serverId, srvcHandle, descriptorHandle);
+        g_diag_desc_handle = descriptorHandle;
+    }
+
+    if (g_sample_characteristic_handle != 0 && g_diag_characteristic_handle !=0 && g_diag_desc_handle != 0) {
+        int ret = gatts_start_service(serverId, srvcHandle);
+        WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "gatts_start_service ret 0x%x", ret);
+    }
+}
+
+static void SettingBtGattsServiceStartCallback(uint8_t serverId, uint16_t srvcHandle, errcode_t status)
+{
+    if (g_sample_svr_handle == srvcHandle) {
+        WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "SettingBtGattsServiceStartCallback 0x%x 0x%x 0x%x", status, serverId, srvcHandle);
+    }
+}
+
+static void SettingBtGattsServiceStopCallback(uint8_t serverId, uint16_t srvcHandle, errcode_t status)
+{
+    WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "SettingBtGattsServiceStopCallback 0x%x 0x%x 0x%x", status, serverId, srvcHandle);
+}
+
+static void SettingBtGattsServiceDeleteCallback(uint8_t serverId, errcode_t status)
+{
+    WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "SettingBtGattsServiceDeleteCallback 0x%x 0x%x", status, serverId);
+}
+
+static void SettingBtGattsRequestReadCallback(uint8_t serverId, uint16_t connId, gatts_req_read_cb_t *readCbPara, errcode_t status)
+{
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SettingBtGattsRequestReadCallback handle = %u", readCbPara->handle);
+}
+
+static void SettingBtGattsRequestWriteCallback(uint8_t serverId, uint16_t connId, gatts_req_write_cb_t *writeCbPara,  errcode_t status)
+{
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SettingBtGattsRequestWriteCallback handle = %u", writeCbPara->handle);
+    if (g_sample_characteristic_handle == writeCbPara->handle) {
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SettingBtGattsRequestWriteCallback handle = %u", writeCbPara->handle);
+        if (writeCbPara->length == 9) {
+            if (memcmp("open ctkd", writeCbPara->value, writeCbPara->length) == 0) {
+                WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "enable ctkd");
+                // 一键双连使能(依赖安全连接参数配置)
+                errcode_t ret = gap_ble_set_ctkd_enable(true);
+                WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "gap_ble_set_ctkd_enable ret = %u", ret);
+
+                // 发起ble配对
+                ret = gap_ble_pair_remote_device(&g_bd_addr);
+                WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "gap_ble_pair_remote_device ret = %u ", ret);
+            }
+        } else if (writeCbPara->length == 10) {
+            if (memcmp("close ctkd", writeCbPara->value, writeCbPara->length) == 0) {
+                // 一键双连去使能
+                errcode_t ret = gap_ble_set_ctkd_enable(false);
+                WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "gap_ble_set_ctkd_disable ret = %u", ret);
+            }
+        }
+    } else if (g_diag_characteristic_handle == writeCbPara->handle) {
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "diag_gatt_write_req_cbk handle = %u", writeCbPara->handle);
+        diag_gatt_write_req_cbk(serverId, connId, writeCbPara, status);
+    } else if (g_diag_desc_handle == writeCbPara->handle) {
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "diag_gatt_set_handle handle = %u", writeCbPara->handle);
+        if ((writeCbPara->length == 2) && (*(char*)(writeCbPara->value) == 1)) {
+            WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "open gatt channel");
+            diag_gatt_set_handle(serverId, connId, g_diag_characteristic_handle);
+            msg_center_set_trans_channel(DIAG_FRAME_FID_BT);
+        } else if ((writeCbPara->length == 2) && (*(char*)(writeCbPara->value) == 0)) {
+            WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "close gatt channel");
+            diag_gatt_set_handle(0, 0, 0);
+            msg_center_set_trans_channel(DIAG_FRAME_FID_PHONE);
+        }
+    }
+}
+
+static void SettingBtGattsMtuChangedCallback(uint8_t serverId, uint16_t connId, uint16_t mtuSize, errcode_t status)
+{
+    WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "SettingBtGattsMtuChangedCallback connId = %u mtuSize = %u", connId, mtuSize);
+}
+
+static void SettingBtA2dpSnkAcceptTimerStop(void)
+{
+    WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "stop timer\n");
+    if (g_setting_a2dp_stream_accept_timer.timer != nullptr) {
+        (void)osal_timer_stop(&g_setting_a2dp_stream_accept_timer);
+        (void)osal_timer_destroy(&g_setting_a2dp_stream_accept_timer);
+        g_setting_a2dp_stream_accept_timer.timer = nullptr;
+    }
+    WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "stop timer success!\n");
+}
+
+static void SettingBtA2dpSnStartAcceptHandler(unsigned long data)
+{
+    UNUSED(data);
+    bd_addr_t active_bd_addr = a2dp_snk_get_active_device();
+    a2dp_snk_start_accept(&active_bd_addr);
+    SettingBtA2dpSnkAcceptTimerStop();
+}
+
+static errcode_t SettingBtA2dpSnkStartAcceptTimer(void)
+{
+    WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "start timer\n");
+    if (g_setting_a2dp_stream_accept_timer.timer != nullptr) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "timer is running");
+        return ERRCODE_SUCC;
+    }
+
+    g_setting_a2dp_stream_accept_timer.handler = SettingBtA2dpSnStartAcceptHandler;
+    g_setting_a2dp_stream_accept_timer.interval = A2DP_STREAM_ACCEPT_TIMER_PERIOD;
+
+    int32_t timer_ret = osal_timer_init(&g_setting_a2dp_stream_accept_timer);
+    if (timer_ret != EOK) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "create timer error! ret: %x\n", timer_ret);
+        SettingBtA2dpSnkAcceptTimerStop();
+        return ERRCODE_FAIL;
+    }
+    timer_ret = osal_timer_start(&g_setting_a2dp_stream_accept_timer);
+    if (timer_ret != EOK) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "start timer error! ret: %x\n", timer_ret);
+        SettingBtA2dpSnkAcceptTimerStop();
+        return ERRCODE_FAIL;
+    }
+    return ERRCODE_SUCC;
+}
+
+static int32_t SettingBtA2dpSnkAudioCreate()
+{
+#if MEDIA_A2DP_SNK_INTERFACE
+    WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "audioFormat %d channelCount %d sampleRate %d \n",
+        g_setting_audio_format_config.audioFormat, g_setting_audio_format_config.channelCount, g_setting_audio_format_config.sampleRate);
+
+    int32_t ret = AudioManagerA2dpSinkSetParam(g_setting_audio_format_config);
+    WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "AudioManagerA2dpSinkSetParam ret %x\n", ret);
+    ret = AudioManagerA2dpSinkCreate();
+    WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "AudioManagerA2dpSinkCreate ret %x\n", ret);
+#endif
+    /* 起定时器接受音乐开始请求 */
+    (void)SettingBtA2dpSnkStartAcceptTimer();
+    return 0;
+}
+
+static int32_t SettingBtA2dpSnkAudioDestroy()
+{
+#if MEDIA_A2DP_SNK_INTERFACE
+    int32_t ret = AudioManagerA2dpSinkDestroy();
+    WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "AudioManagerA2dpSinkDestroy ret %x\n", ret);
+#endif
+    return 0;
+}
+
+static void SettingBtA2dpSnkConnectStateChangedCb(bd_addr_t *bd_addr, int conn_state)
+{
+    WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "addr: ****%02x%02x%02x%02x conn_state: %x\n",
+        bd_addr->addr[3], bd_addr->addr[2], bd_addr->addr[1], bd_addr->addr[0], conn_state); /* 3 2 1 0 idx */
+}
+
+static void SettingBtA2dpSnkStartStreamReqCb(bd_addr_t *bd_addr)
+{
+    WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "addr: ****%02x%02x%02x%02x \n",
+        bd_addr->addr[3], bd_addr->addr[2], bd_addr->addr[1], bd_addr->addr[0]); /* 3 2 1 0 idx */
+    SettingBtA2dpSnkAudioCreate();
+}
+
+static void SettingBtA2dpSnkPlayingStateChangedCb(bd_addr_t *bd_addr, int playing_state)
+{
+    WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "addr: ****%02x%02x%02x%02x playing_state: %x\n",
+        bd_addr->addr[3], bd_addr->addr[2], bd_addr->addr[1], bd_addr->addr[0], playing_state); /* 3 2 1 0 idx */
+    if (playing_state == A2DP_NOT_PLAYING) {
+        SettingBtA2dpSnkAudioDestroy();
+    }
+}
+
+static void SettingBtA2dpSnkConfigChangedCb(bd_addr_t *bd_addr, a2dp_snk_codec_info_t *info)
+{
+    WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "addr: ****%02x%02x%02x%02x ",
+        bd_addr->addr[3], bd_addr->addr[2], bd_addr->addr[1], bd_addr->addr[0]); /* 3 2 1 0 idx */
+    WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP,
+        "codec_priority: %04x codec_type: %04x sample_rate: %02x bits_per_sample: %02x channel_mode: %02x",
+        info->codec_priority, info->codec_type, info->sample_rate, info->bits_per_sample, info->channel_mode);
+    WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP,
+        "codec_specific1: %04x codec_specific2: %04x codec_specific3: %04x codec_specific4: %04x\n",
+        (unsigned int)info->codec_specific1,
+        (unsigned int)info->codec_specific2,
+        (unsigned int)info->codec_specific3,
+        (unsigned int)info->codec_specific4);
+#if MEDIA_A2DP_SNK_INTERFACE
+    if (info->codec_type == A2DP_SNK_CODEC_TYPE_AAC) {
+        g_setting_audio_format_config.audioFormat = AAC_LC;
+    } else {
+        g_setting_audio_format_config.audioFormat = SBC;
+    }
+    /* channel count 1 or 2 */
+    g_setting_audio_format_config.channelCount = (info->channel_mode == A2DP_SNK_CODEC_CHANNEL_MODE_NONE ? 1 : 2);
+
+    switch (info->sample_rate) {
+        case A2DP_SNK_CODEC_SAMPLE_RATE_48000:
+            g_setting_audio_format_config.sampleRate = BT_AUDIO_A2DP_SMAPLE_RATE48000;
+            break;
+        case A2DP_SNK_CODEC_SAMPLE_RATE_88200:
+            g_setting_audio_format_config.sampleRate = BT_AUDIO_A2DP_SMAPLE_RATE88200;
+            break;
+        case A2DP_SNK_CODEC_SAMPLE_RATE_96000:
+            g_setting_audio_format_config.sampleRate = BT_AUDIO_A2DP_SMAPLE_RATE96000;
+            break;
+        default:
+            g_setting_audio_format_config.sampleRate = BT_AUDIO_A2DP_SMAPLE_RATE44100;
+            break;
+    }
+    WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "audioFormat %d channelCount %d sampleRate %d \n",
+        g_setting_audio_format_config.audioFormat, g_setting_audio_format_config.channelCount, g_setting_audio_format_config.sampleRate);
+#endif
+}
+
+// 注册回调函数
+static gap_call_backs_t g_settingBtGapCallBacks{};
+static a2dp_src_callbacks_t g_settingA2dprcCallbacks{};
+static gap_ble_callbacks_t g_settingGapBleCallbacks{};
+static gatts_callbacks_t g_settingBtGattsCallbacks{};
+static a2dp_snk_callbacks_t g_settingA2dpSnkCallbacks = {};
+
+
+static void SettingBleConnectCallback(uint16_t conn_id, errcode_t status, const gap_ble_conn_param_update_t *param)
+{
+    WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "SettingBleConnectCallback conn_id:%u, interval-1:%u latency:%u timeout:%u\n",conn_id, param->interval, param->latency, param->timeout);
+}
+
+void SettingBtInitCallBacks()
+{
+    g_settingBtGapCallBacks.discovery_result_callback = SettingBtGapDiscoveryResultCallback;
+    g_settingBtGapCallBacks.discovery_state_changed_callback = SettingBtGapDiscoveryStateChangedCallback;
+    g_settingBtGapCallBacks.acl_state_changed_callbak = SettingBtGapAclStateChangedCallback;
+    g_settingBtGapCallBacks.read_remote_rssi_event_callback = SettingBtGapReadRemoteRssiEventCallback;
+    g_settingBtGapCallBacks.remote_name_changed_callback = SettingBtRemoteNameChangedCallback;
+    g_settingBtGapCallBacks.is_accept_conn_on_safe_mode_callback = SettingBtIsAcceptConnOnSafeModeCallback;
+    g_settingBtGapCallBacks.pair_status_changed_callback = SettingBtGapPairStatusChangedCallback;
+    g_settingBtGapCallBacks.pair_requested_callback = SettingBtGapPairRequestedCallback;
+    g_settingBtGapCallBacks.pair_confiremed_callback = SettingBtGapPairConfirmedCallback;
+    gap_register_callbacks(&g_settingBtGapCallBacks);
+
+    g_settingA2dprcCallbacks.connectstate_changed_cb = A2dpSettingSrcConnectstateChanged;
+    g_settingA2dprcCallbacks.configuration_changed_cb = A2dpSettingSrcConfigureChanged;
+    g_settingA2dprcCallbacks.playing_state_changed_cb = A2dpSettingSrcPlayingStateChanged;
+    a2dp_src_register_callbacks(&g_settingA2dprcCallbacks);
+
+    /* a2dp sink */
+    g_settingA2dpSnkCallbacks.connectstate_changed_cb = SettingBtA2dpSnkConnectStateChangedCb;
+    g_settingA2dpSnkCallbacks.start_stream_request_cb = SettingBtA2dpSnkStartStreamReqCb;
+    g_settingA2dpSnkCallbacks.playing_state_changed_cb = SettingBtA2dpSnkPlayingStateChangedCb;
+    g_settingA2dpSnkCallbacks.configuration_changed_cb = SettingBtA2dpSnkConfigChangedCb;
+    a2dp_snk_register_callbacks(&g_settingA2dpSnkCallbacks);
+}
+
+void SettingBtInitCallBacksEx()
+{
+    g_settingGapBleCallbacks.conn_state_change_cb = SettingBleConnStateChangeCallback;
+    g_settingGapBleCallbacks.start_adv_cb = SettingBleAdvStartStateCallback;
+    g_settingGapBleCallbacks.stop_adv_cb = SettingBleAdvStopCallback;
+    g_settingGapBleCallbacks.terminate_adv_cb = SettingBleAdvTerminateCallback;
+    g_settingGapBleCallbacks.conn_param_update_cb = SettingBleConnectCallback;
+    wrapper_gap_ble_register_callbacks(&g_settingGapBleCallbacks);
+
+    g_settingBtGattsCallbacks.add_service_cb = SettingBtGattsServiceAddCallback;
+    g_settingBtGattsCallbacks.add_characteristic_cb = SettingBtGattsCharacteristicAddCallback;
+    g_settingBtGattsCallbacks.add_descriptor_cb = SettingBtGattsDescriptorAddCallback;
+    g_settingBtGattsCallbacks.start_service_cb = SettingBtGattsServiceStartCallback;
+    g_settingBtGattsCallbacks.stop_service_cb = SettingBtGattsServiceStopCallback;
+    g_settingBtGattsCallbacks.delete_service_cb = SettingBtGattsServiceDeleteCallback;
+    g_settingBtGattsCallbacks.read_request_cb = SettingBtGattsRequestReadCallback;
+    g_settingBtGattsCallbacks.write_request_cb = SettingBtGattsRequestWriteCallback;
+    g_settingBtGattsCallbacks.mtu_changed_cb = SettingBtGattsMtuChangedCallback;
+    wrapper_gatts_register_callbacks(&g_settingBtGattsCallbacks);
+}
+
+void SettingBtInitGatts(void)
+{
+    uint16_t id = 0xF01F;
+    uint16_t ser_id = 0xFF1F;
+    uint8_t serverId = 0;
+    bt_uuid_t uuid;
+    int ret;
+
+    uuid.uuid_len = sizeof(ser_id);
+    memcpy_s(uuid.uuid, sizeof(uuid.uuid), (char *)&ser_id, sizeof(ser_id));
+    ret = wrapper_gatts_register_server(&uuid, &serverId); /* 注册gatt server */
+    WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "gatts_register_server ret: 0x%x serverId = 0x%x", ret, serverId);
+
+    uuid.uuid_len = sizeof(id);
+    memcpy_s(uuid.uuid, sizeof(uuid.uuid), (char *)&id, sizeof(id));
+    ret = wrapper_gatts_add_service(serverId, &uuid, true);
+    WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "gatts_add_service ret: 0x%x", ret);
+
+    wrapper_gatts_service_start();
+}
+
+static uint8_t Char2Num(int8_t c)
+{
+    if (c >= '0' && c <= '9') {
+        return (uint8_t)(c - '0');
+    } else if (c >= 'A' && c <= 'F') {
+        return (uint8_t)(c - 'A' + TEN);
+    } else if (c >= 'a' && c <= 'f') {
+        return (uint8_t)(c - 'a' + TEN);
+    } else {
+        return 0xFF;
+    }
+}
+
+static uint32_t GenerateUuidFromString(const char *str, uint8_t len, bt_uuid_t *uuid_out)
+{
+    int slen = (int)strnlen(str, len);
+    bool new_uuid = false;
+    if (uuid_out == nullptr) {
+        return ERRCODE_INVALID_PARAM;
+    }
+
+    uuid_out->uuid_len = (uint8_t)slen / 2; /* 2: 2个字符组成一个字节,因此只取偶数个字符 */
+    for (int i = 0; i + 1 < slen; i += 2) { /* 2: 同上 */
+        uint8_t num1 = Char2Num(str[i]);
+        uint8_t num2 = Char2Num(str[i + 1]);
+        if (num1 == UINT8_MAX || num2 == UINT8_MAX) {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "invalid input %c%c\n", str[i], str[i + 1]);
+            return ERRCODE_INVALID_PARAM;
+        }
+
+        uuid_out->uuid[i / 2] = (uint8_t)((num1 << BIT4) | num2); /* 2: 同上 */
+        WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "%02x ", (uint8_t)(uuid_out->uuid[i / 2])); /* 2: 同上 */
+    }
+
+    WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "\n");
+    return ERRCODE_SUCC;
+}
+
+void SettingBtSppServerCreate(const char *spp_uuid, const char *name, uint8_t name_len)
+{
+    spp_create_socket_para_t param;
+    if (GenerateUuidFromString((const char *)spp_uuid, (uint8_t)strlen(spp_uuid), &param.uuid) != ERRCODE_SUCC) {
+        WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "get uuid fail\n");
+        return;
+    }
+
+    param.socket_type = SPP_SOCKET_RFCOMM;
+    param.is_encrypt = true;
+
+    WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "uuid: %s uuid_len: %u\n", spp_uuid, param.uuid.uuid_len);
+    WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "socket_type: %x is_encrypt: %d name: %s nameLen: %u\n", param.socket_type,
+        param.is_encrypt, name, name_len);
+
+    int ret = spp_server_create(&param, name, name_len);
+    WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "spp_server_create ret: %x\n", ret);
+}
+
+static int BtSppServerAcceptTaskBody(void *data)
+{
+    int server_id = (int)(intptr_t)data;
+    WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "server_id: %x\n", server_id);
+
+    int ret = spp_server_accept(server_id);
+
+    WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "spp_server_accept ret: %x\n", ret);
+
+    return OSAL_SUCCESS;
+}
+
+/* 等待client连接 */
+void SettingBtSppServerAccept(uint8_t server_id)
+{
+    osal_task *task = osal_kthread_create(BtSppServerAcceptTaskBody, (void *)(uintptr_t)server_id,
+        "spp_server_accept_task", BT_SPP_TASK_STACK_SIZE);
+    if (task == nullptr) {
+        WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "create task fail\n");
+        return;
+    }
+
+    int ret = osal_kthread_set_priority(task, BT_SPP_TASK_PRI);
+    if (ret != OSAL_SUCCESS) {
+        WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "set pri error: %08x\n", ret);
+    }
+
+    WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "create task success.\n");
+}
+
+void SettingBtInitSpp(void)
+{
+    char uuid[] = "1101";
+    char name[] = "COM1";
+    uint8_t name_len = strlen(name) + 1;
+    uint8_t server_id = 0;
+
+    /* 创建spp */
+    WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "create spp server uuid=%s name=%s name_len=%d\n", uuid, name, name_len);
+    SettingBtSppServerCreate(uuid, name, name_len);
+    SettingBtSppServerAccept(server_id);
+}
+
+void BleSettingAdvStart(void)
+{
+    int advId = g_sample_adv_id;
+    if (SettingBluetoothModel::GetInstance()->GetAdvStartState()) {
+        WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "BleSettingAdvStart already started");
+        gap_ble_stop_adv(advId);
+        osDelay(50);
+    }
+    gap_ble_adv_params_t adv_para;
+    memset_s(&adv_para, sizeof(gap_ble_adv_params_t), 0, sizeof(gap_ble_adv_params_t));
+    adv_para.min_interval = 0x30;
+    adv_para.max_interval = 0x60;
+    adv_para.adv_type = GAP_BLE_ADV_CONN_SCAN_UNDIR;
+    adv_para.channel_map = 0x7;
+    adv_para.duration = 0;
+    gap_ble_set_adv_param(advId, &adv_para);
+    gap_ble_set_local_appearance(GAP_BLE_APPEARANCE_TYPE_GENERIC_WATCH);
+    errcode_t ret = gap_ble_start_adv(advId);
+    WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "BleSettingAdvStart bt gap_ble_start_adv  ret = 0x%x", ret);
+}
+
+#ifdef __cplusplus
+}
+#endif
+}
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/settings/src/model/SettingCardModel.cpp b/code/sdk/application/wearable/evb/nativeapp/nativeui/settings/src/model/SettingCardModel.cpp
new file mode 100644 (file)
index 0000000..b434cf5
--- /dev/null
@@ -0,0 +1,154 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SettingCardModel\r
+ * Create: 2025-06-01\r
+ */\r
+#include <cstdint>\r
+#include <algorithm>\r
+#include "dfx_reboot.h"\r
+#include "kv_store.h"\r
+#include "UiConfig.h"\r
+#include "main/MainModel.h"\r
+#include "settings/common/SettingCardEffectResourceImage.h"\r
+#include "settings/common/SettingCommon.h"\r
+#include "settings/model/SettingCardModel.h"\r
+\r
+namespace OHOS {\r
+static const int STYLE_VALUE_LEN = 128;\r
+static const char* SWIPE_EFFECT = "swipe_effect";\r
+\r
+static const std::map<CardEffectID, std::pair<const char*, std::vector<int>>> g_effectMap = {\r
+    {CardEffectID::UI_CUBE, std::make_pair("3D折叠", UI_3D_FOLD_RESIDS)},\r
+    {CardEffectID::UI_CARD_FLIP, std::make_pair("十字平滑", UI_CARD_FLIP_RESIDS)},\r
+    {CardEffectID::UI_PUSH_PRESS, std::make_pair("推压", UI_PUSH_PRESS_RESIDS)},\r
+    {CardEffectID::UI_TURN_PAGE, std::make_pair("翻页", UI_TURN_PAGE_RESIDS)},\r
+    {CardEffectID::UI_WINDMILL, std::make_pair("风车", UI_WINDMILL_RESIDS)},\r
+    {CardEffectID::UI_ZOOM, std::make_pair("缩放", UI_ZOOM_RESIDS)},\r
+};\r
+\r
+SettingCardModel::SettingCardModel()\r
+{\r
+    std::vector<SettingUnionItemData> tempUnionData = {{\r
+        PlainTextItemData{"卡片"},\r
+        IconTextNavigationItemData{SettingPageId::CARD_EFFECT_PAGE, IMAGE_CARD_LIST_CARDANIMATOR, "卡片动效",\r
+            nullptr,true, SETTING_LIST_DEFAULT_BG_COLOR, SETTING_LIST_DEFAULT_BG_COLOR_OPA},\r
+        IconTextNavigationItemData{SettingPageId::CARD_MGR_PAGE, IMAGE_CARD_LIST_CARDMANAGER, "卡片管理",\r
+            nullptr,true, SETTING_LIST_DEFAULT_BG_COLOR, SETTING_LIST_DEFAULT_BG_COLOR_OPA},\r
+    }};\r
+    cardUnionData_.swap(tempUnionData);\r
+\r
+    selectStyle_ = CardEffectID::UI_INVALIDE;\r
+    int backgroundImageId = IMAGE_DESKTOP_BG;\r
+    const char* resourceImage = SETTING_IMAGE;\r
+    for (auto it = g_effectMap.begin(); it != g_effectMap.end(); ++it) {\r
+        effects_[it->first] = SettingCardEffectSample(it->first,\r
+            it->second.second, it->second.first,\r
+            backgroundImageId, resourceImage, false);\r
+    }\r
+}\r
+\r
+std::vector<SettingUnionItemData>& SettingCardModel::GetCardUnionData()\r
+{\r
+    return cardUnionData_;\r
+}\r
+\r
+std::vector<SettingCardItemData>& SettingCardModel::GetCardData()\r
+{\r
+    RefreshCardData();\r
+    return cardData_;\r
+}\r
+\r
+void SettingCardModel::RefreshCardData()\r
+{\r
+    MainModel::GetInstance().InitCardSettings();\r
+    uint8_t selectedCardCount = MainModel::GetInstance().GetCardSettingCount();\r
+    CardId *selectedCardSettings = MainModel::GetInstance().GetCardSettings();\r
+\r
+    if (cardData_.size() != (MAX_CARD - 1)) {\r
+        cardData_.resize(MAX_CARD - 1); // 系统中的card总个数是固定的, WATCH_FACE不属于card范畴\r
+    }\r
+    for (uint8_t i = 0; i < cardData_.size(); i++) {\r
+        CardId cardId = (CardId)(i+1); // CardId是定义的枚举, WATCH_FACE=0, COMPASS=1;\r
+        uint8_t cardIndex = i;         // CardIndex是cardInfoMap中的index, cardInfoMap[0]=COMPASS\r
+\r
+        const CardInfo *info = MainModel::GetInstance().GetCardInfo(cardId);\r
+        if (info == nullptr) {\r
+            continue;\r
+        }\r
+\r
+        SettingCardItemData& data = cardData_[cardIndex];\r
+        data.index = cardIndex;\r
+        data.id = info->id;\r
+        data.image = info->cardImg;\r
+        data.isSelect = false;\r
+        for (uint8_t j = 0; j < selectedCardCount; j++) {\r
+            if (selectedCardSettings[j] == cardId) {\r
+                data.isSelect = true;\r
+                break;\r
+            }\r
+        }\r
+    }\r
+}\r
+\r
+void SettingCardModel::AddCard(uint8_t index)\r
+{\r
+    MainModel::GetInstance().AddCardSetting(index);\r
+}\r
+\r
+void SettingCardModel::DeleteCard(uint8_t index)\r
+{\r
+    MainModel::GetInstance().DeleteCardSetting(index);\r
+}\r
+\r
+void SettingCardModel::SetSelectedCard(uint8_t cardId)\r
+{\r
+    selectedCardId_ = cardId;\r
+}\r
+\r
+uint8_t SettingCardModel::GetSelectedCard(void)\r
+{\r
+    return selectedCardId_;\r
+}\r
+\r
+void SettingCardModel::InitEffectItem(void)\r
+{\r
+    for (auto& pair : effects_) {\r
+        pair.second.selected = false;\r
+    }\r
+    CardEffectID selectStyle = this->GetSwipeEffectStyle();\r
+    effects_[selectStyle].selected = true;\r
+}\r
+\r
+std::map<CardEffectID, SettingCardEffectSample>& SettingCardModel::GetEffectListItems(void)\r
+{\r
+    return effects_;\r
+}\r
+\r
+CardEffectID SettingCardModel::GetSwipeEffectStyle(void)\r
+{\r
+    if (selectStyle_ != CardEffectID::UI_INVALIDE) {\r
+        return selectStyle_;\r
+    }\r
+    selectStyle_ = CardEffectID::UI_ZOOM;\r
+    char temp[STYLE_VALUE_LEN] = { 0 };\r
+    (void)UtilsGetValue(SWIPE_EFFECT, temp, STYLE_VALUE_LEN);\r
+    auto it = std::find_if(effects_.begin(), effects_.end(),\r
+        [temp](const std::pair<CardEffectID, SettingCardEffectSample>& pair) {\r
+            return strcmp(temp, pair.second.label) == 0;\r
+        });\r
+    if (it != effects_.end()) {\r
+        selectStyle_ = it->first;\r
+    }\r
+    return selectStyle_;\r
+}\r
+\r
+void SettingCardModel::SetSwipeEffectStyle(CardEffectID swipeId)\r
+{\r
+    if (swipeId == CardEffectID::UI_INVALIDE) {\r
+        // If the corresponding style is not found, set the default value to UI_ZOOM.\r
+        swipeId = CardEffectID::UI_ZOOM;\r
+    }\r
+    (void)UtilsSetValue(SWIPE_EFFECT, effects_[swipeId].label);\r
+    selectStyle_ = swipeId;\r
+}\r
+} // OHOS\r
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/settings/src/model/SettingDesktopModel.cpp b/code/sdk/application/wearable/evb/nativeapp/nativeui/settings/src/model/SettingDesktopModel.cpp
new file mode 100644 (file)
index 0000000..d22e7ec
--- /dev/null
@@ -0,0 +1,371 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SettingDesktopModel\r
+ * Create: 2025-06-01\r
+ */\r
+#include <algorithm>\r
+#include "dirent.h"\r
+#include "UiConfig.h"\r
+#include "kv_store.h"\r
+#include "common/image_cache_manager.h"\r
+#include "wearable_log.h"\r
+#include "main/DialBinParser.h"\r
+#include "settings/common/SettingCommon.h"\r
+#include "settings/model/SettingDesktopModel.h"\r
+\r
+namespace OHOS {\r
+static constexpr uint32_t STYLE_VALUE_LEN = 32;\r
+static constexpr uint8_t SETTING_DIAL_STYLE_ROLLER_IDX = 1;\r
+static constexpr uint8_t SETTING_DIAL_STYLE_COVERFLOW_IDX = 2;\r
+static constexpr uint8_t SETTING_DIAL_STYLE_AOD_IDX = 3;\r
+\r
+SettingDesktopModel::SettingDesktopModel()\r
+{\r
+    std::vector<SettingUnionItemData> tempDesktopUnionData = {{\r
+        PlainTextItemData{"表盘与桌面"},\r
+        IconTextNavigationItemData{SettingPageId::DESKTOP_DIAL_PAGE, IMAGE_DESKTOP_LIST_DIAL, "表盘",\r
+            nullptr, true, SETTING_LIST_DEFAULT_BG_COLOR, SETTING_LIST_DEFAULT_BG_COLOR_OPA},\r
+        IconTextNavigationItemData{SettingPageId::DESKTOP_HOME_PAGE, IMAGE_DESKTOP_LIST_HOME, "桌面风格",\r
+            nullptr, true, SETTING_LIST_DEFAULT_BG_COLOR, SETTING_LIST_DEFAULT_BG_COLOR_OPA},\r
+        IconTextNavigationItemData{SettingPageId::DESKTOP_DIAL_STYLE_PAGE, IMAGE_DESKTOP_LIST_DIAL_STYLE, "表盘风格",\r
+            nullptr, true, SETTING_LIST_DEFAULT_BG_COLOR, SETTING_LIST_DEFAULT_BG_COLOR_OPA},\r
+    }};\r
+    desktopUnionData_.swap(tempDesktopUnionData);\r
+\r
+    std::vector<SettingDesktopHomeItemData> tempDesktopHomeData = {{\r
+        {APPLIST_STYLE, IMAGE_DESKTOP_HOME_SELECTED_APPLIST, IMAGE_DESKTOP_HOME_UNSELECT_APPLIST, "列表", false},\r
+        {HEXAGONS_STYLE, IMAGE_DESKTOP_HOME_SELECTED_HEXAGONS, IMAGE_DESKTOP_HOME_UNSELECT_HEXAGONS, "蜂窝", false},\r
+        {FOOTBALL_STYLE, IMAGE_DESKTOP_HOME_SELECTED_FOOTBALL, IMAGE_DESKTOP_HOME_UNSELECT_FOOTBALL, "足球", false},\r
+        {WATERFALL_STYLE, IMAGE_DESKTOP_HOME_SELECTED_WATERFALL, IMAGE_DESKTOP_HOME_UNSELECT_WATERFALL, "瀑布", false},\r
+        {PLANET_STYLE, IMAGE_DESKTOP_HOME_SELECTED_PLANET, IMAGE_DESKTOP_HOME_UNSELECT_PLANET, "星球", false},\r
+    }};\r
+    desktopHomeData_.swap(tempDesktopHomeData);\r
+\r
+    std::vector<SettingUnionItemData> tempDialStyleUnionData = {{\r
+        PlainTextItemData{"表盘风格"},\r
+        IconTextToggleItemData{IMAGE_DESKTOP_DIALSTYLE_COVERFLOW, "coverflow", false,\r
+            SETTING_LIST_DEFAULT_BG_COLOR, SETTING_LIST_DEFAULT_BG_COLOR_OPA},\r
+        IconTextToggleItemData{IMAGE_DESKTOP_DIALSTYLE_ROLLER, "roller", false,\r
+            SETTING_LIST_DEFAULT_BG_COLOR, SETTING_LIST_DEFAULT_BG_COLOR_OPA},\r
+        IconTextToggleItemData{IMAGE_DESKTOP_DIALSTYLE_AOD, "息屏显示", false,\r
+            SETTING_LIST_DEFAULT_BG_COLOR, SETTING_LIST_DEFAULT_BG_COLOR_OPA},\r
+    }};\r
+    dialStyleUnionData_.swap(tempDialStyleUnionData);\r
+}\r
+\r
+std::vector<SettingUnionItemData>& SettingDesktopModel::GetDesktopUnionData()\r
+{\r
+    return desktopUnionData_;\r
+}\r
+\r
+std::vector<SettingDesktopHomeItemData>& SettingDesktopModel::GetDesktopHomeData()\r
+{\r
+    DesktopStyle style = GetDesktopStyle();\r
+    for (auto& it : desktopHomeData_) {\r
+        it.isSelect = (it.style == style);\r
+    }\r
+    return desktopHomeData_;\r
+}\r
+\r
+std::vector<SettingUnionItemData>& SettingDesktopModel::GetDialStyleUnionData()\r
+{\r
+    RefreshDialStyleUnionDataForStyle();\r
+    RefreshDialStyleUnionDataForAod();\r
+    return dialStyleUnionData_;\r
+}\r
+\r
+void SettingDesktopModel::RefreshDialStyleUnionDataForStyle()\r
+{\r
+    DialStyle style = GetDialStyle();\r
+    auto coverflowItemData = static_cast<IconTextToggleItemData*>(\r
+        dialStyleUnionData_[SETTING_DIAL_STYLE_COVERFLOW_IDX].GetUnionItemData());\r
+    auto rollerItemData = static_cast<IconTextToggleItemData*>(\r
+        dialStyleUnionData_[SETTING_DIAL_STYLE_ROLLER_IDX].GetUnionItemData());\r
+    coverflowItemData->selected = (style == DialStyle::COVERFLOW);\r
+    rollerItemData->selected = (style == DialStyle::ROLLER);\r
+}\r
+\r
+void SettingDesktopModel::RefreshDialStyleUnionDataForAod()\r
+{\r
+    auto aodItemData = static_cast<IconTextToggleItemData*>(\r
+        dialStyleUnionData_[SETTING_DIAL_STYLE_AOD_IDX].GetUnionItemData());\r
+    aodItemData->selected = MainModel::GetInstance().IsAodEnabled();\r
+}\r
+\r
+DesktopStyle SettingDesktopModel::GetDesktopStyle(void)\r
+{\r
+    DesktopStyle style;\r
+    char temp[STYLE_VALUE_LEN] = { 0 };\r
+    (void)UtilsGetValue("applist_style", temp, STYLE_VALUE_LEN);\r
+    if (strcmp(temp, "hexagons") == 0) {\r
+        style = HEXAGONS_STYLE;\r
+    } else if (strcmp(temp, "football") == 0) {\r
+        style = FOOTBALL_STYLE;\r
+    } else if (strcmp(temp, "waterfall") == 0) {\r
+        style = WATERFALL_STYLE;\r
+    } else if (strcmp(temp, "planet") == 0)\r
+        style = PLANET_STYLE;\r
+    else {\r
+        style = APPLIST_STYLE;\r
+    }\r
+    return style;\r
+}\r
+\r
+void SettingDesktopModel::SetDesktopStyle(DesktopStyle style)\r
+{\r
+    if (style == APPLIST_STYLE) {\r
+        (void)UtilsSetValue("applist_style", "list");\r
+    } else if (style == HEXAGONS_STYLE) {\r
+        (void)UtilsSetValue("applist_style", "hexagons");\r
+    } else if (style == FOOTBALL_STYLE) {\r
+        (void)UtilsSetValue("applist_style", "football");\r
+    } else if (style == WATERFALL_STYLE) {\r
+        (void)UtilsSetValue("applist_style", "waterfall");\r
+    } else if (style == PLANET_STYLE) {\r
+        (void)UtilsSetValue("applist_style", "planet");\r
+    }\r
+}\r
+\r
+uint8_t SettingDesktopModel::GetDesktopHomeDataSelect()\r
+{\r
+    DesktopStyle style = GetDesktopStyle();\r
+    for (size_t i = 0; i < desktopHomeData_.size(); i++) {\r
+        if (desktopHomeData_[i].style == style) {\r
+            return i;\r
+        }\r
+    }\r
+    return 0;\r
+}\r
+\r
+void SettingDesktopModel::SetDesktopHomeDataSelect(DesktopStyle style)\r
+{\r
+    for (auto& it : desktopHomeData_) {\r
+        it.isSelect = (it.style == style);\r
+    }\r
+    SetDesktopStyle(style);\r
+}\r
+\r
+DialStyle SettingDesktopModel::GetDialStyle()\r
+{\r
+    DialStyle style;\r
+    char temp[STYLE_VALUE_LEN] = { 0 };\r
+    (void)UtilsGetValue("set_dial_style", temp, STYLE_VALUE_LEN);\r
+    if (strcmp(temp, "DialStyle::ROLLER") == 0) {\r
+        style = DialStyle::ROLLER;\r
+    } else { // "DialStyle::COVERFLOW" or ""\r
+        style = DialStyle::COVERFLOW;\r
+    }\r
+    return style;\r
+}\r
+\r
+void SettingDesktopModel::SetDialStyle(DialStyle style)\r
+{\r
+    if (style == DialStyle::COVERFLOW) {\r
+        (void)UtilsSetValue("set_dial_style", "DialStyle::COVERFLOW");\r
+    } else if (style == DialStyle::ROLLER) {\r
+        (void)UtilsSetValue("set_dial_style", "DialStyle::ROLLER");\r
+    }\r
+}\r
+\r
+void SettingDesktopModel::SetDialStyleDataSelect(const char* DialStyleName)\r
+{\r
+    auto coverflowItemData = static_cast<IconTextToggleItemData*>(\r
+        dialStyleUnionData_[SETTING_DIAL_STYLE_COVERFLOW_IDX].GetUnionItemData());\r
+    auto rollerItemData = static_cast<IconTextToggleItemData*>(\r
+        dialStyleUnionData_[SETTING_DIAL_STYLE_ROLLER_IDX].GetUnionItemData());\r
+    auto aodItemData = static_cast<IconTextToggleItemData*>(\r
+        dialStyleUnionData_[SETTING_DIAL_STYLE_AOD_IDX].GetUnionItemData());\r
+\r
+    if (strcmp(DialStyleName, aodItemData->textContent) == 0) {\r
+        aodItemData->selected = !aodItemData->selected;\r
+        MainModel::GetInstance().EnableAod(aodItemData->selected);\r
+    } else {\r
+        DialStyle style;\r
+        rollerItemData->selected = !rollerItemData->selected;\r
+        coverflowItemData->selected = !coverflowItemData->selected;\r
+        style = rollerItemData->selected ? DialStyle::ROLLER : DialStyle::COVERFLOW;\r
+        SetDialStyle(style);\r
+    }\r
+}\r
+\r
+void SettingDesktopModel::LoadAllDial(void)\r
+{\r
+    LoadAllDialFromRam(); // 导入在线表盘\r
+    size_t dialSize = dialInfos_.size();\r
+    size_t aodSize = aodDialInfos_.size();\r
+    LoadAllDialFromFs(); // 导入离线表盘\r
+    /* 只排序离线表盘 */\r
+    std::sort(dialInfos_.begin() + dialSize, dialInfos_.end(), [](const SetDialInfo& f, const SetDialInfo& n) {\r
+                return f.dialName < n.dialName;\r
+            });\r
+    std::sort(aodDialInfos_.begin() + aodSize,\r
+        aodDialInfos_.end(),\r
+        [](const SetDialInfo &f, const SetDialInfo &n) { return f.dialName < n.dialName; });\r
+}\r
+\r
+std::vector<SetDialInfo>& SettingDesktopModel::GetDialInfo(void)\r
+{\r
+    return dialInfos_;\r
+}\r
+\r
+std::vector<SetDialInfo>& SettingDesktopModel::GetAmbientDialInfo(void)\r
+{\r
+    return aodDialInfos_;\r
+}\r
+\r
+void SettingDesktopModel::SaveDialSetting(uint8_t pageIndex)\r
+{\r
+    if (pageIndex >= dialInfos_.size()) {\r
+        return;\r
+    }\r
+    DialSetting diagSetting;\r
+    SetDialInfo &info = dialInfos_[pageIndex];\r
+    diagSetting.dialFlag = info.dialFlag;\r
+    diagSetting.dialId = info.id;\r
+    diagSetting.dialFullName = info.dialFullName;\r
+    MainModel::GetInstance().AddDialSetting(diagSetting);\r
+}\r
+\r
+void SettingDesktopModel::SetSpecifyDialSetting(const DialSetting &setting)\r
+{\r
+    hasSpecificDial_ = true;\r
+    specificDialSetting_ = setting;\r
+}\r
+\r
+void SettingDesktopModel::ClearDialInfo(void)\r
+{\r
+    for (auto iter : dialInfos_) {\r
+        if (iter.dialFlag) {\r
+            ImageCacheManager::GetInstance().UnloadOneInMultiRes(iter.resId, iter.dialFullName);\r
+        } else {\r
+            ImageCacheManager::GetInstance().UnloadSingleRes(iter.imageFullName);\r
+        }\r
+    }\r
+    dialInfos_.clear();\r
+    aodDialInfos_.clear();\r
+\r
+    if (hasSpecificDial_) {\r
+        MainModel::GetInstance().GetDialSetting() = specificDialSetting_;\r
+        MainModel::GetInstance().AddDialSetting(specificDialSetting_);\r
+    }\r
+}\r
+\r
+uint8_t SettingDesktopModel::GetPageIndex(void)\r
+{\r
+    uint8_t index = 0;\r
+    DialSetting dialSetting = MainModel::GetInstance().GetDialSetting();\r
+    for (auto& iter : dialInfos_) {\r
+        if (dialSetting.dialFlag) {\r
+            if (strcmp(iter.dialFullName.c_str(), dialSetting.dialFullName.c_str()) == 0) {\r
+                return index;\r
+            }\r
+        } else {\r
+            if ((!iter.dialFlag) && (iter.id == dialSetting.dialId)) {\r
+                return index;\r
+            }\r
+        }\r
+        index++;\r
+    }\r
+    return 0;\r
+}\r
+\r
+void SettingDesktopModel::LoadAllDialFromRam()\r
+{\r
+    for (uint8_t i = 0; i < MainModel::GetInstance().GetDialInfoNum(); i++) {\r
+        const DialInfo *info = MainModel::GetInstance().GetDialInfo(i);\r
+        if (info == nullptr) {\r
+            continue;\r
+        }\r
+        SetDialInfo dialInfo{0};\r
+        dialInfo.dialFlag = 0;\r
+        dialInfo.id = i;\r
+        dialInfo.dialName = info->dialName;\r
+        dialInfo.imageFullName = info->dialImg;\r
+        ImageInfo* imageInfo = ImageCacheManager::GetInstance().LoadSingleRes(info->dialImg, false);\r
+        if (info == nullptr) {\r
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "LoadAllDialFromRam loadimage %s fail", info->dialImg);\r
+            continue;\r
+        }\r
+        dialInfo.preImageInfo = imageInfo;\r
+        if (info->capability == DIAL_DISPLAY_CAPABILITY_NORMAL_ONLY) {\r
+            dialInfos_.push_back(dialInfo);\r
+        } else if (info->capability == DIAL_DISPLAY_CAPABILITY_AMBITIENT_ONLY) {\r
+            aodDialInfos_.push_back(dialInfo);\r
+        } else {\r
+            dialInfos_.push_back(dialInfo);\r
+            aodDialInfos_.push_back(dialInfo);\r
+        }\r
+    }\r
+}\r
+\r
+void SettingDesktopModel::LoadAllDialFromFs()\r
+{\r
+    struct dirent *direntp;\r
+\r
+    // 打开目录\r
+    DIR *dirp = opendir(APP_DIAL_PATH);\r
+    // 遍历文件\r
+    if (dirp != nullptr) {\r
+        while ((direntp = readdir(dirp)) != nullptr) {\r
+            SetDialInfo dialInfo{0};\r
+            if (ParseDialHeader(direntp->d_name, dialInfo) != 0) {\r
+                continue;\r
+            }\r
+            if (dialInfo.capability == DIAL_DISPLAY_CAPABILITY_NORMAL_ONLY) {\r
+                dialInfos_.push_back(dialInfo);\r
+            } else if (dialInfo.capability == DIAL_DISPLAY_CAPABILITY_AMBITIENT_ONLY) {\r
+                aodDialInfos_.push_back(dialInfo);\r
+            } else {\r
+                dialInfos_.push_back(dialInfo);\r
+                aodDialInfos_.push_back(dialInfo);\r
+            }\r
+        }\r
+    }\r
+    // 关闭目录\r
+    closedir(dirp);\r
+}\r
+\r
+int32_t SettingDesktopModel::ParseDialHeader(const std::string &dialFileName, SetDialInfo &dialInfo)\r
+{\r
+    std::string dialFullName = APP_DIAL_PATH;\r
+    dialFullName += "/";\r
+    dialFullName += dialFileName;\r
+    FILE *fp = fopen(dialFullName.c_str(), "rb");\r
+    if (fp == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ParseDialHeader cannot open file: %s",\r
+            dialFullName.c_str());\r
+        return -1;\r
+    }\r
+    DialPreviewInfo preInfo{0};\r
+    bool ret = DialBinParserManager::GetInstance()->GetDialPreviewInfo(dialFullName, fp, &preInfo);\r
+    if (!ret) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "GetDialPreviewInfo %s fail", dialFullName.c_str());\r
+        fclose(fp);\r
+        return -1;\r
+    }\r
+    WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "ParseDialHeader dialFullName: %s", dialFullName.c_str());\r
+    WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "ParseDialHeader dialName: %s", preInfo.dialName);\r
+    WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "ParseDialHeader description: %s", preInfo.description);\r
+    WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "ParseDialHeader previewImgId: %u", preInfo.imgId);\r
+    WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "ParseDialHeader imageOffset: %u", preInfo.offset);\r
+    ImageInfo *info = ImageCacheManager::GetInstance().LoadOneInMultiRes(\r
+        preInfo.imgId, dialFullName, fp, false, preInfo.offset);\r
+    if (info == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ParseDialHeader loadimage fail");\r
+        fclose(fp);\r
+        return -1;\r
+    }\r
+\r
+    dialInfo.dialFlag = 1;\r
+    dialInfo.id = 0;\r
+    dialInfo.resId = preInfo.imgId;\r
+    dialInfo.dialFullName = dialFullName;\r
+    dialInfo.dialName = preInfo.dialName;\r
+    dialInfo.description = preInfo.description;\r
+    dialInfo.preImageInfo = info;\r
+    dialInfo.capability = preInfo.capability;\r
+\r
+    fclose(fp);\r
+    return 0;\r
+}\r
+}\r
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/settings/src/model/SettingDisplayModel.cpp b/code/sdk/application/wearable/evb/nativeapp/nativeui/settings/src/model/SettingDisplayModel.cpp
new file mode 100644 (file)
index 0000000..3c7f9d6
--- /dev/null
@@ -0,0 +1,347 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SettingDisplayModel\r
+ * Create: 2025-06-01\r
+ */\r
+\r
+#include "kv_store.h"\r
+#ifndef _WIN32\r
+#include "screennotify/ui_screennotify.h"\r
+#endif\r
+#include "power_display_service.h"\r
+#include "UiConfig.h"\r
+#include "wearable_log.h"\r
+#include "main/HealthModel.h"\r
+#include "settings/common/SettingCommon.h"\r
+#include "settings/model/SettingDisplayModel.h"\r
+\r
+namespace OHOS {\r
+static constexpr uint32_t SETTING_DISPLAY_VALUE_LEN = 32;\r
+static constexpr uint8_t SETTING_DISPLAY_MODLE_BRI_PERCENT_MAX = 100;\r
+static constexpr uint8_t SETTING_DISPLAY_MODEL_BRI_PERCENT_DEFAULT = 50;\r
+static constexpr uint8_t SETTING_DISPLAY_MODLE_BRI_RANGE_MIN = 55;\r
+static constexpr uint8_t SETTING_DISPLAY_MODLE_BRI_RANGE_STEP = 2;\r
+static const char* SETTING_SCREEN_OFF_ALL_STR[] = {"5秒钟", "10秒钟", "15秒钟", "30秒钟", "1分钟", "5分钟"};\r
+static const char* SETTING_STEADY_ON_ALL_STR[] = {"5分钟", "10分钟", "20分钟", "30分钟", "1小时", "2小时"};\r
+enum SettingStrIndex {INDEX_0, INDEX_1, INDEX_2, INDEX_3, INDEX_4, INDEX_5, INDEX_6};\r
+\r
+SettingDisplayModel::SettingDisplayModel()\r
+{\r
+    std::vector<SettingUnionItemData> tempUnionData = {{\r
+        PlainTextItemData{"显示与亮度"},\r
+        IconTextNavigationItemData{SettingPageId::DISPLAY_BRIGHTNESS_PAGE, IMAGE_DISPLAY_LIST_ADJUST_BRIGHTNESS,\r
+            "调节亮度", nullptr, true, SETTING_LIST_DEFAULT_BG_COLOR, SETTING_LIST_DEFAULT_BG_COLOR_OPA},\r
+        IconTextToggleItemData{IMAGE_DISPLAY_LIST_AUTO_ADJUST, "自动调节", false,\r
+            SETTING_LIST_DEFAULT_BG_COLOR, SETTING_LIST_DEFAULT_BG_COLOR_OPA},\r
+        IconTextNavigationItemData{SettingPageId::DISPLAY_SCREEN_OFF_PAGE, IMAGE_DISPLAY_LIST_SCREEN_OFF_TIME,\r
+            "熄屏时间", nullptr, true, SETTING_LIST_DEFAULT_BG_COLOR, SETTING_LIST_DEFAULT_BG_COLOR_OPA},\r
+        IconTextNavigationItemData{SettingPageId::DISPLAY_STEADY_ON_PAGE, IMAGE_DISPLAY_LIST_SCREEN_ON_TIME,\r
+            "长亮时刻", nullptr, true, SETTING_LIST_DEFAULT_BG_COLOR, SETTING_LIST_DEFAULT_BG_COLOR_OPA},\r
+    }};\r
+    displayUnionData_.swap(tempUnionData);\r
+}\r
+\r
+std::vector<SettingUnionItemData>& SettingDisplayModel::GetDisplayUnionData()\r
+{\r
+    RefreshDisplayUnionDataForAutoAdjustBrightness();\r
+    RefreshDisPlayUnionDataForScreenOffDataContext();\r
+    RefreshDisplayUnionDataForSteadyOnDataContext();\r
+    return displayUnionData_;\r
+}\r
+\r
+void SettingDisplayModel::RefreshDisplayUnionDataForAutoAdjustBrightness()\r
+{\r
+    auto toggleItemData = static_cast<IconTextToggleItemData*>(displayUnionData_[INDEX_2].GetUnionItemData());\r
+    toggleItemData->selected = GetAutoAdjustBrightness();\r
+}\r
+\r
+void SettingDisplayModel::RefreshDisPlayUnionDataForScreenOffDataContext()\r
+{\r
+    auto screenOffItemData = static_cast<IconTextNavigationItemData*>(displayUnionData_[INDEX_3].GetUnionItemData());\r
+    screenOffItemData->dataContent = GetScreenOffTimeShortStr(GetScreenOffTime());\r
+}\r
+\r
+void SettingDisplayModel::RefreshDisplayUnionDataForSteadyOnDataContext()\r
+{\r
+    auto steadyOnItemData = static_cast<IconTextNavigationItemData*>(displayUnionData_[INDEX_4].GetUnionItemData());\r
+    steadyOnItemData->dataContent = GetSteadyOnTimeShortStr(GetSteadyOnTime());\r
+}\r
+\r
+void SettingDisplayModel::InitDisplayModel()\r
+{\r
+    const power_display_svr_api_t* svr = power_display_svr_get_api();\r
+    if (svr == nullptr) {\r
+        return;\r
+    }\r
+    // 设置亮度调节模式\r
+    SetAutoAdjustBrightness(GetAutoAdjustBrightness());\r
+    // 设置当前亮度\r
+    SetBrightness(GetBrightness());\r
+    // 设置熄屏时间\r
+    SetScreenOffTime(GetScreenOffTime());\r
+}\r
+\r
+void SettingDisplayModel::EnableSteadyOn()\r
+{\r
+    const power_display_svr_api_t *srv = power_display_svr_get_api();\r
+    if (srv == nullptr) {\r
+        return;\r
+    }\r
+    if (OHOS::HealthModel::GetInstance()->GetBriScrStatus() == 0) {\r
+#if !defined(_WIN32)\r
+        // 设置应用永不返回\r
+        set_back_to_home_interval(0xFFFFFFFF);\r
+#endif\r
+        if (srv->get_screen_state() != SCREEN_ON) {\r
+            srv->turn_on_screen();\r
+        }\r
+        srv->set_screen_set_keepon_timeout((uint32_t)GetSteadyOnTime());\r
+    }\r
+}\r
+\r
+void SettingDisplayModel::DisableSteadyOn()\r
+{\r
+    const power_display_svr_api_t *srv = power_display_svr_get_api();\r
+    if (srv == nullptr) {\r
+        return;\r
+    }\r
+    if (OHOS::HealthModel::GetInstance()->GetBriScrStatus() == 0) {\r
+#if !defined(_WIN32)\r
+        // 设置应用的返回时间和灭屏时间相同\r
+        set_back_to_home_interval((uint32_t)GetScreenOffTime());\r
+#endif\r
+        srv->set_screen_auto_off_timeout((uint32_t)GetScreenOffTime());\r
+        srv->set_screen_set_keepon_timeout(0);\r
+    }\r
+}\r
+\r
+bool SettingDisplayModel::GetAutoAdjustBrightness()\r
+{\r
+    uint8_t brightness = 0;\r
+    char temp[SETTING_DISPLAY_VALUE_LEN] = "";\r
+    (void)UtilsGetValue("auto_adjust_brightness", temp, SETTING_DISPLAY_VALUE_LEN);\r
+    if (strcmp(temp, "auto") == 0) {\r
+        return true;\r
+    } else if (strcmp(temp, "manual") == 0) {\r
+        return false;\r
+    }\r
+    // 配置文件读取失败时, 取当前系统的设置\r
+    const power_display_svr_api_t* svr = power_display_svr_get_api();\r
+    if (svr == nullptr) {\r
+        return false;\r
+    }\r
+    return svr->get_brightness_mode() == AUTO;\r
+}\r
+\r
+void SettingDisplayModel::SetAutoAdjustBrightness(bool isAuto)\r
+{\r
+    const power_display_svr_api_t* svr = power_display_svr_get_api();\r
+    if (svr == nullptr) {\r
+        return;\r
+    }\r
+    if (isAuto) {\r
+        svr->set_brightness_mode(AUTO);\r
+        // 自动调节没有传感器支持, 当前设置为默认亮度\r
+        svr->set_brightness(TransBriPercentToValue(SETTING_DISPLAY_MODEL_BRI_PERCENT_DEFAULT));\r
+        (void)UtilsSetValue("auto_adjust_brightness", "auto");\r
+    } else { // 从自动调节转到非自动调节时, 设置存储的亮度值\r
+        svr->set_brightness_mode(MANUAL);\r
+        svr->set_brightness(TransBriPercentToValue(GetBrightness()));\r
+        (void)UtilsSetValue("auto_adjust_brightness", "manual");\r
+    }\r
+}\r
+\r
+uint8_t SettingDisplayModel::GetBrightness()\r
+{\r
+    uint32_t brightness = 0;\r
+    char temp[SETTING_DISPLAY_VALUE_LEN] = "";\r
+    (void)UtilsGetValue("brightness", temp, SETTING_DISPLAY_VALUE_LEN);\r
+    if (sscanf_s(temp, "%hhu", &brightness) != 1) {\r
+        // 配置文件读取失败时, 取最大亮度的50%\r
+        return SETTING_DISPLAY_MODEL_BRI_PERCENT_DEFAULT;\r
+    }\r
+    if (brightness > SETTING_DISPLAY_MODLE_BRI_PERCENT_MAX) {\r
+        brightness = SETTING_DISPLAY_MODLE_BRI_PERCENT_MAX;\r
+    }\r
+    return brightness;\r
+}\r
+\r
+void SettingDisplayModel::SetBrightness(uint8_t brightness)\r
+{\r
+    if (brightness > SETTING_DISPLAY_MODLE_BRI_PERCENT_MAX) {\r
+        brightness = SETTING_DISPLAY_MODLE_BRI_PERCENT_MAX;\r
+    }\r
+    // 非自动调节时 应用传入亮度值, 否则仅保存亮度值\r
+    if (!GetAutoAdjustBrightness()) {\r
+        const power_display_svr_api_t* svr = power_display_svr_get_api();\r
+        if (svr == nullptr) {\r
+            return;\r
+        }\r
+        svr->set_brightness(TransBriPercentToValue(brightness));\r
+    }\r
+    char temp[SETTING_DISPLAY_VALUE_LEN] = "";\r
+    if (sprintf_s(temp, sizeof(temp), "%u", brightness) > 0) {\r
+        (void)UtilsSetValue("brightness", temp);\r
+    }\r
+}\r
+\r
+ScreenOffTime SettingDisplayModel::GetScreenOffTime()\r
+{\r
+    ScreenOffTime screenOffTime = ScreenOffTime::SECONDS_5;\r
+    char temp[SETTING_DISPLAY_VALUE_LEN] = "";\r
+    (void)UtilsGetValue("screen_off_time", temp, SETTING_DISPLAY_VALUE_LEN);\r
+    if (sscanf_s(temp, "%u", &screenOffTime) == 0) {\r
+        return ScreenOffTime::SECONDS_5;\r
+    }\r
+    return screenOffTime;\r
+}\r
+\r
+void SettingDisplayModel::SetScreenOffTime(ScreenOffTime screenOffTime)\r
+{\r
+    const power_display_svr_api_t* svr = power_display_svr_get_api();\r
+    if (svr == nullptr) {\r
+        return;\r
+    }\r
+    // 设置灭屏时间\r
+    errcode_t err = svr->set_screen_auto_off_timeout((uint32_t)screenOffTime);\r
+#if !defined(_WIN32)\r
+    // 设置应用返回的时间和灭屏时间同步\r
+    set_back_to_home_interval((uint32_t)screenOffTime);\r
+#endif\r
+    // 保存灭屏时间到配置\r
+    char temp[SETTING_DISPLAY_VALUE_LEN] = "";\r
+    if (sprintf_s(temp, sizeof(temp), "%u", screenOffTime) > 0) {\r
+        (void)UtilsSetValue("screen_off_time", temp);\r
+    }\r
+    return;\r
+}\r
+\r
+SteadyOnTime SettingDisplayModel::GetSteadyOnTime()\r
+{\r
+    SteadyOnTime steadyOnTime = SteadyOnTime::MINUTE_10;\r
+    char temp[SETTING_DISPLAY_VALUE_LEN] = "";\r
+    (void)UtilsGetValue("steady_on_time", temp, SETTING_DISPLAY_VALUE_LEN);\r
+    if (sscanf_s(temp, "%u", &steadyOnTime) == 0) {\r
+        return SteadyOnTime::MINUTE_5;\r
+    }\r
+    return steadyOnTime;\r
+}\r
+\r
+void SettingDisplayModel::SetSteadyOnTime(SteadyOnTime steadyOnTime)\r
+{\r
+    char temp[SETTING_DISPLAY_VALUE_LEN] = "";\r
+    if (sprintf_s(temp, sizeof(temp), "%u", steadyOnTime) > 0) {\r
+        (void)UtilsSetValue("steady_on_time", temp);\r
+    }\r
+}\r
+\r
+const char** SettingDisplayModel::GetScreenOffTimeAllStr()\r
+{\r
+    return SETTING_SCREEN_OFF_ALL_STR;\r
+}\r
+\r
+const char** SettingDisplayModel::GetSteadyOnTimeAllStr()\r
+{\r
+    return SETTING_STEADY_ON_ALL_STR;\r
+}\r
+\r
+uint8_t SettingDisplayModel::GetScreenOffTimeAllStrSize()\r
+{\r
+    return sizeof(SETTING_SCREEN_OFF_ALL_STR)/sizeof(SETTING_SCREEN_OFF_ALL_STR[0]);\r
+}\r
+\r
+uint8_t SettingDisplayModel::GetSteadyOnTimeAllStrSize()\r
+{\r
+    return sizeof(SETTING_STEADY_ON_ALL_STR)/sizeof(SETTING_SCREEN_OFF_ALL_STR[0]);\r
+}\r
+\r
+uint8_t SettingDisplayModel::GetScreenOffTimeIndex()\r
+{\r
+    ScreenOffTime screenOffTime = GetScreenOffTime();\r
+    switch (screenOffTime) {\r
+        case ScreenOffTime::SECONDS_5:  return INDEX_0;\r
+        case ScreenOffTime::SECONDS_10: return INDEX_1;\r
+        case ScreenOffTime::SECONDS_15: return INDEX_2;\r
+        case ScreenOffTime::SECONDS_30: return INDEX_3;\r
+        case ScreenOffTime::MINUTE_1:   return INDEX_4;\r
+        case ScreenOffTime::MINUTE_5:   return INDEX_5;\r
+    }\r
+}\r
+\r
+uint8_t SettingDisplayModel::GetSteadyOnTimeIndex()\r
+{\r
+    SteadyOnTime steadyOnTime = GetSteadyOnTime();\r
+    switch (steadyOnTime) {\r
+        case SteadyOnTime::MINUTE_5:  return INDEX_0;\r
+        case SteadyOnTime::MINUTE_10: return INDEX_1;\r
+        case SteadyOnTime::MINUTE_20: return INDEX_2;\r
+        case SteadyOnTime::MINUTE_30: return INDEX_3;\r
+        case SteadyOnTime::HOUR_1:    return INDEX_4;\r
+        case SteadyOnTime::HOUR_2:    return INDEX_5;\r
+    }\r
+}\r
+\r
+void SettingDisplayModel::SetScreenOffTimeIndex(uint8_t index)\r
+{\r
+    ScreenOffTime screenOffTime;\r
+    switch (index) {\r
+        case INDEX_0: screenOffTime = ScreenOffTime::SECONDS_5;  break;\r
+        case INDEX_1: screenOffTime = ScreenOffTime::SECONDS_10; break;\r
+        case INDEX_2: screenOffTime = ScreenOffTime::SECONDS_15; break;\r
+        case INDEX_3: screenOffTime = ScreenOffTime::SECONDS_30; break;\r
+        case INDEX_4: screenOffTime = ScreenOffTime::MINUTE_1;   break;\r
+        case INDEX_5: screenOffTime = ScreenOffTime::MINUTE_5;   break;\r
+        default: return;\r
+    }\r
+    SetScreenOffTime(screenOffTime);\r
+}\r
+\r
+void SettingDisplayModel::SetSteadyOnTimeIndex(uint8_t index)\r
+{\r
+    SteadyOnTime steadyOnTime;\r
+    switch (index) {\r
+        case INDEX_0: steadyOnTime = SteadyOnTime::MINUTE_5; break;\r
+        case INDEX_1: steadyOnTime = SteadyOnTime::MINUTE_10; break;\r
+        case INDEX_2: steadyOnTime = SteadyOnTime::MINUTE_20; break;\r
+        case INDEX_3: steadyOnTime = SteadyOnTime::MINUTE_30; break;\r
+        case INDEX_4: steadyOnTime = SteadyOnTime::HOUR_1;    break;\r
+        case INDEX_5: steadyOnTime = SteadyOnTime::HOUR_2;    break;\r
+        default: return;\r
+    }\r
+    SetSteadyOnTime(steadyOnTime);\r
+}\r
+\r
+const char* SettingDisplayModel::GetScreenOffTimeShortStr(ScreenOffTime screenOffTime)\r
+{\r
+    switch (screenOffTime) {\r
+        case ScreenOffTime::SECONDS_5:   return "5s";\r
+        case ScreenOffTime::SECONDS_10:  return "10s";\r
+        case ScreenOffTime::SECONDS_15:  return "15s";\r
+        case ScreenOffTime::SECONDS_30:  return "30s";\r
+        case ScreenOffTime::MINUTE_1:    return "1m";\r
+        case ScreenOffTime::MINUTE_5:    return "5m";\r
+    }\r
+}\r
+\r
+const char* SettingDisplayModel::GetSteadyOnTimeShortStr(SteadyOnTime steadyOnTime)\r
+{\r
+    switch (steadyOnTime) {\r
+        case SteadyOnTime::MINUTE_5:  return "5m";\r
+        case SteadyOnTime::MINUTE_10: return "10m";\r
+        case SteadyOnTime::MINUTE_20: return "20m";\r
+        case SteadyOnTime::MINUTE_30: return "30m";\r
+        case SteadyOnTime::HOUR_1:    return "1h";\r
+        case SteadyOnTime::HOUR_2:    return "2h";\r
+    }\r
+}\r
+\r
+uint8_t SettingDisplayModel::TransBriValueToPercent(uint8_t value)\r
+{\r
+    return (value - SETTING_DISPLAY_MODLE_BRI_RANGE_MIN) / SETTING_DISPLAY_MODLE_BRI_RANGE_STEP;\r
+}\r
+\r
+uint8_t SettingDisplayModel::TransBriPercentToValue(uint8_t percent)\r
+{\r
+    return percent * SETTING_DISPLAY_MODLE_BRI_RANGE_STEP + SETTING_DISPLAY_MODLE_BRI_RANGE_MIN;\r
+}\r
+}
\ No newline at end of file
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/settings/src/model/SettingMainModel.cpp b/code/sdk/application/wearable/evb/nativeapp/nativeui/settings/src/model/SettingMainModel.cpp
new file mode 100644 (file)
index 0000000..edf24ab
--- /dev/null
@@ -0,0 +1,50 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SettingMainModel\r
+ * Create: 2025-06-01\r
+ */\r
+#include "Slice.h"\r
+#include "UiConfig.h"\r
+#include "settings/common/SettingCommon.h"\r
+#include "settings/model/SettingMainModel.h"\r
+\r
+namespace OHOS {\r
+SettingMainModel::SettingMainModel()\r
+{\r
+    std::vector<SettingUnionItemData> tempUnionData = {{\r
+        PlainTextItemData{"设置"},\r
+        IconTextNavigationItemData{SettingPageId::BLUETOOTH_PAGE, IMAGE_MAIN_LIST_BLUETOOTH, "蓝牙",\r
+            nullptr, true, SETTING_LIST_BLUETOOTH_BG_COLOR, SETTING_LIST_BLUETOOTH_BG_COLOR_OPA},\r
+        IconTextNavigationItemData{SettingPageId::DISPLAY_PAGE, IMAGE_MAIN_LIST_DISPLAY, "显示与亮度",\r
+            nullptr, true, SETTING_LIST_DISPLAY_BG_COLOR, SETTING_LIST_DISPLAY_BG_COLOR_OPA},\r
+        IconTextNavigationItemData{SettingPageId::DESKTOP_PAGE, IMAGE_MAIN_LIST_DESKTOP, "表盘与桌面",\r
+            nullptr, true, SETTING_LIST_DESKTOP_BG_COLOR, SETTING_LIST_DESKTOP_BG_COLOR_OPA},\r
+        IconTextNavigationItemData{SettingPageId::POWER_PAGE, IMAGE_MAIN_LIST_POWER, "电量",\r
+            nullptr, true, SETTING_LIST_POWER_BG_COLOR, SETTING_LIST_POWER_BG_COLOR_OPA},\r
+        IconTextNavigationItemData{SettingPageId::CARD_PAGE, IMAGE_MAIN_LIST_CARD, "卡片",\r
+            nullptr, true, SETTING_LIST_CARD_BG_COLOR, SETTING_LIST_CARD_BG_COLOR_OPA},\r
+        IconTextNavigationItemData{SettingPageId::SYSTEM_PAGE, IMAGE_MAIN_LIST_SYSTEM, "系统和升级",\r
+            nullptr, true, SETTING_LIST_SYSTEM_BG_COLOR, SETTING_LIST_SYSTEM_BG_COLOR_OPA},\r
+        IconTextNavigationItemData{SettingPageId::ABOUT_PAGE, IMAGE_MAIN_LIST_ABOUT, "关于",\r
+            nullptr, true, SETTING_LIST_ABOUT_BG_COLOR, SETTING_LIST_ABOUT_BG_COLOR_OPA},\r
+    }};\r
+    mainUnionData_.swap(tempUnionData);\r
+}\r
+\r
+std::vector<SettingUnionItemData>& SettingMainModel::GetMainUnionData()\r
+{\r
+    return mainUnionData_;\r
+}\r
+\r
+UIView* SettingMainModel::OnSimpleListCreate(uint8_t type)\r
+{\r
+    if (type == SettingUnionItemType::PLAIN_TEXT) {\r
+        return new PlainTextItemView();\r
+    } else if (type == SettingUnionItemType::ICON_TEXT_TOGGLE) {\r
+        return new IconTextToggleItemView();\r
+    } else if (type == SettingUnionItemType::ICON_TEXT_NAVIGATION) {\r
+        return new IconTextNavigationItemView();\r
+    }\r
+    return nullptr;\r
+}\r
+}\r
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/settings/src/model/SettingPowerModel.cpp b/code/sdk/application/wearable/evb/nativeapp/nativeui/settings/src/model/SettingPowerModel.cpp
new file mode 100644 (file)
index 0000000..60f49e2
--- /dev/null
@@ -0,0 +1,161 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SettingPowerModel\r
+ * Create: 2025-06-01\r
+ */\r
+#if !defined(_WIN32)\r
+#include "osal_interrupt.h"\r
+#endif\r
+#include "settings/common/SettingCommon.h"\r
+#include "settings/model/SettingPowerModel.h"\r
+\r
+namespace OHOS {\r
+static constexpr const uint8_t percentage_scale = 100; // 百分比换算基数\r
+static constexpr const uint8_t percentage_max = 100;\r
+static constexpr const uint8_t percentage_min = 0;\r
+\r
+static constexpr const uint32_t adc_reference_ratio_numerator = 450U;\r
+static constexpr const uint32_t adc_reference_ratio_denominator = 1024U / 2U;\r
+static constexpr const uint32_t millivolt_per_volt = 1000U;\r
+\r
+static constexpr const uint32_t def_samples_to_keep = 10;\r
+static constexpr const uint32_t def_samples_to_discard = 5;\r
+static constexpr const uint32_t def_adc_max_range_mv = 380;\r
+static constexpr const uint32_t def_adc_min_range_mv = 0;\r
+\r
+#if !defined(_WIN32)\r
+SettingPowerModel::SettingPowerModel()\r
+{\r
+    channel_ = ADC_CHANNEL_3;\r
+    analog_pin_ = S_AGPIO_L27;\r
+    mode_ = PIN_MODE_0;\r
+    samples_to_keep_ = def_samples_to_keep;\r
+    samples_to_discard_ = def_samples_to_discard;\r
+    // 毫伏更容易计算电量百分比\r
+    adc_max_range_mv_ = def_adc_max_range_mv;\r
+    adc_min_range_mv_ = def_adc_min_range_mv;\r
+}\r
+\r
+SettingPowerModel::~SettingPowerModel()\r
+{\r
+    adc_context_shutdown();\r
+}\r
+\r
+uint8_t SettingPowerModel::GetBatteryPowerLevel()\r
+{\r
+    uint32_t voltage = 0;\r
+    // 从adc获取电压值\r
+    if (adc_context_startup()) {\r
+        voltage = calc_voltage();\r
+    }\r
+    adc_context_shutdown();\r
+    // 根据电压值计算电量百分比\r
+    return calc_percentage(voltage);\r
+}\r
+\r
+const char* SettingPowerModel::GetPowerModelNotify()\r
+{\r
+    return "这是相对于新电池而言的电池容量。容量较低可能导致充电后,电池使用时间缩短。内建动态软硬件系统将协助克服随手表化学老化出现的性能影响。";\r
+}\r
+\r
+bool SettingPowerModel::adc_context_init()\r
+{\r
+    // 初始化pin模块\r
+    uapi_pin_init();\r
+    // 初始化高精度计数器\r
+    errcode_t err = uapi_tcxo_init();\r
+    if (err != ERRCODE_SUCC) {\r
+        return false;\r
+    }\r
+    // 设置pin脚模式\r
+    err = uapi_pin_set_mode(analog_pin_, mode_);\r
+    if (err != ERRCODE_SUCC) {\r
+        return false;\r
+    }\r
+    return true;\r
+}\r
+\r
+bool SettingPowerModel::adc_context_startup()\r
+{\r
+    errcode_t err = uapi_adc_init(ADC_CLOCK_500KHZ);  // 初始化adc\r
+    if (err != ERRCODE_SUCC) {\r
+        return false;\r
+    }\r
+    uapi_adc_power_en(AFE_SCAN_MODE_MAX_NUM, true);\r
+    err = uapi_adc_open_channel(channel_);\r
+    if (err != ERRCODE_SUCC) {\r
+        return false;\r
+    }\r
+    return true;\r
+}\r
+\r
+void SettingPowerModel::adc_context_shutdown()\r
+{\r
+    errcode_t err = uapi_adc_close_channel(channel_);\r
+    if (err != ERRCODE_SUCC) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "uapi_adc_close_channel error %u", err);\r
+    }\r
+    uapi_adc_power_en(AFE_SCAN_MODE_MAX_NUM, false);\r
+    uapi_adc_deinit();\r
+}\r
+\r
+uint8_t SettingPowerModel::calc_percentage(uint32_t voltage)\r
+{\r
+    if (voltage >= adc_max_range_mv_) {\r
+        return percentage_max;\r
+    }\r
+    if (voltage <= adc_min_range_mv_) {\r
+        return percentage_min;\r
+    }\r
+\r
+    uint32_t voltage_range = adc_max_range_mv_ - adc_min_range_mv_;\r
+    uint32_t rounding_term = voltage_range / 2;\r
+    uint32_t voltage_offset = voltage - adc_min_range_mv_;\r
+    return static_cast<uint8_t>((voltage_offset * percentage_scale + rounding_term) / voltage_range);\r
+}\r
+\r
+uint32_t SettingPowerModel::calc_voltage()\r
+{\r
+    // 丢弃初始帧数据\r
+    for (uint32_t i = 0; i < samples_to_discard_; i++) {\r
+        uapi_adc_manual_sample(ADC_CHANNEL_NONE);\r
+        uapi_tcxo_delay_ms((uint64_t)3);  // 延迟3ms\r
+    }\r
+\r
+    uint32_t stick = 0;\r
+    uint32_t stick_count = 0;\r
+    // 采集样本数\r
+    for (uint32_t i = 0; i < samples_to_keep_; i++) {\r
+        uint32_t irq_sts = osal_irq_lock();\r
+        uint32_t sample_result =\r
+            (uint32_t)uapi_adc_manual_sample(ADC_CHANNEL_NONE);  // 每次读取CHANNEL_NONE? testsuit中是这样写的\r
+        if (sample_result != 0) {\r
+            stick += sample_result;\r
+            stick_count++;\r
+        }\r
+        osal_irq_restore(irq_sts);\r
+    }\r
+    if (stick_count == 0) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "calc voltage error, no result");\r
+        return 0;\r
+    }\r
+    return adc_trans_sytick_to_voltages(stick / stick_count);\r
+}\r
+\r
+uint32_t SettingPowerModel::adc_trans_sytick_to_voltages(uint32_t sytick)\r
+{\r
+    // 整数运算公式:(sytick * numerator + denominator/2) / denominator\r
+    return (sytick * adc_reference_ratio_numerator + adc_reference_ratio_denominator) / adc_reference_ratio_denominator;\r
+}\r
+#else\r
+uint8_t SettingPowerModel::GetBatteryPowerLevel()\r
+{\r
+    return percentage_max;\r
+}\r
+\r
+const char* SettingPowerModel::GetPowerModelNotify()\r
+{\r
+    return "这是相对于新电池而言的电池容量。容量较低可能导致充电后,电池使用时间缩短。内建动态软硬件系统将协助克服随手表化学老化出现的性能影响。";\r
+}\r
+#endif\r
+}
\ No newline at end of file
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/settings/src/model/SettingQrcodeConnModel.cpp b/code/sdk/application/wearable/evb/nativeapp/nativeui/settings/src/model/SettingQrcodeConnModel.cpp
new file mode 100644 (file)
index 0000000..d832f79
--- /dev/null
@@ -0,0 +1,19 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SettingQrcodeConnModel\r
+ * Created: 2025-06-05\r
+ */\r
+\r
+#include "settings/model/SettingQrcodeConnModel.h"\r
+\r
+namespace OHOS {\r
+SettingQrcodeConnModel::SettingQrcodeConnModel() {}\r
+\r
+SettingQrcodeConnModel::~SettingQrcodeConnModel() {}\r
+\r
+SettingQrcodeConnModel &SettingQrcodeConnModel::GetInstance()\r
+{\r
+    static SettingQrcodeConnModel instance;\r
+    return instance;\r
+}\r
+}\r
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/settings/src/model/SettingSystemModel.cpp b/code/sdk/application/wearable/evb/nativeapp/nativeui/settings/src/model/SettingSystemModel.cpp
new file mode 100644 (file)
index 0000000..ed4bd4d
--- /dev/null
@@ -0,0 +1,302 @@
+/*
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.
+ * Description: SettingSystemModel
+ * Create: 2025-06-01
+ */
+#include <cstring>
+#include <cstdint>
+#include <cstdio>
+#include <dirent.h>
+#include <list>
+#include <string>
+#include <sys/stat.h>
+#include <unistd.h>
+#if !defined(_WIN32)
+#include "tcxo.h"
+#include "upg.h"
+#include "upg_porting.h"
+#include "upg_definitions.h"
+#include "upg_common_porting.h"
+#endif
+#include "dfx_reboot.h"
+#include "bundlems_slite_client.h"
+#include "abilityms_slite_client.h"
+#include "bundle_info.h"
+#include "adapter.h"
+#ifdef SUPPORT_ALIPAY_SEC
+#include "alipay_feature.h"
+#endif
+#include "UiConfig.h"
+#include "wearable_log.h"
+#include "sport/SportModel.h"
+#include "gfx_utils/list.h"
+#include "bts_def.h"
+#include "bts_br_gap.h"
+#include "flashlight/FlashLightModel.h"
+#include "settings/model/SettingSystemModel.h"
+
+
+namespace OHOS {
+#define MODLE_THREAD_STACK_SIZE 4096
+static constexpr uint8_t SETTING_SYSTEM_OTA_PERCENT_5 = 5;
+static constexpr uint8_t SETTING_SYSTEM_OTA_PERCENT_10 = 10;
+static constexpr uint8_t SETTING_SYSTEM_OTA_PERCENT_25 = 25;
+static constexpr uint8_t SETTING_SYSTEM_OTA_PERCENT_40 = 40;
+static constexpr uint8_t SETTING_SYSTEM_OTA_PERCENT_50 = 50;
+static constexpr uint8_t SETTING_SYSTEM_OTA_PERCENT_100 = 100;
+
+SettingSystemModel::SettingSystemModel()
+{
+    std::vector<SettingUnionItemData> tempUnionData = {{
+        PlainTextItemData{"系统和升级"},
+        IconTextNavigationItemData{SettingPageId::SYSTEM_OPERATION_PAGE, IMAGE_SYSTEM_LIST_POWEROFF, "关机",
+            nullptr, true, SETTING_LIST_DEFAULT_BG_COLOR, SETTING_LIST_DEFAULT_BG_COLOR_OPA},
+        IconTextNavigationItemData{SettingPageId::SYSTEM_OPERATION_PAGE, IMAGE_SYSTEM_LIST_RESTART, "重启",
+            nullptr, true, SETTING_LIST_DEFAULT_BG_COLOR, SETTING_LIST_DEFAULT_BG_COLOR_OPA},
+        IconTextNavigationItemData{SettingPageId::SYSTEM_OPERATION_PAGE, IMAGE_SYSTEM_LIST_RESUME, "恢复出厂",
+            nullptr, true, SETTING_LIST_DEFAULT_BG_COLOR, SETTING_LIST_DEFAULT_BG_COLOR_OPA},
+        IconTextNavigationItemData{SettingPageId::SYSTEM_OTA_PAGE, IMAGE_SYSTEM_LIST_OTA, "OTA升级",
+            nullptr, true, SETTING_LIST_DEFAULT_BG_COLOR, SETTING_LIST_DEFAULT_BG_COLOR_OPA},
+    }};
+    systemUnionData_.swap(tempUnionData);
+}
+
+SettingSystemModel::~SettingSystemModel()
+{
+#if !defined(_WIN32)
+    if (systemOtaTask_ != nullptr) {
+        osal_kthread_destroy(systemOtaTask_, 0);
+    }
+#endif
+}
+
+std::vector<SettingUnionItemData>& SettingSystemModel::GetSystemUnionData()
+{
+    return systemUnionData_;
+}
+
+void SettingSystemModel::SystemOperation(const char* operationName)
+{
+#if !defined(_WIN32)
+    if (strcmp(operationName, "关机") == 0) {
+        uapi_system_shutdown(0);
+    } else if (strcmp(operationName, "重启") == 0) {
+        uapi_system_reboot(SYSTEM_SOFT_REBOOT);
+    } else if (strcmp(operationName, "恢复出厂") == 0) {
+        RestoreJSApplication();
+        RestoreNativeApplication();
+        RestoreKvstore();
+        uapi_system_reboot(SYSTEM_SOFT_REBOOT);
+    }
+#endif
+}
+
+void SettingSystemModel::RestoreJSApplication()
+{
+#if !defined(_WIN32)
+    bool res = bluetooth_factory_reset();
+    WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "bluetooth_factory_reset res:%u.", (uint32_t)res);
+#ifdef SUPPORT_ALIPAY_SEC
+    (void)uapi_alipay_svr_reset();
+    WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "uapi_alipay_svr_reset process.");
+#endif
+
+    BundleInfo *bundleInfos = nullptr;
+    int32_t     bundleCount = 0;
+    uint32_t    err = ERRCODE_FAIL;
+
+    err = BundleMsClient::GetInstance().GetBundleInfos(0, &bundleInfos, &bundleCount);
+    if (err != 0) {
+        bundleCount = 0;
+        WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "Get bundleInfos Failed, errno is %d\n", err);
+    }
+
+    WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "----------------- AppList Start[%d] ------------------", bundleCount);
+    for (int32_t i = 0; i<bundleCount; i++) {
+        WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "App:%03d label:%-20s bundleName:%-20s",
+                      i, bundleInfos[i].label, bundleInfos[i].bundleName);
+        ElementName* topAbility = AbilityMsClient::GetInstance().GetTopAbility();
+
+        if ((topAbility != nullptr) && (strcmp(topAbility->bundleName, bundleInfos[i].bundleName) == 0)) {
+            AbilityMsClient::GetInstance().TerminateAbility(0);
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "terminate %-20s", bundleInfos[i].bundleName);
+        }
+
+        InstallParam installParam = {.installLocation = 1, .keepData = false};
+        BundleMsClient::GetInstance().Uninstall(bundleInfos[i].bundleName, &installParam,
+                                                SettingSystemModel::UninstallCallback);
+        FreeElement(topAbility);
+    }
+    WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "----------------- AppList End[%d] ------------------", bundleCount);
+
+    if (bundleInfos != nullptr && bundleCount != 0) {
+        for (int32_t i = 0; i<bundleCount; i++) {
+            ClearBundleInfo(&bundleInfos[i]);
+        }
+        AdapterFree(bundleInfos);
+        bundleInfos = nullptr;
+    }
+#endif
+}
+
+void SettingSystemModel::RestoreNativeApplication()
+{
+    SportModel::GetInstance().ClearData();
+    FlashLightModel::GetInstance().SetDefault();
+}
+
+void SettingSystemModel::RestoreKvstore()
+{
+#if !defined(_WIN32)
+#ifndef XTS_SUPPORT
+    const char* path = "/user/kvstore";
+    DIR* dir = opendir(path);
+    if (!dir) return;
+    struct dirent* entry;
+    while ((entry = readdir(dir)) != nullptr) {
+        if (strcmp(entry->d_name, ".") == 0 || strcmp(entry->d_name, "..") == 0)
+            continue;
+        std::string full_path = std::string(path) + "/" + entry->d_name;
+        struct stat statbuf;
+        if (lstat(full_path.c_str(), &statbuf) == -1)
+            continue;
+        if (!S_ISDIR(statbuf.st_mode)) {
+            unlink(full_path.c_str());
+        }
+    }
+    closedir(dir);
+#endif
+#endif
+}
+
+void SettingSystemModel::UninstallCallback(const uint8_t resultCode, const void *resultMessage)
+{
+    WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "Uninstall %-20s, %u", resultMessage, resultCode);
+}
+
+uint32_t SettingSystemModel::GetOtaPackageSize()
+{
+#if !defined(_WIN32)
+    FILE *fp = fopen(upg_get_pkg_file_path(), "rb");
+    if (fp == nullptr) {
+        return 0;
+    }
+    fseek(fp, 0L, SEEK_END);
+    uint32_t total_size = ftell(fp);
+    fclose(fp);
+
+    return total_size;
+#else
+    return 0;
+#endif
+}
+
+bool SettingSystemModel::GetOtaIsUpgrade()
+{
+    std::lock_guard<std::mutex> lock(otaOSALMtx_);
+#ifndef _WIN32
+    return systemOtaTask_ != nullptr;
+#else
+    return false;
+#endif
+}
+
+uint8_t SettingSystemModel::GetOtaNativeUpgradePercent()
+{
+    std::lock_guard<std::mutex> lock(otaOSALMtx_);
+    return otaUpgradePrecent_;
+}
+
+std::string SettingSystemModel::GetOtaNativeUpgradeMessage()
+{
+    std::lock_guard<std::mutex> lock(otaOSALMtx_);
+    return otaUpgradeMessage_;
+}
+
+void SettingSystemModel::SetOtaNativeUpgradePercent(uint8_t percent)
+{
+    std::lock_guard<std::mutex> lock(otaOSALMtx_);
+    otaUpgradePrecent_ = percent;
+}
+
+void SettingSystemModel::SetOtaNativeUpgradeMessage(std::string message)
+{
+    std::lock_guard<std::mutex> lock(otaOSALMtx_);
+    otaUpgradeMessage_ = message;
+}
+
+void SettingSystemModel::StartOtaNativeUpgrade()
+{
+#if !defined(_WIN32)
+    systemOtaTask_ = osal_kthread_create(&SettingSystemModel::SystemOta, this,
+        "sys_ota", MODLE_THREAD_STACK_SIZE);
+    if (systemOtaTask_ == nullptr) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ota osal_wait_init error");
+        return;
+    }
+#endif
+}
+
+void SettingSystemModel::StopOtaNativeUpgrade()
+{
+#if !defined(_WIN32)
+    if (systemOtaTask_ != nullptr) {
+        osal_kthread_destroy(systemOtaTask_, 0);
+        systemOtaTask_ = nullptr;
+    }
+#endif
+}
+
+int SettingSystemModel::SystemOta(void *data)
+{
+    SettingSystemModel* model = (SettingSystemModel*)data;
+    do {
+#if !defined(_WIN32)
+        upg_prepare_info_t info;
+        model->SetOtaNativeUpgradePercent(SETTING_SYSTEM_OTA_PERCENT_5);
+        model->SetOtaNativeUpgradeMessage("检查文件...");
+        info.package_len = model->GetOtaPackageSize();
+        if (info.package_len == 0) {
+            model->SetOtaNativeUpgradeMessage("检查文件失败");
+            break;
+        }
+        model->SetOtaNativeUpgradePercent(SETTING_SYSTEM_OTA_PERCENT_10);
+        model->SetOtaNativeUpgradeMessage("准备中...");
+        errcode_t ret = uapi_upg_prepare(&info);
+        if (ret != ERRCODE_SUCC) {
+            model->SetOtaNativeUpgradeMessage("准备失败");
+            break;
+        }
+        model->SetOtaNativeUpgradePercent(SETTING_SYSTEM_OTA_PERCENT_25);
+        model->SetOtaNativeUpgradeMessage("申请升级...");
+        ret = uapi_upg_request_upgrade(false);
+        if (ret != ERRCODE_SUCC) {
+            model->SetOtaNativeUpgradeMessage("申请升级失败");
+            break;
+        }
+        model->SetOtaNativeUpgradePercent(SETTING_SYSTEM_OTA_PERCENT_40);
+        model->SetOtaNativeUpgradeMessage("备份系统...");
+        ret = upg_image_backups_update();
+        if (ret != ERRCODE_SUCC) {
+            model->SetOtaNativeUpgradeMessage("备份失败");
+            break;
+        }
+        model->SetOtaNativeUpgradePercent(SETTING_SYSTEM_OTA_PERCENT_50);
+        model->SetOtaNativeUpgradeMessage("升级中...");
+        ret = uapi_upg_start();
+        if (ret != ERRCODE_SUCC) {
+            model->SetOtaNativeUpgradeMessage("升级失败");
+            break;
+        }
+        model->SetOtaNativeUpgradePercent(SETTING_SYSTEM_OTA_PERCENT_100);
+        model->SetOtaNativeUpgradeMessage("即将重启...");
+        uapi_system_reboot(SYSTEM_SOFT_REBOOT);
+#else
+        model->SetOtaNativeUpgradePercent(SETTING_SYSTEM_OTA_PERCENT_100);
+        model->SetOtaNativeUpgradeMessage("即将重启...");
+#endif
+    } while (false);
+    model->StopOtaNativeUpgrade(); // 停止线程
+    return 0;
+}
+} // OHOS
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/settings/src/page/SettingAboutPage.cpp b/code/sdk/application/wearable/evb/nativeapp/nativeui/settings/src/page/SettingAboutPage.cpp
new file mode 100644 (file)
index 0000000..4453ab6
--- /dev/null
@@ -0,0 +1,157 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SettingAboutPage\r
+ * Create: 2025-06-01\r
+ */\r
+#include "SlicePageFactory.h"\r
+#include "PageTransitionMgr.h"\r
+#include "NativeAbility.h"\r
+#include "AppViewIDs.h"\r
+#include "wearable_log.h"\r
+#include "settings/model/SettingAboutModel.h"\r
+#include "settings/page/SettingAboutPage.h"\r
+\r
+namespace OHOS {\r
+REGIST_SLICE_PAGE(VIEW_SETTING, SettingPageId::ABOUT_PAGE, SettingAboutPage, false);\r
+\r
+static constexpr int16_t SETTING_ABOUT_DEFAULT_X = 78;\r
+static constexpr int16_t SETTING_ABOUT_DEFAULT_WIDTH = 298;\r
+static constexpr int16_t SETTING_ABOUT_DEFAULT_DATA_OPA = 168; // 66%\r
+\r
+static const char* SETTING_ABOUT_TITLE_TEXT = "关于";\r
+static const char* SETTING_ABOUT_DEVICENAME_TEXT = "设备名称";\r
+static const char* SETTING_ABOUT_DEVICETYPE_TEXT = "型号";\r
+\r
+static constexpr int16_t SETTING_ABOUT_TITLE_X = 100;\r
+static constexpr int16_t SETTING_ABOUT_TITLE_Y = 39;\r
+static constexpr int16_t SETTING_ABOUT_TITLE_WIDTH = 254;\r
+static constexpr int16_t SETTING_ABOUT_TITLE_HEIGHT = 53;\r
+static constexpr int16_t SETTING_ABOUT_TITLE_FSIZE = 38;\r
+\r
+static constexpr int16_t SETTING_ABOUT_DEVICENAME_Y = 134;\r
+static constexpr int16_t SETTING_ABOUT_DEVICENAME_HEIGHT = 54;\r
+static constexpr int16_t SETTING_ABOUT_DEVICENAME_FSIZE = 38;\r
+\r
+static constexpr int16_t SETTING_ABOUT_DEVICETYPE_Y = 268;\r
+static constexpr int16_t SETTING_ABOUT_DEVICETYPE_HEIGHT = 54;\r
+static constexpr int16_t SETTING_ABOUT_DEVICETYPE_FSIZE = 38;\r
+\r
+static constexpr int16_t SETTING_ABOUT_DEVICENAME_DATA_Y = 192;\r
+static constexpr int16_t SETTING_ABOUT_DEVICENAME_DATA_HEIGHT = 45;\r
+static constexpr int16_t SETTING_ABOUT_DEVICENAME_DATA_FSIZE = 32;\r
+\r
+static constexpr int16_t SETTING_ABOUT_DEVICETYPE_DATA_Y = 322;\r
+static constexpr int16_t SETTING_ABOUT_DEVICETYPE_DATA_HEIGHT = 45;\r
+static constexpr int16_t SETTING_ABOUT_DEVICETYPE_DATA_FSIZE = 32;\r
+\r
+void SettingAboutPage::OnStart(void* data)\r
+{\r
+    InitTitle();\r
+    InitDeviceNameView();\r
+    InitDeviceTypeView();\r
+    AddViewToPageContainer(title_);\r
+    AddViewToPageContainer(deviceNameTitle_);\r
+    AddViewToPageContainer(deviceTypeTitle_);\r
+    AddViewToPageContainer(deviceName_);\r
+    AddViewToPageContainer(deviceType_);\r
+}\r
+\r
+void SettingAboutPage::OnResume()\r
+{\r
+    deviceName_->SetText(SettingAboutModel::GetInstance().GetSystemName().c_str());\r
+    deviceType_->SetText(SettingAboutModel::GetInstance().GetSystemType().c_str());\r
+}\r
+\r
+void SettingAboutPage::OnStop()\r
+{\r
+    if (title_ != nullptr) {\r
+        delete title_;\r
+        title_ = nullptr;\r
+    }\r
+    if (deviceNameTitle_ != nullptr) {\r
+        delete deviceNameTitle_;\r
+        deviceNameTitle_ = nullptr;\r
+    }\r
+    if (deviceTypeTitle_ != nullptr) {\r
+        delete deviceTypeTitle_;\r
+        deviceTypeTitle_ = nullptr;\r
+    }\r
+    if (deviceName_ != nullptr) {\r
+        delete deviceName_;\r
+        deviceName_ = nullptr;\r
+    }\r
+    if (deviceType_ != nullptr) {\r
+        delete deviceType_;\r
+        deviceType_ = nullptr;\r
+    }\r
+}\r
+\r
+void SettingAboutPage::InitTitle()\r
+{\r
+    title_ = new UILabel();\r
+    if (title_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SettingAboutPage::OnStart title_ new fail");\r
+        return;\r
+    }\r
+    title_->SetPosition(SETTING_ABOUT_TITLE_X, SETTING_ABOUT_TITLE_Y);\r
+    title_->Resize(SETTING_ABOUT_TITLE_WIDTH, SETTING_ABOUT_TITLE_HEIGHT);\r
+    title_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+    title_->SetFont(BOLD_VECTOR_FONT_FILENAME, SETTING_ABOUT_TITLE_FSIZE);\r
+    title_->SetStyle(STYLE_TEXT_COLOR, Color::White().full);\r
+    title_->SetText(SETTING_ABOUT_TITLE_TEXT);\r
+}\r
+\r
+void SettingAboutPage::InitDeviceTypeView()\r
+{\r
+    deviceTypeTitle_ = new UILabel();\r
+    if (deviceTypeTitle_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SettingAboutPage::OnStart deviceTypeTitle_ new fail");\r
+        return;\r
+    }\r
+    deviceTypeTitle_->SetPosition(SETTING_ABOUT_DEFAULT_X, SETTING_ABOUT_DEVICETYPE_Y);\r
+    deviceTypeTitle_->Resize(SETTING_ABOUT_DEFAULT_WIDTH, SETTING_ABOUT_DEVICETYPE_HEIGHT);\r
+    deviceTypeTitle_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+    deviceTypeTitle_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SETTING_ABOUT_DEVICETYPE_FSIZE);\r
+    deviceTypeTitle_->SetStyle(STYLE_TEXT_COLOR, Color::White().full);\r
+    deviceTypeTitle_->SetText(SETTING_ABOUT_DEVICETYPE_TEXT);\r
+\r
+    deviceType_ = new UILabel();\r
+    if (deviceType_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SettingAboutPage::OnStart deviceType_ new fail");\r
+        return;\r
+    }\r
+    deviceType_->SetPosition(SETTING_ABOUT_DEFAULT_X, SETTING_ABOUT_DEVICETYPE_DATA_Y);\r
+    deviceType_->Resize(SETTING_ABOUT_DEFAULT_WIDTH, SETTING_ABOUT_DEVICETYPE_DATA_HEIGHT);\r
+    deviceType_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+    deviceType_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SETTING_ABOUT_DEVICETYPE_DATA_FSIZE);\r
+    deviceType_->SetStyle(STYLE_TEXT_COLOR, Color::White().full);\r
+    deviceType_->SetStyle(STYLE_TEXT_OPA, SETTING_ABOUT_DEFAULT_DATA_OPA);\r
+}\r
+\r
+void SettingAboutPage::InitDeviceNameView()\r
+{\r
+    deviceNameTitle_ = new UILabel();\r
+    if (deviceNameTitle_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SettingAboutPage::OnStart deviceNameTitle_ new fail");\r
+        return;\r
+    }\r
+    deviceNameTitle_->SetPosition(SETTING_ABOUT_DEFAULT_X, SETTING_ABOUT_DEVICENAME_Y);\r
+    deviceNameTitle_->Resize(SETTING_ABOUT_DEFAULT_WIDTH, SETTING_ABOUT_DEVICENAME_HEIGHT);\r
+    deviceNameTitle_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+    deviceNameTitle_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SETTING_ABOUT_DEVICENAME_FSIZE);\r
+    deviceNameTitle_->SetStyle(STYLE_TEXT_COLOR, Color::White().full);\r
+    deviceNameTitle_->SetText(SETTING_ABOUT_DEVICENAME_TEXT);\r
+\r
+    deviceName_ = new UILabel();\r
+    if (deviceName_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SettingAboutPage::OnStart deviceName_ new fail");\r
+        return;\r
+    }\r
+    deviceName_->SetPosition(SETTING_ABOUT_DEFAULT_X, SETTING_ABOUT_DEVICENAME_DATA_Y);\r
+    deviceName_->Resize(SETTING_ABOUT_DEFAULT_WIDTH, SETTING_ABOUT_DEVICENAME_DATA_HEIGHT);\r
+    deviceName_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+    deviceName_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SETTING_ABOUT_DEVICENAME_DATA_FSIZE);\r
+    deviceName_->SetStyle(STYLE_TEXT_COLOR, Color::White().full);\r
+    deviceName_->SetStyle(STYLE_TEXT_OPA, SETTING_ABOUT_DEFAULT_DATA_OPA);\r
+}\r
+}\r
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/settings/src/page/SettingBluetoothPage.cpp b/code/sdk/application/wearable/evb/nativeapp/nativeui/settings/src/page/SettingBluetoothPage.cpp
new file mode 100644 (file)
index 0000000..04503b4
--- /dev/null
@@ -0,0 +1,814 @@
+/*
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.
+ * Description: SettingBluetoothPage
+ * Created: 2025-06-05
+ */
+
+#include "components/ui_simple_list.h"
+#include "components/ui_scroll_view_nested.h"
+#include "SlicePageFactory.h"
+#include "PageTransitionMgr.h"
+#include "NativeAbility.h"
+#include "ui_resource_settings.h"
+#include "ohos_timer.h"
+#include "graphic_service.h"
+#include "main/LoadImg.h"
+#include "settings/common/SettingCommon.h"
+#include "settings/common/SettingBluetoothItemGroup.h"
+#include "settings/model/SettingBluetoothModel.h"
+#include "settings/page/SettingBluetoothPage.h"
+
+namespace OHOS {
+REGIST_SLICE_PAGE(VIEW_SETTING, SettingPageId::BLUETOOTH_PAGE, SettingBluetoothPage, false);
+
+static SettingBluetoothPage *g_pSettingBluetoothPage{nullptr};
+GraphicTimer* g_settingStopScanHandle = nullptr;
+static constexpr uint32_t SCAN_TIME = 25000;
+static constexpr int16_t SETTING_ADDR2 = 2;
+static constexpr int16_t SETTING_ADDR3 = 3;
+static constexpr int16_t SETTING_ADDR4 = 4;
+static constexpr int16_t SETTING_ADDR5 = 5;
+static constexpr int16_t SETTING_LIST_POSITION_X = 14;
+static constexpr int16_t SETTING_LIST_POSITION_Y = 350;
+static constexpr int16_t SETTING_SCROLLBLANKSIZE = 50;
+static constexpr int16 MAX_SCR_DIS = 1000;
+static constexpr int16 LIST_POS = 20;
+static constexpr int16 SNUM_2 = 2;
+static constexpr int16_t SETTING_CONTENT_HEIGHT = 160;
+static constexpr int16_t SETTING_TITLE_Y = 39;
+static constexpr int16_t SETTING_TITLE_HEIGHT = 53;
+static constexpr int16_t SETTING_TITLE_FONT = 38;
+static constexpr int16_t SETTING_AVILABLE_Y = 102;
+static constexpr int16_t SETTING_AVILABLE_HEIGHT = 39;
+static constexpr int16_t SETTING_AVILABLE_FONT = 32;
+static constexpr int16_t SETTING_SEATCHBTN_HEIGHT = 36;
+static constexpr int16_t SETTING_SEATCHBTN_FONT = 30;
+static constexpr int16_t SETTING_ITEM_HEIGHT_ = 130;
+static constexpr int16_t SETTING_NODEVICE_Y = 150;
+static constexpr int16_t SETTING_NODEVICE_FONT = 25;
+static constexpr int16_t SETTING_RESEARCH_X = 111;
+static constexpr int16_t SETTING_RESEARCH_Y = 230;
+static constexpr int16_t SETTING_CONYENT_HEIGHT = 40;
+static constexpr int16_t SETTING_RESEARCH_WIDTH = 232;
+static constexpr int16_t SETTING_RESEARCH_HEIGHT = 76;
+static constexpr int16_t SETTING_IMGANI_X = 163;
+static constexpr int16_t SETTING_IMGANI_HEIGHT = 126;
+static constexpr int16_t SETTING_IMGANI_Y = 150;
+static constexpr int16_t SETTING_IMGANI_UPDATE = 120;
+static constexpr int16_t SETTING_BTLIST_X = 426;
+static constexpr int16_t SETTING_BTLIST_Y = 129;
+static constexpr int16_t SETTING_BTLIST_ROUND = 30;
+static constexpr int16_t CONTAINER_BLANK_SIZE = 100;
+static constexpr int16_t LIST_WIDTH = 416;
+static constexpr int16_t SEARCH_BTN_Y = 271;
+static constexpr int16_t LIST_CONTENT_HEIGHT = 207;
+static constexpr int16_t SETTING_RESET_RESEARCH_OFFSE5T = 50;
+static constexpr int16_t SETTING_RESETTESEARCH_OFFSE5T = 80;
+static constexpr int16_t SETTING_CONTENT_OFFSE5T_SEARCH = 85;
+static constexpr int16_t SETTING_CONTENT_OFFSE5T_NOSEARCH = 200;
+static constexpr char *RESEARCH_BUTTON = "researchButton";
+static constexpr char *OPTION_LIST = "optionList";
+static constexpr char *BT_LIST = "btList";
+
+std::vector<IconTextNavigationItemData> g_bluetoothOptionData = {
+    {SettingPageId::CONNECT_NEW_PHONE_PAGE, IMAGE_PHONE, "连接新手机",
+        nullptr, true, SETTING_LIST_ABOUT_BG_COLOR, SETTING_LIST_ABOUT_BG_COLOR_OPA},
+    {SettingPageId::QRCODE_CONN_PAGE, IMAGE_QCODE, "二维码连接",
+        nullptr, true, SETTING_LIST_ABOUT_BG_COLOR, SETTING_LIST_ABOUT_BG_COLOR_OPA}};
+
+const int g_imageAnimator[SEARCH_IMAGE_COUNT] = {
+    IMAGE_Y3_1,
+    IMAGE_Y3_2,
+    IMAGE_Y3_3,
+    IMAGE_Y3_4,
+    IMAGE_Y3_5,
+    IMAGE_Y3_6,
+    IMAGE_Y3_7,
+    IMAGE_Y3_8,
+    IMAGE_Y3_9,
+    IMAGE_Y3_10,
+    IMAGE_Y3_11,
+    IMAGE_Y3_12,
+    IMAGE_Y3_13,
+    IMAGE_Y3_14,
+    IMAGE_Y3_15,
+    IMAGE_Y3_16,
+    IMAGE_Y3_17,
+    IMAGE_Y3_18,
+    IMAGE_Y3_19,
+    IMAGE_Y3_20,
+    IMAGE_Y3_21,
+    IMAGE_Y3_22,
+    IMAGE_Y3_23,
+    IMAGE_Y3_24,
+    IMAGE_Y3_25,
+    IMAGE_Y3_26,
+    IMAGE_Y3_27,
+    IMAGE_Y3_28,
+    IMAGE_Y3_29,
+    IMAGE_Y3_30,
+    IMAGE_Y3_31,
+};
+
+SettingBluetoothPage::SettingBluetoothPage()
+{
+    g_pSettingBluetoothPage = this;
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SettingBluetoothPage::SettingBluetoothPage");
+}
+
+SettingBluetoothPage::~SettingBluetoothPage()
+{
+    bool ret = is_bt_discovering(BT_TRANSPORT_BR_EDR);
+    if (ret) {
+        bool results = gap_br_cancel_discovery();
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BtScan CancelBtDiscovery results %d", results);
+    }
+    BtAnimatorStop();
+    DestoryPageView();
+    g_pSettingBluetoothPage = nullptr;
+    SettingBluetoothModel::GetInstance()->SetConnectFragmentStatus(false);
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SettingBluetoothPage::~SettingBluetoothPage");
+}
+
+void SettingBluetoothPage::InitContentList()
+{
+    optionList_->ClearAll();
+    for (auto& it : g_bluetoothOptionData) {
+        Contents cont;
+        cont.createFunc = SettingBluetoothPage::CreateForContent;
+        cont.updateFunc = SettingBluetoothPage::UpdateForContent;
+        cont.type = SettingUnionItemType::ICON_TEXT_NAVIGATION;
+        cont.data = &it;
+        optionList_->AddContent(cont);
+    }
+    optionList_->RefreshList();
+}
+
+SettingBluetoothPage* SettingBluetoothPage::GetInstance()
+{
+    return g_pSettingBluetoothPage;
+}
+
+void SettingBluetoothPage::SetScanStatus(bool value)
+{
+    scanStart_ = value;
+}
+
+bool SettingBluetoothPage::GetScanStatus()
+{
+    return scanStart_;
+}
+
+void SettingBluetoothPage::OnStart(void *data)
+{
+    InitPageView();
+    InitImageAnimator();
+    if (SettingBluetoothModel::GetInstance()->GetScansDevicesList().size() != 0) {
+        SettingBluetoothModel::GetInstance()->MoveMatchingDeviceToFront();
+        LoadFindDeviceList();
+    }
+    BtScan();
+    InitContentList();
+    AddViewToPageContainer(scroll_);
+    AddViewToPageContainer(connectNewPhoneFragment_->GetFragmentView());
+    AddViewToPageContainer(connectOpenFragment_->GetFragmentView());
+    AddViewToPageContainer(reconnectionFragment_->GetFragmentView());
+    AddViewToPageContainer(secondConfirmFragment_->GetFragmentView());
+    AddViewToPageContainer(unPairFragment_->GetFragmentView());
+    AddViewToPageContainer(successFragment_->GetFragmentView());
+    AddViewToPageContainer(failFragment_->GetFragmentView());
+}
+
+void SettingBluetoothPage::InitPageView()
+{
+    scroll_ = new UIScrollViewNested();
+    if (scroll_ == nullptr) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SettingBluetoothPage::InitPageView::scroll_ new fail");
+        return;
+    }
+    scroll_->SetPosition(0, 0, HORIZONTAL_RESOLUTION, HORIZONTAL_RESOLUTION);
+    scroll_->SetVerticalScrollState(true);
+    scroll_->SetYScrollBarVisible(true);
+    scroll_->SetOnDragListener(this);
+    scroll_->SetScrollBlankSize(CONTAINER_BLANK_SIZE, UIAbstractScroll::Direction::BOTTOM);
+
+    connectNewPhoneFragment_ = new SettingConnectNewPhone();
+    connectNewPhoneFragment_->GetFragmentView()->SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);
+    connectNewPhoneFragment_->CreateView();
+    if (connectNewPhoneFragment_ == nullptr) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SettingBluetoothPage::InitPageView::successFragment_ new fail");
+        return;
+    }
+    connectNewPhoneFragment_->GetFragmentView()->SetVisible(false);
+
+    connectOpenFragment_ = new SettingConnectionOpen();
+    connectOpenFragment_->GetFragmentView()->SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);
+    connectOpenFragment_->CreateView();
+    if (connectOpenFragment_ == nullptr) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SettingBluetoothPage::InitPageView::connectOpenFragment_ new fail");
+        return;
+    }
+    connectOpenFragment_->GetFragmentView()->SetVisible(false);
+
+    reconnectionFragment_ = new SettingReconnection();
+    reconnectionFragment_->GetFragmentView()->SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);
+    reconnectionFragment_->CreateView();
+    if (reconnectionFragment_ == nullptr) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SettingBluetoothPage::InitPageView::reconnectionFragment_ new fail");
+        return;
+    }
+    reconnectionFragment_->GetFragmentView()->SetVisible(false);
+
+    secondConfirmFragment_ = new SettingReconnectSecondConfirm();
+    secondConfirmFragment_->GetFragmentView()->SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);
+    secondConfirmFragment_->CreateView();
+    if (secondConfirmFragment_ == nullptr) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SettingBluetoothPage::InitPageView::secondConfirmFragment_ new fail");
+        return;
+    }
+    secondConfirmFragment_->GetFragmentView()->SetVisible(false);
+
+    unPairFragment_ = new UnPairSecondConfirm();
+    unPairFragment_->GetFragmentView()->SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);
+    unPairFragment_->CreateView();
+    if (unPairFragment_ == nullptr) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SettingBluetoothPage::InitPageView::unPairFragment_ new fail");
+        return;
+    }
+    unPairFragment_->GetFragmentView()->SetVisible(false);
+
+    successFragment_ = new SettingConnectBlueSuccess();
+    successFragment_->GetFragmentView()->SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);
+    successFragment_->CreateView();
+    if (successFragment_ == nullptr) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SettingBluetoothPage::InitPageView::successFragment_ new fail");
+        return;
+    }
+    successFragment_->GetFragmentView()->SetVisible(false);
+
+    failFragment_ = new SettingConnectBlueFail();
+    failFragment_->GetFragmentView()->SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);
+    failFragment_->CreateView();
+
+    if (failFragment_ == nullptr) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SettingBluetoothPage::InitPageView::failFragment_ new fail");
+        return;
+    }
+    failFragment_->GetFragmentView()->SetVisible(false);
+
+    titleLabel_ = new UILabel();
+    if (titleLabel_ == nullptr) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SettingBluetoothPage::InitPageView::titleLabel_ new fail");
+        return;
+    }
+    titleLabel_->SetPosition(0, SETTING_TITLE_Y, RESOLUTION_WIDTH, SETTING_TITLE_HEIGHT);
+    titleLabel_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);
+    titleLabel_->SetFont(BOLD_VECTOR_FONT_FILENAME, SETTING_TITLE_FONT);
+    titleLabel_->SetStyle(STYLE_TEXT_COLOR, Color::White().full);
+    titleLabel_->SetText("蓝牙");
+
+    availableDeviceLabel_ = new UILabel();
+    if (availableDeviceLabel_ == nullptr) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SettingBluetoothPage::InitPageView::availableDeviceLabel_ new fail");
+        return;
+    }
+    availableDeviceLabel_->SetPosition(0, SETTING_AVILABLE_Y, RESOLUTION_WIDTH, SETTING_AVILABLE_HEIGHT);
+    availableDeviceLabel_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);
+    availableDeviceLabel_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SETTING_AVILABLE_FONT);
+    availableDeviceLabel_->SetStyle(STYLE_TEXT_COLOR, Color::White().full);
+    availableDeviceLabel_->SetText("可用设备");
+
+    // 根据list数量下移
+    searchBtnTextLabel_ = new UILabel();
+    if (searchBtnTextLabel_ == nullptr) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SettingBluetoothPage::InitPageView::searchBtnTextLabel_ new fail");
+        return;
+    }
+    searchBtnTextLabel_->SetPosition(0, SEARCH_BTN_Y, RESOLUTION_WIDTH, SETTING_SEATCHBTN_HEIGHT);
+    searchBtnTextLabel_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);
+    searchBtnTextLabel_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SETTING_SEATCHBTN_FONT);
+    searchBtnTextLabel_->SetStyle(STYLE_TEXT_COLOR, Color::White().full);
+    searchBtnTextLabel_->SetText("正在搜索...");
+    searchBtnTextLabel_->SetVisible(true);
+
+    noDeviceLabel_ = new UILabel();
+    if (noDeviceLabel_ == nullptr) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SettingBluetoothPage::InitPageView::noDeviceLabel_ new fail");
+        return;
+    }
+    noDeviceLabel_->SetPosition(0, SETTING_NODEVICE_Y, RESOLUTION_WIDTH, SETTING_SEATCHBTN_HEIGHT);
+    noDeviceLabel_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);
+    noDeviceLabel_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SETTING_NODEVICE_FONT);
+    noDeviceLabel_->SetStyle(STYLE_TEXT_COLOR, Color::White().full);
+    noDeviceLabel_->SetText("未发现附近有可用设备");
+    noDeviceLabel_->SetVisible(false);
+
+    resetResearchButton_ = new UILabelButton();
+    if (resetResearchButton_ == nullptr) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SettingBluetoothPage::InitPageView::resetResearchButton_ new fail");
+        return;
+    }
+    resetResearchButton_->SetPosition(SETTING_RESEARCH_X, SETTING_RESEARCH_Y, SETTING_RESEARCH_WIDTH,
+                                      SETTING_RESEARCH_HEIGHT);
+    resetResearchButton_->SetAlign(TEXT_ALIGNMENT_CENTER);
+    resetResearchButton_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SETTING_AVILABLE_FONT);
+    resetResearchButton_->SetStyle(STYLE_TEXT_COLOR, Color::White().full);
+    resetResearchButton_->SetStyle(STYLE_BACKGROUND_COLOR, Color::Blue().full);
+    resetResearchButton_->SetText("重新搜索");
+    resetResearchButton_->SetStyleForState(STYLE_BACKGROUND_COLOR, Color::Blue().full, UIButton::PRESSED);
+    resetResearchButton_->SetStyleForState(STYLE_BACKGROUND_COLOR, Color::Blue().full, UIButton::RELEASED);
+    resetResearchButton_->SetStyleForState(STYLE_BACKGROUND_COLOR, Color::Blue().full, UIButton::INACTIVE);
+    resetResearchButton_->SetViewId(RESEARCH_BUTTON);
+    resetResearchButton_->SetOnClickListener(this);
+    resetResearchButton_->SetVisible(false);
+
+    optionList_ = new UISimpleList();
+    if (optionList_ == nullptr) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SettingBluetoothPage::InitPageView::optionList_ new fail");
+        return;
+    }
+    optionList_->SetPosition(SETTING_LIST_POSITION_X, SETTING_LIST_POSITION_Y);
+    optionList_->Resize(LIST_WIDTH, LIST_CONTENT_HEIGHT);
+    optionList_->SetDraggable(false);
+    optionList_->SetScrollBlankSize(0);
+    optionList_->SetMaxScrollDistance(0);
+    optionList_->SetViewId(OPTION_LIST);
+
+    btEarPhoneList_ = new UISimpleList();
+    if (btEarPhoneList_ == nullptr) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SettingBluetoothPage::InitPageView::btEarPhoneList_ new fail");
+        return;
+    }
+    btEarPhoneList_->SetPosition(SETTING_LIST_POSITION_X, SETTING_NODEVICE_Y);
+    btEarPhoneList_->SetScrollBlankSize(0);
+    btEarPhoneList_->SetMaxScrollDistance(0);
+    btEarPhoneList_->SetVisible(true);
+    btEarPhoneList_->SetViewId(BT_LIST);
+
+    scroll_->Add(titleLabel_);
+    scroll_->Add(availableDeviceLabel_);
+    scroll_->Add(searchBtnTextLabel_);
+    scroll_->Add(optionList_);
+    scroll_->Add(resetResearchButton_);
+    scroll_->Add(noDeviceLabel_);
+    scroll_->Add(btEarPhoneList_);
+}
+
+void SettingBluetoothPage::LoadFindDeviceList()
+{
+    std::list<BtCaseInfo> &bluetoothCaseList = SettingBluetoothModel::GetInstance()->GetScansDevicesList();
+    btEarPhoneList_->ClearAll();
+    for (auto& it : bluetoothCaseList) {
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "LoadFindDeviceList addr: %02x%02x%02x%02x%02x%02x",
+            it.addr[SETTING_ADDR5], it.addr[SETTING_ADDR4], it.addr[SETTING_ADDR3],
+            it.addr[SETTING_ADDR2], it.addr[1], it.addr[0]);
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "LoadFindDeviceList connect_status:%s", it.connect_status.c_str());
+        Contents cont;
+        cont.createFunc = SettingBluetoothPage::CreateForBtList;
+        cont.updateFunc = SettingBluetoothPage::UpdateForBtList;
+        cont.type = 1;
+        cont.data = &it;
+        btEarPhoneList_->AddContent(cont);
+    }
+    btEarPhoneList_->Resize(SETTING_BTLIST_X, SETTING_BTLIST_Y * bluetoothCaseList.size());
+    btEarPhoneList_->SetDraggable(false);
+    btEarPhoneList_->EnableAutoAlign(true);
+    btEarPhoneList_->SetStyle(STYLE_BACKGROUND_OPA, OPA_OPAQUE);
+    btEarPhoneList_->RefreshList();
+    UpdataImageAnimatorAndList();
+    scroll_->Invalidate();
+}
+
+void SettingBluetoothPage::InitImageAnimator()
+{
+    imageAnimator_ = new UIImageAnimatorView();
+    if (imageAnimator_ == nullptr) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SettingBluetoothPage::InitImageAnimator::imageAnimator_ new fail");
+        return;
+    }
+
+    imageAnimator_->SetPosition(SETTING_IMGANI_X, SETTING_IMGANI_Y, SETTING_IMGANI_HEIGHT, SETTING_IMGANI_HEIGHT);
+    for (uint8_t i = 0; i < SEARCH_IMAGE_COUNT; i++) {
+        searchImageInfo_[i].imageInfo =
+            ImageCacheManager::GetInstance().LoadOneInMultiRes(g_imageAnimator[i], SETTING_IMAGE);
+        searchImageInfo_[i].imageType = IMG_SRC_IMAGE_INFO;
+        searchImageInfo_[i].pos.x = SETTING_IMGANI_X;
+        searchImageInfo_[i].pos.y = SETTING_IMGANI_Y;
+        searchImageInfo_[i].width = SETTING_IMGANI_HEIGHT;
+        searchImageInfo_[i].height = SETTING_IMGANI_HEIGHT;
+    }
+    imageAnimator_->SetImageAnimatorSrc(searchImageInfo_, SEARCH_IMAGE_COUNT, SETTING_IMGANI_UPDATE);
+    imageAnimator_->SetRepeat(true);
+    imageAnimator_->SetAutoEnable(false);
+    imageAnimator_->SetResizeMode(UIImageView::FILL);
+    imageAnimator_->SetVisible(true);
+    imageAnimator_->SetSizeFixed(true);
+    scroll_->Add(imageAnimator_);
+}
+
+void SettingBluetoothPage::UpdataImageAnimatorAndList()
+{
+    int16_t imageAnimatorPosY = btEarPhoneList_->GetY() +
+            ((SettingBluetoothModel::GetInstance()->GetScansDevicesList().size()) * SETTING_ITEM_HEIGHT_);
+    imageAnimator_->SetPosition(SETTING_IMGANI_X, imageAnimatorPosY, SETTING_IMGANI_HEIGHT, SETTING_IMGANI_HEIGHT);
+    for (uint8_t i = 0; i < SEARCH_IMAGE_COUNT; i++) {
+        searchImageInfo_[i].imageInfo =
+            ImageCacheManager::GetInstance().LoadOneInMultiRes(g_imageAnimator[i], SETTING_IMAGE);
+        searchImageInfo_[i].imageType = IMG_SRC_IMAGE_INFO;
+        searchImageInfo_[i].pos.x = SETTING_IMGANI_X;
+        searchImageInfo_[i].pos.y = imageAnimatorPosY;
+        searchImageInfo_[i].width = SETTING_IMGANI_HEIGHT;
+        searchImageInfo_[i].height = SETTING_IMGANI_HEIGHT;
+    }
+    imageAnimator_->SetImageAnimatorSrc(searchImageInfo_, SEARCH_IMAGE_COUNT, SETTING_IMGANI_UPDATE);
+    imageAnimator_->SetRepeat(true);
+    imageAnimator_->SetAutoEnable(false);
+    imageAnimator_->SetResizeMode(UIImageView::FILL);
+    imageAnimator_->SetSizeFixed(true);
+    imageAnimator_->Invalidate();
+    imageAnimator_->Start();
+    searchBtnTextLabel_->SetPosition(0, imageAnimator_->GetY() + SETTING_IMGANI_HEIGHT);
+    resetResearchButton_->SetPosition(SETTING_RESEARCH_X, imageAnimator_->GetY() + SETTING_RESETTESEARCH_OFFSE5T);
+    optionList_->SetPosition(SETTING_LIST_POSITION_X, imageAnimator_->GetY() + SETTING_CONTENT_OFFSE5T_NOSEARCH);
+    scroll_->Invalidate();
+}
+
+void SettingBluetoothPage::BtAnimatorStart(void)
+{
+    imageAnimator_->Start();
+}
+
+void SettingBluetoothPage::BtAnimatorStop(void)
+{
+    imageAnimator_->Stop();
+}
+
+void SettingBluetoothPage::NotFindDevice()
+{
+    BtAnimatorStop();
+    searchBtnTextLabel_->SetVisible(false);
+    imageAnimator_->SetVisible(false);
+    noDeviceLabel_->SetVisible(true);
+    resetResearchButton_->SetVisible(true);
+    scroll_->Invalidate();
+}
+
+void SettingBluetoothPage::TimerFindDevice()
+{
+    BtAnimatorStop();
+    searchBtnTextLabel_->SetVisible(false);
+    imageAnimator_->SetVisible(false);
+    noDeviceLabel_->SetVisible(false);
+    resetResearchButton_->SetVisible(true);
+    scroll_->Invalidate();
+}
+
+void SettingCancelBrScanHandle(void)
+{
+    if (g_settingStopScanHandle != nullptr) {
+        g_settingStopScanHandle->Stop();
+        delete g_settingStopScanHandle;
+        g_settingStopScanHandle = nullptr;
+    }
+    bool results = gap_br_cancel_discovery();
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SettingCancelBrScanHandle CancelBtDiscovery results %d", results);
+}
+
+void SettingEndScanHandle(void)
+{
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,
+        "SettingBluetoothModel::GetInstance()->GetScansDevicesList().size() results %d",
+        SettingBluetoothModel::GetInstance()->GetScansDevicesList().size());
+    SettingBluetoothPage* bluetoothPage = SettingBluetoothPage::GetInstance();
+    if (bluetoothPage == nullptr) {
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "bluetoothPage nullptr");
+        return;
+    }
+    if (SettingBluetoothModel::GetInstance()->GetScansDevicesList().size() > 0) {
+        bluetoothPage->TimerFindDevice();
+    } else {
+        // 未发现蓝牙耳机
+        bluetoothPage->NotFindDevice();
+    }
+}
+
+// 定时器回调函数
+static void SettingBluetoothScanTimerCallbackProc(void* data)
+{
+    (void)data;
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Bt scan end jumpView");
+    SettingCancelBrScanHandle();
+    SettingEndScanHandle();
+}
+
+void SettingBluetoothScanTimerCallback(void* data)
+{
+    GraphicService::GetInstance()->PostGraphicEvent(std::bind(SettingBluetoothScanTimerCallbackProc, data));
+}
+
+void SettingBluetoothPage::BtScan()
+{
+    bool ret;
+    bool results;
+    SetScanStatus(true);
+    BtAnimatorStart();
+    ret = is_bt_discovering(BT_TRANSPORT_BR_EDR);
+    if (ret) {
+        results = gap_br_cancel_discovery();
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BtScan CancelBtDiscovery results %d", results);
+    }
+
+    results = gap_br_set_inquiry_paramters(DEVICE_MAJOR_CLASS_AUDIO_VIDEO, 0);
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,
+        "SettingBluetoothPage gap_br_set_inquiry_paramters results %d", results);
+    results = gap_br_start_discovery();
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,
+        "SettingBluetoothPage gap_br_start_discovery results %d", results);
+    if (g_settingStopScanHandle != nullptr) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BluetoothEarPhoneView::BtScan g_settingStopScanHandle != nullptr");
+        return;
+    }
+    uint32_t tick = GetOSTick(SCAN_TIME);
+    g_settingStopScanHandle = new GraphicTimer(tick, SettingBluetoothScanTimerCallback, nullptr, true);
+    if (g_settingStopScanHandle == nullptr) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BluetoothEarPhoneView::BtScan new GraphicTimer failed!!");
+        return;
+    }
+    bool retTimer = g_settingStopScanHandle->Start();
+    if (!retTimer) {
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BluetoothEarPhoneView::BtScan Start failed");
+        if (g_settingStopScanHandle != nullptr) {
+            delete g_settingStopScanHandle;
+            g_settingStopScanHandle = nullptr;
+        }
+        return;
+    }
+    return;
+}
+
+void SettingBluetoothPage::StopBtScan()
+{
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BluetoothEarPhoneView::StopBtScan");
+    if (imageAnimator_->GetState() == true) {
+        SettingCancelBrScanHandle();
+        SettingEndScanHandle();
+    }
+}
+
+void SettingBluetoothPage::DestoryPageView()
+{
+    if (scroll_ != nullptr) {
+        scroll_->RemoveAll();
+        delete scroll_;
+        scroll_ = nullptr;
+    }
+    if (connectNewPhoneFragment_ != nullptr) {
+        connectNewPhoneFragment_->DestroyView();
+        delete connectNewPhoneFragment_;
+        connectNewPhoneFragment_ = nullptr;
+    }
+    if (connectOpenFragment_ != nullptr) {
+        connectOpenFragment_->DestroyView();
+        delete connectOpenFragment_;
+        connectOpenFragment_ = nullptr;
+    }
+    if (reconnectionFragment_ != nullptr) {
+        reconnectionFragment_->DestroyView();
+        delete reconnectionFragment_;
+        reconnectionFragment_ = nullptr;
+    }
+    if (secondConfirmFragment_ != nullptr) {
+        secondConfirmFragment_->DestroyView();
+        delete secondConfirmFragment_;
+        secondConfirmFragment_ = nullptr;
+    }
+    if (unPairFragment_ != nullptr) {
+        unPairFragment_->DestroyView();
+        delete unPairFragment_;
+        unPairFragment_ = nullptr;
+    }
+    if (successFragment_ != nullptr) {
+        successFragment_->DestroyView();
+        delete successFragment_;
+        successFragment_ = nullptr;
+    }
+    if (failFragment_ != nullptr) {
+        failFragment_->DestroyView();
+        delete failFragment_;
+        failFragment_ = nullptr;
+    }
+    if (optionList_ != nullptr) {
+        delete optionList_;
+        optionList_ = nullptr;
+    }
+    if (btEarPhoneList_ != nullptr) {
+        delete btEarPhoneList_;
+        btEarPhoneList_ = nullptr;
+    }
+    if (titleLabel_ != nullptr) {
+        delete titleLabel_;
+        titleLabel_ = nullptr;
+    }
+    if (noDeviceLabel_ != nullptr) {
+        delete noDeviceLabel_;
+        noDeviceLabel_ = nullptr;
+    }
+    if (searchBtnTextLabel_ != nullptr) {
+        delete searchBtnTextLabel_;
+        searchBtnTextLabel_ = nullptr;
+    }
+    if (resetResearchButton_ != nullptr) {
+        delete resetResearchButton_;
+        resetResearchButton_ = nullptr;
+    }
+    if (availableDeviceLabel_ != nullptr) {
+        delete availableDeviceLabel_;
+        availableDeviceLabel_ = nullptr;
+    }
+    if (imageAnimator_ != nullptr) {
+        delete imageAnimator_;
+        imageAnimator_ = nullptr;
+    }
+}
+
+UIView* SettingBluetoothPage::CreateForContent(uint8_t type)
+{
+    if (type == SettingUnionItemType::ICON_TEXT_NAVIGATION) {
+        IconTextNavigationItemView* item = new IconTextNavigationItemView();
+        if (item == nullptr) {
+            return nullptr;
+        }
+        item->SetOnClickListener(g_pSettingBluetoothPage);
+        return item;
+    }
+    return nullptr;
+}
+
+void SettingBluetoothPage::UpdateForContent(UIView* view, void* data, uint8_t type)
+{
+    UNUSED(type);
+    IconTextNavigationItemView* itemGroup = dynamic_cast<IconTextNavigationItemView*>(view);
+    if (itemGroup == nullptr || data == nullptr) {
+        return;
+    }
+    IconTextNavigationItemData* itemData = static_cast<IconTextNavigationItemData*>(data);
+    itemGroup->UpdateViewData(itemData);
+}
+
+UIView* SettingBluetoothPage::CreateForBtList(uint8_t type)
+{
+    UNUSED(type);
+    return new SettingBluetoothItemGroup();
+}
+
+void SettingBluetoothPage::UpdateForBtList(UIView* view, void* data, uint8_t type)
+{
+    if (view == nullptr || data == nullptr) {
+        return;
+    }
+    SettingBluetoothItemGroup* itemGroup =  dynamic_cast<SettingBluetoothItemGroup*>(view);
+    if (itemGroup == nullptr) {
+        return;
+    }
+    BtCaseInfo* caseInfo = static_cast<BtCaseInfo*>(data);
+    itemGroup->SetItemInfo(caseInfo);
+    itemGroup->SetOnClickListener(g_pSettingBluetoothPage);
+}
+
+void SettingBluetoothPage::UpdateBtListContent(int16_t viewIndex)
+{
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "UpdateBtListContent");
+    std::string deviceName = SettingBluetoothModel::GetInstance()->GetDeviceName();
+    SettingBluetoothModel::GetInstance()->UpdateConnectStatusForDevice();
+    std::list<BtCaseInfo> bluetoothCaseList = SettingBluetoothModel::GetInstance()->GetScansDevicesList();
+    for (auto& it : bluetoothCaseList) {
+        if (std::strcmp(reinterpret_cast<const char*>(it.deviceName), deviceName.c_str()) == 0) {
+            WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "UpdateBtListContent addr: %02x%02x%02x%02x%02x%02x",
+                it.addr[SETTING_ADDR5], it.addr[SETTING_ADDR4], it.addr[SETTING_ADDR3],
+                it.addr[SETTING_ADDR2], it.addr[1], it.addr[0]);
+            Contents cont;
+            cont.createFunc = SettingBluetoothPage::CreateForBtList;
+            cont.updateFunc = SettingBluetoothPage::UpdateForBtList;
+            cont.type = 1;
+            cont.data = &it;
+            btEarPhoneList_->UpdateContent(viewIndex, cont);
+            break;
+        }
+    }
+    btEarPhoneList_->RefreshList();
+}
+
+bool SettingBluetoothPage::IsDeviceConnect()
+{
+    std::list<BtCaseInfo> bluetoothCaseList = SettingBluetoothModel::GetInstance()->GetScansDevicesList();
+    for (auto& it : bluetoothCaseList) {
+        if (it.connect_status == "已连接") {
+            return true;
+        }
+    }
+    return false;
+}
+
+bool SettingBluetoothPage::GetImageAnimatorState()
+{
+    return imageAnimator_->GetState();
+}
+
+void SettingBluetoothPage::ChangeView(int16_t value)
+{
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ChangeView value: %d", value);
+    if (value == BT_MAIN_PAGE) {
+        scroll_->SetVisible(true);
+    } else if (value == CONNECT_OPEN_FRAGMENT) {
+        connectOpenFragment_->RefreshFragment();
+        SettingBluetoothModel::GetInstance()->SetConnectFragmentStatus(true);
+        connectOpenFragment_->GetFragmentView()->SetVisible(true);
+    } else if (value == RECONNECT_SECOND_CONFIRM_FRAGMENT) {
+        secondConfirmFragment_->RefreshFragment();
+        secondConfirmFragment_->GetFragmentView()->SetVisible(true);
+    } else if (value == UNPAIR_CONFIRM_FRAGMENT) {
+        unPairFragment_->RefreshFragment();
+        unPairFragment_->GetFragmentView()->SetVisible(true);
+    }
+    if (imageAnimator_->GetState() == false) {
+        StartBtScan();
+    }
+}
+
+void SettingBluetoothPage::ShowResultGroup(int16_t value)
+{
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ShowResultGroup value: %d", value);
+    StopBtScan();
+    if (value == CONNECT_BLUETOOTH_FAIL_FRAGMENT) {
+        failFragment_->RefreshFragment();
+        failFragment_->GetFragmentView()->SetVisible(true);
+    } else if (value == CONNECT_BLUETOOTH_SUCCESS_FRAGMENT) {
+        successFragment_->RefreshFragment();
+        successFragment_->GetFragmentView()->SetVisible(true);
+    }
+}
+
+void SettingBluetoothPage::StartBtScan()
+{
+    imageAnimator_->SetVisible(true);
+    searchBtnTextLabel_->SetVisible(true);
+    noDeviceLabel_->SetVisible(false);
+    resetResearchButton_->SetVisible(false);
+    optionList_->SetPosition(SETTING_LIST_POSITION_X,
+        searchBtnTextLabel_->GetY() + SETTING_CONTENT_OFFSE5T_SEARCH);
+    BtScan();
+}
+
+bool SettingBluetoothPage::OnClick(UIView &view, const ClickEvent &event)
+{
+    UNUSED(event);
+    if (strcmp(view.GetViewId(), RESEARCH_BUTTON) == 0) {
+        StartBtScan();
+    } else if (strcmp(view.GetParent()->GetViewId(), OPTION_LIST) == 0) {
+        int16_t viewIndex = view.GetViewIndex();
+        if (viewIndex < 0 || viewIndex >= g_bluetoothOptionData.size()) {
+            return true;
+        }
+        IconTextNavigationItemData itemData = g_bluetoothOptionData[viewIndex];
+        if (itemData.pageId == SettingPageId::CONNECT_NEW_PHONE_PAGE) {
+            StopBtScan();
+            scroll_->SetVisible(false);
+            connectNewPhoneFragment_->GetFragmentView()->SetVisible(true);
+        } else {
+            NativeAbility::GetInstance().SwitchPageInSlice(itemData.pageId,
+                TransitionType::TRANSITION_INVALID, true);
+        }
+    } else if (strcmp(view.GetParent()->GetViewId(), BT_LIST) == 0) {
+        // 点击搜索到的设备进行连接
+        SettingBluetoothItemGroup *listItemViewID = dynamic_cast<SettingBluetoothItemGroup *>(&view);
+        BtCaseInfo item = listItemViewID->GetItem();
+        SettingBluetoothModel::GetInstance()->SetSelectedDeviceInfo(&item);
+        std::string connState = item.connect_status;
+        bd_addr_t addr;
+        bool flag_connect = IsDeviceConnect();
+        // 当前设备为已连接 或没有设备被连接时 才会处理点击事件
+        if ((connState == "已连接") || (!flag_connect)) {
+            SettingBluetoothModel::GetInstance()->SetDeviceName(reinterpret_cast<const char*>(item.deviceName));
+            (void)memcpy_s(addr.addr, BD_ADDR_LEN, item.addr, BD_ADDR_LEN);
+            WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "SettingBluetoothPage::OnClick addr: %02x%02x%02x%02x%02x%02x",
+                addr.addr[SETTING_ADDR5], addr.addr[SETTING_ADDR4], addr.addr[SETTING_ADDR3],
+                addr.addr[SETTING_ADDR2], addr.addr[1], addr.addr[0]);
+            if (connState == "") {
+                errcode_t retVal = SettingBluetoothModel::GetInstance()->ConnectRemoteDevice(&addr);
+                WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ConnectRemoteDevice ret =  %d", retVal);
+                if (retVal != 0) {
+                    UpdateBtListContent(view.GetViewIndex());
+                    SettingBluetoothModel::GetInstance()->SetConnectResultPage(true);
+                }
+            } else if (connState == "已连接" || connState == "连接已经断开") {
+                StopBtScan();
+                scroll_->SetVisible(false);
+                reconnectionFragment_->RefreshFragment();
+                reconnectionFragment_->GetFragmentView()->SetVisible(true);
+            }
+        }
+    }
+    scroll_->Invalidate();
+    return true;
+}
+}
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/settings/src/page/SettingCardAddPage.cpp b/code/sdk/application/wearable/evb/nativeapp/nativeui/settings/src/page/SettingCardAddPage.cpp
new file mode 100644 (file)
index 0000000..0efc79e
--- /dev/null
@@ -0,0 +1,135 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SettingCardAddPage\r
+ * Create: 2025-06-01\r
+ */\r
+#include "components/ui_list_nested.h"\r
+#include "SlicePageFactory.h"\r
+#include "PageTransitionMgr.h"\r
+#include "NativeAbility.h"\r
+#include "settings/model/SettingCardModel.h"\r
+#include "settings/page/SettingCardAddPage.h"\r
+\r
+namespace OHOS {\r
+REGIST_SLICE_PAGE(VIEW_SETTING, SettingPageId::CARD_ADD_PAGE, SettingCardAddPage, false);\r
+\r
+static constexpr int16_t SETTING_CARD_ADD_LIST_Y = 125;\r
+static constexpr int16_t SETTING_CARD_ADD_LIST_HEIGHT = 397;\r
+static constexpr int16_t SETTING_CARD_ADD_LIST_DISTANCE = 1000;\r
+static constexpr int16_t SETTING_CARD_ADD_LIST_BLANK = 40;\r
+static constexpr int16_t SETTING_CARD_ADD_LIST_SELECTPOS = HORIZONTAL_RESOLUTION / 4;\r
+static constexpr int16_t SETTING_CARD_ADD_TITLE_X = 100;\r
+static constexpr int16_t SETTING_CARD_ADD_TITLE_Y = 39;\r
+static constexpr int16_t SETTING_CARD_ADD_TITLE_WIDTH = 254;\r
+static constexpr int16_t SETTING_CARD_ADD_TITLE_HEIGHT = 53;\r
+static constexpr int16_t SETTING_CARD_ADD_TITLE_FSIZE = 38;\r
+static const char* SETTING_CARD_ADD_TITLE_TEXT = "添加卡片";\r
+\r
+void SettingCardAddPage::OnStart(void* data)\r
+{\r
+    list_ = new UISimpleList();\r
+    if (list_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SettingCardAddPage::OnStart list_ new fail");\r
+        return;\r
+    }\r
+    list_->SetDirection(UIAbstractScroll::HORIZONTAL);\r
+    list_->SetBoundaryIntercept(DragEvent::DIRECTION_LEFT_TO_RIGHT, false);\r
+    list_->SetPosition(0, SETTING_CARD_ADD_LIST_Y, HORIZONTAL_RESOLUTION, SETTING_CARD_ADD_LIST_HEIGHT);\r
+    list_->SetScrollBlankSize(SETTING_CARD_ADD_LIST_BLANK);\r
+    list_->SetSelectPosition(SETTING_CARD_ADD_LIST_SELECTPOS);\r
+    list_->SetMaxScrollDistance(SETTING_CARD_ADD_LIST_DISTANCE);\r
+    list_->SetDraggable(true);\r
+    list_->SetThrowDrag(true);\r
+    list_->EnableAutoAlign(true);\r
+    list_->SetIntercept(false);\r
+\r
+    title_ = new UILabel();\r
+    if (title_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SettingCardAddPage::OnStart title_ new fail");\r
+        return;\r
+    }\r
+    title_->SetPosition(SETTING_CARD_ADD_TITLE_X, SETTING_CARD_ADD_TITLE_Y);\r
+    title_->Resize(SETTING_CARD_ADD_TITLE_WIDTH, SETTING_CARD_ADD_TITLE_HEIGHT);\r
+    title_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+    title_->SetFont(BOLD_VECTOR_FONT_FILENAME, SETTING_CARD_ADD_TITLE_FSIZE);\r
+    title_->SetStyle(STYLE_TEXT_COLOR, Color::White().full);\r
+    title_->SetText(SETTING_CARD_ADD_TITLE_TEXT);\r
+\r
+    AddViewToPageContainer(list_);\r
+    AddViewToPageContainer(title_);\r
+}\r
+\r
+void SettingCardAddPage::OnResume()\r
+{\r
+    std::vector<SettingCardItemData>& cardData = SettingCardModel::GetInstance().GetCardData();\r
+    if (cardData.size() == 0) {\r
+        list_->SetVisible(false);\r
+    } else {\r
+        list_->ClearAll();\r
+        for(auto& it : cardData) {\r
+            it.contextPtr = this;\r
+\r
+            Contents cont;\r
+            cont.createFunc = SettingCardAddPage::OnSimpleListCreate;\r
+            cont.updateFunc = SettingCardAddPage::OnSimpleListUpdate;\r
+            cont.type = 0;\r
+            cont.data = &it;\r
+            list_->AddContent(cont);\r
+        }\r
+        list_->SetVisible(true);\r
+        list_->RefreshList();\r
+    }\r
+}\r
+\r
+void SettingCardAddPage::OnStop()\r
+{\r
+    if (list_ != nullptr) {\r
+        delete list_;\r
+        list_ = nullptr;\r
+    }\r
+    if (title_ != nullptr) {\r
+        delete title_;\r
+        title_ = nullptr;\r
+    }\r
+}\r
+\r
+bool SettingCardAddPage::OnClick(UIView& view, const ClickEvent& event)\r
+{\r
+    int16_t index = view.GetViewIndex();\r
+    std::vector<SettingCardItemData>& cardData = SettingCardModel::GetInstance().GetCardData();\r
+    SettingCardItemData& currData = cardData[index];\r
+\r
+    if (!currData.isSelect) {\r
+        SettingCardModel::GetInstance().AddCard(currData.index);\r
+        SettingCardModel::GetInstance().RefreshCardData();\r
+\r
+        if (cardData.size() == 0) {\r
+            list_->SetVisible(false);\r
+        }\r
+        list_->RefreshList();\r
+    }\r
+    return true;\r
+}\r
+\r
+UIView* SettingCardAddPage::OnSimpleListCreate(uint8_t type)\r
+{\r
+    UNUSED(type);\r
+    return new SettingCardAddItemGroup();\r
+}\r
+\r
+void SettingCardAddPage::OnSimpleListUpdate(UIView* view, void* data, uint8_t type)\r
+{\r
+    UNUSED(type);\r
+    if (view == nullptr || data == nullptr) {\r
+        return;\r
+    }\r
+    SettingCardAddItemGroup* itemGroup = dynamic_cast<SettingCardAddItemGroup*>(view);\r
+    if (itemGroup == nullptr) {\r
+        return;\r
+    }\r
+    SettingCardItemData* itemData = static_cast<SettingCardItemData*>(data);\r
+    SettingCardAddPage* page = static_cast<SettingCardAddPage*>(itemData->contextPtr);\r
+    itemGroup->UpdateItemGroup(itemData);\r
+    itemGroup->SetOnClickListener(page);\r
+}\r
+}
\ No newline at end of file
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/settings/src/page/SettingCardEffectPage.cpp b/code/sdk/application/wearable/evb/nativeapp/nativeui/settings/src/page/SettingCardEffectPage.cpp
new file mode 100644 (file)
index 0000000..8dea211
--- /dev/null
@@ -0,0 +1,179 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SettingCardEffecPage\r
+ * Create: 2025-04\r
+ */\r
+#include "SlicePageFactory.h"\r
+#include "NativeRegisterManager.h"\r
+#include "PageTransitionMgr.h"\r
+#include "wearable_log.h"\r
+#include "UiConfig.h"\r
+#include "settings/SettingView.h"\r
+#include "settings/common/SettingCommon.h"\r
+#include "settings/page/SettingCardEffectPage.h"\r
+\r
+namespace OHOS {\r
+REGIST_SLICE_PAGE(VIEW_SETTING, SettingPageId::CARD_EFFECT_PAGE, SettingCardEffecPage, false);\r
+static SettingCardEffecPage *g_pSettingCardEffecPage = nullptr;\r
+static constexpr uint8_t SETTINGS_ITEM_FONT_SIZE = 40;\r
+static constexpr int16_t SETTINGS_RESIZE_SIZE_WIDTH = HORIZONTAL_RESOLUTION;\r
+static constexpr int16_t SETTINGS_RESIZE_SIZE_HEIGHT = 60;\r
+static constexpr int16_t SETTING_TITLE_POSITION_X = 0;\r
+static constexpr int16_t SETTING_TITLE_POSITION_Y = 20;\r
+static constexpr int16_t SETTING_LIST_POSITION_X = 0;\r
+static constexpr int16_t SETTING_LIST_POSITION_Y = 0;\r
+static constexpr int16_t SETTING_SCROLLBLANKSIZE = 100;\r
+static constexpr int16 MAX_SCR_DIS = 454;\r
+static constexpr int16 SNUM_2 = 2;\r
+\r
+SettingCardEffecPage::SettingCardEffecPage()\r
+{\r
+    g_pSettingCardEffecPage = this;\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SettingCardEffecPage::SettingCardEffecPage");\r
+}\r
+\r
+SettingCardEffecPage::~SettingCardEffecPage()\r
+{\r
+    g_pSettingCardEffecPage = nullptr;\r
+    if (titleText_ != nullptr) {\r
+        delete titleText_;\r
+        titleText_ = nullptr;\r
+    }\r
+\r
+    contentList_->ClearAll();\r
+    if (contentList_ != nullptr) {\r
+        delete contentList_;\r
+        contentList_ = nullptr;\r
+    }\r
+    effectListDatas_.clear();\r
+}\r
+\r
+void SettingCardEffecPage::OnStart(void* data)\r
+{\r
+    titleText_ = new UILabel();\r
+    if (titleText_ == nullptr) {\r
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SettingCardEffecPage::OnStart::title is nullptr");\r
+        return;\r
+    }\r
+    titleText_->SetPosition(SETTING_TITLE_POSITION_X, SETTING_TITLE_POSITION_Y);\r
+    titleText_->Resize(SETTINGS_RESIZE_SIZE_WIDTH, SETTINGS_RESIZE_SIZE_HEIGHT);\r
+    titleText_->SetText("卡片动效");\r
+    titleText_->SetFont(BOLD_VECTOR_FONT_FILENAME, SETTINGS_ITEM_FONT_SIZE);\r
+    titleText_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+    titleText_->SetStyle(STYLE_TEXT_OPA, OPA_OPAQUE);\r
+    titleText_->SetStyle(STYLE_TEXT_COLOR, Color::White().full);\r
+    titleText_->SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
+    titleText_->SetStyle(STYLE_BACKGROUND_OPA, OPA_OPAQUE);\r
+\r
+    contentList_ = new UISimpleList();\r
+    if (contentList_ == nullptr) {\r
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SettingCardEffecPage::OnStart::contentList_ is nullptr");\r
+        return;\r
+    }\r
+    contentList_->SetDirection(UIAbstractScroll::HORIZONTAL);\r
+    contentList_->SetBoundaryIntercept(DragEvent::DIRECTION_LEFT_TO_RIGHT, false);\r
+    contentList_->SetPosition(SETTING_LIST_POSITION_X, SETTING_LIST_POSITION_Y);\r
+    contentList_->Resize(HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);\r
+    contentList_->SetSelectPosition(HORIZONTAL_RESOLUTION / SNUM_2); // middle position\r
+    contentList_->SetScrollBlankSize(SETTING_SCROLLBLANKSIZE, UIAbstractScroll::Direction::RIGHT);\r
+    contentList_->SetDraggable(true);\r
+    contentList_->SetThrowDrag(true);\r
+    contentList_->SetLoopState(false);\r
+    contentList_->EnableAutoAlign(true);\r
+    contentList_->SetScrollStateListener(this);\r
+    AddViewToPageContainer(contentList_);\r
+    AddViewToPageContainer(titleText_);\r
+\r
+    SettingCardModel::GetInstance().InitEffectItem();\r
+    SetCardEffectListData(SettingCardModel::GetInstance().GetEffectListItems());\r
+}\r
+\r
+bool SettingCardEffecPage::OnClick(UIView& view, const ClickEvent& event)\r
+{\r
+    CardEffectID swipeId = CardEffectID::UI_INVALIDE;\r
+    SettingCardEffectItemGroup* setSwipeEffectView = dynamic_cast<SettingCardEffectItemGroup*>(&view);\r
+    if (setSwipeEffectView == nullptr) {\r
+        return false;\r
+    }\r
+    swipeId = setSwipeEffectView->GetViewId(event);\r
+    if (swipeId != CardEffectID::UI_INVALIDE) {\r
+        SettingCardModel::GetInstance().SetSwipeEffectStyle(swipeId);\r
+        NativeAbility::GetInstance().ChangeSlice(VIEW_MAIN_SAMPLE);\r
+    }\r
+    return true;\r
+}\r
+\r
+void SettingCardEffecPage::OnItemSelected(int16 index, UIView* view)\r
+{\r
+    UNUSED(index);\r
+    if (view != nullptr) {\r
+        itemGroupSele_ = static_cast<SettingCardEffectItemGroup*>(view);\r
+        itemGroupSele_->SelectedChange();\r
+\r
+        if (preItemGroupSele_ != nullptr && preItemGroupSele_ != itemGroupSele_) {\r
+            preItemGroupSele_->Reset();\r
+        }\r
+        preItemGroupSele_ = itemGroupSele_;\r
+    }\r
+}\r
+\r
+UIView* SettingCardEffecPage::OnSimpleListCreate(uint8_t type)\r
+{\r
+    SettingCardEffectItemGroup* itemGroup = new SettingCardEffectItemGroup();\r
+    if (itemGroup == nullptr) {\r
+        return nullptr;\r
+    }\r
+    itemGroup->SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);\r
+    itemGroup->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+    itemGroup->SetTouchable(true);\r
+    itemGroup->SetOnClickListener(g_pSettingCardEffecPage);\r
+    return itemGroup;\r
+}\r
+\r
+void SettingCardEffecPage::OnSimpleListUpdate(UIView* view, void* data, uint8_t type)\r
+{\r
+    if (view == nullptr || data == nullptr) {\r
+        return;\r
+    }\r
+    SettingCardEffectItemGroup* itemGroup = dynamic_cast<SettingCardEffectItemGroup*>(view);\r
+    if (itemGroup == nullptr) {\r
+        return;\r
+    }\r
+    CardEffectPair* content = static_cast<CardEffectPair*>(data);\r
+    itemGroup->SetItemInfo(content->first, content->second);\r
+}\r
+\r
+void SettingCardEffecPage::SetCardEffectListData(const std::map<CardEffectID, SettingCardEffectSample> &effectMap)\r
+{\r
+    contentList_->ClearAll();\r
+    uint16_t selectIndex = static_cast<uint16_t>(\r
+        SettingCardModel::GetInstance().GetSwipeEffectStyle()) / SNUM_2;\r
+    effectListDatas_.clear();\r
+    for (auto currentIt = effectMap.begin(); currentIt != effectMap.end(); ++currentIt) {\r
+        auto nextIt = std::next(currentIt);\r
+        CardEffectPair swipeEffectData;\r
+        swipeEffectData.first = currentIt->second;\r
+        if (nextIt != effectMap.end()) {\r
+            swipeEffectData.second = nextIt->second;\r
+            currentIt = nextIt;\r
+        } else {\r
+            SettingCardEffectSample sample;\r
+            swipeEffectData.second = sample;\r
+        }\r
+        effectListDatas_.push_back(swipeEffectData);\r
+    }\r
+    int index = 1;\r
+    for (auto currentIt = effectListDatas_.begin(); currentIt != effectListDatas_.end(); ++currentIt) {\r
+        Contents content;\r
+        content.createFunc = OnSimpleListCreate;\r
+        content.updateFunc = OnSimpleListUpdate;\r
+        content.type = index++;\r
+        content.data = reinterpret_cast<void *>(&*currentIt);\r
+        contentList_->AddContent(content);\r
+    }\r
+\r
+    contentList_->ScrollTo(selectIndex);\r
+    contentList_->ScrollBy(-SNUM_2);\r
+    contentList_->RefreshList();\r
+}\r
+}
\ No newline at end of file
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/settings/src/page/SettingCardMgrPage.cpp b/code/sdk/application/wearable/evb/nativeapp/nativeui/settings/src/page/SettingCardMgrPage.cpp
new file mode 100644 (file)
index 0000000..5dc1220
--- /dev/null
@@ -0,0 +1,180 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SettingCardMgrPage\r
+ * Create: 2025-06-01\r
+ */\r
+#include "components/ui_list_nested.h"\r
+#include "SlicePageFactory.h"\r
+#include "PageTransitionMgr.h"\r
+#include "NativeAbility.h"\r
+#include "settings/model/SettingCardModel.h"\r
+#include "settings/page/SettingCardMgrPage.h"\r
+\r
+namespace OHOS {\r
+REGIST_SLICE_PAGE(VIEW_SETTING, SettingPageId::CARD_MGR_PAGE, SettingCardMgrPage, false);\r
+\r
+static constexpr int16_t SETTING_CARD_MGR_LIST_X = 0;\r
+static constexpr int16_t SETTING_CARD_MGR_LIST_Y = 110;\r
+static constexpr int16_t SETTING_CARD_MGR_LIST_WIDTH = 454;\r
+static constexpr int16_t SETTING_CARD_MGR_LIST_HEIGHT = 245;\r
+static constexpr int16_t SETTING_CARD_MGR_LIST_BLANK = 40;\r
+static constexpr int16_t SETTING_CARD_MGR_LIST_SELECTPOS = HORIZONTAL_RESOLUTION / 2;\r
+static constexpr int16_t SETTING_CARD_MGR_LIST_DISTANCE = 1000;\r
+\r
+static constexpr int16_t SETTING_CARD_MGR_ADD_X = 184;\r
+static constexpr int16_t SETTING_CARD_MGR_ADD_Y = 16;\r
+static constexpr int16_t SETTING_CARD_MGR_ADD_WIDTH = 85;\r
+static constexpr int16_t SETTING_CARD_MGR_ADD_HEIGHT = 85;\r
+\r
+static constexpr int16_t SETTING_CARD_MGR_DEL_X = 179;\r
+static constexpr int16_t SETTING_CARD_MGR_DEL_Y = 354;\r
+static constexpr int16_t SETTING_CARD_MGR_DEL_WIDTH = 96;\r
+static constexpr int16_t SETTING_CARD_MGR_DEL_HEIGHT = 96;\r
+\r
+void SettingCardMgrPage::OnStart(void* data)\r
+{\r
+    InitListView();\r
+    InitButtonView();\r
+    AddViewToPageContainer(list_);\r
+    AddViewToPageContainer(addButton_);\r
+    AddViewToPageContainer(delButton_);\r
+}\r
+\r
+void SettingCardMgrPage::OnResume()\r
+{\r
+    std::vector<SettingCardItemData>& cardData = SettingCardModel::GetInstance().GetCardData();\r
+    list_->SetVisible(false);\r
+    list_->ClearAll();\r
+    for (auto& it : cardData) {\r
+        if (!it.isSelect) {\r
+            continue;\r
+        }\r
+        Contents cont;\r
+        cont.createFunc = SettingCardMgrPage::OnSimpleListCreate;\r
+        cont.updateFunc = SettingCardMgrPage::OnSimpleListUpdate;\r
+        cont.type = 0;\r
+        cont.data = &it;\r
+        list_->AddContent(cont);\r
+        list_->SetVisible(true);\r
+    }\r
+    list_->RefreshList();\r
+}\r
+\r
+void SettingCardMgrPage::OnStop()\r
+{\r
+    if (list_ != nullptr) {\r
+        delete list_;\r
+        list_ = nullptr;\r
+    }\r
+    if (addButton_ != nullptr) {\r
+        delete addButton_;\r
+        addButton_ = nullptr;\r
+    }\r
+    if (delButton_ != nullptr) {\r
+        delete delButton_;\r
+        delButton_ = nullptr;\r
+    }\r
+    ImageCacheManager::GetInstance().UnloadOneInMultiRes(IMAGE_CARD_MGR_ADD, SETTING_IMAGE);\r
+    ImageCacheManager::GetInstance().UnloadOneInMultiRes(IMAGE_CARD_MGR_DEL, SETTING_IMAGE);\r
+}\r
+\r
+bool SettingCardMgrPage::OnClick(UIView& view, const ClickEvent& event)\r
+{\r
+    if (strcmp(view.GetViewId(), "add") == 0) {\r
+        NativeAbility::GetInstance().SwitchPageInSlice(SettingPageId::CARD_ADD_PAGE,\r
+            TransitionType::TRANSITION_INVALID, true);\r
+    } else if (strcmp(view.GetViewId(), "del") == 0) {\r
+        uint16_t selectIndex = list_->GetSelectView()->GetViewIndex();\r
+        std::vector<SettingCardItemData>& cardData = SettingCardModel::GetInstance().GetCardData();\r
+\r
+        // 更新系统数据\r
+        SettingCardModel::GetInstance().DeleteCard(cardData[selectIndex].index);\r
+        SettingCardModel::GetInstance().RefreshCardData();\r
+\r
+        // 更新界面数据\r
+        list_->RemoveContent(selectIndex);\r
+        list_->SetVisible(false);\r
+        for (auto& it : cardData) {\r
+            if (it.isSelect) {\r
+                list_->SetVisible(true);\r
+                break;\r
+            }\r
+        }\r
+        list_->RefreshList();\r
+    }\r
+    return true;\r
+}\r
+\r
+void SettingCardMgrPage::InitListView()\r
+{\r
+    list_ = new UISimpleList();\r
+    if (list_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SettingCardMgrPage::InitListView list_ new fail");\r
+        return;\r
+    }\r
+    list_->SetDirection(UIAbstractScroll::HORIZONTAL);\r
+    list_->SetBoundaryIntercept(DragEvent::DIRECTION_LEFT_TO_RIGHT, false);\r
+    list_->SetPosition(SETTING_CARD_MGR_LIST_X, SETTING_CARD_MGR_LIST_Y);\r
+    list_->Resize(SETTING_CARD_MGR_LIST_WIDTH, SETTING_CARD_MGR_LIST_HEIGHT);\r
+    list_->SetScrollBlankSize(SETTING_CARD_MGR_LIST_BLANK);\r
+    list_->SetSelectPosition(SETTING_CARD_MGR_LIST_SELECTPOS);\r
+    list_->SetMaxScrollDistance(SETTING_CARD_MGR_LIST_DISTANCE);\r
+    list_->SetDraggable(true);\r
+    list_->SetThrowDrag(true);\r
+    list_->EnableAutoAlign(true);\r
+    list_->SetIntercept(false);\r
+}\r
+\r
+void SettingCardMgrPage::InitButtonView()\r
+{\r
+    addButton_ = new UIButton();\r
+    if (addButton_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SettingCardMgrPage::InitButtonView addButton_ new fail");\r
+        return;\r
+    }\r
+    addButton_->SetPosition(SETTING_CARD_MGR_ADD_X, SETTING_CARD_MGR_ADD_Y);\r
+    addButton_->Resize(SETTING_CARD_MGR_ADD_WIDTH, SETTING_CARD_MGR_ADD_HEIGHT);\r
+    addButton_->SetViewId("add");\r
+    addButton_->SetStyleForState(STYLE_BACKGROUND_COLOR, Color::Black().full, UIButton::PRESSED);\r
+    addButton_->SetStyleForState(STYLE_BACKGROUND_COLOR, Color::Black().full, UIButton::RELEASED);\r
+    addButton_->SetStyleForState(STYLE_BACKGROUND_COLOR, Color::Black().full, UIButton::INACTIVE);\r
+    ImageInfo* addImage = ImageCacheManager::GetInstance().LoadOneInMultiRes(IMAGE_CARD_MGR_ADD, SETTING_IMAGE);\r
+    addButton_->SetImageSrc(addImage, addImage);\r
+    addButton_->SetOnClickListener(this);\r
+\r
+    delButton_ = new UIButton();\r
+    if (delButton_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SettingCardMgrPage::InitButtonView delButton_ new fail");\r
+        return;\r
+    }\r
+    delButton_->SetPosition(SETTING_CARD_MGR_DEL_X, SETTING_CARD_MGR_DEL_Y);\r
+    delButton_->Resize(SETTING_CARD_MGR_DEL_WIDTH, SETTING_CARD_MGR_DEL_HEIGHT);\r
+    delButton_->SetViewId("del");\r
+    ImageInfo* delImage = ImageCacheManager::GetInstance().LoadOneInMultiRes(IMAGE_CARD_MGR_DEL, SETTING_IMAGE);\r
+    delButton_->SetImageSrc(delImage, delImage);\r
+    delButton_->SetStyleForState(STYLE_BACKGROUND_COLOR, Color::Black().full, UIButton::PRESSED);\r
+    delButton_->SetStyleForState(STYLE_BACKGROUND_COLOR, Color::Black().full, UIButton::RELEASED);\r
+    delButton_->SetStyleForState(STYLE_BACKGROUND_COLOR, Color::Black().full, UIButton::INACTIVE);\r
+    delButton_->SetOnClickListener(this);\r
+}\r
+\r
+UIView* SettingCardMgrPage::OnSimpleListCreate(uint8_t type)\r
+{\r
+    UNUSED(type);\r
+    return new SettingCardMgrItemGroup();\r
+}\r
+\r
+void SettingCardMgrPage::OnSimpleListUpdate(UIView* view, void* data, uint8_t type)\r
+{\r
+    UNUSED(type);\r
+    if (view == nullptr || data == nullptr) {\r
+        return;\r
+    }\r
+    SettingCardMgrItemGroup* itemGroup = dynamic_cast<SettingCardMgrItemGroup*>(view);\r
+    if (itemGroup == nullptr) {\r
+        return;\r
+    }\r
+    SettingCardItemData* itemData = static_cast<SettingCardItemData*>(data);\r
+    itemGroup->UpdateItemGroup(itemData);\r
+}\r
+}
\ No newline at end of file
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/settings/src/page/SettingCardPage.cpp b/code/sdk/application/wearable/evb/nativeapp/nativeui/settings/src/page/SettingCardPage.cpp
new file mode 100644 (file)
index 0000000..3e7dc71
--- /dev/null
@@ -0,0 +1,135 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SettingCardPage\r
+ * Create: 2025-06-01\r
+ */\r
+#include "components/ui_list_nested.h"\r
+#include "components/ui_scroll_view_nested.h"\r
+#include "SlicePageFactory.h"\r
+#include "PageTransitionMgr.h"\r
+#include "NativeAbility.h"\r
+#include "settings/model/SettingMainModel.h"\r
+#include "settings/model/SettingCardModel.h"\r
+#include "settings/page/SettingCardPage.h"\r
+\r
+namespace OHOS {\r
+REGIST_SLICE_PAGE(VIEW_SETTING, SettingPageId::CARD_PAGE, SettingCardPage, false);\r
+\r
+static constexpr int16_t SETTING_LIST_POSITION_X = 14;\r
+static constexpr int16_t SETTING_LIST_WIDTH = 426;\r
+static constexpr int16_t SETTING_SCROLLBLANKSIZE = 30;\r
+static constexpr int16 MAX_SCR_DIS = 1000;\r
+static constexpr int16 SNUM_2 = 2;\r
+static SettingCardPage *g_pSettingCardPage{nullptr};\r
+\r
+void SettingCardPage::OnStart(void* data)\r
+{\r
+    g_pSettingCardPage = this;\r
+    content_ = new UISimpleList();\r
+    if (content_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SettingCardPage::OnStart content_ new fail");\r
+        return;\r
+    }\r
+    content_->SetPosition(SETTING_LIST_POSITION_X, 0, SETTING_LIST_WIDTH, HORIZONTAL_RESOLUTION);\r
+    content_->SetScrollBlankSize(SETTING_SCROLLBLANKSIZE, UIAbstractScroll::Direction::BOTTOM);\r
+    content_->SetSelectPosition(HORIZONTAL_RESOLUTION / SNUM_2);\r
+    content_->SetDraggable(true);\r
+    content_->SetThrowDrag(true);\r
+    content_->EnableAutoAlign(true);\r
+    content_->SetMaxScrollDistance(MAX_SCR_DIS);\r
+\r
+    scroll_ = new UIScrollViewNested();\r
+    if (scroll_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SettingCardPage::OnStart scroll_ new fail");\r
+        return;\r
+    }\r
+    scroll_->Resize(HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);\r
+    scroll_->SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
+    scroll_->SetStyle(STYLE_BACKGROUND_OPA, UN_OPACITY);\r
+    scroll_->SetThrowDrag(true);\r
+    scroll_->SetIntercept(true);\r
+    scroll_->Add(content_);\r
+    AddViewToPageContainer(scroll_);\r
+}\r
+\r
+void SettingCardPage::OnResume()\r
+{\r
+    content_->ClearAll();\r
+    for(auto& it : SettingCardModel::GetInstance().GetCardUnionData()) {\r
+        Contents cont;\r
+        cont.createFunc = SettingMainModel::OnSimpleListCreate;\r
+        cont.updateFunc = SettingCardPage::OnSimpleListUpdate;\r
+        cont.type = it.GetUnionItemType();\r
+        cont.data = &it;\r
+        content_->AddContent(cont);\r
+    }\r
+    content_->RefreshList();\r
+}\r
+\r
+void SettingCardPage::OnStop()\r
+{\r
+    g_pSettingCardPage = nullptr;\r
+    if (scroll_ != nullptr) {\r
+        scroll_->RemoveAll();\r
+        delete scroll_;\r
+        scroll_ = nullptr;\r
+    }\r
+    if (content_ != nullptr) {\r
+        delete content_;\r
+        content_ = nullptr;\r
+    }\r
+}\r
+\r
+bool SettingCardPage::OnClick(UIView& view, const ClickEvent& event)\r
+{\r
+    uintptr_t viewId = (uintptr_t)view.GetViewId();\r
+    if (viewId == (uintptr_t)ICON_TEXT_NAVIGATION) {\r
+        int16_t viewIndex = view.GetViewIndex();\r
+        auto& cardUnionData = SettingCardModel::GetInstance().GetCardUnionData();\r
+        if (viewIndex < 0 || viewIndex > cardUnionData.size()) {\r
+            return true;\r
+        }\r
+\r
+        SettingUnionItemData& itemData = cardUnionData[viewIndex];\r
+        if (itemData.GetUnionItemType() == ICON_TEXT_NAVIGATION) {\r
+            IconTextNavigationItemData* data = static_cast<IconTextNavigationItemData*>(itemData.GetUnionItemData());\r
+            NativeAbility::GetInstance().SwitchPageInSlice(data->pageId,\r
+                TransitionType::TRANSITION_INVALID, true);\r
+        }\r
+        return true;\r
+    }\r
+    return false;\r
+}\r
+\r
+void SettingCardPage::OnSimpleListUpdate(UIView* view, void* data, uint8_t type)\r
+{\r
+    if (view == nullptr || data == nullptr) {\r
+        return;\r
+    }\r
+    if (type == SettingUnionItemType::PLAIN_TEXT) {\r
+        PlainTextItemView *itemGroup = dynamic_cast<PlainTextItemView*>(view);\r
+        if (itemGroup == nullptr) {\r
+            return;\r
+        }\r
+        PlainTextItemData* itemData = static_cast<PlainTextItemData*>(data);\r
+        itemGroup->UpdateViewData(itemData);\r
+    } else if(type == SettingUnionItemType::ICON_TEXT_TOGGLE) {\r
+        IconTextToggleItemView *itemGroup = dynamic_cast<IconTextToggleItemView*>(view);\r
+        if (itemGroup == nullptr) {\r
+            return;\r
+        }\r
+        IconTextToggleItemData* itemData = static_cast<IconTextToggleItemData*>(data);\r
+        itemGroup->UpdateViewData(itemData);\r
+        itemGroup->SetOnClickListener(g_pSettingCardPage);\r
+    }  else if(type == SettingUnionItemType::ICON_TEXT_NAVIGATION) {\r
+        IconTextNavigationItemView *itemGroup = dynamic_cast<IconTextNavigationItemView*>(view);\r
+        if (itemGroup == nullptr) {\r
+            return;\r
+        }\r
+        IconTextNavigationItemData* itemData = static_cast<IconTextNavigationItemData*>(data);\r
+        itemGroup->UpdateViewData(itemData);\r
+        itemGroup->SetOnClickListener(g_pSettingCardPage);\r
+    }\r
+    return;\r
+}\r
+}
\ No newline at end of file
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/settings/src/page/SettingConnectBlueFail.cpp b/code/sdk/application/wearable/evb/nativeapp/nativeui/settings/src/page/SettingConnectBlueFail.cpp
new file mode 100644 (file)
index 0000000..1f6b8eb
--- /dev/null
@@ -0,0 +1,153 @@
+/*
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.
+ * Description: SettingConnectBlueFail
+ * Created: 2025-06-05
+ */
+#include "wearable_log.h"
+#include "SlicePageFactory.h"
+#include "PageTransitionMgr.h"
+#include "NativeAbility.h"
+#include "AppViewIDs.h"
+#include "ui_resource_settings.h"
+#include "main/LoadImg.h"
+#include "settings/model/SettingBluetoothModel.h"
+#include "settings/page/SettingBluetoothPage.h"
+#include "settings/page/SettingConnectBlueFail.h"
+
+namespace OHOS {
+static constexpr int16_t SETTING_IMG_X = 100;
+static constexpr int16_t SETTING_IMG_Y = -50;
+static constexpr int16_t SETTING_WATCH_Y = 180;
+static constexpr int16_t SETTING_WATCH_HEIGHT = 40;
+static constexpr int16_t SETTING_WATCH_FONT = 36;
+static constexpr int16_t SETTING_CONTENT_Y = 230;
+static constexpr int16_t SETTING_CONYENT_HEIGHT = 40;
+static constexpr int16_t SETTING_BTN_X = 65;
+static constexpr int16_t SETTING_BTN_Y = 359;
+static constexpr int16_t SETTING_BTN_WIDTH = 324;
+static constexpr int16_t SETTING_BTN_HEIGHT = 101;
+static constexpr char *CONFIRM_BUTTON = "confirmButton";
+
+void SettingConnectBlueFail::OnCreateView(void* data)
+{
+    InitFailFragment();
+}
+
+void SettingConnectBlueFail::OnDestroyView()
+{
+    fragmentView_.RemoveAll();
+    if (img_ != nullptr) {
+        delete img_;
+        img_ = nullptr;
+    }
+    if (watchNameLabel_ != nullptr) {
+        delete watchNameLabel_;
+        watchNameLabel_ = nullptr;
+    }
+    if (connectStatusLabel_ != nullptr) {
+        delete connectStatusLabel_;
+        connectStatusLabel_ = nullptr;
+    }
+    if (confirmButton_ != nullptr) {
+        delete confirmButton_;
+        confirmButton_ = nullptr;
+    }
+}
+
+void SettingConnectBlueFail::InitFailFragment()
+{
+    fragmentView_.SetTouchable(true);
+    fragmentView_.SetDraggable(true);
+    fragmentView_.SetOnDragListener(this);
+    img_ = new UIImageView();
+    if (img_ == nullptr) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "InitFailFragment img_ new fail");
+        return;
+    }
+    LOADIMG::LoadImageViewImg(img_, SETTING_IMAGE, IMAGE_SURPRISE);
+    img_->SetPosition(SETTING_IMG_X, SETTING_IMG_Y);
+
+    watchNameLabel_ = new UILabel();
+    if (watchNameLabel_ == nullptr) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "InitFailFragment watchNameLabel_ new fail");
+        return;
+    }
+    watchNameLabel_->SetPosition(0, SETTING_WATCH_Y, RESOLUTION_WIDTH, SETTING_WATCH_HEIGHT);
+    watchNameLabel_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);
+    watchNameLabel_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SETTING_WATCH_FONT);
+    watchNameLabel_->SetStyle(STYLE_TEXT_COLOR, Color::White().full);
+    std::string str = SettingBluetoothModel::GetInstance()->GetDeviceName();
+    watchNameLabel_->SetText(str.c_str());
+
+    connectStatusLabel_ = new UILabel();
+    if (connectStatusLabel_ == nullptr) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "InitFailFragment connectStatusLabel_ new fail");
+        return;
+    }
+    connectStatusLabel_->SetPosition(0, SETTING_CONTENT_Y, RESOLUTION_WIDTH, SETTING_WATCH_HEIGHT);
+    connectStatusLabel_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);
+    connectStatusLabel_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SETTING_WATCH_FONT);
+    connectStatusLabel_->SetStyle(STYLE_TEXT_COLOR, Color::White().full);
+    connectStatusLabel_->SetText("连接失败,请稍后再试");
+
+    confirmButton_ = new UILabelButton();
+    if (confirmButton_ == nullptr) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "InitFailFragment confirmButton_ new fail");
+        return;
+    }
+    LOADIMG::LoadBtnImage(confirmButton_, SETTING_IMAGE, IMAGE_OK_DOWN, IMAGE_OK_DOWN);
+    confirmButton_->SetStyleForState(STYLE_BACKGROUND_COLOR, Color::Black().full, UIButton::PRESSED);
+    confirmButton_->SetStyleForState(STYLE_BACKGROUND_COLOR, Color::Black().full, UIButton::RELEASED);
+    confirmButton_->SetStyleForState(STYLE_BACKGROUND_COLOR, Color::Black().full, UIButton::INACTIVE);
+    confirmButton_->SetPosition(SETTING_BTN_X, SETTING_BTN_Y, SETTING_BTN_WIDTH, SETTING_BTN_HEIGHT);
+    confirmButton_->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);
+    confirmButton_->SetAlign(TEXT_ALIGNMENT_CENTER);
+    confirmButton_->SetStyle(STYLE_BACKGROUND_COLOR, Color::White().full);
+    confirmButton_->SetViewId(CONFIRM_BUTTON);
+    confirmButton_->SetOnClickListener(this);
+    confirmButton_->SetVisible(true);
+
+    fragmentView_.Add(img_);
+    fragmentView_.Add(watchNameLabel_);
+    fragmentView_.Add(connectStatusLabel_);
+    fragmentView_.Add(confirmButton_);
+}
+
+void SettingConnectBlueFail::RefreshFragment()
+{
+    if (watchNameLabel_ == nullptr) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "RefreshFragment fail");
+        return;
+    }
+    std::string str = SettingBluetoothModel::GetInstance()->GetDeviceName();
+    watchNameLabel_->SetText(str.c_str());
+}
+
+bool SettingConnectBlueFail::OnClick(UIView &view, const ClickEvent &event)
+{
+    UNUSED(event);
+    if (strcmp(view.GetViewId(), CONFIRM_BUTTON) == 0) {
+        bool state = SettingBluetoothPage::GetInstance()->GetImageAnimatorState();
+        if (state == false) {
+            SettingBluetoothPage::GetInstance()->StartBtScan();
+        }
+        fragmentView_.SetVisible(false);
+    }
+    return true;
+}
+
+bool SettingConnectBlueFail::OnDragStart(UIView& view, const DragEvent& event)
+{
+    return true;
+}
+
+bool SettingConnectBlueFail::OnDrag(UIView& view, const DragEvent& event)
+{
+    return true;
+}
+
+bool SettingConnectBlueFail::OnDragEnd(UIView& view, const DragEvent& event)
+{
+    return true;
+}
+}
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/settings/src/page/SettingConnectBlueSuccess.cpp b/code/sdk/application/wearable/evb/nativeapp/nativeui/settings/src/page/SettingConnectBlueSuccess.cpp
new file mode 100644 (file)
index 0000000..1e640b5
--- /dev/null
@@ -0,0 +1,156 @@
+/*
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.
+ * Description: SettingConnectBlueSuccess
+ * Created: 2025-06-05
+ */
+
+#include "wearable_log.h"
+#include "SlicePageFactory.h"
+#include "PageTransitionMgr.h"
+#include "NativeAbility.h"
+#include "AppViewIDs.h"
+#include "ui_resource_settings.h"
+#include "main/LoadImg.h"
+#include "settings/page/SettingBluetoothPage.h"
+#include "settings/model/SettingBluetoothModel.h"
+#include "settings/page/SettingBluetoothPage.h"
+#include "settings/page/SettingConnectBlueSuccess.h"
+
+namespace OHOS {
+static constexpr int16_t SETTING_IMG_X = 85;
+static constexpr int16_t SETTING_IMG_Y = -50;
+static constexpr int16_t SETTING_WATCH_Y = 180;
+static constexpr int16_t SETTING_WATCH_HEIGHT = 40;
+static constexpr int16_t SETTING_WATCH_FONT = 36;
+static constexpr int16_t SETTING_BTN_FONT = 40;
+static constexpr int16_t SETTING_CONTENT_Y = 230;
+static constexpr int16_t SETTING_CONYENT_HEIGHT = 40;
+static constexpr int16_t SETTING_BTN_X = 65;
+static constexpr int16_t SETTING_BTN_Y = 359;
+static constexpr int16_t SETTING_BTN_WIDTH = 324;
+static constexpr int16_t SETTING_BTN_HEIGHT = 101;
+static constexpr char *CONFIRM_BUTTON = "confirmButton";
+
+void SettingConnectBlueSuccess::OnCreateView(void* data)
+{
+    InitSuccessFragment();
+}
+
+void SettingConnectBlueSuccess::OnDestroyView()
+{
+    fragmentView_.RemoveAll();
+    if (img_ != nullptr) {
+        delete img_;
+        img_ = nullptr;
+    }
+    if (watchNameLabel_ != nullptr) {
+        delete watchNameLabel_;
+        watchNameLabel_ = nullptr;
+    }
+    if (connectStatusLabel_ != nullptr) {
+        delete connectStatusLabel_;
+        connectStatusLabel_ = nullptr;
+    }
+    if (confirmButton_ != nullptr) {
+        delete confirmButton_;
+        confirmButton_ = nullptr;
+    }
+}
+
+void SettingConnectBlueSuccess::InitSuccessFragment()
+{
+    fragmentView_.SetTouchable(true);
+    fragmentView_.SetDraggable(true);
+    fragmentView_.SetOnDragListener(this);
+    img_ = new UIImageView();
+    if (img_ == nullptr) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "InitSuccessFragment img_ new fail");
+        return;
+    }
+    LOADIMG::LoadImageViewImg(img_, SETTING_IMAGE, IMAGE_OK);
+    img_->SetPosition(SETTING_IMG_X, SETTING_IMG_Y);
+
+    watchNameLabel_ = new UILabel();
+    if (watchNameLabel_ == nullptr) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "InitSuccessFragment watchNameLabel_ new fail");
+        return;
+    }
+    watchNameLabel_->SetPosition(0, SETTING_WATCH_Y, RESOLUTION_WIDTH, SETTING_WATCH_HEIGHT);
+    watchNameLabel_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);
+    watchNameLabel_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SETTING_WATCH_FONT);
+    watchNameLabel_->SetStyle(STYLE_TEXT_COLOR, Color::White().full);
+    std::string str = SettingBluetoothModel::GetInstance()->GetDeviceName();
+    watchNameLabel_->SetText(str.c_str());
+
+    connectStatusLabel_ = new UILabel();
+    if (connectStatusLabel_ == nullptr) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "InitSuccessFragment connectStatusLabel_ new fail");
+        return;
+    }
+    connectStatusLabel_->SetPosition(0, SETTING_CONTENT_Y, RESOLUTION_WIDTH, SETTING_WATCH_HEIGHT);
+    connectStatusLabel_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);
+    connectStatusLabel_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SETTING_WATCH_FONT);
+    connectStatusLabel_->SetStyle(STYLE_TEXT_COLOR, Color::White().full);
+    connectStatusLabel_->SetText("连接成功");
+
+    confirmButton_ = new UILabelButton();
+    if (confirmButton_ == nullptr) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "InitSuccessFragment confirmButton_ new fail");
+        return;
+    }
+    LOADIMG::LoadBtnImage(confirmButton_, SETTING_IMAGE, IMAGE_OK_DOWN, IMAGE_OK_DOWN);
+    confirmButton_->SetStyleForState(STYLE_BACKGROUND_COLOR, Color::Black().full, UIButton::PRESSED);
+    confirmButton_->SetStyleForState(STYLE_BACKGROUND_COLOR, Color::Black().full, UIButton::RELEASED);
+    confirmButton_->SetStyleForState(STYLE_BACKGROUND_COLOR, Color::Black().full, UIButton::INACTIVE);
+    confirmButton_->SetPosition(SETTING_BTN_X, SETTING_BTN_Y, SETTING_BTN_WIDTH, SETTING_BTN_HEIGHT);
+    confirmButton_->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);
+    confirmButton_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SETTING_BTN_FONT);
+    confirmButton_->SetStyle(STYLE_BACKGROUND_COLOR, Color::White().full);
+    confirmButton_->SetViewId(CONFIRM_BUTTON);
+    confirmButton_->SetOnClickListener(this);
+    confirmButton_->SetVisible(true);
+
+    fragmentView_.Add(img_);
+    fragmentView_.Add(watchNameLabel_);
+    fragmentView_.Add(connectStatusLabel_);
+    fragmentView_.Add(confirmButton_);
+}
+
+void SettingConnectBlueSuccess::RefreshFragment()
+{
+    if (watchNameLabel_ == nullptr) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "RefreshFragment fail");
+        return;
+    }
+    std::string str = SettingBluetoothModel::GetInstance()->GetDeviceName();
+    watchNameLabel_->SetText(str.c_str());
+}
+
+bool SettingConnectBlueSuccess::OnClick(UIView &view, const ClickEvent &event)
+{
+    UNUSED(event);
+    if (strcmp(view.GetViewId(), CONFIRM_BUTTON) == 0) {
+        bool state = SettingBluetoothPage::GetInstance()->GetImageAnimatorState();
+        if (state == false) {
+            SettingBluetoothPage::GetInstance()->StartBtScan();
+        }
+        fragmentView_.SetVisible(false);
+    }
+    return true;
+}
+
+bool SettingConnectBlueSuccess::OnDragStart(UIView& view, const DragEvent& event)
+{
+    return true;
+}
+
+bool SettingConnectBlueSuccess::OnDrag(UIView& view, const DragEvent& event)
+{
+    return true;
+}
+
+bool SettingConnectBlueSuccess::OnDragEnd(UIView& view, const DragEvent& event)
+{
+    return true;
+}
+}
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/settings/src/page/SettingConnectNewPhone.cpp b/code/sdk/application/wearable/evb/nativeapp/nativeui/settings/src/page/SettingConnectNewPhone.cpp
new file mode 100644 (file)
index 0000000..287c615
--- /dev/null
@@ -0,0 +1,165 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SettingConnectNewPhone\r
+ * Created: 2025-06-05\r
+ */\r
+\r
+#include "wearable_log.h"\r
+#include "SlicePageFactory.h"\r
+#include "PageTransitionMgr.h"\r
+#include "NativeAbility.h"\r
+#include "AppViewIDs.h"\r
+#include "uiservice/ui_service.h"\r
+#include "main/LoadImg.h"\r
+#include "ui_resource_settings.h"\r
+#include "settings/page/SettingBluetoothPage.h"\r
+#include "settings/page/SettingConnectNewPhone.h"\r
+\r
+namespace OHOS {\r
+static constexpr int16_t SETTING_CONNECT_CANCEL_WIDTH = 85;\r
+static constexpr int16_t SETTING_CONNECT_CANCEL_Y = 300;\r
+static constexpr int16_t SETTING_CONNECT_CANCEL_X = 114;\r
+static constexpr int16_t SETTING_CONNECT_CONFIRM_X = 254;\r
+static constexpr int16_t SETTING_CONNECT_TEXTFIRST_Y = 100;\r
+static constexpr int16_t SETTING_CONNECT_TEXTSECOND_Y = 150;\r
+static constexpr int16_t SETTING_CONNECT_TEXTTHIRD_Y = 200;\r
+static constexpr int16_t SETTING_UNPAIR_TEXT_HEIGHT = 50;\r
+static constexpr int16_t SETTING_UNPAIR_TEXT_FONT = 34;\r
+static constexpr char *CONFIRM_BUTTON = "confirmButton";\r
+static constexpr char *CANCEL_BUTTON = "cancelButton";\r
+\r
+void SettingConnectNewPhone::OnCreateView(void* data)\r
+{\r
+    InitNewPhoneFragment();\r
+}\r
+\r
+void SettingConnectNewPhone::OnDestroyView()\r
+{\r
+    fragmentView_.RemoveAll();\r
+    if (textFirst_ != nullptr) {\r
+        delete textFirst_;\r
+        textFirst_ = nullptr;\r
+    }\r
+    if (textSecond_ != nullptr) {\r
+        delete textSecond_;\r
+        textSecond_ = nullptr;\r
+    }\r
+    if (textThird_ != nullptr) {\r
+        delete textThird_;\r
+        textThird_ = nullptr;\r
+    }\r
+    if (cancel_ != nullptr) {\r
+        delete cancel_;\r
+        cancel_ = nullptr;\r
+    }\r
+    if (confirm_ != nullptr) {\r
+        delete confirm_;\r
+        confirm_ = nullptr;\r
+    }\r
+}\r
+\r
+void SettingConnectNewPhone::InitNewPhoneFragment()\r
+{\r
+    fragmentView_.SetTouchable(true);\r
+    fragmentView_.SetDraggable(true);\r
+    fragmentView_.SetOnDragListener(this);\r
+    std::string str1 = "将断开已连接的手机,";\r
+    std::string str2 = "同一账号的新手机会保留";\r
+    std::string str3 = "个人数据,是否继续?";\r
+    textFirst_ = new UILabel();\r
+    if (textFirst_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "InitNewPhoneFragment textFirst_ new fail");\r
+        return;\r
+    }\r
+    textFirst_->SetPosition(0, SETTING_CONNECT_TEXTFIRST_Y, RESOLUTION_WIDTH, SETTING_UNPAIR_TEXT_HEIGHT);\r
+    textFirst_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+    textFirst_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SETTING_UNPAIR_TEXT_FONT);\r
+    textFirst_->SetStyle(STYLE_TEXT_COLOR, Color::White().full);\r
+    textFirst_->SetText(str1.c_str());\r
+\r
+    textSecond_ = new UILabel();\r
+    if (textSecond_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "InitNewPhoneFragment textSecond_ new fail");\r
+        return;\r
+    }\r
+    textSecond_->SetPosition(0, SETTING_CONNECT_TEXTSECOND_Y, RESOLUTION_WIDTH, SETTING_UNPAIR_TEXT_HEIGHT);\r
+    textSecond_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+    textSecond_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SETTING_UNPAIR_TEXT_FONT);\r
+    textSecond_->SetStyle(STYLE_TEXT_COLOR, Color::White().full);\r
+    textSecond_->SetText(str2.c_str());\r
+\r
+    textThird_ = new UILabel();\r
+    if (textThird_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "InitNewPhoneFragment textThird_ new fail");\r
+        return;\r
+    }\r
+    textThird_->SetPosition(0, SETTING_CONNECT_TEXTTHIRD_Y, RESOLUTION_WIDTH, SETTING_UNPAIR_TEXT_HEIGHT);\r
+    textThird_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+    textThird_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SETTING_UNPAIR_TEXT_FONT);\r
+    textThird_->SetStyle(STYLE_TEXT_COLOR, Color::White().full);\r
+    textThird_->SetText(str3.c_str());\r
+\r
+    cancel_ = new UIImageView();\r
+    if (cancel_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "InitNewPhoneFragment cancel_ new fail");\r
+        return;\r
+    }\r
+    LOADIMG::LoadImageViewImg(cancel_, SETTING_IMAGE, IMAGE_CANCEL);\r
+    cancel_->SetPosition(SETTING_CONNECT_CANCEL_X,\r
+        SETTING_CONNECT_CANCEL_Y, SETTING_CONNECT_CANCEL_WIDTH, SETTING_CONNECT_CANCEL_WIDTH);\r
+    cancel_->SetTouchable(true);\r
+    cancel_->SetViewId(CANCEL_BUTTON);\r
+    cancel_->SetOnClickListener(this);\r
+    cancel_->SetVisible(true);\r
+\r
+    confirm_ = new UIButton();\r
+    if (confirm_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "InitNewPhoneFragment confirm_ new fail");\r
+        return;\r
+    }\r
+    confirm_->SetPosition(SETTING_CONNECT_CONFIRM_X,\r
+        SETTING_CONNECT_CANCEL_Y, SETTING_CONNECT_CANCEL_WIDTH, SETTING_CONNECT_CANCEL_WIDTH);\r
+    confirm_->SetStyle(STYLE_BACKGROUND_COLOR, Color::Blue().full);\r
+    confirm_->SetViewId(CONFIRM_BUTTON);\r
+    confirm_->SetOnClickListener(this);\r
+    confirm_->SetVisible(true);\r
+    LOADIMG::LoadBtnImage(confirm_, SETTING_IMAGE, IMAGE_OK_BLUE, IMAGE_OK_BLUE);\r
+    confirm_->SetStyleForState(STYLE_BACKGROUND_COLOR, Color::Blue().full, UIButton::PRESSED);\r
+    confirm_->SetStyleForState(STYLE_BACKGROUND_COLOR, Color::Blue().full, UIButton::RELEASED);\r
+    confirm_->SetStyleForState(STYLE_BACKGROUND_COLOR, Color::Blue().full, UIButton::INACTIVE);\r
+\r
+    fragmentView_.Add(textFirst_);\r
+    fragmentView_.Add(textSecond_);\r
+    fragmentView_.Add(textThird_);\r
+    fragmentView_.Add(cancel_);\r
+    fragmentView_.Add(confirm_);\r
+}\r
+\r
+bool SettingConnectNewPhone::OnClick(UIView &view, const ClickEvent &event)\r
+{\r
+    UNUSED(event);\r
+    if (strcmp(view.GetViewId(), CANCEL_BUTTON) == 0) {\r
+        fragmentView_.SetVisible(false);\r
+        SettingBluetoothPage::GetInstance()->ChangeView(BT_MAIN_PAGE);\r
+    } else if (strcmp(view.GetViewId(), CONFIRM_BUTTON) == 0) {\r
+        fragmentView_.SetVisible(false);\r
+        SettingBluetoothPage::GetInstance()->ChangeView(CONNECT_OPEN_FRAGMENT);\r
+    }\r
+    return true;\r
+}\r
+\r
+bool SettingConnectNewPhone::OnDragStart(UIView& view, const DragEvent& event)\r
+{\r
+    return true;\r
+}\r
+\r
+bool SettingConnectNewPhone::OnDrag(UIView& view, const DragEvent& event)\r
+{\r
+    return true;\r
+}\r
+\r
+bool SettingConnectNewPhone::OnDragEnd(UIView& view, const DragEvent& event)\r
+{\r
+    return true;\r
+}\r
+}\r
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/settings/src/page/SettingConnectionOpen.cpp b/code/sdk/application/wearable/evb/nativeapp/nativeui/settings/src/page/SettingConnectionOpen.cpp
new file mode 100644 (file)
index 0000000..37da745
--- /dev/null
@@ -0,0 +1,153 @@
+/*
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.
+ * Description: SettingConnectionOpen
+ * Created: 2025-06-05
+ */
+
+#include "wearable_log.h"
+#include "SlicePageFactory.h"
+#include "PageTransitionMgr.h"
+#include "NativeAbility.h"
+#include "AppViewIDs.h"
+#include "main/LoadImg.h"
+#include "ui_resource_settings.h"
+#include "settings/model/SettingBluetoothModel.h"
+#include "settings/page/SettingBluetoothPage.h"
+#include "settings/page/SettingConnectionOpen.h"
+
+namespace OHOS {
+static constexpr int16_t SETTING_IMG_X = 85;
+static constexpr int16_t SETTING_IMG_Y = -50;
+static constexpr int16_t SETTING_WATCH_Y = 180;
+static constexpr int16_t SETTING_WATCH_HEIGHT = 45;
+static constexpr int16_t SETTING_WATCH_FONT = 36;
+static constexpr int16_t SETTING_CONTENT_Y = 230;
+static constexpr int16_t SETTING_CONYENT_HEIGHT = 40;
+static constexpr int16_t SETTING_BTN_FONT = 40;
+static constexpr int16_t SETTING_BTN_X = 65;
+static constexpr int16_t SETTING_BTN_Y = 359;
+static constexpr int16_t SETTING_BTN_WIDTH = 324;
+static constexpr int16_t SETTING_BTN_HEIGHT = 101;
+static constexpr char *CONFIRM_BUTTON = "confirmButton";
+static SettingConnectionOpen *g_pSettingConnectionOpen{nullptr};
+
+void SettingConnectionOpen::OnCreateView(void* data)
+{
+    InitConnectionOpenFragment();
+    g_pSettingConnectionOpen = this;
+}
+
+void SettingConnectionOpen::OnDestroyView()
+{
+    fragmentView_.RemoveAll();
+    if (img_ != nullptr) {
+        delete img_;
+        img_ = nullptr;
+    }
+    if (watchNameLabel_ != nullptr) {
+        delete watchNameLabel_;
+        watchNameLabel_ = nullptr;
+    }
+    if (connectStatusLabel_ != nullptr) {
+        delete connectStatusLabel_;
+        connectStatusLabel_ = nullptr;
+    }
+    if (confirmButton_ != nullptr) {
+        delete confirmButton_;
+        confirmButton_ = nullptr;
+    }
+}
+
+void SettingConnectionOpen::InitConnectionOpenFragment()
+{
+    fragmentView_.SetTouchable(true);
+    fragmentView_.SetDraggable(true);
+    fragmentView_.SetOnDragListener(this);
+    img_ = new UIImageView();
+    if (img_ == nullptr) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "InitConnectionOpenFragment img_ new fail");
+        return;
+    }
+    LOADIMG::LoadImageViewImg(img_, SETTING_IMAGE, IMAGE_OK);
+    img_->SetPosition(SETTING_IMG_X, SETTING_IMG_Y);
+
+    watchNameLabel_ = new UILabel();
+    if (watchNameLabel_ == nullptr) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "InitConnectionOpenFragment watchNameLabel_ new fail");
+        return;
+    }
+    watchNameLabel_->SetPosition(0, SETTING_WATCH_Y, RESOLUTION_WIDTH, SETTING_WATCH_HEIGHT);
+    watchNameLabel_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);
+    watchNameLabel_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SETTING_WATCH_FONT);
+    watchNameLabel_->SetStyle(STYLE_TEXT_COLOR, Color::White().full);
+    watchNameLabel_->SetText(SettingBluetoothModel::GetInstance()->GetWatchName());
+
+    connectStatusLabel_ = new UILabel();
+    if (connectStatusLabel_ == nullptr) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "InitConnectionOpenFragment connectStatusLabel_ new fail");
+        return;
+    }
+    connectStatusLabel_->SetPosition(0, SETTING_CONTENT_Y, RESOLUTION_WIDTH, SETTING_WATCH_HEIGHT);
+    connectStatusLabel_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);
+    connectStatusLabel_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SETTING_CONYENT_HEIGHT);
+    connectStatusLabel_->SetStyle(STYLE_TEXT_COLOR, Color::White().full);
+    connectStatusLabel_->SetText("连接已打开");
+
+    confirmButton_ = new UILabelButton();
+    if (confirmButton_ == nullptr) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "InitConnectionOpenFragment confirmButton_ new fail");
+        return;
+    }
+    LOADIMG::LoadBtnImage(confirmButton_, SETTING_IMAGE, IMAGE_OK_DOWN, IMAGE_OK_DOWN);
+    confirmButton_->SetStyleForState(STYLE_BACKGROUND_COLOR, Color::Black().full, UIButton::PRESSED);
+    confirmButton_->SetStyleForState(STYLE_BACKGROUND_COLOR, Color::Black().full, UIButton::RELEASED);
+    confirmButton_->SetStyleForState(STYLE_BACKGROUND_COLOR, Color::Black().full, UIButton::INACTIVE);
+    confirmButton_->SetPosition(SETTING_BTN_X, SETTING_BTN_Y, SETTING_BTN_WIDTH, SETTING_BTN_HEIGHT);
+    confirmButton_->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);
+    confirmButton_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SETTING_BTN_FONT);
+    confirmButton_->SetStyle(STYLE_BACKGROUND_COLOR, Color::White().full);
+    confirmButton_->SetViewId(CONFIRM_BUTTON);
+    confirmButton_->SetOnClickListener(this);
+    confirmButton_->SetVisible(true);
+
+    fragmentView_.Add(img_);
+    fragmentView_.Add(watchNameLabel_);
+    fragmentView_.Add(connectStatusLabel_);
+    fragmentView_.Add(confirmButton_);
+}
+
+void SettingConnectionOpen::RefreshFragment()
+{
+    if (watchNameLabel_ == nullptr) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "RefreshFragment fail");
+        return;
+    }
+    watchNameLabel_->SetText(SettingBluetoothModel::GetInstance()->GetWatchName());
+}
+
+bool SettingConnectionOpen::OnClick(UIView &view, const ClickEvent &event)
+{
+    UNUSED(event);
+    if (strcmp(view.GetViewId(), CONFIRM_BUTTON) == 0) {
+        fragmentView_.SetVisible(false);
+        SettingBluetoothPage::GetInstance()->ChangeView(BT_MAIN_PAGE);
+        SettingBluetoothModel::GetInstance()->SetConnectFragmentStatus(false);
+    }
+    return true;
+}
+
+bool SettingConnectionOpen::OnDragStart(UIView& view, const DragEvent& event)
+{
+    return true;
+}
+
+bool SettingConnectionOpen::OnDrag(UIView& view, const DragEvent& event)
+{
+    return true;
+}
+
+bool SettingConnectionOpen::OnDragEnd(UIView& view, const DragEvent& event)
+{
+    return true;
+}
+}
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/settings/src/page/SettingDesktopDialPage.cpp b/code/sdk/application/wearable/evb/nativeapp/nativeui/settings/src/page/SettingDesktopDialPage.cpp
new file mode 100644 (file)
index 0000000..a68dc54
--- /dev/null
@@ -0,0 +1,202 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SettingDesktopDialPage\r
+ * Create: 2025-06-01\r
+ */\r
+#include "common/screen.h"\r
+#include "components/ui_swipe_view_nested.h"\r
+#include "gfx_utils/graphic_math.h"\r
+#include "SlicePageFactory.h"\r
+#include "PageTransitionMgr.h"\r
+#include "NativeAbility.h"\r
+#include "settings/model/SettingDesktopModel.h"\r
+#include "settings/page/SettingDesktopDialPage.h"\r
+\r
+namespace OHOS {\r
+REGIST_SLICE_PAGE(VIEW_SETTING, SettingPageId::DESKTOP_DIAL_PAGE, SettingDesktopDialPage, false);\r
+\r
+static constexpr int16_t SETTING_ROLLER_ITEM_WIDTH = 250;\r
+static constexpr int16_t SETTING_ROLLER_ITEM_HEIHT = 250;\r
+static constexpr int16_t SETTING_ROLLER_ITEM_PADDING = 80;\r
+static constexpr float SETTING_ROLLER_BASE_ANGLE = 360.0;\r
+static constexpr float SETTING_ROLLER_HALF_BASE_ANGLE = 180.0;\r
+\r
+static constexpr int16_t SETTING_DIAL_BUTTON_X = -454;\r
+static constexpr int16_t SETTING_DIAL_BUTTON_Y = 363;\r
+static constexpr int16_t SETTING_DIAL_BUTTON_WDITH = 454*3;\r
+static constexpr int16_t SETTING_DIAL_BUTTON_HEIGHT = 454*3;\r
+static constexpr int16_t SETTING_DIAL_BUTTON_RADIUS = 454*3;\r
+#define  SETTING_DIAL_BUTTON_COLOR Color::GetColorFromRGB(13, 159, 251) // 0xFF0D9FFB\r
+\r
+static constexpr int16_t SETTING_DIAL_BUTTON_LABEL_X = 105;\r
+static constexpr int16_t SETTING_DIAL_BUTTON_LABEL_Y = 375;\r
+static constexpr int16_t SETTING_DIAL_BUTTON_LABEL_WIDTH = 244;\r
+static constexpr int16_t SETTING_DIAL_BUTTON_LABEL_HEIGHT = 54;\r
+static constexpr int16_t SETTING_DIAL_BUTTON_LABEL_FSIZE = 38;\r
+static const char* SETTING_DIAL_BUTTON_LABEL_TEXT = "设置";\r
+\r
+static constexpr int16_t SETTING_DIAL_TITLE_X = 100;\r
+static constexpr int16_t SETTING_DIAL_TITLE_Y = 39;\r
+static constexpr int16_t SETTING_DIAL_TITLE_WIDTH = 254;\r
+static constexpr int16_t SETTING_DIAL_TITLE_HEIGHT = 53;\r
+static constexpr int16_t SETTING_DIAL_TITLE_FSZIE = 38;\r
+\r
+void SettingDesktopDialPage::OnStart(void* data)\r
+{\r
+    InitDialView();\r
+    InitCtrlView();\r
+    AddViewToPageContainer(itemLabel_);\r
+    AddViewToPageContainer(coverflow_);\r
+    AddViewToPageContainer(rollerView_);\r
+}\r
+\r
+void SettingDesktopDialPage::OnResume()\r
+{\r
+    GetSlicePageContainer()->SetIntercept(true);\r
+    GetSlicePageContainer()->SetOnDragListener(nullptr); // 取消跟手返回\r
+    SettingDesktopModel::GetInstance().LoadAllDial();\r
+    const auto& dialInfo = SettingDesktopModel::GetInstance().GetDialInfo();\r
+    itemIndex_ = SettingDesktopModel::GetInstance().GetPageIndex();\r
+\r
+    if (SettingDesktopModel::GetInstance().GetDialStyle() == DialStyle::ROLLER) {\r
+        itemCount_ = 0; // 重置计数\r
+        for (const auto& iter : dialInfo) {\r
+            rollerView_->AddItem(iter.dialName, iter.preImageInfo) ? itemCount_++ : itemCount_;\r
+        }\r
+        rollerView_->SetCurrentItem(dialInfo[itemIndex_].dialName);\r
+        rollerView_->SetVisible(true);\r
+    } else { // DialStyle::COVERFLOW风格\r
+        for (const auto& iter : dialInfo) {\r
+            coverflow_->Add(iter.dialName.c_str(), iter.preImageInfo);\r
+        }\r
+        coverflow_->SetCurrentPage(itemIndex_);\r
+        coverflow_->SetVisible(true);\r
+    }\r
+    itemLabel_->SetText(dialInfo[itemIndex_].dialName.c_str());\r
+}\r
+\r
+void SettingDesktopDialPage::OnPause()\r
+{\r
+    if (SettingDesktopModel::GetInstance().GetDialStyle() == DialStyle::COVERFLOW) {\r
+        coverflow_->ClearAll();\r
+    } else {\r
+        rollerView_->ClearAll();\r
+    }\r
+    SettingDesktopModel::GetInstance().ClearDialInfo();\r
+}\r
+\r
+void SettingDesktopDialPage::OnStop()\r
+{\r
+    if (coverflow_ != nullptr) {\r
+        delete coverflow_;\r
+        coverflow_ = nullptr;\r
+    }\r
+    if (rollerView_ != nullptr) {\r
+        delete rollerView_;\r
+        rollerView_ = nullptr;\r
+    }\r
+    if (itemLabel_ != nullptr) {\r
+        delete itemLabel_;\r
+        itemLabel_ = nullptr;\r
+    }\r
+}\r
+\r
+bool SettingDesktopDialPage::OnClick(UIView& view, const ClickEvent& event)\r
+{\r
+    SettingDesktopModel::GetInstance().SaveDialSetting(itemIndex_);\r
+    NativeAbility::GetInstance().ChangeSlice(VIEW_MAIN_SAMPLE);\r
+    return true;\r
+}\r
+\r
+bool SettingDesktopDialPage::OnScroll()\r
+{\r
+    int16_t windowCenterX = HORIZONTAL_RESOLUTION / 2;\r
+    int16_t windowDistance = windowCenterX;\r
+    int16_t currItemDistance = 0;\r
+    uint16_t currItemIndex = 0;\r
+    for (uint16_t i = 0; i < coverflow_->GetChildrenNumber(); i++) {\r
+        Rect itemRect = coverflow_->GetViewByIndex(i)->GetOrigRect();\r
+        int16_t itemCenterX = itemRect.GetLeft() + itemRect.GetWidth() / 2;\r
+        int16_t itemDistance = MATH_ABS(itemCenterX - windowCenterX);\r
+        if (windowDistance > itemDistance) { // 和中心点距离最小的组件是当前显示页面\r
+            currItemIndex = i;\r
+            currItemDistance = itemDistance;\r
+            windowDistance = itemDistance;\r
+        }\r
+    }\r
+    if (currItemIndex != itemIndex_) {\r
+        itemIndex_ = currItemIndex;\r
+        const auto& dialInfo = SettingDesktopModel::GetInstance().GetDialInfo();\r
+        itemLabel_->SetText(dialInfo[itemIndex_].dialName.c_str());\r
+    }\r
+    // 公式: 透明度 = 最大透明度- 最大透明度*(组件中心点/窗口中心点); 当组件中心点=窗口中心点时, OPA的值最大\r
+    uint16_t opa = OPA_OPAQUE - (uint16_t)((int32_t)OPA_OPAQUE * currItemDistance / windowCenterX);\r
+    itemLabel_->SetStyle(STYLE_TEXT_OPA, opa);\r
+    return true;\r
+}\r
+\r
+void SettingDesktopDialPage::OnScroll(UIRollerView* roller, std::string currentItemName, float currentItemAngle)\r
+{\r
+    const float baseAngle = SETTING_ROLLER_BASE_ANGLE;\r
+    const float halfBaseAngle = SETTING_ROLLER_HALF_BASE_ANGLE;\r
+    if (FloatMoreEqual(currentItemAngle, halfBaseAngle)) {\r
+        currentItemAngle -= baseAngle;\r
+    }\r
+    if (currentItemAngle < 0) {\r
+        currentItemAngle = -currentItemAngle;\r
+    }\r
+    float maxAngle = baseAngle / itemCount_;\r
+    float coef = 1.0 - 1.0 / (maxAngle) * currentItemAngle;\r
+    itemLabel_->SetStyle(STYLE_TEXT_OPA, coef * OPA_OPAQUE);\r
+    itemLabel_->SetText(currentItemName.c_str());\r
+    auto& dialInfo = SettingDesktopModel::GetInstance().GetDialInfo();\r
+    for (uint8_t i = 0; i < dialInfo.size(); ++i) {\r
+        if (dialInfo[i].dialName == currentItemName) {\r
+            itemIndex_ = i;\r
+        }\r
+    }\r
+}\r
+\r
+void SettingDesktopDialPage::InitDialView()\r
+{\r
+    coverflow_ = new UICoverflowView();\r
+    if (coverflow_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SettingDesktopDialPage::InitDialView  coverflow_ new fail");\r
+        return;\r
+    }\r
+    coverflow_->SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);\r
+    coverflow_->SetOnCoverflowListener(this);\r
+    coverflow_->SetOnClickListener(this);\r
+    coverflow_->SetThrowDrag(true);\r
+    coverflow_->SetIntercept(true);\r
+    coverflow_->SetVisible(false);\r
+\r
+    rollerView_ = new UIRollerView();\r
+    if (rollerView_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SettingDesktopDialPage::InitDialView  rollerView_ new fail");\r
+        return;\r
+    }\r
+    rollerView_->SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);\r
+    rollerView_->SetItemSize(SETTING_ROLLER_ITEM_WIDTH, SETTING_ROLLER_ITEM_HEIHT);\r
+    rollerView_->SetThrowDrag(true);\r
+    rollerView_->SetIntercept(true);\r
+    rollerView_->SetItemPadding(SETTING_ROLLER_ITEM_PADDING);\r
+    rollerView_->SetOnScrollListener(this);\r
+    rollerView_->SetOnClickListener(this);\r
+    rollerView_->SetVisible(false);\r
+}\r
+\r
+void SettingDesktopDialPage::InitCtrlView()\r
+{\r
+    itemLabel_ = new UILabel();\r
+    if (itemLabel_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SettingDesktopDialPage::InitCtrlView  itemLabel_ new fail");\r
+        return;\r
+    }\r
+    itemLabel_->SetPosition(SETTING_DIAL_TITLE_X, SETTING_DIAL_TITLE_Y);\r
+    itemLabel_->Resize(SETTING_DIAL_TITLE_WIDTH, SETTING_DIAL_TITLE_HEIGHT);\r
+    itemLabel_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+    itemLabel_->SetFont(BOLD_VECTOR_FONT_FILENAME, SETTING_DIAL_TITLE_FSZIE);\r
+    itemLabel_->SetStyle(STYLE_TEXT_COLOR, Color::White().full);\r
+}\r
+}\r
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/settings/src/page/SettingDesktopDialStylePage.cpp b/code/sdk/application/wearable/evb/nativeapp/nativeui/settings/src/page/SettingDesktopDialStylePage.cpp
new file mode 100644 (file)
index 0000000..4dbb823
--- /dev/null
@@ -0,0 +1,136 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SettingDesktopDialStylePage\r
+ * Create: 2025-06-01\r
+ */\r
+#include "components/ui_scroll_view_nested.h"\r
+#include "SlicePageFactory.h"\r
+#include "PageTransitionMgr.h"\r
+#include "NativeAbility.h"\r
+#include "settings/model/SettingMainModel.h"\r
+#include "settings/model/SettingDesktopModel.h"\r
+#include "settings/page/SettingDesktopDialStylePage.h"\r
+\r
+namespace OHOS {\r
+REGIST_SLICE_PAGE(VIEW_SETTING, SettingPageId::DESKTOP_DIAL_STYLE_PAGE, SettingDesktopDialStylePage, false);\r
+\r
+static constexpr int16_t SETTING_LIST_POSITION_X = 14;\r
+static constexpr int16_t SETTING_LIST_WIDTH = 426;\r
+static constexpr int16_t SETTING_SCROLLBLANKSIZE = 96;\r
+static constexpr int16 MAX_SCR_DIS = 1000;\r
+static constexpr int16 SNUM_2 = 2;\r
+static SettingDesktopDialStylePage *g_pSettingDesktopDialStylePage{nullptr};\r
+\r
+void SettingDesktopDialStylePage::OnStart(void *data)\r
+{\r
+    g_pSettingDesktopDialStylePage = this;\r
+    scroll_ = new UIScrollViewNested();\r
+    if (scroll_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SettingDesktopDialStylePage::OnStart scroll_ new fail");\r
+        return;\r
+    }\r
+    scroll_->Resize(HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);\r
+    scroll_->SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
+    scroll_->SetStyle(STYLE_BACKGROUND_OPA, UN_OPACITY);\r
+    scroll_->SetThrowDrag(true);\r
+    scroll_->SetIntercept(true);\r
+\r
+    content_ = new UISimpleList();\r
+    if (content_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SettingDesktopDialStylePage::OnStart content_ new fail");\r
+        return;\r
+    }\r
+    content_->SetPosition(SETTING_LIST_POSITION_X, 0, SETTING_LIST_WIDTH, HORIZONTAL_RESOLUTION);\r
+    content_->SetScrollBlankSize(SETTING_SCROLLBLANKSIZE, UIAbstractScroll::Direction::BOTTOM);\r
+    content_->SetSelectPosition(HORIZONTAL_RESOLUTION / SNUM_2);\r
+    content_->SetDraggable(true);\r
+    content_->SetThrowDrag(true);\r
+    content_->SetMaxScrollDistance(MAX_SCR_DIS);\r
+    scroll_->Add(content_);\r
+    AddViewToPageContainer(scroll_);\r
+}\r
+\r
+void SettingDesktopDialStylePage::OnResume()\r
+{\r
+    content_->ClearAll();\r
+    for(auto& it : SettingDesktopModel::GetInstance().GetDialStyleUnionData()) {\r
+        Contents cont;\r
+        cont.createFunc = SettingMainModel::OnSimpleListCreate;\r
+        cont.updateFunc = SettingDesktopDialStylePage::OnSimpleListUpdate;\r
+        cont.type = it.GetUnionItemType();\r
+        cont.data = &it;\r
+        content_->AddContent(cont);\r
+    }\r
+    content_->RefreshList();\r
+}\r
+\r
+void SettingDesktopDialStylePage::OnStop()\r
+{\r
+    g_pSettingDesktopDialStylePage = nullptr;\r
+    if (scroll_ != nullptr) {\r
+        scroll_->RemoveAll();\r
+        delete scroll_;\r
+        scroll_ = nullptr;\r
+    }\r
+    if (content_ != nullptr) {\r
+        delete content_;\r
+        content_ = nullptr;\r
+    }\r
+}\r
+\r
+bool SettingDesktopDialStylePage::OnClick(UIView& view, const ClickEvent& event)\r
+{\r
+    uintptr_t viewId = (uintptr_t)view.GetViewId();\r
+    if (viewId == (uintptr_t)ICON_TEXT_TOGGLE) {\r
+        int16_t viewIndex = view.GetViewIndex();\r
+        auto& dialStyleUnionData = SettingDesktopModel::GetInstance().GetDialStyleUnionData();\r
+        if (viewIndex < 0 || viewIndex > dialStyleUnionData.size()) {\r
+            return true;\r
+        }\r
+\r
+        SettingUnionItemData& itemData = dialStyleUnionData[viewIndex];\r
+        if (itemData.GetUnionItemType() == ICON_TEXT_TOGGLE) {\r
+            IconTextToggleItemData* data = static_cast<IconTextToggleItemData*>(itemData.GetUnionItemData());\r
+            SettingDesktopModel::GetInstance().SetDialStyleDataSelect(data->textContent);\r
+\r
+            // 刷新UnionData\r
+            SettingDesktopModel::GetInstance().GetDialStyleUnionData();\r
+            content_->RefreshList();\r
+        }\r
+    }\r
+    return true;\r
+}\r
+\r
+\r
+void SettingDesktopDialStylePage::OnSimpleListUpdate(UIView* view, void* data, uint8_t type)\r
+{\r
+    if (view == nullptr || data == nullptr) {\r
+        return;\r
+    }\r
+    if (type == SettingUnionItemType::PLAIN_TEXT) {\r
+        PlainTextItemView *itemGroup = dynamic_cast<PlainTextItemView*>(view);\r
+        if (itemGroup == nullptr) {\r
+            return;\r
+        }\r
+        PlainTextItemData* itemData = static_cast<PlainTextItemData*>(data);\r
+        itemGroup->UpdateViewData(itemData);\r
+    } else if(type == SettingUnionItemType::ICON_TEXT_TOGGLE) {\r
+        IconTextToggleItemView *itemGroup = dynamic_cast<IconTextToggleItemView*>(view);\r
+        if (itemGroup == nullptr) {\r
+            return;\r
+        }\r
+        IconTextToggleItemData* itemData = static_cast<IconTextToggleItemData*>(data);\r
+        itemGroup->UpdateViewData(itemData);\r
+        itemGroup->SetOnClickListener(g_pSettingDesktopDialStylePage);\r
+    }  else if(type == SettingUnionItemType::ICON_TEXT_NAVIGATION) {\r
+        IconTextNavigationItemView *itemGroup = dynamic_cast<IconTextNavigationItemView*>(view);\r
+        if (itemGroup == nullptr) {\r
+            return;\r
+        }\r
+        IconTextNavigationItemData* itemData = static_cast<IconTextNavigationItemData*>(data);\r
+        itemGroup->UpdateViewData(itemData);\r
+        itemGroup->SetOnClickListener(g_pSettingDesktopDialStylePage);\r
+    }\r
+    return;\r
+}\r
+}
\ No newline at end of file
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/settings/src/page/SettingDesktopHomePage.cpp b/code/sdk/application/wearable/evb/nativeapp/nativeui/settings/src/page/SettingDesktopHomePage.cpp
new file mode 100644 (file)
index 0000000..d2a5ff4
--- /dev/null
@@ -0,0 +1,125 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SettingDesktopHomePage\r
+ * Create: 2025-06-01\r
+ */\r
+#include "components/ui_scroll_view_nested.h"\r
+#include "SlicePageFactory.h"\r
+#include "PageTransitionMgr.h"\r
+#include "NativeAbility.h"\r
+#include "settings/model/SettingDesktopModel.h"\r
+#include "settings/page/SettingDesktopHomePage.h"\r
+\r
+namespace OHOS {\r
+REGIST_SLICE_PAGE(VIEW_SETTING, SettingPageId::DESKTOP_HOME_PAGE, SettingDesktopHomePage, false);\r
+\r
+static constexpr int16_t SETTING_DESKTOP_HOME_LIST_Y = 130;\r
+static constexpr int16_t SETTING_DESKTOP_HOME_LSIT_HEIGHT = 205;\r
+static constexpr int16_t SETTING_DESKTOP_HOME_LIST_BLANK = 0;\r
+static constexpr int16_t SETTING_DESKTOP_HOME_LIST_DISTANCE = 1000;\r
+static constexpr int16_t SETTING_DESKTOP_HOME_LIST_SELECTPOS = HORIZONTAL_RESOLUTION / 4;\r
+\r
+static constexpr int16_t SETTING_DESKTOP_HOME_TITLE_X = 100;\r
+static constexpr int16_t SETTING_DESKTOP_HOME_TITLE_Y = 39;\r
+static constexpr int16_t SETTING_DESKTOP_HOME_TITLE_WIDTH = 254;\r
+static constexpr int16_t SETTING_DESKTOP_HOME_TITLE_HEIGHT = 53;\r
+static constexpr int16_t SETTING_DESKTOP_HOME_TITLE_FSIZE = 38;\r
+static const char* SETTING_DESKTOP_HOME_TITLE_TEXT = "桌面风格";\r
+\r
+void SettingDesktopHomePage::OnStart(void* data)\r
+{\r
+    list_ = new UISimpleList();\r
+    if (list_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SettingDesktopHomePage::OnStart list_ new fail");\r
+        return;\r
+    }\r
+    list_->SetDirection(UIAbstractScroll::HORIZONTAL);\r
+    list_->SetBoundaryIntercept(DragEvent::DIRECTION_LEFT_TO_RIGHT, false);\r
+    list_->SetPosition(0, SETTING_DESKTOP_HOME_LIST_Y);\r
+    list_->Resize(HORIZONTAL_RESOLUTION, SETTING_DESKTOP_HOME_LSIT_HEIGHT);\r
+    list_->SetScrollBlankSize(SETTING_DESKTOP_HOME_LIST_BLANK);\r
+    list_->SetSelectPosition(SETTING_DESKTOP_HOME_LIST_SELECTPOS);\r
+    list_->SetDraggable(true);\r
+    list_->SetThrowDrag(true);\r
+    list_->EnableAutoAlign(true);\r
+    list_->SetMaxScrollDistance(SETTING_DESKTOP_HOME_LIST_DISTANCE);\r
+    list_->SetIntercept(false);\r
+\r
+    title_ = new UILabel();\r
+    if (title_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SettingDesktopHomePage::OnStart title_ new fail");\r
+        return;\r
+    }\r
+    title_->SetPosition(SETTING_DESKTOP_HOME_TITLE_X, SETTING_DESKTOP_HOME_TITLE_Y);\r
+    title_->Resize(SETTING_DESKTOP_HOME_TITLE_WIDTH, SETTING_DESKTOP_HOME_TITLE_HEIGHT);\r
+    title_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+    title_->SetFont(BOLD_VECTOR_FONT_FILENAME, SETTING_DESKTOP_HOME_TITLE_FSIZE);\r
+    title_->SetStyle(STYLE_TEXT_COLOR, Color::White().full);\r
+    title_->SetText(SETTING_DESKTOP_HOME_TITLE_TEXT);\r
+\r
+    AddViewToPageContainer(list_);\r
+    AddViewToPageContainer(title_);\r
+}\r
+\r
+void SettingDesktopHomePage::OnResume()\r
+{\r
+    list_->ClearAll();\r
+    for(auto& it : SettingDesktopModel::GetInstance().GetDesktopHomeData()) {\r
+        it.contextPtr = this;\r
+        Contents cont;\r
+        cont.createFunc = SettingDesktopHomePage::OnSimpleListCreate;\r
+        cont.updateFunc = SettingDesktopHomePage::OnSimpleListUpdate;\r
+        cont.type = 0;\r
+        cont.data = &it;\r
+        list_->AddContent(cont);\r
+    }\r
+    list_->RefreshList();\r
+}\r
+\r
+void SettingDesktopHomePage::OnStop()\r
+{\r
+    if (list_ != nullptr) {\r
+        delete list_;\r
+        list_ = nullptr;\r
+    }\r
+    if (title_ != nullptr) {\r
+        delete title_;\r
+        title_ = nullptr;\r
+    }\r
+}\r
+\r
+bool SettingDesktopHomePage::OnClick(UIView& view, const ClickEvent& event)\r
+{\r
+    int16_t index = view.GetViewIndex();\r
+    int16_t currIndex = SettingDesktopModel::GetInstance().GetDesktopHomeDataSelect();\r
+    auto& desktopHomeData = SettingDesktopModel::GetInstance().GetDesktopHomeData();\r
+    if (index != currIndex && index >= 0 && (size_t)index < desktopHomeData.size()) {\r
+        SettingDesktopModel::GetInstance().SetDesktopHomeDataSelect((DesktopStyle)desktopHomeData[index].style);\r
+        list_->RefreshList();\r
+        NativeAbility::GetInstance().ChangeSlice(VIEW_MAIN_SAMPLE);\r
+    }\r
+    return true;\r
+}\r
+\r
+UIView* SettingDesktopHomePage::OnSimpleListCreate(uint8_t type)\r
+{\r
+    UNUSED(type);\r
+    return new SettingDesktopHomeItemGroup();\r
+}\r
+\r
+void SettingDesktopHomePage::OnSimpleListUpdate(UIView* view, void* data, uint8_t type)\r
+{\r
+    UNUSED(type);\r
+    if (view == nullptr || data == nullptr) {\r
+        return;\r
+    }\r
+    SettingDesktopHomeItemGroup* itemGroup = dynamic_cast<SettingDesktopHomeItemGroup*>(view);\r
+    if (itemGroup == nullptr) {\r
+        return;\r
+    }\r
+    SettingDesktopHomeItemData* itemData = static_cast<SettingDesktopHomeItemData*>(data);\r
+    SettingDesktopHomePage* page = static_cast<SettingDesktopHomePage*>(itemData->contextPtr);\r
+    itemGroup->UpdateItemGroup(itemData);\r
+    itemGroup->SetOnClickListener(page);\r
+}\r
+}
\ No newline at end of file
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/settings/src/page/SettingDesktopPage.cpp b/code/sdk/application/wearable/evb/nativeapp/nativeui/settings/src/page/SettingDesktopPage.cpp
new file mode 100644 (file)
index 0000000..51d08e2
--- /dev/null
@@ -0,0 +1,135 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SettingDesktopPage\r
+ * Create: 2025-06-01\r
+ */\r
+#include "components/ui_list_nested.h"\r
+#include "components/ui_scroll_view_nested.h"\r
+#include "SlicePageFactory.h"\r
+#include "PageTransitionMgr.h"\r
+#include "NativeAbility.h"\r
+#include "settings/model/SettingMainModel.h"\r
+#include "settings/model/SettingDesktopModel.h"\r
+#include "settings/page/SettingDesktopPage.h"\r
+\r
+namespace OHOS {\r
+REGIST_SLICE_PAGE(VIEW_SETTING, SettingPageId::DESKTOP_PAGE, SettingDesktopPage, false);\r
+\r
+static constexpr int16_t SETTING_LIST_POSITION_X = 14;\r
+static constexpr int16_t SETTING_LIST_WIDTH = 426;\r
+static constexpr int16_t SETTING_SCROLLBLANKSIZE = 96;\r
+static constexpr int16 MAX_SCR_DIS = 1000;\r
+static constexpr int16 SNUM_2 = 2;\r
+static SettingDesktopPage *g_pSettingDesktopPage{nullptr};\r
+\r
+void SettingDesktopPage::OnStart(void *data)\r
+{\r
+    g_pSettingDesktopPage = this;\r
+    content_ = new UISimpleList();\r
+    if (content_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SettingDesktopPage::OnStart content_ new fail");\r
+        return;\r
+    }\r
+    content_->SetPosition(SETTING_LIST_POSITION_X, 0, SETTING_LIST_WIDTH, HORIZONTAL_RESOLUTION);\r
+    content_->SetScrollBlankSize(SETTING_SCROLLBLANKSIZE, UIAbstractScroll::Direction::BOTTOM);\r
+    content_->SetSelectPosition(HORIZONTAL_RESOLUTION / SNUM_2);\r
+    content_->SetDraggable(true);\r
+    content_->SetThrowDrag(true);\r
+    content_->SetMaxScrollDistance(MAX_SCR_DIS);\r
+\r
+    scroll_ = new UIScrollViewNested();\r
+    if (scroll_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SettingDesktopPage::OnStart scroll_ new fail");\r
+        return;\r
+    }\r
+    scroll_->Resize(HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);\r
+    scroll_->SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
+    scroll_->SetStyle(STYLE_BACKGROUND_OPA, UN_OPACITY);\r
+    scroll_->SetThrowDrag(true);\r
+    scroll_->SetIntercept(true);\r
+    scroll_->SetOnDragListener(this);\r
+    scroll_->Add(content_);\r
+    AddViewToPageContainer(scroll_);\r
+}\r
+\r
+void SettingDesktopPage::OnResume()\r
+{\r
+    content_->ClearAll();\r
+    for (SettingUnionItemData& it : SettingDesktopModel::GetInstance().GetDesktopUnionData()) {\r
+        Contents cont;\r
+        cont.createFunc = SettingMainModel::OnSimpleListCreate;\r
+        cont.updateFunc = SettingDesktopPage::OnSimpleListUpdate;\r
+        cont.type = it.GetUnionItemType();\r
+        cont.data = &it;\r
+        content_->AddContent(cont);\r
+    }\r
+    content_->RefreshList();\r
+}\r
+\r
+void SettingDesktopPage::OnStop()\r
+{\r
+    if (scroll_ != nullptr) {\r
+        scroll_->RemoveAll();\r
+        delete scroll_;\r
+        scroll_ = nullptr;\r
+    }\r
+    if (content_ != nullptr) {\r
+        delete content_;\r
+        content_ = nullptr;\r
+    }\r
+    g_pSettingDesktopPage = nullptr;\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SettingDesktopPage::~SettingDesktopPage");\r
+}\r
+\r
+bool SettingDesktopPage::OnClick(UIView& view, const ClickEvent& event)\r
+{\r
+    uintptr_t viewId = (uintptr_t)view.GetViewId();\r
+    if (viewId == (uintptr_t)ICON_TEXT_NAVIGATION) {\r
+        int16_t viewIndex = view.GetViewIndex();\r
+        auto& desktopUnionData = SettingDesktopModel::GetInstance().GetDesktopUnionData();\r
+        if (viewIndex < 0 || viewIndex > desktopUnionData.size()) {\r
+            return true;\r
+        }\r
+\r
+        SettingUnionItemData& itemData = desktopUnionData[viewIndex];\r
+        if (itemData.GetUnionItemType() == ICON_TEXT_NAVIGATION) {\r
+            IconTextNavigationItemData* data = static_cast<IconTextNavigationItemData*>(itemData.GetUnionItemData());\r
+            NativeAbility::GetInstance().SwitchPageInSlice(data->pageId,\r
+                TransitionType::TRANSITION_INVALID, true);\r
+        }\r
+    }\r
+    return true;\r
+}\r
+\r
+void SettingDesktopPage::OnSimpleListUpdate(UIView* view, void* data, uint8_t type)\r
+{\r
+    if (view == nullptr || data == nullptr) {\r
+        return;\r
+    }\r
+    if (type == SettingUnionItemType::PLAIN_TEXT) {\r
+        PlainTextItemView *itemGroup = dynamic_cast<PlainTextItemView*>(view);\r
+        if (itemGroup == nullptr) {\r
+            return;\r
+        }\r
+        PlainTextItemData* itemData = static_cast<PlainTextItemData*>(data);\r
+        itemGroup->UpdateViewData(itemData);\r
+    } else if(type == SettingUnionItemType::ICON_TEXT_TOGGLE) {\r
+        IconTextToggleItemView *itemGroup = dynamic_cast<IconTextToggleItemView*>(view);\r
+        if (itemGroup == nullptr) {\r
+            return;\r
+        }\r
+        IconTextToggleItemData* itemData = static_cast<IconTextToggleItemData*>(data);\r
+        itemGroup->UpdateViewData(itemData);\r
+        itemGroup->SetOnClickListener(g_pSettingDesktopPage);\r
+    }  else if(type == SettingUnionItemType::ICON_TEXT_NAVIGATION) {\r
+        IconTextNavigationItemView *itemGroup = dynamic_cast<IconTextNavigationItemView*>(view);\r
+        if (itemGroup == nullptr) {\r
+            return;\r
+        }\r
+        IconTextNavigationItemData* itemData = static_cast<IconTextNavigationItemData*>(data);\r
+        itemGroup->UpdateViewData(itemData);\r
+        itemGroup->SetOnClickListener(g_pSettingDesktopPage);\r
+    }\r
+    return;\r
+}\r
+}
\ No newline at end of file
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/settings/src/page/SettingDisplayBrightnessPage.cpp b/code/sdk/application/wearable/evb/nativeapp/nativeui/settings/src/page/SettingDisplayBrightnessPage.cpp
new file mode 100644 (file)
index 0000000..44cf3e1
--- /dev/null
@@ -0,0 +1,293 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SettingDisplayBrightnessPage\r
+ * Create: 2025-06-01\r
+ */\r
+#include "SlicePageFactory.h"\r
+#include "PageTransitionMgr.h"\r
+#include "NativeAbility.h"\r
+#include "settings/model/SettingDisplayModel.h"\r
+#include "settings/page/SettingDisplayBrightnessPage.h"\r
+\r
+namespace OHOS {\r
+REGIST_SLICE_PAGE(VIEW_SETTING, SettingPageId::DISPLAY_BRIGHTNESS_PAGE, SettingDisplayBrightnessPage, false);\r
+\r
+static constexpr int8_t SETTING_DISPLAY_TEMP_STR_LEN = 10;\r
+static constexpr uint8_t SETTING_DISPLAY_BRIGHTNESS_MAX = 100;\r
+static constexpr uint8_t SETTING_DISPLAY_BRIGHTNESS_MIN = 0;\r
+static constexpr int16_t SETTING_DISPLAY_BRIGHTNESS_AUTO_TIME = 300;\r
+\r
+static constexpr int16_t SETTING_DISPLAY_BRI_TITLE_X = 100;\r
+static constexpr int16_t SETTING_DISPLAY_BRI_TITLE_Y = 39;\r
+static constexpr int16_t SETTING_DISPLAY_BRI_TITLE_WIDTH = 254;\r
+static constexpr int16_t SETTING_DISPLAY_BRI_TITLE_HEIGHT = 53;\r
+static constexpr int16_t SETTING_DISPLAY_BRI_TITLE_FSIZE = 38;\r
+static const char* SETTING_DISPLAY_BRI_TITLE_TEXT = "调整亮度";\r
+\r
+static constexpr int16_t SETTING_DISPLAY_BRI_PROGRESS_X = 127;\r
+static constexpr int16_t SETTING_DISPLAY_BRI_PROGRESS_Y = 127;\r
+static constexpr int16_t SETTING_DISPLAY_BRI_PROGRESS_WIDTH = 200;\r
+static constexpr int16_t SETTING_DISPLAY_BRI_PROGRESS_HEIGHT = 200;\r
+static constexpr int16_t SETTING_DISPLAY_BRI_PROGRESS_LINE_WIDTH = 25;\r
+static constexpr int16_t SETTING_DISPLAY_BRI_PROGRESS_RADIUS = 100;\r
+static constexpr int16_t SETTING_DISPLAY_BRI_START_ANGLE = 360;\r
+static constexpr int16_t SETTING_DISPLAY_BRI_END_ANGLE = 0;\r
+\r
+static constexpr int16_t SETTING_DISPLAY_BRI_PROGRESSNUM_X = 173;\r
+static constexpr int16_t SETTING_DISPLAY_BRI_PROGRESSNUM_Y = 187;\r
+static constexpr int16_t SETTING_DISPLAY_BRI_PROGRESSNUM_WIDTH = 108;\r
+static constexpr int16_t SETTING_DISPLAY_BRI_PROGRESSNUM_HEIGHT = 60;\r
+static constexpr int16_t SETTING_DISPLAY_BRI_PROGRESSNUM_FSIZE = 59;\r
+\r
+static constexpr int16_t SETTING_DISPLAY_BRI_ADD_X = 343;\r
+static constexpr int16_t SETTING_DISPLAY_BRI_ADD_Y = 187;\r
+static constexpr int16_t SETTING_DISPLAY_BRI_ADD_WIDTH = 80;\r
+static constexpr int16_t SETTING_DISPLAY_BRI_ADD_HEIGHT = 80;\r
+static constexpr int16_t SETTING_DISPLAY_BRI_ADD_OPA = 37;\r
+static const char* SETTING_DISPLAY_BRI_ADD_BUTTON_ID = "add";\r
+\r
+static constexpr int16_t SETTING_DISPLAY_BRI_SUB_X = 31;\r
+static constexpr int16_t SETTING_DISPLAY_BRI_SUB_Y = 187;\r
+static constexpr int16_t SETTING_DISPLAY_BRI_SUB_WIDTH = 80;\r
+static constexpr int16_t SETTING_DISPLAY_BRI_SUB_HEIGHT = 80;\r
+static constexpr int16_t SETTING_DISPLAY_BRI_SUB_OPA = 37;\r
+static const char* SETTING_DISPLAY_BRI_SUB_BUTTON_ID = "sub";\r
+\r
+void SettingDisplayBrightnessPage::OnStart(void* data)\r
+{\r
+    InitProgressView();\r
+    InitButtonView();\r
+    AddViewToPageContainer(title_);\r
+    AddViewToPageContainer(progress_);\r
+    AddViewToPageContainer(progressNum_);\r
+    AddViewToPageContainer(add_);\r
+    AddViewToPageContainer(sub_);\r
+}\r
+\r
+void SettingDisplayBrightnessPage::OnResume()\r
+{\r
+    char temp[SETTING_DISPLAY_TEMP_STR_LEN] = "";\r
+    uint8_t brightness = SettingDisplayModel::GetInstance().GetBrightness();\r
+    progress_->SetValue(brightness);\r
+    if (sprintf_s(temp, sizeof(temp), "%u", brightness) > 0) {\r
+        progressNum_->SetText(temp);\r
+    }\r
+}\r
+\r
+void SettingDisplayBrightnessPage::OnPause()\r
+{\r
+    animator_->Stop();\r
+}\r
+\r
+void SettingDisplayBrightnessPage::OnStop()\r
+{\r
+    if (title_ != nullptr) {\r
+        delete title_;\r
+        title_ = nullptr;\r
+    }\r
+    if (progress_ != nullptr) {\r
+        delete progress_;\r
+        progress_ = nullptr;\r
+    }\r
+    if (progressNum_ != nullptr) {\r
+        delete progressNum_;\r
+        progressNum_ = nullptr;\r
+    }\r
+    if (add_ != nullptr) {\r
+        delete add_;\r
+        add_ = nullptr;\r
+    }\r
+    if (sub_ != nullptr) {\r
+        delete sub_;\r
+        sub_ = nullptr;\r
+    }\r
+    if (animator_ != nullptr) {\r
+        delete animator_;\r
+        animator_ = nullptr;\r
+    }\r
+    ImageCacheManager::GetInstance().UnloadOneInMultiRes(IMAGE_DESKTOP_BRIGHTNESS_FG, SETTING_IMAGE);\r
+    ImageCacheManager::GetInstance().UnloadOneInMultiRes(IMAGE_DISPLAY_BRIGHTNESS_ADD, SETTING_IMAGE);\r
+    ImageCacheManager::GetInstance().UnloadOneInMultiRes(IMAGE_DISPLAY_BRIGHTNESS_SUB, SETTING_IMAGE);\r
+}\r
+\r
+bool SettingDisplayBrightnessPage::OnClick(UIView &view, const ClickEvent &event)\r
+{\r
+    char temp[SETTING_DISPLAY_TEMP_STR_LEN] = "";\r
+    if (strcmp(view.GetViewId(), SETTING_DISPLAY_BRI_ADD_BUTTON_ID) == 0) {\r
+        uint8_t brightness = SettingDisplayModel::GetInstance().GetBrightness();\r
+        if (brightness != SETTING_DISPLAY_BRIGHTNESS_MAX) {\r
+            brightness++;\r
+            SettingDisplayModel::GetInstance().SetBrightness(brightness);\r
+            progress_->SetValue(brightness);\r
+            if (sprintf_s(temp, sizeof(temp), "%u", brightness) > 0) {\r
+                progressNum_->SetText(temp);\r
+            }\r
+        }\r
+    } else if (strcmp(view.GetViewId(), SETTING_DISPLAY_BRI_SUB_BUTTON_ID) == 0) {\r
+        uint8_t brightness = SettingDisplayModel::GetInstance().GetBrightness();\r
+        if (brightness != SETTING_DISPLAY_BRIGHTNESS_MIN) {\r
+            brightness--;\r
+            SettingDisplayModel::GetInstance().SetBrightness(brightness);\r
+            progress_->SetValue(brightness);\r
+            if (sprintf_s(temp, sizeof(temp), "%u", brightness) > 0) {\r
+                progressNum_->SetText(temp);\r
+            }\r
+        }\r
+    }\r
+    return true;\r
+}\r
+\r
+bool SettingDisplayBrightnessPage::OnLongPress(UIView& view, const LongPressEvent& event)\r
+{\r
+    if (strcmp(view.GetViewId(), SETTING_DISPLAY_BRI_ADD_BUTTON_ID) == 0) {\r
+        if (curLongPressButton_ == nullptr) {\r
+            curLongPressButton_ = add_;\r
+            animator_->Start();\r
+        }\r
+    } else if (strcmp(view.GetViewId(), SETTING_DISPLAY_BRI_SUB_BUTTON_ID) == 0) {\r
+        if (curLongPressButton_ == nullptr) {\r
+            curLongPressButton_ = sub_;\r
+            animator_->Start();\r
+        }\r
+    }\r
+    return true;\r
+}\r
+\r
+bool SettingDisplayBrightnessPage::OnRelease(UIView& view, const ReleaseEvent& event)\r
+{\r
+    animator_->Stop();\r
+    curLongPressButton_ = nullptr;\r
+    return true;\r
+}\r
+\r
+bool SettingDisplayBrightnessPage::OnDragEnd(UIView& view, const DragEvent& event)\r
+{\r
+    if (view.GetViewId() &&\r
+        (strcmp(view.GetViewId(), SETTING_DISPLAY_BRI_ADD_BUTTON_ID) == 0 ||\r
+        strcmp(view.GetViewId(), SETTING_DISPLAY_BRI_SUB_BUTTON_ID) == 0)) {\r
+        animator_->Stop();\r
+        curLongPressButton_ = nullptr;\r
+    }\r
+    return false;\r
+}\r
+\r
+void SettingDisplayBrightnessPage::Callback(UIView* view)\r
+{\r
+    static uint32_t lastRunTime = 0;\r
+    uint32_t currRunTime = animator_->GetRunTime();\r
+    if (currRunTime - lastRunTime < SETTING_DISPLAY_BRIGHTNESS_AUTO_TIME) {\r
+        return;\r
+    }\r
+    lastRunTime = currRunTime;\r
+    char temp[SETTING_DISPLAY_TEMP_STR_LEN] = "";\r
+    uint8_t brightness = SettingDisplayModel::GetInstance().GetBrightness();\r
+    if (curLongPressButton_ == add_ && brightness != SETTING_DISPLAY_BRIGHTNESS_MAX) {\r
+        brightness++;\r
+    } else if (curLongPressButton_ == sub_ && brightness != SETTING_DISPLAY_BRIGHTNESS_MIN) {\r
+        brightness--;\r
+    }\r
+    SettingDisplayModel::GetInstance().SetBrightness(brightness);\r
+    progress_->SetValue(brightness);\r
+    if (sprintf_s(temp, sizeof(temp), "%u", brightness) > 0) {\r
+        progressNum_->SetText(temp);\r
+    }\r
+}\r
+\r
+void SettingDisplayBrightnessPage::InitProgressView()\r
+{\r
+    title_ = new UILabel();\r
+    if (title_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SettingDisplayBrightness::InitProgressView title_ new fail");\r
+        return;\r
+    }\r
+    title_->SetPosition(SETTING_DISPLAY_BRI_TITLE_X, SETTING_DISPLAY_BRI_TITLE_Y);\r
+    title_->Resize(SETTING_DISPLAY_BRI_TITLE_WIDTH, SETTING_DISPLAY_BRI_TITLE_HEIGHT);\r
+    title_->SetTextColor(Color::White());\r
+    title_->SetFont(BOLD_VECTOR_FONT_FILENAME, SETTING_DISPLAY_BRI_TITLE_FSIZE);\r
+    title_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+    title_->SetText(SETTING_DISPLAY_BRI_TITLE_TEXT);\r
+\r
+    progress_ = new UICircleProgress();\r
+    if (progress_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SettingDisplayBrightness::InitProgressView progress_ new fail");\r
+        return;\r
+    }\r
+    progress_->SetPosition(SETTING_DISPLAY_BRI_PROGRESS_X, SETTING_DISPLAY_BRI_PROGRESS_Y);\r
+    progress_->Resize(SETTING_DISPLAY_BRI_PROGRESS_WIDTH, SETTING_DISPLAY_BRI_PROGRESS_HEIGHT);\r
+    ImageInfo* fgImage = ImageCacheManager::GetInstance().LoadOneInMultiRes(IMAGE_DESKTOP_BRIGHTNESS_FG, SETTING_IMAGE);\r
+    ImageInfo* bgImage = ImageCacheManager::GetInstance().LoadOneInMultiRes(IMAGE_DESKTOP_BRIGHTNESS_BG, SETTING_IMAGE);\r
+    progress_->SetImage(fgImage, bgImage);\r
+    progress_->SetBackgroundStyle(STYLE_LINE_WIDTH, SETTING_DISPLAY_BRI_PROGRESS_LINE_WIDTH);\r
+    progress_->SetForegroundStyle(STYLE_LINE_WIDTH, SETTING_DISPLAY_BRI_PROGRESS_LINE_WIDTH);\r
+    progress_->SetProgressImagePosition(0, 0);\r
+    progress_->SetBackgroundImagePosition(0, 0);\r
+    progress_->SetCenterPosition(SETTING_DISPLAY_BRI_PROGRESS_RADIUS, SETTING_DISPLAY_BRI_PROGRESS_RADIUS);\r
+    progress_->SetRadius(SETTING_DISPLAY_BRI_PROGRESS_RADIUS);\r
+    progress_->SetStartAngle(SETTING_DISPLAY_BRI_START_ANGLE);\r
+    progress_->SetEndAngle(SETTING_DISPLAY_BRI_END_ANGLE);\r
+\r
+    progressNum_ = new UILabel();\r
+    if (progressNum_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SettingDisplayBrightness::InitProgressView progressNum_ new fail");\r
+        return;\r
+    }\r
+    progressNum_->SetPosition(SETTING_DISPLAY_BRI_PROGRESSNUM_X, SETTING_DISPLAY_BRI_PROGRESSNUM_Y);\r
+    progressNum_->Resize(SETTING_DISPLAY_BRI_PROGRESSNUM_WIDTH, SETTING_DISPLAY_BRI_PROGRESSNUM_HEIGHT);\r
+    progressNum_->SetTextColor(Color::White());\r
+    progressNum_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SETTING_DISPLAY_BRI_PROGRESSNUM_FSIZE);\r
+    progressNum_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+}\r
+\r
+void SettingDisplayBrightnessPage::InitButtonView()\r
+{\r
+    add_ = new UIButton();\r
+    if (add_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SettingDisplayBrightness::InitButtonView add_ new fail");\r
+        return;\r
+    }\r
+    add_->SetPosition(SETTING_DISPLAY_BRI_ADD_X, SETTING_DISPLAY_BRI_ADD_Y);\r
+    add_->Resize(SETTING_DISPLAY_BRI_ADD_WIDTH, SETTING_DISPLAY_BRI_ADD_HEIGHT);\r
+    ImageInfo* addImage =\r
+        ImageCacheManager::GetInstance().LoadOneInMultiRes(IMAGE_DISPLAY_BRIGHTNESS_ADD, SETTING_IMAGE);\r
+    add_->SetImageSrc(addImage, addImage);\r
+    add_->SetStyleForState(STYLE_BACKGROUND_COLOR, Color::Black().full, UIButton::RELEASED);\r
+    add_->SetStyleForState(STYLE_BACKGROUND_COLOR, Color::Black().full, UIButton::PRESSED);\r
+    add_->SetStyleForState(STYLE_BACKGROUND_OPA, SETTING_DISPLAY_BRI_ADD_OPA, UIButton::RELEASED);\r
+    add_->SetStyleForState(STYLE_BACKGROUND_OPA, SETTING_DISPLAY_BRI_ADD_OPA, UIButton::PRESSED);\r
+    add_->SetViewId(SETTING_DISPLAY_BRI_ADD_BUTTON_ID);\r
+    add_->SetDraggable(true);\r
+    add_->SetOnClickListener(this);\r
+    add_->SetOnTouchListener(this);\r
+    add_->SetOnLongPressListener(this);\r
+    add_->SetOnDragListener(this);\r
+    add_->SetIntercept(true);\r
+\r
+    sub_ = new UIButton();\r
+    if (sub_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SettingDisplayBrightness::InitButtonView sub_ new fail");\r
+        return;\r
+    }\r
+    sub_->SetPosition(SETTING_DISPLAY_BRI_SUB_X, SETTING_DISPLAY_BRI_SUB_Y);\r
+    sub_->Resize(SETTING_DISPLAY_BRI_SUB_WIDTH, SETTING_DISPLAY_BRI_SUB_HEIGHT);\r
+    ImageInfo* subImage =\r
+        ImageCacheManager::GetInstance().LoadOneInMultiRes(IMAGE_DISPLAY_BRIGHTNESS_SUB, SETTING_IMAGE);\r
+    sub_->SetImageSrc(subImage, subImage);\r
+    sub_->SetStyleForState(STYLE_BACKGROUND_COLOR, Color::Black().full, UIButton::RELEASED);\r
+    sub_->SetStyleForState(STYLE_BACKGROUND_COLOR, Color::Black().full, UIButton::PRESSED);\r
+    sub_->SetStyleForState(STYLE_BACKGROUND_OPA, SETTING_DISPLAY_BRI_SUB_OPA, UIButton::RELEASED);\r
+    sub_->SetStyleForState(STYLE_BACKGROUND_OPA, SETTING_DISPLAY_BRI_SUB_OPA, UIButton::PRESSED);\r
+    sub_->SetViewId(SETTING_DISPLAY_BRI_SUB_BUTTON_ID);\r
+    sub_->SetDraggable(true);\r
+    sub_->SetOnClickListener(this);\r
+    sub_->SetOnTouchListener(this);\r
+    sub_->SetOnLongPressListener(this);\r
+    sub_->SetOnDragListener(this);\r
+    sub_->SetIntercept(true);\r
+\r
+    animator_ = new Animator(this, nullptr, 0, true);\r
+    if (animator_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SettingDisplayBrightness::InitButtonView animator_ new fail");\r
+        return;\r
+    }\r
+}\r
+}
\ No newline at end of file
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/settings/src/page/SettingDisplayPage.cpp b/code/sdk/application/wearable/evb/nativeapp/nativeui/settings/src/page/SettingDisplayPage.cpp
new file mode 100644 (file)
index 0000000..2bd2f53
--- /dev/null
@@ -0,0 +1,145 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SettingDisplayPage\r
+ * Create: 2025-06-01\r
+ */\r
+#include "components/ui_scroll_view_nested.h"\r
+#include "SlicePageFactory.h"\r
+#include "PageTransitionMgr.h"\r
+#include "NativeAbility.h"\r
+#include "settings/model/SettingMainModel.h"\r
+#include "settings/model/SettingDisplayModel.h"\r
+#include "settings/page/SettingDisplayPage.h"\r
+\r
+namespace OHOS {\r
+REGIST_SLICE_PAGE(VIEW_SETTING, SettingPageId::DISPLAY_PAGE, SettingDisplayPage, false);\r
+\r
+static constexpr int16_t SETTING_LIST_POSITION_X = 14;\r
+static constexpr int16_t SETTING_LIST_WIDTH = 426;\r
+static constexpr int16_t SETTING_SCROLLBLANKSIZE = 96;\r
+static constexpr int16 MAX_SCR_DIS = 1000;\r
+static constexpr int16 SNUM_2 = 2;\r
+static SettingDisplayPage *g_pSettingDisplayPage{nullptr};\r
+\r
+void SettingDisplayPage::OnStart(void *data)\r
+{\r
+    g_pSettingDisplayPage = this;\r
+    scroll_ = new UIScrollViewNested();\r
+    if (scroll_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SettingDisplayPage::OnStart scroll_ new fail");\r
+        return;\r
+    }\r
+    scroll_->Resize(HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);\r
+    scroll_->SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
+    scroll_->SetStyle(STYLE_BACKGROUND_OPA, UN_OPACITY);\r
+    scroll_->SetThrowDrag(true);\r
+    scroll_->SetTouchable(true);\r
+    scroll_->SetDraggable(true);\r
+    scroll_->SetIntercept(true);\r
+\r
+    content_ = new UISimpleList();\r
+    if (content_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SettingDisplayPage::OnStart content_ new fail");\r
+        return;\r
+    }\r
+    content_->SetPosition(SETTING_LIST_POSITION_X, 0, SETTING_LIST_WIDTH, HORIZONTAL_RESOLUTION);\r
+    content_->SetScrollBlankSize(SETTING_SCROLLBLANKSIZE, UIAbstractScroll::Direction::BOTTOM);\r
+    content_->SetSelectPosition(HORIZONTAL_RESOLUTION / SNUM_2);\r
+    content_->SetDraggable(true);\r
+    content_->SetThrowDrag(true);\r
+    content_->SetMaxScrollDistance(MAX_SCR_DIS);\r
+    scroll_->Add(content_);\r
+    AddViewToPageContainer(scroll_);\r
+}\r
+\r
+void SettingDisplayPage::OnResume()\r
+{\r
+    content_->ClearAll();\r
+    for(auto& it : SettingDisplayModel::GetInstance().GetDisplayUnionData()) {\r
+        Contents cont;\r
+        cont.createFunc = SettingMainModel::OnSimpleListCreate;\r
+        cont.updateFunc = SettingDisplayPage::OnSimpleListUpdate;\r
+        cont.type = it.GetUnionItemType();\r
+        cont.data = &it;\r
+        content_->AddContent(cont);\r
+    }\r
+    content_->RefreshList();\r
+}\r
+\r
+void SettingDisplayPage::OnStop()\r
+{\r
+    g_pSettingDisplayPage = nullptr;\r
+    if (scroll_ != nullptr) {\r
+        scroll_->RemoveAll();\r
+        delete scroll_;\r
+        scroll_ = nullptr;\r
+    }\r
+    if (content_ != nullptr) {\r
+        delete content_;\r
+        content_ = nullptr;\r
+    }\r
+}\r
+\r
+bool SettingDisplayPage::OnClick(UIView& view, const ClickEvent& event)\r
+{\r
+    uintptr_t viewId = (uintptr_t)view.GetViewId();\r
+    if (viewId == (uintptr_t)ICON_TEXT_TOGGLE) {\r
+        int16_t viewIndex = view.GetViewIndex();\r
+        auto& displayUnionData = SettingDisplayModel::GetInstance().GetDisplayUnionData();\r
+        if (viewIndex < 0 || viewIndex > displayUnionData.size()) {\r
+            return true;\r
+        }\r
+\r
+        SettingDisplayModel::GetInstance().SetAutoAdjustBrightness(\r
+            !SettingDisplayModel::GetInstance().GetAutoAdjustBrightness());\r
+        SettingDisplayModel::GetInstance().RefreshDisplayUnionDataForAutoAdjustBrightness();\r
+        content_->RefreshList();\r
+    } else if (viewId == (uintptr_t)ICON_TEXT_NAVIGATION) {\r
+        int16_t viewIndex = view.GetViewIndex();\r
+        auto& displayUnionData = SettingDisplayModel::GetInstance().GetDisplayUnionData();\r
+        if (viewIndex < 0 || viewIndex > displayUnionData.size()) {\r
+            return true;\r
+        }\r
+\r
+        SettingUnionItemData& itemData = displayUnionData[viewIndex];\r
+        if (itemData.GetUnionItemType() == ICON_TEXT_NAVIGATION) {\r
+            IconTextNavigationItemData* data = static_cast<IconTextNavigationItemData*>(itemData.GetUnionItemData());\r
+            NativeAbility::GetInstance().SwitchPageInSlice(data->pageId,\r
+                TransitionType::TRANSITION_INVALID, true);\r
+        }\r
+    }\r
+    return true;\r
+}\r
+\r
+void SettingDisplayPage::OnSimpleListUpdate(UIView* view, void* data, uint8_t type)\r
+{\r
+    if (view == nullptr || data == nullptr) {\r
+        return;\r
+    }\r
+    if (type == SettingUnionItemType::PLAIN_TEXT) {\r
+        PlainTextItemView *itemGroup = dynamic_cast<PlainTextItemView*>(view);\r
+        if (itemGroup == nullptr) {\r
+            return;\r
+        }\r
+        PlainTextItemData* itemData = static_cast<PlainTextItemData*>(data);\r
+        itemGroup->UpdateViewData(itemData);\r
+    } else if(type == SettingUnionItemType::ICON_TEXT_TOGGLE) {\r
+        IconTextToggleItemView *itemGroup = dynamic_cast<IconTextToggleItemView*>(view);\r
+        if (itemGroup == nullptr) {\r
+            return;\r
+        }\r
+        IconTextToggleItemData* itemData = static_cast<IconTextToggleItemData*>(data);\r
+        itemGroup->UpdateViewData(itemData);\r
+        itemGroup->SetOnClickListener(g_pSettingDisplayPage);\r
+    }  else if(type == SettingUnionItemType::ICON_TEXT_NAVIGATION) {\r
+        IconTextNavigationItemView *itemGroup = dynamic_cast<IconTextNavigationItemView*>(view);\r
+        if (itemGroup == nullptr) {\r
+            return;\r
+        }\r
+        IconTextNavigationItemData* itemData = static_cast<IconTextNavigationItemData*>(data);\r
+        itemGroup->UpdateViewData(itemData);\r
+        itemGroup->SetOnClickListener(g_pSettingDisplayPage);\r
+    }\r
+    return;\r
+}\r
+}
\ No newline at end of file
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/settings/src/page/SettingDisplayScreenOffPage.cpp b/code/sdk/application/wearable/evb/nativeapp/nativeui/settings/src/page/SettingDisplayScreenOffPage.cpp
new file mode 100644 (file)
index 0000000..2471099
--- /dev/null
@@ -0,0 +1,123 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SettingDisplayScreenOffPage\r
+ * Create: 2025-06-01\r
+ */\r
+#include "SlicePageFactory.h"\r
+#include "PageTransitionMgr.h"\r
+#include "NativeAbility.h"\r
+#include "settings/model/SettingDisplayModel.h"\r
+#include "settings/page/SettingDisplayScreenOffPage.h"\r
+\r
+namespace OHOS {\r
+REGIST_SLICE_PAGE(VIEW_SETTING, SettingPageId::DISPLAY_SCREEN_OFF_PAGE,\r
+    SettingDisplayScreenOffPage, false);\r
+\r
+static constexpr int16_t SETTING_DISPLAY_SCREEN_TITLE_X = 100;\r
+static constexpr int16_t SETTING_DISPLAY_SCREEN_TITLE_Y = 39;\r
+static constexpr int16_t SETTING_DISPLAY_SCREEN_TITLE_WIDTH = 254;\r
+static constexpr int16_t SETTING_DISPLAY_SCREEN_TITLE_HEIGHT = 53;\r
+static constexpr int16_t SETTING_DISPLAY_SCREEN_TITLE_FSIZE = 38;\r
+static const char* SETTING_DISPLAY_SCREEN_TITLE_TEXT = "熄屏时间";\r
+\r
+static constexpr int16_t SETTING_DISPLAY_SCREEN_PICKER_X = 64;\r
+static constexpr int16_t SETTING_DISPLAY_SCREEN_PICKER_Y = 118;\r
+static constexpr int16_t SETTING_DISPLAY_SCREEN_PICKER_WIDTH = 321;\r
+static constexpr int16_t SETTING_DISPLAY_SCREEN_PICKER_HEIGHT = 218;\r
+static constexpr int16_t SETTING_DISPLAY_SCREEN_PICKER_FSIZE = 44;\r
+static constexpr int16_t SETTING_DISPLAY_SCREEN_PICKER_ITEM_HEIGHT = 84;\r
+\r
+static constexpr int16_t SETTING_DISPLAY_SCREEN_BUTTON_X = 63;\r
+static constexpr int16_t SETTING_DISPLAY_SCREEN_BUTTON_Y = 358;\r
+static constexpr int16_t SETTING_DISPLAY_SCREEN_BUTTON_WIDTH = 328;\r
+static constexpr int16_t SETTING_DISPLAY_SCREEN_BUTTON_HEIGHT = 94;\r
+static constexpr int16_t SETTING_DISPLAY_SCREEN_BUTTON_BG_OPA = 51;\r
+static const char* SETTING_DISPLAY_SCREEN_BUTTON_ID = "button";\r
+\r
+void SettingDisplayScreenOffPage::OnStart(void* data)\r
+{\r
+    title_ = new UILabel();\r
+    if (title_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SettingDisplayScreenOffTimePage::OnStart title_ new fail");\r
+        return;\r
+    }\r
+    title_->SetPosition(SETTING_DISPLAY_SCREEN_TITLE_X, SETTING_DISPLAY_SCREEN_TITLE_Y);\r
+    title_->Resize(SETTING_DISPLAY_SCREEN_TITLE_WIDTH, SETTING_DISPLAY_SCREEN_TITLE_HEIGHT);\r
+    title_->SetFont(BOLD_VECTOR_FONT_FILENAME, SETTING_DISPLAY_SCREEN_TITLE_FSIZE);\r
+    title_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+    title_->SetTextColor(Color::White());\r
+    title_->SetText(SETTING_DISPLAY_SCREEN_TITLE_TEXT);\r
+\r
+    picker_ = new UIPicker();\r
+    if (picker_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SettingDisplayScreenOffTimePage::OnStart picker_ new fail");\r
+        return;\r
+    }\r
+    picker_->SetPosition(SETTING_DISPLAY_SCREEN_PICKER_X, SETTING_DISPLAY_SCREEN_PICKER_Y);\r
+    picker_->Resize(SETTING_DISPLAY_SCREEN_PICKER_WIDTH, SETTING_DISPLAY_SCREEN_PICKER_HEIGHT);\r
+    picker_->SetStyle(STYLE_BACKGROUND_OPA, OPA_OPAQUE);\r
+    picker_->SetBackgroundFont(DEFAULT_VECTOR_FONT_FILENAME, SETTING_DISPLAY_SCREEN_PICKER_FSIZE);\r
+    picker_->SetHighlightFont(DEFAULT_VECTOR_FONT_FILENAME, SETTING_DISPLAY_SCREEN_PICKER_FSIZE);\r
+    picker_->SetItemHeight(SETTING_DISPLAY_SCREEN_PICKER_ITEM_HEIGHT);\r
+    picker_->SetTextColor(SETTING_LIST_DEFAULT_BG_COLOR, Color::White());\r
+    picker_->SetIntercept(true);\r
+\r
+    button_ = new UIButton();\r
+    if (button_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SettingDisplayScreenOffTimePage::OnStart button_ new fail");\r
+        return;\r
+    }\r
+    button_->SetPosition(SETTING_DISPLAY_SCREEN_BUTTON_X, SETTING_DISPLAY_SCREEN_BUTTON_Y);\r
+    button_->Resize(SETTING_DISPLAY_SCREEN_BUTTON_WIDTH, SETTING_DISPLAY_SCREEN_BUTTON_HEIGHT);\r
+    ImageInfo* image = ImageCacheManager::GetInstance().LoadOneInMultiRes(IMAGE_DISPLAY_OK, SETTING_IMAGE);\r
+    button_->SetImageSrc(image, image);\r
+    button_->SetStyleForState(STYLE_BACKGROUND_COLOR, Color::Black().full, UIButton::RELEASED);\r
+    button_->SetStyleForState(STYLE_BACKGROUND_COLOR, Color::Black().full, UIButton::PRESSED);\r
+    button_->SetStyleForState(STYLE_BACKGROUND_OPA, SETTING_DISPLAY_SCREEN_BUTTON_BG_OPA, UIButton::RELEASED);\r
+    button_->SetStyleForState(STYLE_BACKGROUND_OPA, SETTING_DISPLAY_SCREEN_BUTTON_BG_OPA, UIButton::PRESSED);\r
+    button_->SetStyleForState(STYLE_IMAGE_OPA, OPA_OPAQUE, UIButton::RELEASED);\r
+    button_->SetStyleForState(STYLE_IMAGE_OPA, OPA_OPAQUE, UIButton::PRESSED);\r
+    button_->SetViewId(SETTING_DISPLAY_SCREEN_BUTTON_ID);\r
+    button_->SetOnClickListener(this);\r
+\r
+    AddViewToPageContainer(title_);\r
+    AddViewToPageContainer(picker_);\r
+    AddViewToPageContainer(button_);\r
+}\r
+\r
+void SettingDisplayScreenOffPage::OnResume()\r
+{\r
+    const char** data = SettingDisplayModel::GetInstance().GetScreenOffTimeAllStr();\r
+    uint8_t size = SettingDisplayModel::GetInstance().GetScreenOffTimeAllStrSize();\r
+    uint8_t selectIndex = SettingDisplayModel::GetInstance().GetScreenOffTimeIndex();\r
+    picker_->SetValues(data, size);\r
+    picker_->SetSelected(selectIndex);\r
+}\r
+\r
+void SettingDisplayScreenOffPage::OnStop()\r
+{\r
+    if (title_ != nullptr) {\r
+        delete title_;\r
+        title_ = nullptr;\r
+    }\r
+    if (picker_ != nullptr) {\r
+        delete picker_;\r
+        picker_ = nullptr;\r
+    }\r
+    if (button_ != nullptr) {\r
+        delete button_;\r
+        button_ = nullptr;\r
+    }\r
+    ImageCacheManager::GetInstance().UnloadOneInMultiRes(IMAGE_DISPLAY_OK, SETTING_IMAGE);\r
+}\r
+\r
+bool SettingDisplayScreenOffPage::OnClick(UIView &view, const ClickEvent &event)\r
+{\r
+    if (strcmp(view.GetViewId(), SETTING_DISPLAY_SCREEN_BUTTON_ID) == 0) {\r
+        uint8_t index = picker_->GetSelected();\r
+        SettingDisplayModel::GetInstance().SetScreenOffTimeIndex(index);\r
+        NativeAbility::GetInstance().BackToPrevSlicePage();\r
+    }\r
+    return true;\r
+}\r
+}\r
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/settings/src/page/SettingDisplaySteadyOnPage.cpp b/code/sdk/application/wearable/evb/nativeapp/nativeui/settings/src/page/SettingDisplaySteadyOnPage.cpp
new file mode 100644 (file)
index 0000000..f1ea1ea
--- /dev/null
@@ -0,0 +1,123 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SettingDisplaySteadyOnPage\r
+ * Create: 2025-06-01\r
+ */\r
+#include "SlicePageFactory.h"\r
+#include "PageTransitionMgr.h"\r
+#include "NativeAbility.h"\r
+#include "settings/model/SettingDisplayModel.h"\r
+#include "settings/page/SettingDisplaySteadyOnPage.h"\r
+\r
+namespace OHOS {\r
+REGIST_SLICE_PAGE(VIEW_SETTING, SettingPageId::DISPLAY_STEADY_ON_PAGE,\r
+    SettingDisplaySteadyOnPage, false);\r
+\r
+static constexpr int16_t SETTING_DISPLAY_STEADY_TITLE_X = 100;\r
+static constexpr int16_t SETTING_DISPLAY_STEADY_TITLE_Y = 39;\r
+static constexpr int16_t SETTING_DISPLAY_STEADY_TITLE_WIDTH = 254;\r
+static constexpr int16_t SETTING_DISPLAY_STEADY_TITLE_HEIGHT = 53;\r
+static constexpr int16_t SETTING_DISPLAY_STEADY_TITLE_FSIZE = 38;\r
+static const char* SETTING_DISPLAY_STEADY_TITLE_TEXT = "长亮时刻";\r
+\r
+static constexpr int16_t SETTING_DISPLAY_STEADY_PICKER_X = 64;\r
+static constexpr int16_t SETTING_DISPLAY_STEADY_PICKER_Y = 118;\r
+static constexpr int16_t SETTING_DISPLAY_STEADY_PICKER_WIDTH = 321;\r
+static constexpr int16_t SETTING_DISPLAY_STEADY_PICKER_HEIGHT = 218;\r
+static constexpr int16_t SETTING_DISPLAY_STEADY_PICKER_FSIZE = 44;\r
+static constexpr int16_t SETTING_DISPLAY_STEADY_PICKER_ITEM_HEIGHT = 84;\r
+\r
+static constexpr int16_t SETTING_DISPLAY_STEADY_BUTTON_X = 63;\r
+static constexpr int16_t SETTING_DISPLAY_STEADY_BUTTON_Y = 358;\r
+static constexpr int16_t SETTING_DISPLAY_STEADY_BUTTON_WIDTH = 328;\r
+static constexpr int16_t SETTING_DISPLAY_STEADY_BUTTON_HEIGHT = 94;\r
+static constexpr int16_t SETTING_DISPLAY_STEADY_BUTTON_BG_OPA = 51;\r
+static const char* SETTING_DISPLAY_STEADY_BUTTON_ID = "button";\r
+\r
+void SettingDisplaySteadyOnPage::OnStart(void* data)\r
+{\r
+    title_ = new UILabel();\r
+    if (title_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SettingDisplaySteadyOnTimePage::OnStart title_ new fail");\r
+        return;\r
+    }\r
+    title_->SetPosition(SETTING_DISPLAY_STEADY_TITLE_X, SETTING_DISPLAY_STEADY_TITLE_Y);\r
+    title_->Resize(SETTING_DISPLAY_STEADY_TITLE_WIDTH, SETTING_DISPLAY_STEADY_TITLE_HEIGHT);\r
+    title_->SetFont(BOLD_VECTOR_FONT_FILENAME, SETTING_DISPLAY_STEADY_TITLE_FSIZE);\r
+    title_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+    title_->SetTextColor(Color::White());\r
+    title_->SetText(SETTING_DISPLAY_STEADY_TITLE_TEXT);\r
+\r
+    picker_ = new UIPicker();\r
+    if (picker_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SettingDisplaySteadyOnTimePage::OnStart picker_ new fail");\r
+        return;\r
+    }\r
+    picker_->SetPosition(SETTING_DISPLAY_STEADY_PICKER_X, SETTING_DISPLAY_STEADY_PICKER_Y);\r
+    picker_->Resize(SETTING_DISPLAY_STEADY_PICKER_WIDTH, SETTING_DISPLAY_STEADY_PICKER_HEIGHT);\r
+    picker_->SetStyle(STYLE_BACKGROUND_OPA, OPA_OPAQUE);\r
+    picker_->SetBackgroundFont(DEFAULT_VECTOR_FONT_FILENAME, SETTING_DISPLAY_STEADY_PICKER_FSIZE);\r
+    picker_->SetHighlightFont(DEFAULT_VECTOR_FONT_FILENAME, SETTING_DISPLAY_STEADY_PICKER_FSIZE);\r
+    picker_->SetItemHeight(SETTING_DISPLAY_STEADY_PICKER_ITEM_HEIGHT);\r
+    picker_->SetTextColor(SETTING_LIST_DEFAULT_BG_COLOR, Color::White());\r
+    picker_->SetIntercept(true);\r
+\r
+    button_ = new UIButton();\r
+    if (button_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SettingDisplaySteadyOnTimePage::OnStart button_ new fail");\r
+        return;\r
+    }\r
+    button_->SetPosition(SETTING_DISPLAY_STEADY_BUTTON_X, SETTING_DISPLAY_STEADY_BUTTON_Y);\r
+    button_->Resize(SETTING_DISPLAY_STEADY_BUTTON_WIDTH, SETTING_DISPLAY_STEADY_BUTTON_HEIGHT);\r
+    ImageInfo* image = ImageCacheManager::GetInstance().LoadOneInMultiRes(IMAGE_DISPLAY_OK, SETTING_IMAGE);\r
+    button_->SetImageSrc(image, image);\r
+    button_->SetStyleForState(STYLE_BACKGROUND_COLOR, Color::Black().full, UIButton::RELEASED);\r
+    button_->SetStyleForState(STYLE_BACKGROUND_COLOR, Color::Black().full, UIButton::PRESSED);\r
+    button_->SetStyleForState(STYLE_BACKGROUND_OPA, SETTING_DISPLAY_STEADY_BUTTON_BG_OPA, UIButton::RELEASED);\r
+    button_->SetStyleForState(STYLE_BACKGROUND_OPA, SETTING_DISPLAY_STEADY_BUTTON_BG_OPA, UIButton::PRESSED);\r
+    button_->SetStyleForState(STYLE_IMAGE_OPA, OPA_OPAQUE, UIButton::RELEASED);\r
+    button_->SetStyleForState(STYLE_IMAGE_OPA, OPA_OPAQUE, UIButton::PRESSED);\r
+    button_->SetViewId(SETTING_DISPLAY_STEADY_BUTTON_ID);\r
+    button_->SetOnClickListener(this);\r
+\r
+    AddViewToPageContainer(title_);\r
+    AddViewToPageContainer(picker_);\r
+    AddViewToPageContainer(button_);\r
+}\r
+\r
+void SettingDisplaySteadyOnPage::OnResume()\r
+{\r
+    const char** data = SettingDisplayModel::GetInstance().GetSteadyOnTimeAllStr();\r
+    uint8_t size = SettingDisplayModel::GetInstance().GetSteadyOnTimeAllStrSize();\r
+    uint8_t selectIndex = SettingDisplayModel::GetInstance().GetSteadyOnTimeIndex();\r
+    picker_->SetValues(data, size);\r
+    picker_->SetSelected(selectIndex);\r
+}\r
+\r
+void SettingDisplaySteadyOnPage::OnStop()\r
+{\r
+    if (title_ != nullptr) {\r
+        delete title_;\r
+        title_ = nullptr;\r
+    }\r
+    if (picker_ != nullptr) {\r
+        delete picker_;\r
+        picker_ = nullptr;\r
+    }\r
+    if (button_ != nullptr) {\r
+        delete button_;\r
+        button_ = nullptr;\r
+    }\r
+    ImageCacheManager::GetInstance().UnloadOneInMultiRes(IMAGE_DISPLAY_OK, SETTING_IMAGE);\r
+}\r
+\r
+bool SettingDisplaySteadyOnPage::OnClick(UIView &view, const ClickEvent &event)\r
+{\r
+    if (strcmp(view.GetViewId(), SETTING_DISPLAY_STEADY_BUTTON_ID) == 0) {\r
+        uint8_t index = picker_->GetSelected();\r
+        SettingDisplayModel::GetInstance().SetSteadyOnTimeIndex(index);\r
+        NativeAbility::GetInstance().BackToPrevSlicePage();\r
+    }\r
+    return true;\r
+}\r
+}\r
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/settings/src/page/SettingMainPage.cpp b/code/sdk/application/wearable/evb/nativeapp/nativeui/settings/src/page/SettingMainPage.cpp
new file mode 100644 (file)
index 0000000..75c301e
--- /dev/null
@@ -0,0 +1,146 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SettingMainPage\r
+ * Create: 2025-06-01\r
+ */\r
+#include "components/ui_list_nested.h"\r
+#include "components/ui_scroll_view_nested.h"\r
+#include "SlicePageFactory.h"\r
+#include "PageTransitionMgr.h"\r
+#include "NativeAbility.h"\r
+#include "settings/common/SettingCommon.h"\r
+#include "settings/model/SettingMainModel.h"\r
+#include "settings/model/SettingDesktopModel.h"\r
+#include "settings/page/SettingMainPage.h"\r
+\r
+namespace OHOS {\r
+REGIST_SLICE_PAGE(VIEW_SETTING, SettingPageId::MAIN_PAGE, SettingMainPage, true);\r
+\r
+static constexpr int16_t SETTING_LIST_POSITION_X = 14;\r
+static constexpr int16_t SETTING_LIST_WIDTH = 426;\r
+static constexpr int16_t SETTING_SCROLLBLANKSIZE = 96;\r
+static constexpr int16 MAX_SCR_DIS = 1000;\r
+static constexpr int16 SNUM_2 = 2;\r
+static SettingMainPage *g_pSettingMainPage = nullptr;\r
+\r
+void SettingMainPage::OnStart(void *data)\r
+{\r
+    g_pSettingMainPage = this;\r
+    simpleList_ = new UISimpleList();\r
+    if (simpleList_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SettingMainPage::OnStart simpleList_ new fail");\r
+        return;\r
+    }\r
+    simpleList_->SetPosition(SETTING_LIST_POSITION_X, 0, SETTING_LIST_WIDTH, HORIZONTAL_RESOLUTION);\r
+    simpleList_->SetScrollBlankSize(SETTING_SCROLLBLANKSIZE, UIAbstractScroll::Direction::BOTTOM);\r
+    simpleList_->SetSelectPosition(HORIZONTAL_RESOLUTION / SNUM_2);\r
+    simpleList_->SetTouchable(true);\r
+    simpleList_->SetDraggable(true);\r
+    simpleList_->SetThrowDrag(true);\r
+    simpleList_->SetMaxScrollDistance(MAX_SCR_DIS);\r
+    scrollView_ = new UIScrollViewNested();\r
+    if (scrollView_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SettingMainPage::OnStart scrollView_ new fail");\r
+        return;\r
+    }\r
+    scrollView_->Resize(HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);\r
+    scrollView_->SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
+    scrollView_->SetStyle(STYLE_BACKGROUND_OPA, UN_OPACITY);\r
+    scrollView_->SetThrowDrag(true);\r
+    scrollView_->Add(simpleList_);\r
+    AddViewToPageContainer(scrollView_);\r
+    if (PageTransitionMgr::GetInstance().GetTopSlideBackImage() == nullptr) { // 滑动跟手返回\r
+        scrollView_->SetOnDragListener(this);\r
+    }\r
+}\r
+\r
+void SettingMainPage::OnResume()\r
+{\r
+    simpleList_->ClearAll();\r
+    for(auto& it : SettingMainModel::GetInstance().GetMainUnionData()) {\r
+        Contents cont;\r
+        cont.createFunc = SettingMainModel::OnSimpleListCreate;\r
+        cont.updateFunc = SettingMainPage::OnSimpleListUpdate;\r
+        cont.type = it.GetUnionItemType();\r
+        cont.data = &it;\r
+        simpleList_->AddContent(cont);\r
+    }\r
+    simpleList_->RefreshList();\r
+}\r
+\r
+void SettingMainPage::OnStop()\r
+{\r
+    g_pSettingMainPage = this;\r
+    if (scrollView_ != nullptr) {\r
+        scrollView_->RemoveAll();\r
+        delete scrollView_;\r
+        scrollView_ = nullptr;\r
+    }\r
+    if (simpleList_ != nullptr) {\r
+        delete simpleList_;\r
+        simpleList_ = nullptr;\r
+    }\r
+}\r
+\r
+bool SettingMainPage::OnDrag(UIView &view, const DragEvent &event)\r
+{\r
+    UNUSED(view);\r
+    if ((event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT) &&\r
+        (event.GetDeltaX() > X_DRAG_OFFSET) && (event.GetDeltaX() > (DOUBLES * MATH_ABS(event.GetDeltaY())))) {\r
+        NativeAbility::GetInstance().ChangeSliceToApplist();\r
+    }\r
+    return false;\r
+}\r
+\r
+bool SettingMainPage::OnClick(UIView& view, const ClickEvent& event)\r
+{\r
+    uintptr_t simpleListViewId = (uintptr_t)view.GetViewId();\r
+    if (simpleListViewId == (uintptr_t)ICON_TEXT_NAVIGATION) {\r
+        int16_t viewIndex = view.GetViewIndex();\r
+        auto& mainUnionData = SettingMainModel::GetInstance().GetMainUnionData();\r
+        if (viewIndex < 0 || viewIndex > mainUnionData.size()) {\r
+            return true;\r
+        }\r
+\r
+        SettingUnionItemData& itemData = mainUnionData[viewIndex];\r
+        if (itemData.GetUnionItemType() == ICON_TEXT_NAVIGATION) {\r
+            IconTextNavigationItemData* data = static_cast<IconTextNavigationItemData*>(itemData.GetUnionItemData());\r
+            NativeAbility::GetInstance().SwitchPageInSlice(data->pageId,\r
+                TransitionType::TRANSITION_INVALID, true);\r
+        }\r
+    }\r
+    return true;\r
+}\r
+\r
+void SettingMainPage::OnSimpleListUpdate(UIView* view, void* data, uint8_t type)\r
+{\r
+    if (view == nullptr || data == nullptr) {\r
+        return;\r
+    }\r
+    if (type == SettingUnionItemType::PLAIN_TEXT) {\r
+        PlainTextItemView *itemGroup = dynamic_cast<PlainTextItemView*>(view);\r
+        if (itemGroup == nullptr) {\r
+            return;\r
+        }\r
+        PlainTextItemData* itemData = static_cast<PlainTextItemData*>(data);\r
+        itemGroup->UpdateViewData(itemData);\r
+    } else if(type == SettingUnionItemType::ICON_TEXT_TOGGLE) {\r
+        IconTextToggleItemView *itemGroup = dynamic_cast<IconTextToggleItemView*>(view);\r
+        if (itemGroup == nullptr) {\r
+            return;\r
+        }\r
+        IconTextToggleItemData* itemData = static_cast<IconTextToggleItemData*>(data);\r
+        itemGroup->UpdateViewData(itemData);\r
+        itemGroup->SetOnClickListener(g_pSettingMainPage);\r
+    }  else if(type == SettingUnionItemType::ICON_TEXT_NAVIGATION) {\r
+        IconTextNavigationItemView *itemGroup = dynamic_cast<IconTextNavigationItemView*>(view);\r
+        if (itemGroup == nullptr) {\r
+            return;\r
+        }\r
+        IconTextNavigationItemData* itemData = static_cast<IconTextNavigationItemData*>(data);\r
+        itemGroup->UpdateViewData(itemData);\r
+        itemGroup->SetOnClickListener(g_pSettingMainPage);\r
+    }\r
+    return;\r
+}\r
+}
\ No newline at end of file
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/settings/src/page/SettingPowerPage.cpp b/code/sdk/application/wearable/evb/nativeapp/nativeui/settings/src/page/SettingPowerPage.cpp
new file mode 100644 (file)
index 0000000..9931d7d
--- /dev/null
@@ -0,0 +1,289 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SettingPowerPage\r
+ * Create: 2025-06-01\r
+ */\r
+#include <sys/time.h>\r
+#ifdef BUILD_IN_LINUX\r
+#include "localtime.h"\r
+#endif\r
+#include "common/screen.h"\r
+#include "components/ui_scroll_view_nested.h"\r
+#include "SlicePageFactory.h"\r
+#include "PageTransitionMgr.h"\r
+#include "NativeAbility.h"\r
+#include "settings/common/SettingCommon.h"\r
+#include "settings/model/SettingPowerModel.h"\r
+#include "settings/page/SettingPowerPage.h"\r
+\r
+namespace OHOS {\r
+REGIST_SLICE_PAGE(VIEW_SETTING, SettingPageId::POWER_PAGE, SettingPowerPage, false);\r
+\r
+#define SETTING_POWER_LEVEL_ARRAY_SIZE 10\r
+#define SETTING_VIEW_TEXT_SIZE 16\r
+static constexpr int16_t SETTING_POWER_SCROLL_BLANK = 60;\r
+static constexpr int16_t SETTING_POWER_TITLE_X = 100;\r
+static constexpr int16_t SETTING_POWER_TITLE_Y = 39;\r
+static constexpr int16_t SETTING_POWER_TITLE_WIDTH = 254;\r
+static constexpr int16_t SETTING_POWER_TITLE_HEIGHT = 53;\r
+static constexpr int16_t SETTING_POWER_TITLE_FSIZE = 38;\r
+static const char* SETTING_POWER_TITLE_TEXT = "电量";\r
+\r
+static constexpr int16_t SETTING_POWER_POWERDESC_X = 76;\r
+static constexpr int16_t SETTING_POWER_POWERDESC_Y = 113;\r
+static constexpr int16_t SETTING_POWER_POWERDESC_WIDTH = 193;\r
+static constexpr int16_t SETTING_POWER_POWERDESC_HEIGHT = 55;\r
+static constexpr int16_t SETTING_POWER_POWERDESC_FSIZE = 48;\r
+static const char* SETTING_POWER_POWERDESC_TEXT = "当前电量";\r
+\r
+static constexpr int16_t SETTING_POWER_BATTERYPERCENTAGE_X = 286;\r
+static constexpr int16_t SETTING_POWER_BATTERYPERCENTAGE_Y = 113;\r
+static constexpr int16_t SETTING_POWER_BATTERYPERCENTAGE_WIDTH = 122;\r
+static constexpr int16_t SETTING_POWER_BATTERYPERCENTAGE_HEIGHT = 55;\r
+static constexpr int16_t SETTING_POWER_BATTERYPERCENTAGE_FSIZE = 48;\r
+#define SETTING_POWER_BATTERYPERCENTAGE_COLOR Color::GetColorFromRGB(9, 148, 69)\r
+\r
+static constexpr int16_t SETTING_POWER_TIME_X = 145;\r
+static constexpr int16_t SETTING_POWER_TIME_Y = 172;\r
+static constexpr int16_t SETTING_POWER_TIME_WIDTH = 165;\r
+static constexpr int16_t SETTING_POWER_TIME_HEIGHT = 55;\r
+static constexpr int16_t SETTING_POWER_TIME_FSIZE = 36;\r
+\r
+static constexpr int16_t SETTING_POWER_GROUP_X = 20;\r
+static constexpr int16_t SETTING_POWER_GROUP_Y = 234;\r
+static constexpr int16_t SETTING_POWER_GROUP_WIDTH = 414;\r
+static constexpr int16_t SETTING_POWER_GROUP_HEIGHT = 91;\r
+static constexpr int16_t SETTING_POWER_GROUP_RADIUS = 48;\r
+\r
+static constexpr int16_t SETTING_POWER_GROUP_BATTERY_X = 34;\r
+static constexpr int16_t SETTING_POWER_GROUP_BATTERY_Y = 29;\r
+static constexpr int16_t SETTING_POWER_GROUP_BATTERY_WIDTH = 128;\r
+static constexpr int16_t SETTING_POWER_GROUP_BATTERY_HEIGHT = 38;\r
+static constexpr int16_t SETTING_POWER_GROUP_BATTERY_FSIZE = 32;\r
+static const char* SETTING_POWER_GROUP_BATTERY_TEXT = "电池健康";\r
+\r
+static constexpr int16_t SETTING_POWER_GROUP_BATTERY_LEVEL_X = 295;\r
+static constexpr int16_t SETTING_POWER_GROUP_BATTERY_LEVEL_Y = 29;\r
+static constexpr int16_t SETTING_POWER_GROUP_BATTERY_LEVEL_WIDTH = 84;\r
+static constexpr int16_t SETTING_POWER_GROUP_BATTERY_LEVEL_HEIGHT = 38;\r
+static constexpr int16_t SETTING_POWER_GROUP_BATTERY_LEVEL_FSIZE = 32;\r
+\r
+static constexpr int16_t SETTING_POWER_DETAILSDESC_X = 59;\r
+static constexpr int16_t SETTING_POWER_DETAILSDESC_Y = 365;\r
+static constexpr int16_t SETTING_POWER_DETAILSDESC_WIDTH = 336;\r
+static constexpr int16_t SETTING_POWER_DETAILSDESC_LINE_HEIGHT = 36;\r
+static constexpr int16_t SETTING_POWER_DETAILSDESC_FSIZE = 24;\r
+\r
+void SettingPowerPage::OnStart(void* data)\r
+{\r
+    scrollView_ = new UIScrollViewNested();\r
+    if (scrollView_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SettingPowerPage::OnStart scrollView_ new fail");\r
+        return;\r
+    }\r
+    scrollView_->SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);\r
+    scrollView_->SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
+    scrollView_->SetStyle(STYLE_BACKGROUND_OPA, UN_OPACITY);\r
+    scrollView_->SetScrollBlankSize(SETTING_POWER_SCROLL_BLANK, UIAbstractScroll::Direction::BOTTOM);\r
+    scrollView_->SetThrowDrag(true);\r
+    scrollView_->SetIntercept(true);\r
+    InitPowerView();\r
+    InitBatteryStatusView();\r
+    InitNotify();\r
+    batteryStatusGroup_->Add(batteryLabel_);\r
+    batteryStatusGroup_->Add(batteryLevel_);\r
+    scrollView_->Add(title_);\r
+    scrollView_->Add(powerDesc_);\r
+    scrollView_->Add(batteryPercentage_);\r
+    scrollView_->Add(timeLabel_);\r
+    scrollView_->Add(batteryStatusGroup_);\r
+    scrollView_->Add(detailsDesc_);\r
+    AddViewToPageContainer(scrollView_);\r
+}\r
+\r
+void SettingPowerPage::OnResume()\r
+{\r
+    char tempBuffer[SETTING_POWER_LEVEL_ARRAY_SIZE] = "";\r
+    if (sprintf_s(tempBuffer, sizeof(tempBuffer), "%u%%",\r
+        SettingPowerModel::GetInstance().GetBatteryPowerLevel()) > 0) {\r
+        batteryPercentage_->SetText(tempBuffer);\r
+        batteryLevel_->SetText(tempBuffer);\r
+    }\r
+    detailsDesc_->SetText(SettingPowerModel::GetInstance().GetPowerModelNotify());\r
+    timeAnimator_->Start();\r
+}\r
+\r
+void SettingPowerPage::OnPause()\r
+{\r
+    timeAnimator_->Stop();\r
+}\r
+\r
+void SettingPowerPage::OnStop()\r
+{\r
+    if (scrollView_ != nullptr) {\r
+        scrollView_->RemoveAll();\r
+        delete scrollView_;\r
+        scrollView_ = nullptr;\r
+    }\r
+    if (batteryStatusGroup_ != nullptr) {\r
+        batteryStatusGroup_->RemoveAll();\r
+        delete batteryStatusGroup_;\r
+        batteryStatusGroup_ = nullptr;\r
+    }\r
+    if (title_ != nullptr) {\r
+        delete title_;\r
+        title_ = nullptr;\r
+    }\r
+    if (powerDesc_ != nullptr) {\r
+        delete powerDesc_;\r
+        powerDesc_ = nullptr;\r
+    }\r
+    if (batteryPercentage_ != nullptr) {\r
+        delete batteryPercentage_;\r
+        batteryPercentage_ = nullptr;\r
+    }\r
+    if (timeLabel_ != nullptr) {\r
+        delete timeLabel_;\r
+        timeLabel_ = nullptr;\r
+    }\r
+    if (batteryLabel_ != nullptr) {\r
+        delete batteryLabel_;\r
+        batteryLabel_ = nullptr;\r
+    }\r
+    if (batteryLevel_ != nullptr) {\r
+        delete batteryLevel_;\r
+        batteryLevel_ = nullptr;\r
+    }\r
+    if (detailsDesc_ != nullptr) {\r
+        delete detailsDesc_;\r
+        detailsDesc_ = nullptr;\r
+    }\r
+    if (timeAnimator_ != nullptr) {\r
+        delete timeAnimator_;\r
+        timeAnimator_ = nullptr;\r
+    }\r
+}\r
+\r
+void SettingPowerPage::Callback(UIView* view)\r
+{\r
+    char temp[SETTING_VIEW_TEXT_SIZE];\r
+    time_t seconds = time(nullptr);\r
+    struct tm tm_data;\r
+#if !defined(_WIN32)\r
+    localtime_r(&seconds, &tm_data);\r
+#else\r
+    localtime_s(&tm_data, &seconds);\r
+#endif\r
+    if (sprintf_s(temp, sizeof(temp), "今天%02d:%02d", tm_data.tm_hour, tm_data.tm_min) > 0) {\r
+        ((UILabel*)view)->SetText(temp);\r
+    }\r
+}\r
+\r
+void SettingPowerPage::InitPowerView()\r
+{\r
+    title_ = new UILabel();\r
+    if (title_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SettingPowerPage::InitPowerView title_ new fail");\r
+        return;\r
+    }\r
+    title_->SetPosition(SETTING_POWER_TITLE_X, SETTING_POWER_TITLE_Y);\r
+    title_->Resize(SETTING_POWER_TITLE_WIDTH, SETTING_POWER_TITLE_HEIGHT);\r
+    title_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+    title_->SetFont(BOLD_VECTOR_FONT_FILENAME, SETTING_POWER_TITLE_FSIZE);\r
+    title_->SetStyle(STYLE_TEXT_COLOR, Color::White().full);\r
+    title_->SetText(SETTING_POWER_TITLE_TEXT);\r
+\r
+    powerDesc_  = new UILabel();\r
+    if (powerDesc_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SettingPowerPage::InitPowerView powerDesc_ new fail");\r
+        return;\r
+    }\r
+    powerDesc_->SetPosition(SETTING_POWER_POWERDESC_X, SETTING_POWER_POWERDESC_Y);\r
+    powerDesc_->Resize(SETTING_POWER_POWERDESC_WIDTH, SETTING_POWER_POWERDESC_HEIGHT);\r
+    powerDesc_->SetAlign(TEXT_ALIGNMENT_RIGHT, TEXT_ALIGNMENT_CENTER);\r
+    powerDesc_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SETTING_POWER_POWERDESC_FSIZE);\r
+    powerDesc_->SetStyle(STYLE_TEXT_COLOR, Color::White().full);\r
+    powerDesc_->SetText(SETTING_POWER_POWERDESC_TEXT);\r
+\r
+    batteryPercentage_ = new UILabel();\r
+    if (batteryPercentage_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SettingPowerPage::InitPowerView batteryPercentage_ new fail");\r
+        return;\r
+    }\r
+    batteryPercentage_->SetPosition(SETTING_POWER_BATTERYPERCENTAGE_X, SETTING_POWER_BATTERYPERCENTAGE_Y);\r
+    batteryPercentage_->Resize(SETTING_POWER_BATTERYPERCENTAGE_WIDTH, SETTING_POWER_BATTERYPERCENTAGE_HEIGHT);\r
+    batteryPercentage_->SetAlign(TEXT_ALIGNMENT_LEFT, TEXT_ALIGNMENT_CENTER);\r
+    batteryPercentage_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SETTING_POWER_BATTERYPERCENTAGE_FSIZE);\r
+    batteryPercentage_->SetStyle(STYLE_TEXT_COLOR, SETTING_POWER_BATTERYPERCENTAGE_COLOR.full);\r
+\r
+    timeLabel_ = new UILabel();\r
+    if (timeLabel_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SettingPowerPage::InitPowerView timeLabel_ new fail");\r
+        return;\r
+    }\r
+    timeLabel_->SetPosition(SETTING_POWER_TIME_X, SETTING_POWER_TIME_Y);\r
+    timeLabel_->Resize(SETTING_POWER_TIME_WIDTH, SETTING_POWER_TIME_HEIGHT);\r
+    timeLabel_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+    timeLabel_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SETTING_POWER_TIME_FSIZE);\r
+    timeLabel_->SetStyle(STYLE_TEXT_COLOR, Color::Gray().full);\r
+}\r
+\r
+void SettingPowerPage::InitBatteryStatusView()\r
+{\r
+    batteryStatusGroup_ = new UIViewGroup();\r
+    if (batteryStatusGroup_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SettingPowerPage::InitBatteryStatusView batteryStatusGroup_ new fail");\r
+        return;\r
+    }\r
+    batteryStatusGroup_->SetPosition(SETTING_POWER_GROUP_X, SETTING_POWER_GROUP_Y);\r
+    batteryStatusGroup_->Resize(SETTING_POWER_GROUP_WIDTH, SETTING_POWER_GROUP_HEIGHT);\r
+    batteryStatusGroup_->SetStyle(STYLE_BACKGROUND_COLOR, SETTING_LIST_DEFAULT_BG_COLOR.full);\r
+    batteryStatusGroup_->SetStyle(STYLE_BACKGROUND_OPA, UN_OPACITY);\r
+    batteryStatusGroup_->SetStyle(STYLE_BORDER_RADIUS, SETTING_POWER_GROUP_RADIUS);\r
+\r
+    batteryLabel_ = new UILabel();\r
+    if (batteryLabel_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SettingPowerPage::InitBatteryStatusView batteryLabel_ new fail");\r
+        return;\r
+    }\r
+    batteryLabel_->SetPosition(SETTING_POWER_GROUP_BATTERY_X, SETTING_POWER_GROUP_BATTERY_Y);\r
+    batteryLabel_->Resize(SETTING_POWER_GROUP_BATTERY_WIDTH, SETTING_POWER_GROUP_BATTERY_HEIGHT);\r
+    batteryLabel_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+    batteryLabel_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SETTING_POWER_GROUP_BATTERY_FSIZE);\r
+    batteryLabel_->SetStyle(STYLE_TEXT_COLOR, Color::White().full);\r
+    batteryLabel_->SetText(SETTING_POWER_GROUP_BATTERY_TEXT);\r
+\r
+    batteryLevel_ = new UILabel();\r
+    if (batteryLevel_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SettingPowerPage::InitBatteryStatusView batteryLevel_ new fail");\r
+        return;\r
+    }\r
+    batteryLevel_->SetPosition(SETTING_POWER_GROUP_BATTERY_LEVEL_X, SETTING_POWER_GROUP_BATTERY_LEVEL_Y);\r
+    batteryLevel_->Resize(SETTING_POWER_GROUP_BATTERY_LEVEL_WIDTH, SETTING_POWER_GROUP_BATTERY_LEVEL_HEIGHT);\r
+    batteryLevel_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+    batteryLevel_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SETTING_POWER_GROUP_BATTERY_LEVEL_FSIZE);\r
+    batteryLevel_->SetStyle(STYLE_TEXT_COLOR, Color::White().full);\r
+}\r
+\r
+void SettingPowerPage::InitNotify()\r
+{\r
+    detailsDesc_ = new UILabel();\r
+    if (detailsDesc_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SettingPowerPage::OnStart::batteryPercentage_ new fail");\r
+        return;\r
+    }\r
+    detailsDesc_->SetPosition(SETTING_POWER_DETAILSDESC_X, SETTING_POWER_DETAILSDESC_Y);\r
+    detailsDesc_->Resize(SETTING_POWER_DETAILSDESC_WIDTH, SETTING_POWER_DETAILSDESC_LINE_HEIGHT);\r
+    detailsDesc_->SetLineBreakMode(UILabel::LINE_BREAK_WRAP);\r
+    detailsDesc_->SetAlign(TEXT_ALIGNMENT_LEFT, TEXT_ALIGNMENT_CENTER);\r
+    detailsDesc_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SETTING_POWER_DETAILSDESC_FSIZE);\r
+    detailsDesc_->SetStyle(STYLE_LINE_HEIGHT, SETTING_POWER_DETAILSDESC_LINE_HEIGHT);\r
+    detailsDesc_->SetStyle(STYLE_TEXT_COLOR, Color::White().full);\r
+\r
+    timeAnimator_ = new Animator(this, timeLabel_, 0, true);\r
+    if (timeAnimator_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SettingPowerPage::OnStart::timeAnimator_ new fail");\r
+        return;\r
+    }\r
+}\r
+};
\ No newline at end of file
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/settings/src/page/SettingQrcodeConnPage.cpp b/code/sdk/application/wearable/evb/nativeapp/nativeui/settings/src/page/SettingQrcodeConnPage.cpp
new file mode 100644 (file)
index 0000000..62f52fd
--- /dev/null
@@ -0,0 +1,90 @@
+/*
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.
+ * Description: SettingQrcodeConnPage
+ * Created: 2025-06-05
+ */
+
+#include "wearable_log.h"
+#include "SlicePageFactory.h"
+#include "settings/model/SettingBluetoothModel.h"
+#include "settings/common/SettingCommon.h"
+#include "settings/model/SettingQrcodeConnModel.h"
+#include "settings/page/SettingQrcodeConnPage.h"
+
+namespace OHOS {
+REGIST_SLICE_PAGE(VIEW_SETTING, SettingPageId::QRCODE_CONN_PAGE, SettingQrcodeConnPage, false);
+static const uint32_t QRCODE_POS_X = 101;
+static const uint32_t QRCODE_POS_Y = 85;
+static const uint32_t QRCODE_WIDTH = 232;
+static const uint32_t QRCODE_HEIGHT = 232;
+static const uint32_t PAD_SIZE = 10;
+static const uint32_t QRCODE_CONTENT_POS_Y = 350;
+static const uint32_t QRCODE_CONTENT_HEIGHT = 50;
+static const uint32_t QRCODE_CONTENT_FONT = 36;
+
+SettingQrcodeConnPage::SettingQrcodeConnPage()
+{
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SettingQrcodeConnPage::SettingQrcodeConnPage");
+}
+
+SettingQrcodeConnPage::~SettingQrcodeConnPage()
+{
+    if (group_ != nullptr) {
+        group_->RemoveAll();
+        delete group_;
+        group_ = nullptr;
+    }
+    if (qrcode_ != nullptr) {
+        delete qrcode_;
+        qrcode_ = nullptr;
+    }
+    if (content_ != nullptr) {
+        delete content_;
+        content_ = nullptr;
+    }
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SettingQrcodeConnPage::~SettingQrcodeConnPage");
+}
+
+void SettingQrcodeConnPage::InitView()
+{
+    group_ = new UIScrollViewNested();
+    if (group_ == nullptr) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SettingQrcodeConnPage::InitView::group_ new fail");
+        return;
+    }
+    group_->SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);
+    group_->SetStyle(STYLE_BACKGROUND_OPA, 0);
+
+    qrcode_ = new UIQrcode();
+    if (qrcode_ == nullptr) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SettingQrcodeConnPage::InitView::qrcode_ new fail");
+        return;
+    }
+    qrcode_->SetPosition(QRCODE_POS_X, QRCODE_POS_Y, QRCODE_WIDTH, QRCODE_HEIGHT);
+    qrcode_->SetQrcodeInfo(SettingBluetoothModel::GetInstance()->GetWatchName());
+    qrcode_->SetStyle(STYLE_PADDING_LEFT, PAD_SIZE);
+    qrcode_->SetStyle(STYLE_PADDING_RIGHT, PAD_SIZE);
+    qrcode_->SetStyle(STYLE_PADDING_TOP, PAD_SIZE);
+    qrcode_->SetStyle(STYLE_PADDING_BOTTOM, PAD_SIZE);
+    group_->Add(qrcode_);
+
+    content_ = new UILabel();
+    if (content_ == nullptr) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SettingQrcodeConnPage::InitView::content_ new fail");
+        return;
+    }
+    content_->SetPosition(0, QRCODE_CONTENT_POS_Y, RESOLUTION_WIDTH, QRCODE_CONTENT_HEIGHT);
+    content_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);
+    content_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, QRCODE_CONTENT_FONT);
+    content_->SetStyle(STYLE_TEXT_COLOR, Color::White().full);
+    content_->SetText("扫码连接设备");
+    group_->Add(content_);
+    AddViewToPageContainer(group_);
+}
+
+void SettingQrcodeConnPage::OnStart(void *data)
+{
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SettingQrcodeConnPage::OnStart");
+    InitView();
+}
+}
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/settings/src/page/SettingReconnectSecondConfirm.cpp b/code/sdk/application/wearable/evb/nativeapp/nativeui/settings/src/page/SettingReconnectSecondConfirm.cpp
new file mode 100644 (file)
index 0000000..f698a69
--- /dev/null
@@ -0,0 +1,259 @@
+/*
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.
+ * Description: SettingReconnectSecondConfirm
+ * Created: 2025-06-05
+ */
+
+#include "wearable_log.h"
+#include "SlicePageFactory.h"
+#include "PageTransitionMgr.h"
+#include "NativeAbility.h"
+#include "AppViewIDs.h"
+#include "ui_resource_settings.h"
+#include "main/LoadImg.h"
+#include "settings/model/SettingBluetoothModel.h"
+#include "settings/page/SettingBluetoothPage.h"
+#include "settings/page/SettingReconnectSecondConfirm.h"
+
+namespace OHOS {
+static constexpr int16_t SETTING_ADDR2 = 2;
+static constexpr int16_t SETTING_ADDR3 = 3;
+static constexpr int16_t SETTING_ADDR4 = 4;
+static constexpr int16_t SETTING_ADDR5 = 5;
+static constexpr int16_t SETTING_RECO_TITLE_Y = 60;
+static constexpr int16_t SETTING_RECO_TITLE_HEIGHT = 40;
+static constexpr int16_t SETTING_RECO_TITLE_FONT = 38;
+static constexpr int16_t SETTING_RECO_CONTENT1_Y = 135;
+static constexpr int16_t SETTING_RECO_CONTENT2_X = 30;
+static constexpr int16_t SETTING_RECO_CONTENT2_Y = 180;
+static constexpr int16_t SETTING_RECO_CONTENT3_Y = 225;
+static constexpr int16_t SETTING_RECO_CONTENT_Y = 130;
+static constexpr int16_t SETTING_RECO_CONYENT_HEIGHT = 115;
+static constexpr int16_t SETTING_RECO_CONYENT1_HEIGHT = 50;
+static constexpr int16_t SETTING_RECO_CONTENT_FONT = 35;
+static constexpr int16_t SETTING_RECO_CONYENT_WIDTH = 394;
+static constexpr int16_t SETTING_RECO_BTN_WIDTH = 85;
+static constexpr int16_t SETTING_RECO_BTN_Y = 300;
+static constexpr int16_t SETTING_RECO_BTN_X1 = 114;
+static constexpr int16_t SETTING_RECO_BTN_X2 = 254;
+static constexpr char *CONFIRM_BUTTON = "confirmButton";
+static constexpr char *CANCEL_BUTTON = "cancelButton";
+
+void SettingReconnectSecondConfirm::OnCreateView(void* data)
+{
+    InitSecondConfirmFragment();
+}
+
+void SettingReconnectSecondConfirm::OnDestroyView()
+{
+    fragmentView_.RemoveAll();
+    if (title_ != nullptr) {
+        delete title_;
+        title_ = nullptr;
+    }
+    if (contentFirst_ != nullptr) {
+        delete contentFirst_;
+        contentFirst_ = nullptr;
+    }
+    if (contentSecond_ != nullptr) {
+        delete contentSecond_;
+        contentSecond_ = nullptr;
+    }
+    if (contentThird_ != nullptr) {
+        delete contentThird_;
+        contentThird_ = nullptr;
+    }
+    if (cancel_ != nullptr) {
+        delete cancel_;
+        cancel_ = nullptr;
+    }
+    if (confirm_ != nullptr) {
+        delete confirm_;
+        confirm_ = nullptr;
+    }
+}
+
+void SettingReconnectSecondConfirm::InitSecondConfirmFragment()
+{
+    fragmentView_.SetTouchable(true);
+    fragmentView_.SetDraggable(true);
+    fragmentView_.SetOnDragListener(this);
+
+    title_ = new UILabel();
+    if (title_ == nullptr) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "InitSecondConfirmFragment title_ new fail");
+        return;
+    }
+    title_->SetPosition(0, SETTING_RECO_TITLE_Y, RESOLUTION_WIDTH, SETTING_RECO_TITLE_HEIGHT);
+    if (SettingBluetoothModel::GetInstance()->GetBlueToothConnectStatus()) {
+        title_->SetText("确定断开连接?");
+    } else {
+        title_->SetText("确定重新连接?");
+    }
+
+    title_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);
+    title_->SetFont(BOLD_VECTOR_FONT_FILENAME, SETTING_RECO_TITLE_FONT);
+    title_->SetStyle(STYLE_TEXT_COLOR, Color::White().full);
+    std::string str1 = SettingBluetoothModel::GetInstance()->GetDeviceName();
+    std::string str = "";
+    std::string str2 = "";
+    if (SettingBluetoothModel::GetInstance()->GetBlueToothConnectStatus()) {
+        str = "此操作将会断开您与";
+        str2 = "以下设备的连接:";
+    } else {
+        str = "此操作您将会与以下";
+        str2 = "设备进行重新连接:";
+    }
+    contentFirst_ = new UILabel();
+    if (contentFirst_ == nullptr) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "InitSecondConfirmFragment contentFirst_ new fail");
+        return;
+    }
+    contentFirst_->SetPosition(0, SETTING_RECO_CONTENT1_Y,
+        RESOLUTION_WIDTH, SETTING_RECO_CONYENT1_HEIGHT);
+    contentFirst_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);
+    contentFirst_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SETTING_RECO_CONTENT_FONT);
+    contentFirst_->SetStyle(STYLE_TEXT_COLOR, Color::White().full);
+    contentFirst_->SetText(str.c_str());
+
+    contentSecond_ = new UILabel();
+    if (contentSecond_ == nullptr) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "InitSecondConfirmFragment contentSecond_ new fail");
+        return;
+    }
+    contentSecond_->SetPosition(SETTING_RECO_CONTENT2_X, SETTING_RECO_CONTENT2_Y,
+        SETTING_RECO_CONYENT_WIDTH, SETTING_RECO_CONYENT1_HEIGHT);
+    contentSecond_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);
+    contentSecond_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SETTING_RECO_CONTENT_FONT);
+    contentSecond_->SetStyle(STYLE_TEXT_COLOR, Color::White().full);
+    contentSecond_->SetText(str2.c_str());
+
+    contentThird_ = new UILabel();
+    if (contentThird_ == nullptr) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "InitSecondConfirmFragment contentThird_ new fail");
+        return;
+    }
+    contentThird_->SetPosition(0, SETTING_RECO_CONTENT3_Y,
+        RESOLUTION_WIDTH, SETTING_RECO_CONYENT1_HEIGHT);
+    contentThird_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);
+    contentThird_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SETTING_RECO_CONTENT_FONT);
+    contentThird_->SetStyle(STYLE_TEXT_COLOR, Color::White().full);
+    contentThird_->SetText(str1.c_str());
+
+    cancel_ = new UIImageView();
+    if (cancel_ == nullptr) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "InitSecondConfirmFragment cancel_ new fail");
+        return;
+    }
+    LOADIMG::LoadImageViewImg(cancel_, SETTING_IMAGE, IMAGE_CANCEL);
+    cancel_->SetPosition(SETTING_RECO_BTN_X1, SETTING_RECO_BTN_Y, SETTING_RECO_BTN_WIDTH, SETTING_RECO_BTN_WIDTH);
+    cancel_->SetTouchable(true);
+    cancel_->SetViewId(CANCEL_BUTTON);
+    cancel_->SetOnClickListener(this);
+    cancel_->SetVisible(true);
+    confirm_ = new UILabelButton();
+    if (confirm_ == nullptr) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "InitSecondConfirmFragment confirm_ new fail");
+        return;
+    }
+    confirm_->SetPosition(SETTING_RECO_BTN_X2, SETTING_RECO_BTN_Y, SETTING_RECO_BTN_WIDTH, SETTING_RECO_BTN_WIDTH);
+    confirm_->SetStyle(STYLE_BACKGROUND_COLOR, Color::Blue().full);
+    confirm_->SetViewId(CONFIRM_BUTTON);
+    confirm_->SetOnClickListener(this);
+    confirm_->SetVisible(true);
+    LOADIMG::LoadBtnImage(confirm_, SETTING_IMAGE, IMAGE_OK_BLUE, IMAGE_OK_BLUE);
+    confirm_->SetStyleForState(STYLE_BACKGROUND_COLOR, Color::Blue().full, UIButton::PRESSED);
+    confirm_->SetStyleForState(STYLE_BACKGROUND_COLOR, Color::Blue().full, UIButton::RELEASED);
+    confirm_->SetStyleForState(STYLE_BACKGROUND_COLOR, Color::Blue().full, UIButton::INACTIVE);
+
+    fragmentView_.Add(title_);
+    fragmentView_.Add(contentFirst_);
+    fragmentView_.Add(contentSecond_);
+    fragmentView_.Add(contentThird_);
+    fragmentView_.Add(cancel_);
+    fragmentView_.Add(confirm_);
+}
+
+bool SettingReconnectSecondConfirm::OnClick(UIView &view, const ClickEvent &event)
+{
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SettingReconnectSecondConfirm OnClick");
+    UNUSED(event);
+    if (strcmp(view.GetViewId(), CANCEL_BUTTON) == 0) {
+        fragmentView_.SetVisible(false);
+        SettingBluetoothPage::GetInstance()->ChangeView(BT_MAIN_PAGE);
+    } else if (strcmp(view.GetViewId(), CONFIRM_BUTTON) == 0) {
+        bd_addr_t addr;
+        BtCaseInfo *info = SettingBluetoothModel::GetInstance()->GetSelectedDeviceInfo();
+        if (memcpy_s(addr.addr, BD_ADDR_LEN, info->addr, BD_ADDR_LEN) != EOK) {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "memcpy_s failed");
+            return false;
+        }
+        WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "SettingReconnectSecondConfirmPage addr: %02x%02x%02x%02x%02x%02x",
+            addr.addr[SETTING_ADDR5], addr.addr[SETTING_ADDR4], addr.addr[SETTING_ADDR3],
+            addr.addr[SETTING_ADDR2], addr.addr[1], addr.addr[0]);
+        if (SettingBluetoothModel::GetInstance()->GetBlueToothConnectStatus()) {
+            errcode_t retVal = gap_disconnect_remote_device(&addr); // 断开连接
+            WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Disconnect SelectedDevice retVal =  %d", retVal);
+            if (retVal == 0) {
+                SettingBluetoothModel::GetInstance()->UpdateDisconnectStatusForDevice(addr);
+                SettingBluetoothModel::GetInstance()->SetConnectResultPage(false);
+                SettingBluetoothModel::GetInstance()->SetBlueToothConnectStatus(false);
+            }
+        } else {
+            if (SettingBluetoothModel::GetInstance()->ConnectRemoteDevice(&addr) == 0) {
+                WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "connect SelectedDevice");
+                SettingBluetoothModel::GetInstance()->SetLastConnedAddr(&addr);
+                SettingBluetoothModel::GetInstance()->UpdateConnectStatusForDevice();
+                SettingBluetoothModel::GetInstance()->SetConnectResultPage(true);
+                SettingBluetoothModel::GetInstance()->SetBlueToothConnectStatus(true);
+            }  else {
+                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ConnectRemoteDevice failed");
+            }
+        }
+        fragmentView_.SetVisible(false);
+        SettingBluetoothPage::GetInstance()->ChangeView(BT_MAIN_PAGE);
+    }
+    return true;
+}
+
+void SettingReconnectSecondConfirm::RefreshFragment()
+{
+    if (contentFirst_ == nullptr || contentSecond_ == nullptr || contentThird_ == nullptr ||
+        title_ == nullptr) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "RefreshFragment fail");
+        return;
+    }
+    std::string str1 = SettingBluetoothModel::GetInstance()->GetDeviceName();
+    std::string str = "";
+    std::string str2 = "";
+    bool status = SettingBluetoothModel::GetInstance()->GetBlueToothConnectStatus();
+    if (status) {
+        str = "此操作将会断开您与";
+        str2 = "以下设备的连接:";
+        title_->SetText("确定断开连接?");
+    } else {
+        str = "此操作您将会与以下";
+        str2 = "设备进行重新连接:";
+        title_->SetText("确定重新连接?");
+    }
+    contentFirst_->SetText(str.c_str());
+    contentSecond_->SetText(str2.c_str());
+    contentThird_->SetText(str1.c_str());
+}
+
+
+bool SettingReconnectSecondConfirm::OnDragStart(UIView& view, const DragEvent& event)
+{
+    return true;
+}
+
+bool SettingReconnectSecondConfirm::OnDrag(UIView& view, const DragEvent& event)
+{
+    return true;
+}
+
+bool SettingReconnectSecondConfirm::OnDragEnd(UIView& view, const DragEvent& event)
+{
+    return true;
+}
+}
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/settings/src/page/SettingReconnection.cpp b/code/sdk/application/wearable/evb/nativeapp/nativeui/settings/src/page/SettingReconnection.cpp
new file mode 100644 (file)
index 0000000..f12d149
--- /dev/null
@@ -0,0 +1,183 @@
+/*
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.
+ * Description: SettingReconnection
+ * Created: 2025-06-05
+ */
+
+#include "wearable_log.h"
+#include "SlicePageFactory.h"
+#include "PageTransitionMgr.h"
+#include "NativeAbility.h"
+#include "AppViewIDs.h"
+#include "main/LoadImg.h"
+#include "settings/model/SettingBluetoothModel.h"
+#include "settings/page/SettingBluetoothPage.h"
+#include "settings/page/SettingReconnection.h"
+
+namespace OHOS {
+static constexpr int16_t SETTING_WATCH_Y = 105;
+static constexpr int16_t SETTING_WATCH_HEIGHT = 40;
+static constexpr int16_t SETTING_WATCH_FONT = 36;
+static constexpr int16_t SETTING_CONTENT_Y = 155;
+static constexpr int16_t SETTING_CONYENT_HEIGHT = 40;
+static constexpr int16_t SETTING_RECO_X = 111;
+static constexpr int16_t SETTING_RECO1_Y = 230;
+static constexpr int16_t SETTING_RECO2_Y = 321;
+static constexpr int16_t SETTING_RECO_WIDTH = 232;
+static constexpr int16_t SETTING_RECO_HEIGHT = 76;
+static constexpr int16_t SETTING_RECO_FONT = 32;
+static constexpr int16_t SETTING_RECO_BTN_WIDTH = 90;
+static constexpr int16_t SETTING_RECO_BTN_Y = 320;
+static constexpr int16_t SETTING_RECO_BTN_X1 = 85;
+static constexpr int16_t SETTING_RECO_BTN_X2 = 279;
+static constexpr char *RECONNECT_BUTTON = "reconnectionButton";
+static constexpr char *UNPAIR_BUTTON = "unpairButton";
+
+void SettingReconnection::OnCreateView(void* data)
+{
+    InitReconnectionFragment();
+}
+
+void SettingReconnection::OnDestroyView()
+{
+    fragmentView_.RemoveAll();
+    if (watchNameLabel_ != nullptr) {
+        delete watchNameLabel_;
+        watchNameLabel_ = nullptr;
+    }
+    if (connectStatusLabel_ != nullptr) {
+        delete connectStatusLabel_;
+        connectStatusLabel_ = nullptr;
+    }
+    if (reconnectionButton_ != nullptr) {
+        delete reconnectionButton_;
+        reconnectionButton_ = nullptr;
+    }
+    if (unpair_ != nullptr) {
+        delete unpair_;
+        unpair_ = nullptr;
+    }
+}
+
+void SettingReconnection::InitReconnectionFragment()
+{
+    fragmentView_.SetTouchable(true);
+    fragmentView_.SetDraggable(true);
+    fragmentView_.SetOnDragListener(this);
+    watchNameLabel_ = new UILabel();
+    if (watchNameLabel_ == nullptr) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "InitReconnectionFragment watchNameLabel_ new fail");
+        return;
+    }
+    watchNameLabel_->SetPosition(0, SETTING_WATCH_Y, RESOLUTION_WIDTH, SETTING_WATCH_HEIGHT);
+    watchNameLabel_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);
+    watchNameLabel_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SETTING_WATCH_FONT);
+    watchNameLabel_->SetStyle(STYLE_TEXT_COLOR, Color::White().full);
+    std::string str = SettingBluetoothModel::GetInstance()->GetDeviceName();
+    watchNameLabel_->SetText(str.c_str());
+
+    connectStatusLabel_ = new UILabel();
+    if (connectStatusLabel_ == nullptr) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "InitReconnectionFragment connectStatusLabel_ new fail");
+        return;
+    }
+    connectStatusLabel_->SetPosition(0, SETTING_CONTENT_Y, RESOLUTION_WIDTH, SETTING_CONYENT_HEIGHT);
+    connectStatusLabel_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);
+    connectStatusLabel_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SETTING_WATCH_FONT);
+    connectStatusLabel_->SetStyle(STYLE_TEXT_COLOR, Color::White().full);
+    if (SettingBluetoothModel::GetInstance()->GetBlueToothConnectStatus()) {
+        connectStatusLabel_->SetText("已连接");
+    } else {
+        connectStatusLabel_->SetText("未连接");
+    }
+
+    reconnectionButton_ = new UILabelButton();
+    if (reconnectionButton_ == nullptr) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "InitReconnectionFragment recButton_ new fail");
+        return;
+    }
+    reconnectionButton_->SetStyleForState(STYLE_BACKGROUND_COLOR, Color::Blue().full, UIButton::PRESSED);
+    reconnectionButton_->SetStyleForState(STYLE_BACKGROUND_COLOR, Color::Blue().full, UIButton::RELEASED);
+    reconnectionButton_->SetStyleForState(STYLE_BACKGROUND_COLOR, Color::Blue().full, UIButton::INACTIVE);
+    reconnectionButton_->SetPosition(SETTING_RECO_X, SETTING_RECO1_Y, SETTING_RECO_WIDTH, SETTING_RECO_HEIGHT);
+    if (SettingBluetoothModel::GetInstance()->GetBlueToothConnectStatus()) {
+        reconnectionButton_->SetText("断开连接");
+    } else {
+        reconnectionButton_->SetText("重新连接");
+    }
+
+    reconnectionButton_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SETTING_RECO_FONT);
+    reconnectionButton_->SetStyle(STYLE_TEXT_COLOR, Color::White().full);
+    reconnectionButton_->SetViewId(RECONNECT_BUTTON);
+    reconnectionButton_->SetOnClickListener(this);
+    reconnectionButton_->SetVisible(true);
+
+    unpair_ = new UIImageView();
+    if (unpair_ == nullptr) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "InitReconnectionFragment unpair_ new fail");
+        return;
+    }
+    unpair_->SetPosition(SETTING_RECO_X, SETTING_RECO2_Y, SETTING_RECO_WIDTH, SETTING_RECO_HEIGHT);
+    LOADIMG::LoadImageViewImg(unpair_, SETTING_IMAGE, IMAGE_UNPAIR);
+    unpair_->SetTouchable(true);
+    unpair_->SetViewId(UNPAIR_BUTTON);
+    unpair_->SetOnClickListener(this);
+
+    fragmentView_.Add(watchNameLabel_);
+    fragmentView_.Add(connectStatusLabel_);
+    fragmentView_.Add(reconnectionButton_);
+    fragmentView_.Add(unpair_);
+}
+
+void SettingReconnection::RefreshFragment()
+{
+    if (reconnectionButton_ == nullptr || connectStatusLabel_ == nullptr || watchNameLabel_ == nullptr) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "RefreshFragment fail");
+        return;
+    }
+    bool status = SettingBluetoothModel::GetInstance()->GetBlueToothConnectStatus();
+    if (status) {
+        reconnectionButton_->SetText("断开连接");
+    } else {
+        reconnectionButton_->SetText("重新连接");
+    }
+    if (status) {
+        connectStatusLabel_->SetText("已连接");
+    } else {
+        connectStatusLabel_->SetText("未连接");
+    }
+    std::string str = SettingBluetoothModel::GetInstance()->GetDeviceName();
+    watchNameLabel_->SetText(str.c_str());
+}
+
+bool SettingReconnection::OnClick(UIView &view, const ClickEvent &event)
+{
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "OnClick");
+    UNUSED(event);
+    if (strcmp(view.GetViewId(), RECONNECT_BUTTON) == 0) {
+        fragmentView_.SetVisible(false);
+        SettingBluetoothPage::GetInstance()->ChangeView(RECONNECT_SECOND_CONFIRM_FRAGMENT);
+    } else if (strcmp(view.GetViewId(), UNPAIR_BUTTON) == 0) {
+        fragmentView_.SetVisible(false);
+        SettingBluetoothPage::GetInstance()->ChangeView(UNPAIR_CONFIRM_FRAGMENT);
+    }
+    return true;
+}
+
+bool SettingReconnection::OnDragStart(UIView& view, const DragEvent& event)
+{
+    return true;
+}
+
+bool SettingReconnection::OnDrag(UIView& view, const DragEvent& event)
+{
+    return true;
+}
+
+bool SettingReconnection::OnDragEnd(UIView& view, const DragEvent& event)
+{
+    fragmentView_.SetVisible(false);
+    SettingBluetoothPage::GetInstance()->ChangeView(BT_MAIN_PAGE);
+    return true;
+}
+}
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/settings/src/page/SettingSystemOperationPage.cpp b/code/sdk/application/wearable/evb/nativeapp/nativeui/settings/src/page/SettingSystemOperationPage.cpp
new file mode 100644 (file)
index 0000000..e3d7114
--- /dev/null
@@ -0,0 +1,232 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SettingSystemOperationPage\r
+ * Create: 2025-06-01\r
+ */\r
+#include "SlicePageFactory.h"\r
+#include "PageTransitionMgr.h"\r
+#include "NativeAbility.h"\r
+#include "settings/model/SettingSystemModel.h"\r
+#include "settings/page/SettingSystemOperationPage.h"\r
+\r
+namespace OHOS {\r
+REGIST_SLICE_PAGE(VIEW_SETTING, SettingPageId::SYSTEM_OPERATION_PAGE, SettingSystemOperationPage, false);\r
+\r
+#define SYSTEM_SLIDER_LABEL_TEXT_SIZE 20\r
+#define SETTING_SYSTEM_OPERATION_POWEROFF_FG_COLOR Color::GetColorFromRGB(250, 60, 60)  // 0xFA3C3CFF\r
+#define SETTING_SYSTEM_OPERATION_RESTART_FG_COLOR Color::GetColorFromRGB(100, 206, 122)  // 0x6ACE7AFF\r
+#define SETTING_SYSTEM_OPERATION_RESUME_FG_COLOR Color::GetColorFromRGB(153, 153, 153)  // 0x999999FF\r
+\r
+static constexpr int16_t SETTING_SYSTEM_OPERATION_SLIDER_X = 55;\r
+static constexpr int16_t SETTING_SYSTEM_OPERATION_SLIDER_Y = 135;\r
+static constexpr int16_t SETTING_SYSTEM_OPERATION_SLIDER_WIDTH = 349;\r
+static constexpr int16_t SETTING_SYSTEM_OPERATION_SLIDER_HEIGHT = 96;\r
+static constexpr int16_t SETTING_SYSTEM_OPERATION_SLIDER_RADIUS = 88;\r
+static constexpr int16_t SETTING_SYSTEM_OPERATION_SLIDER_KNOBWIDTH = 84;\r
+static constexpr int16_t SETTING_SYSTEM_OPERATION_SLIDER_RANGE_MAX = 349;\r
+static constexpr int16_t SETTING_SYSTEM_OPERATION_SLIDER_RANGE_MIN = 0;\r
+static constexpr int16_t SETTING_SYSTEM_OPERATION_SLIDER_START_POINT = 50;\r
+static constexpr int16_t SETTING_SYSTEM_OPERATION_SLIDER_START_RANG_MAX = 110;\r
+static constexpr int16_t SETTING_SYSTEM_OPERATION_SLIDER_START_RANG_MIN = 10;\r
+static constexpr int16_t SETTING_SYSTEM_OPERATION_SLIDER_END_POINT = 299;\r
+static constexpr int16_t SETTING_SYSTEM_OPERATION_SLIDER_RIGHT_POINT = 249;\r
+static constexpr int16_t SETTING_SYSTEM_OPERATION_SLIDE_BORDER_WIDTH = 16;\r
+static constexpr int16_t SETTING_SYSTEM_OPERATION_SLIDE_FG_OPA = 128;\r
+\r
+static constexpr int16_t SETTING_SYSTEM_OPERATION_SLIDER_LABEL_X = 177;\r
+static constexpr int16_t SETTING_SYSTEM_OPERATION_SLIDER_LABEL_Y = 164;\r
+static constexpr int16_t SETTING_SYSTEM_OPERATION_SLIDER_LABEL_WIDTH = 192;\r
+static constexpr int16_t SETTING_SYSTEM_OPERATION_SLIDER_LABEL_HEIGHT = 38;\r
+static constexpr int16_t SETTING_SYSTEM_OPERATION_SLIDER_LABEL_FSIZE = 32;\r
+\r
+static constexpr int16_t SETTING_SYSTEM_OPERATION_BUTTON_X = 184;\r
+static constexpr int16_t SETTING_SYSTEM_OPERATION_BUTTON_Y = 294;\r
+static constexpr int16_t SETTING_SYSTEM_OPERATION_BUTTON_WIDTH = 85;\r
+static constexpr int16_t SETTING_SYSTEM_OPERATION_BUTTON_HEIGHT = 85;\r
+static constexpr int16_t SETTING_SYSTEM_OPERATION_BUTTON_RADIUS = 45;\r
+\r
+static constexpr int16_t SETTING_SYSTEM_OPERATION_BUTTON_LABEL_X = 194;\r
+static constexpr int16_t SETTING_SYSTEM_OPERATION_BUTTON_LABEL_Y = 394;\r
+static constexpr int16_t SETTING_SYSTEM_OPERATION_BUTTON_LABEL_WIDTH = 64;\r
+static constexpr int16_t SETTING_SYSTEM_OPERATION_BUTTON_LABEL_HEIGHT = 38;\r
+static constexpr int16_t SETTING_SYSTEM_OPERATION_BUTTON_LABEL_FSIZE = 32;\r
+static const char* SETTING_SYSTEM_OPERATION_BUTTON_LABEL_TEXT = "取消";\r
+\r
+SettingSystemOperationPage::SettingSystemOperationPage()\r
+{\r
+    std::map<std::string, OperationData> tempData = {\r
+        {"关机", {SETTING_SYSTEM_OPERATION_POWEROFF_FG_COLOR, IMAGE_SYSTEM_LIST_POWEROFF}},\r
+        {"重启", {SETTING_SYSTEM_OPERATION_RESTART_FG_COLOR, IMAGE_SYSTEM_LIST_RESTART}},\r
+        {"恢复出厂", {SETTING_SYSTEM_OPERATION_RESUME_FG_COLOR, IMAGE_SYSTEM_LIST_RESUME}},\r
+    };\r
+    operationData_.swap(tempData);\r
+}\r
+\r
+void SettingSystemOperationPage::OnStart(void* data)\r
+{\r
+    operationName_ = static_cast<const char*>(data);\r
+    InitSliderView();\r
+    InitButtonView();\r
+    RefreshSlider();\r
+    AddViewToPageContainer(slider_);\r
+    AddViewToPageContainer(button_);\r
+    AddViewToPageContainer(sliderLabel_);\r
+    AddViewToPageContainer(buttonDescription_);\r
+}\r
+\r
+void SettingSystemOperationPage::OnResume()\r
+{\r
+    GetSlicePageContainer()->SetIntercept(true);\r
+    GetSlicePageContainer()->SetOnDragListener(nullptr); // 取消跟手返回\r
+    if (sliderLabel_ != nullptr) {\r
+        char temp[SYSTEM_SLIDER_LABEL_TEXT_SIZE];\r
+        if (sprintf_s(temp, sizeof(temp), "滑动%s", operationName_.c_str()) > 0) {\r
+            sliderLabel_->SetText(temp);\r
+        }\r
+    }\r
+}\r
+\r
+void SettingSystemOperationPage::OnStop()\r
+{\r
+    if (slider_ != nullptr) {\r
+        delete slider_;\r
+        slider_ = nullptr;\r
+    }\r
+    if (sliderLabel_ != nullptr) {\r
+        delete sliderLabel_;\r
+        sliderLabel_ = nullptr;\r
+    }\r
+    if (button_ != nullptr) {\r
+        delete button_;\r
+        button_ = nullptr;\r
+    }\r
+    if (buttonDescription_ != nullptr) {\r
+        delete buttonDescription_;\r
+        buttonDescription_ = nullptr;\r
+    }\r
+    ImageCacheManager::GetInstance().UnloadOneInMultiRes(operationData_[operationName_].sliderKnobImage, SETTING_IMAGE);\r
+    ImageCacheManager::GetInstance().UnloadOneInMultiRes(IMAGE_SYSTEM_OPERATION_CLOSE, SETTING_IMAGE);\r
+}\r
+\r
+bool SettingSystemOperationPage::OnClick(UIView &view, const ClickEvent &event)\r
+{\r
+    if (strcmp(view.GetViewId(), "slider") == 0) {\r
+        // Slide的click需要视为无效点击\r
+        slider_->SetValue(SETTING_SYSTEM_OPERATION_SLIDER_START_POINT);\r
+    } else if (strcmp(view.GetViewId(), "button") == 0) {\r
+        NativeAbility::GetInstance().BackToPrevSlicePage();\r
+    }\r
+    return true;\r
+}\r
+\r
+void SettingSystemOperationPage::OnChange(int32_t value)\r
+{\r
+    // 若滑动开始的坐标在这个区域则允许滑动\r
+    if (value > SETTING_SYSTEM_OPERATION_SLIDER_START_RANG_MIN &&\r
+        value < SETTING_SYSTEM_OPERATION_SLIDER_START_RANG_MAX) {\r
+        sliderBegin_ = true;\r
+    }\r
+    // 若起点不在指定区域 或 往不允许的滑动区域滑动, 则重置为区域起点\r
+    if (!sliderBegin_ || value < SETTING_SYSTEM_OPERATION_SLIDER_START_POINT) {\r
+        slider_->SetValue(SETTING_SYSTEM_OPERATION_SLIDER_START_POINT);\r
+    }\r
+    // 若起点在指定区域, 终点超过允许的滑动区域, 则重置为区域终点\r
+    if (sliderBegin_ && value > SETTING_SYSTEM_OPERATION_SLIDER_END_POINT) {\r
+        slider_->SetValue(SETTING_SYSTEM_OPERATION_SLIDER_END_POINT);\r
+    }\r
+    // 按照滑动坐标修改label的透明度 滑动坐标[50, 299] label透明度[255, 6]\r
+    uint8_t labelOPA = OPA_OPAQUE - (slider_->GetValue() - SETTING_SYSTEM_OPERATION_SLIDER_START_POINT);\r
+    sliderLabel_->SetStyle(STYLE_TEXT_OPA, labelOPA);\r
+}\r
+\r
+void SettingSystemOperationPage::OnRelease(int32_t value)\r
+{\r
+    if (sliderBegin_ && value > SETTING_SYSTEM_OPERATION_SLIDER_RIGHT_POINT) {\r
+        SettingSystemModel::GetInstance().SystemOperation(operationName_.c_str());\r
+    }\r
+    slider_->SetValue(SETTING_SYSTEM_OPERATION_SLIDER_START_POINT);\r
+    sliderLabel_->SetStyle(STYLE_TEXT_OPA, OPA_OPAQUE);\r
+    sliderBegin_ = false;\r
+}\r
+\r
+void SettingSystemOperationPage::InitSliderView()\r
+{\r
+    slider_ = new UISlider();\r
+    if (slider_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SettingSystemOperationPage::InitSliderView slider_ new fail");\r
+        return;\r
+    }\r
+    slider_->SetPosition(SETTING_SYSTEM_OPERATION_SLIDER_X, SETTING_SYSTEM_OPERATION_SLIDER_Y);\r
+    slider_->Resize(SETTING_SYSTEM_OPERATION_SLIDER_WIDTH, SETTING_SYSTEM_OPERATION_SLIDER_HEIGHT);\r
+    slider_->SetViewId("slider");\r
+    slider_->SetSliderRadius(SETTING_SYSTEM_OPERATION_SLIDER_RADIUS, SETTING_SYSTEM_OPERATION_SLIDER_RADIUS);\r
+    slider_->SetKnobWidth(SETTING_SYSTEM_OPERATION_SLIDER_KNOBWIDTH);\r
+    slider_->SetRange(SETTING_SYSTEM_OPERATION_SLIDER_RANGE_MAX, SETTING_SYSTEM_OPERATION_SLIDER_RANGE_MIN);\r
+    slider_->SetValue(SETTING_SYSTEM_OPERATION_SLIDER_START_POINT);\r
+    slider_->SetSliderEventListener(this);\r
+    slider_->SetOnClickListener(this);\r
+    slider_->SetIntercept(true);\r
+\r
+    sliderLabel_ = new UILabel();\r
+    if (sliderLabel_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SettingSystemOperationPage::InitSliderView sliderlabel new fail");\r
+        return;\r
+    }\r
+    sliderLabel_->SetPosition(SETTING_SYSTEM_OPERATION_SLIDER_LABEL_X, SETTING_SYSTEM_OPERATION_SLIDER_LABEL_Y);\r
+    sliderLabel_->Resize(SETTING_SYSTEM_OPERATION_SLIDER_LABEL_WIDTH, SETTING_SYSTEM_OPERATION_SLIDER_LABEL_HEIGHT);\r
+    sliderLabel_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+    sliderLabel_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SETTING_SYSTEM_OPERATION_SLIDER_LABEL_FSIZE);\r
+    sliderLabel_->SetStyle(STYLE_TEXT_COLOR, Color::White().full);\r
+    sliderLabel_->SetStyle(STYLE_TEXT_OPA, OPA_OPAQUE);\r
+    sliderLabel_->SetStyle(STYLE_BACKGROUND_COLOR, SETTING_LIST_DEFAULT_BG_COLOR.full);\r
+}\r
+\r
+void SettingSystemOperationPage::InitButtonView()\r
+{\r
+    button_ = new UIButton();\r
+    if (button_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SettingSystemOperationPage::InitButtonView button_ new fail");\r
+        return;\r
+    }\r
+    button_->SetPosition(SETTING_SYSTEM_OPERATION_BUTTON_X, SETTING_SYSTEM_OPERATION_BUTTON_Y);\r
+    button_->Resize(SETTING_SYSTEM_OPERATION_BUTTON_WIDTH, SETTING_SYSTEM_OPERATION_BUTTON_HEIGHT);\r
+    button_->SetViewId("button");\r
+    ImageInfo* image = ImageCacheManager::GetInstance().LoadOneInMultiRes(IMAGE_SYSTEM_OPERATION_CLOSE, SETTING_IMAGE);\r
+    button_->SetImageSrc(image, image);\r
+    button_->SetStyle(STYLE_BORDER_RADIUS, SETTING_SYSTEM_OPERATION_BUTTON_RADIUS);\r
+    button_->SetStyleForState(STYLE_BACKGROUND_COLOR, Color::Black().full, UIButton::PRESSED);\r
+    button_->SetStyleForState(STYLE_BACKGROUND_COLOR, Color::Black().full, UIButton::RELEASED);\r
+    button_->SetStyleForState(STYLE_BACKGROUND_COLOR, Color::Black().full, UIButton::INACTIVE);\r
+    button_->SetStyleForState(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT, UIButton::PRESSED);\r
+    button_->SetStyleForState(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT, UIButton::RELEASED);\r
+    button_->SetStyleForState(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT, UIButton::INACTIVE);\r
+    button_->SetOnClickListener(this);\r
+\r
+    buttonDescription_ = new UILabel();\r
+    if (buttonDescription_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SettingSystemOperationPage::InitButtonView buttonlabel new fail");\r
+        return;\r
+    }\r
+    buttonDescription_->SetPosition(SETTING_SYSTEM_OPERATION_BUTTON_LABEL_X, SETTING_SYSTEM_OPERATION_BUTTON_LABEL_Y);\r
+    buttonDescription_->Resize(SETTING_SYSTEM_OPERATION_BUTTON_LABEL_WIDTH, SETTING_SYSTEM_OPERATION_BUTTON_LABEL_HEIGHT);\r
+    buttonDescription_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+    buttonDescription_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SETTING_SYSTEM_OPERATION_BUTTON_LABEL_FSIZE);\r
+    buttonDescription_->SetStyle(STYLE_TEXT_COLOR, Color::White().full);\r
+    buttonDescription_->SetText(SETTING_SYSTEM_OPERATION_BUTTON_LABEL_TEXT);\r
+}\r
+\r
+void SettingSystemOperationPage::RefreshSlider()\r
+{\r
+    slider_->SetBackgroundStyle(STYLE_BACKGROUND_COLOR, SETTING_LIST_DEFAULT_BG_COLOR.full);\r
+    slider_->SetForegroundStyle(STYLE_BACKGROUND_OPA, OPA_OPAQUE);\r
+    slider_->SetBackgroundStyle(STYLE_BACKGROUND_OPA, OPA_OPAQUE);\r
+    slider_->SetForegroundStyle(STYLE_BORDER_OPA, OPA_TRANSPARENT);\r
+    slider_->SetForegroundStyle(STYLE_BORDER_WIDTH, SETTING_SYSTEM_OPERATION_SLIDE_BORDER_WIDTH);\r
+    slider_->SetForegroundStyle(STYLE_BACKGROUND_OPA, SETTING_SYSTEM_OPERATION_SLIDE_FG_OPA);\r
+\r
+    ImageInfo* image = ImageCacheManager::GetInstance().LoadOneInMultiRes(\r
+        operationData_[operationName_].sliderKnobImage, SETTING_IMAGE);\r
+    slider_->SetKnobImage(image);\r
+    slider_->SetForegroundStyle(STYLE_BACKGROUND_COLOR, operationData_[operationName_].sliderBgColor.full);\r
+}\r
+}
\ No newline at end of file
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/settings/src/page/SettingSystemOtaPage.cpp b/code/sdk/application/wearable/evb/nativeapp/nativeui/settings/src/page/SettingSystemOtaPage.cpp
new file mode 100644 (file)
index 0000000..ebc2c72
--- /dev/null
@@ -0,0 +1,277 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SettingSystemOtaPage\r
+ * Create: 2025-06-01\r
+ */\r
+#include "SlicePageFactory.h"\r
+#include "PageTransitionMgr.h"\r
+#include "NativeAbility.h"\r
+#include "settings/model/SettingSystemModel.h"\r
+#include "settings/page/SettingSystemOtaPage.h"\r
+\r
+namespace OHOS {\r
+REGIST_SLICE_PAGE(VIEW_SETTING, SettingPageId::SYSTEM_OTA_PAGE, SettingSystemOtaPage, false);\r
+\r
+#define SETTING_MID_UPGRADE_LABEL_TEXT_SIZE 4\r
+#define SETTING_SYS_OTA_MIDPRORESS_BG_LINE_COLOR Color::GetColorFromRGB(217, 217, 217)\r
+#define SETTING_SYS_OTA_MIDPRORESS_FG_LINE_COLOR Color::GetColorFromRGB(68, 132, 255)\r
+static constexpr int16_t SETTING_SYS_OTA_MAX_PERCENTER = 100;\r
+static constexpr int16_t SETTING_SYS_OTA_PREBUTTON_X = 154;\r
+static constexpr int16_t SETTING_SYS_OTA_PREBUTTON_Y = 130;\r
+static constexpr int16_t SETTING_SYS_OTA_PREBUTTON_WIDTH = 146;\r
+static constexpr int16_t SETTING_SYS_OTA_PREBUTTON_HEIGHT = 146;\r
+\r
+static constexpr int16_t SETTING_SYS_OTA_PRELABEL_X = 20;\r
+static constexpr int16_t SETTING_SYS_OTA_PRELABEL_Y = 326;\r
+static constexpr int16_t SETTING_SYS_OTA_PRELABEL_WIDTH = 414;\r
+static constexpr int16_t SETTING_SYS_OTA_PRELABEL_HEIGHT = 44;\r
+static constexpr int16_t SETTING_SYS_OTA_PRELABEL_FSIZE = 36;\r
+\r
+static constexpr int16_t SETTING_SYS_OTA_MIDPRORESS_X = 89;\r
+static constexpr int16_t SETTING_SYS_OTA_MIDPRORESS_Y = 92;\r
+static constexpr int16_t SETTING_SYS_OTA_MIDPRORESS_WIDTH = 276;\r
+static constexpr int16_t SETTING_SYS_OTA_MIDPRORESS_HEIGHT = 276;\r
+static constexpr int16_t SETTING_SYS_OTA_MIDPRORESS_LINEWIDTH = 20;\r
+static constexpr int16_t SETTING_SYS_OTA_MIDPRORESS_CENTPOS_X = 138;\r
+static constexpr int16_t SETTING_SYS_OTA_MIDPRORESS_CENTPOS_Y = 138;\r
+static constexpr int16_t SETTING_SYS_OTA_MIDPRORESS_RADUIS = 138;\r
+\r
+static constexpr int16_t SETTING_SYS_OTA_MIDLABEL_X = 160;\r
+static constexpr int16_t SETTING_SYS_OTA_MIDLABEL_Y = 163;\r
+static constexpr int16_t SETTING_SYS_OTA_MIDLABEL_WIDTH = 102;\r
+static constexpr int16_t SETTING_SYS_OTA_MIDLABEL_HEIGHT = 72;\r
+static constexpr int16_t SETTING_SYS_OTA_MIDLABEL_FSIZE = 60;\r
+\r
+static constexpr int16_t SETTING_SYS_OTA_MIDPERCENT_X = 160+102;\r
+static constexpr int16_t SETTING_SYS_OTA_MIDPERCENT_Y = 187;\r
+static constexpr int16_t SETTING_SYS_OTA_MIDPERCENT_WIDTH = 32;\r
+static constexpr int16_t SETTING_SYS_OTA_MIDPERCENT_HEIGHT = 40;\r
+static constexpr int16_t SETTING_SYS_OTA_MIDPERCENT_FSIZE = 36;\r
+static const char* SETTING_SYS_OTA_MIDPERCENT_TEXT = "%";\r
+\r
+static constexpr int16_t SETTING_SYS_OTA_MIDMESSAGE_X = 15;\r
+static constexpr int16_t SETTING_SYS_OTA_MIDMESSAGE_Y = 246;\r
+static constexpr int16_t SETTING_SYS_OTA_MIDMESSAGE_WIDTH = 424;\r
+static constexpr int16_t SETTING_SYS_OTA_MIDMESSAGE_HEIGHT = 44;\r
+static constexpr int16_t SETTING_SYS_OTA_MIDMESSAGE_FSIZE = 36;\r
+\r
+void SettingSystemOtaPage::OnStart(void* data)\r
+{\r
+    InitPreGroupView();\r
+    InitMidCircleView();\r
+    InitMidMessageView();\r
+    preUpgradeGroup_->Add(preUpgradeButton_);\r
+    preUpgradeGroup_->Add(preUpgradeLabel_);\r
+    midUpgradeGroup_->Add(midUpgradeProress_);\r
+    midUpgradeGroup_->Add(midUpgradeLabel_);\r
+    midUpgradeGroup_->Add(midUpgradePercent_);\r
+    midUpgradeGroup_->Add(midUpgradeMessage_);\r
+    AddViewToPageContainer(preUpgradeGroup_);\r
+    AddViewToPageContainer(midUpgradeGroup_);\r
+}\r
+\r
+void SettingSystemOtaPage::OnResume()\r
+{\r
+    // 判断是否正在升级中\r
+    if (!SettingSystemModel::GetInstance().GetOtaIsUpgrade()) {\r
+        preUpgradeGroup_->SetVisible(true);\r
+        midUpgradeGroup_->SetVisible(false);\r
+        // 检查OTA升级包是否存在\r
+        if (SettingSystemModel::GetInstance().GetOtaPackageSize() != 0) {\r
+            preUpgradeButton_->Enable();\r
+            ImageInfo* image =\r
+                ImageCacheManager::GetInstance().LoadOneInMultiRes(IMAGE_SYSTEM_OTA_UPDATE, SETTING_IMAGE);\r
+            preUpgradeButton_->SetImageSrc(image, image);\r
+            preUpgradeLabel_->SetText("点击开始升级");\r
+            preUpgradeButton_->SetOnClickListener(this);\r
+        } else {\r
+            ImageInfo* image =\r
+                ImageCacheManager::GetInstance().LoadOneInMultiRes(IMAGE_SYSTEM_OTA_UNUPDATE, SETTING_IMAGE);\r
+            preUpgradeButton_->Disable();\r
+            preUpgradeButton_->SetImageSrc(image, image);\r
+            preUpgradeLabel_->SetText("暂无可升级镜像");\r
+            preUpgradeButton_->SetOnClickListener(nullptr);\r
+        }\r
+    } else {\r
+        preUpgradeGroup_->SetVisible(false);\r
+        midUpgradeGroup_->SetVisible(true);\r
+        upgradeAnimator_->Start();\r
+    }\r
+}\r
+\r
+void SettingSystemOtaPage::OnPause()\r
+{\r
+    upgradeAnimator_->Stop();\r
+}\r
+\r
+void SettingSystemOtaPage::OnStop()\r
+{\r
+    if (upgradeAnimator_ != nullptr) {\r
+        delete upgradeAnimator_;\r
+        upgradeAnimator_ = nullptr;\r
+    }\r
+    if (preUpgradeGroup_ != nullptr) {\r
+        preUpgradeGroup_->RemoveAll();\r
+        delete preUpgradeGroup_;\r
+        preUpgradeGroup_ = nullptr;\r
+    }\r
+    if (midUpgradeGroup_ != nullptr) {\r
+        midUpgradeGroup_->RemoveAll();\r
+        delete midUpgradeGroup_;\r
+        midUpgradeGroup_ = nullptr;\r
+    }\r
+    if (preUpgradeButton_ != nullptr) {\r
+        delete preUpgradeButton_;\r
+        preUpgradeButton_ = nullptr;\r
+    }\r
+    if (preUpgradeLabel_ != nullptr) {\r
+        delete preUpgradeLabel_;\r
+        preUpgradeLabel_ = nullptr;\r
+    }\r
+    if (midUpgradeProress_ != nullptr) {\r
+        delete midUpgradeProress_;\r
+        midUpgradeProress_ = nullptr;\r
+    }\r
+    if (midUpgradeLabel_ != nullptr) {\r
+        delete midUpgradeLabel_;\r
+        midUpgradeLabel_ = nullptr;\r
+    }\r
+    if (midUpgradePercent_ != nullptr) {\r
+        delete midUpgradePercent_;\r
+        midUpgradePercent_ = nullptr;\r
+    }\r
+    if (midUpgradeMessage_ != nullptr) {\r
+        delete midUpgradeMessage_;\r
+        midUpgradeMessage_ = nullptr;\r
+    }\r
+    ImageCacheManager::GetInstance().UnloadOneInMultiRes(IMAGE_SYSTEM_OTA_UPDATE, SETTING_IMAGE);\r
+    ImageCacheManager::GetInstance().UnloadOneInMultiRes(IMAGE_SYSTEM_OTA_UNUPDATE, SETTING_IMAGE);\r
+}\r
+\r
+bool SettingSystemOtaPage::OnClick(UIView &view, const ClickEvent &event)\r
+{\r
+    preUpgradeGroup_->SetVisible(false);\r
+    midUpgradeGroup_->SetVisible(true);\r
+    SettingSystemModel::GetInstance().StartOtaNativeUpgrade();\r
+    upgradeAnimator_->Start();\r
+    return true;\r
+}\r
+\r
+void SettingSystemOtaPage::Callback(UIView* view)\r
+{\r
+    char temp[SETTING_MID_UPGRADE_LABEL_TEXT_SIZE] = "";\r
+    uint8_t percent = SettingSystemModel::GetInstance().GetOtaNativeUpgradePercent();\r
+    std::string message = SettingSystemModel::GetInstance().GetOtaNativeUpgradeMessage();\r
+    if (sprintf_s(temp, sizeof(temp), "%u", percent) > 0) {\r
+        midUpgradeLabel_->SetText(temp);\r
+    }\r
+    midUpgradeProress_->SetValue(percent);\r
+    midUpgradeMessage_->SetText(message.c_str());\r
+    if (percent >= SETTING_SYS_OTA_MAX_PERCENTER || !SettingSystemModel::GetInstance().GetOtaIsUpgrade()) {\r
+        upgradeAnimator_->Stop();\r
+    }\r
+}\r
+\r
+void SettingSystemOtaPage::InitPreGroupView()\r
+{\r
+    upgradeAnimator_ = new Animator(this, nullptr, 0, true);\r
+    if (upgradeAnimator_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SettingSystemOtaPage::InitPreGroupView upgradeAnimator_ new fail");\r
+        return;\r
+    }\r
+    preUpgradeGroup_ = new UIViewGroup();\r
+    if (preUpgradeGroup_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SettingSystemOtaPage::InitPreGroupView preUpgradeGroup_ new fail");\r
+        return;\r
+    }\r
+    preUpgradeGroup_->SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);\r
+    preUpgradeGroup_->SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
+    preUpgradeGroup_->SetStyle(STYLE_BACKGROUND_OPA, UN_OPACITY);\r
+\r
+    preUpgradeButton_ = new UIButton();\r
+    if (preUpgradeButton_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SettingSystemOtaPage::InitPreGroupView preUpgradeButton_ new fail");\r
+        return;\r
+    }\r
+    preUpgradeButton_->SetPosition(SETTING_SYS_OTA_PREBUTTON_X, SETTING_SYS_OTA_PREBUTTON_Y);\r
+    preUpgradeButton_->Resize(SETTING_SYS_OTA_PREBUTTON_WIDTH, SETTING_SYS_OTA_PREBUTTON_WIDTH);\r
+    preUpgradeButton_->SetStyleForState(STYLE_BACKGROUND_COLOR, Color::Black().full, UIButton::RELEASED);\r
+    preUpgradeButton_->SetStyleForState(STYLE_BACKGROUND_COLOR, Color::Black().full, UIButton::PRESSED);\r
+\r
+    preUpgradeLabel_ = new UILabel();\r
+    if (preUpgradeLabel_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SettingSystemOtaPage::InitPreGroupView preUpgradeLabel_ new fail");\r
+        return;\r
+    }\r
+    preUpgradeLabel_->SetPosition(SETTING_SYS_OTA_PRELABEL_X, SETTING_SYS_OTA_PRELABEL_Y);\r
+    preUpgradeLabel_->Resize(SETTING_SYS_OTA_PRELABEL_WIDTH, SETTING_SYS_OTA_PRELABEL_HEIGHT);\r
+    preUpgradeLabel_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+    preUpgradeLabel_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SETTING_SYS_OTA_PRELABEL_FSIZE);\r
+    preUpgradeLabel_->SetStyle(STYLE_TEXT_COLOR, Color::White().full);\r
+}\r
+\r
+void SettingSystemOtaPage::InitMidCircleView()\r
+{\r
+    midUpgradeGroup_ = new UIViewGroup();\r
+    if (midUpgradeGroup_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SettingSystemOtaPage::InitMidCircleView midUpgradeGroup_ new fail");\r
+        return;\r
+    }\r
+    midUpgradeGroup_->SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);\r
+    midUpgradeGroup_->SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
+    midUpgradeGroup_->SetStyle(STYLE_BACKGROUND_OPA, UN_OPACITY);\r
+\r
+    midUpgradeProress_ = new UICircleProgress();\r
+    if (midUpgradeProress_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SettingSystemOtaPage::InitMidCircleView preUpgradeButton_ new fail");\r
+        return;\r
+    }\r
+    midUpgradeProress_->SetPosition(SETTING_SYS_OTA_MIDPRORESS_X, SETTING_SYS_OTA_MIDPRORESS_Y);\r
+    midUpgradeProress_->Resize(SETTING_SYS_OTA_MIDPRORESS_WIDTH, SETTING_SYS_OTA_MIDPRORESS_HEIGHT);\r
+    midUpgradeProress_->SetBackgroundStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
+    midUpgradeProress_->SetBackgroundStyle(STYLE_LINE_COLOR, SETTING_SYS_OTA_MIDPRORESS_BG_LINE_COLOR.full);\r
+    midUpgradeProress_->SetBackgroundStyle(STYLE_LINE_WIDTH, SETTING_SYS_OTA_MIDPRORESS_LINEWIDTH);\r
+    midUpgradeProress_->SetForegroundStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
+    midUpgradeProress_->SetForegroundStyle(STYLE_LINE_COLOR, SETTING_SYS_OTA_MIDPRORESS_FG_LINE_COLOR.full);\r
+    midUpgradeProress_->SetForegroundStyle(STYLE_LINE_WIDTH, SETTING_SYS_OTA_MIDPRORESS_LINEWIDTH);\r
+    midUpgradeProress_->SetCenterPosition(SETTING_SYS_OTA_MIDPRORESS_CENTPOS_X, SETTING_SYS_OTA_MIDPRORESS_CENTPOS_Y);\r
+    midUpgradeProress_->SetRadius(SETTING_SYS_OTA_MIDPRORESS_RADUIS);\r
+}\r
+\r
+void SettingSystemOtaPage::InitMidMessageView()\r
+{\r
+    midUpgradeLabel_ = new UILabel();\r
+    if (midUpgradeLabel_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SettingSystemOtaPage::InitMidMessageView preUpgradeLabel_ new fail");\r
+        return;\r
+    }\r
+    midUpgradeLabel_->SetPosition(SETTING_SYS_OTA_MIDLABEL_X, SETTING_SYS_OTA_MIDLABEL_Y);\r
+    midUpgradeLabel_->Resize(SETTING_SYS_OTA_MIDLABEL_WIDTH, SETTING_SYS_OTA_MIDLABEL_HEIGHT);\r
+    midUpgradeLabel_->SetAlign(TEXT_ALIGNMENT_RIGHT, TEXT_ALIGNMENT_CENTER);\r
+    midUpgradeLabel_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SETTING_SYS_OTA_MIDLABEL_FSIZE);\r
+    midUpgradeLabel_->SetStyle(STYLE_TEXT_COLOR, Color::White().full);\r
+\r
+    midUpgradePercent_ = new UILabel();\r
+    if (midUpgradePercent_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SettingSystemOtaPage::InitMidMessageView midUpgradePercent_ new fail");\r
+        return;\r
+    }\r
+    midUpgradePercent_->SetPosition(SETTING_SYS_OTA_MIDPERCENT_X, SETTING_SYS_OTA_MIDPERCENT_Y);\r
+    midUpgradePercent_->Resize(SETTING_SYS_OTA_MIDPERCENT_WIDTH, SETTING_SYS_OTA_MIDPERCENT_HEIGHT);\r
+    midUpgradePercent_->SetAlign(TEXT_ALIGNMENT_LEFT, TEXT_ALIGNMENT_CENTER);\r
+    midUpgradePercent_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SETTING_SYS_OTA_MIDPERCENT_FSIZE);\r
+    midUpgradePercent_->SetStyle(STYLE_TEXT_COLOR, Color::White().full);\r
+    midUpgradePercent_->SetText("%");\r
+\r
+    midUpgradeMessage_ = new UILabel();\r
+    if (midUpgradeMessage_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SettingSystemOtaPage::InitMidMessageView midUpgradeMessage_ new fail");\r
+        return;\r
+    }\r
+    midUpgradeMessage_->SetPosition(SETTING_SYS_OTA_MIDMESSAGE_X, SETTING_SYS_OTA_MIDMESSAGE_Y);\r
+    midUpgradeMessage_->Resize(SETTING_SYS_OTA_MIDMESSAGE_WIDTH, SETTING_SYS_OTA_MIDMESSAGE_HEIGHT);\r
+    midUpgradeMessage_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+    midUpgradeMessage_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SETTING_SYS_OTA_MIDMESSAGE_FSIZE);\r
+    midUpgradeMessage_->SetStyle(STYLE_TEXT_COLOR, Color::White().full);\r
+}\r
+}
\ No newline at end of file
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/settings/src/page/SettingSystemPage.cpp b/code/sdk/application/wearable/evb/nativeapp/nativeui/settings/src/page/SettingSystemPage.cpp
new file mode 100644 (file)
index 0000000..3fc8663
--- /dev/null
@@ -0,0 +1,133 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SettingSystemPage\r
+ * Create: 2025-06-01\r
+ */\r
+#include "components/ui_list_nested.h"\r
+#include "components/ui_scroll_view_nested.h"\r
+#include "SlicePageFactory.h"\r
+#include "PageTransitionMgr.h"\r
+#include "NativeAbility.h"\r
+#include "settings/model/SettingMainModel.h"\r
+#include "settings/model/SettingSystemModel.h"\r
+#include "settings/page/SettingSystemPage.h"\r
+\r
+namespace OHOS {\r
+REGIST_SLICE_PAGE(VIEW_SETTING, SettingPageId::SYSTEM_PAGE, SettingSystemPage, false);\r
+\r
+static constexpr int16_t SETTING_LIST_POSITION_X = 14;\r
+static constexpr int16_t SETTING_LIST_WIDTH = 426;\r
+static constexpr int16_t SETTING_SCROLLBLANKSIZE = 96;\r
+static constexpr int16 MAX_SCR_DIS = 1000;\r
+static constexpr int16 SNUM_2 = 2;\r
+static SettingSystemPage *g_pSettingSystemPage = nullptr;\r
+\r
+void SettingSystemPage::OnStart(void* data)\r
+{\r
+    g_pSettingSystemPage = this;\r
+    content_ = new UISimpleList();\r
+    if (content_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SettingSystemPage::OnStart content_ new fail");\r
+        return;\r
+    }\r
+    content_->SetPosition(SETTING_LIST_POSITION_X, 0, SETTING_LIST_WIDTH, HORIZONTAL_RESOLUTION);\r
+    content_->SetScrollBlankSize(SETTING_SCROLLBLANKSIZE, UIAbstractScroll::Direction::BOTTOM);\r
+    content_->SetSelectPosition(HORIZONTAL_RESOLUTION / SNUM_2);\r
+    content_->SetDraggable(true);\r
+    content_->SetThrowDrag(true);\r
+    content_->SetMaxScrollDistance(MAX_SCR_DIS);\r
+\r
+    scroll_ = new UIScrollViewNested();\r
+    if (scroll_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SettingSystemPage::OnStart scroll_ new fail");\r
+        return;\r
+    }\r
+    scroll_->Resize(HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);\r
+    scroll_->SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
+    scroll_->SetStyle(STYLE_BACKGROUND_OPA, UN_OPACITY);\r
+    scroll_->SetThrowDrag(true);\r
+    scroll_->SetIntercept(true);\r
+    scroll_->Add(content_);\r
+    AddViewToPageContainer(scroll_);\r
+}\r
+\r
+void SettingSystemPage::OnResume()\r
+{\r
+    content_->ClearAll();\r
+    for(auto& it : SettingSystemModel::GetInstance().GetSystemUnionData()) {\r
+        Contents cont;\r
+        cont.createFunc = SettingMainModel::OnSimpleListCreate;\r
+        cont.updateFunc = SettingSystemPage::OnSimpleListUpdate;\r
+        cont.type = it.GetUnionItemType();\r
+        cont.data = &it;\r
+        content_->AddContent(cont);\r
+    }\r
+    content_->RefreshList();\r
+}\r
+\r
+void SettingSystemPage::OnStop()\r
+{\r
+    g_pSettingSystemPage = nullptr;\r
+    if (scroll_ != nullptr) {\r
+        scroll_->RemoveAll();\r
+        delete scroll_;\r
+        scroll_ = nullptr;\r
+    }\r
+    if (content_ != nullptr) {\r
+        delete content_;\r
+        content_ = nullptr;\r
+    }\r
+}\r
+\r
+bool SettingSystemPage::OnClick(UIView& view, const ClickEvent& event)\r
+{\r
+    uintptr_t viewId = (uintptr_t)view.GetViewId();\r
+    if (viewId == (uintptr_t)ICON_TEXT_NAVIGATION) {\r
+        int16_t viewIndex = view.GetViewIndex();\r
+        auto& sysUnionData = SettingSystemModel::GetInstance().GetSystemUnionData();\r
+        if (viewIndex < 0 || viewIndex > sysUnionData.size()) {\r
+            return true;\r
+        }\r
+\r
+        SettingUnionItemData& itemData = sysUnionData[viewIndex];\r
+        if (itemData.GetUnionItemType() == ICON_TEXT_NAVIGATION) {\r
+            IconTextNavigationItemData* data = static_cast<IconTextNavigationItemData*>(itemData.GetUnionItemData());\r
+            NativeAbility::GetInstance().SwitchPageInSlice(data->pageId, TransitionType::TRANSITION_INVALID,\r
+                true, (void*)data->textContent, strlen(data->textContent) + 1);\r
+        }\r
+    }\r
+    return true;\r
+}\r
+\r
+void SettingSystemPage::OnSimpleListUpdate(UIView* view, void* data, uint8_t type)\r
+{\r
+    if (view == nullptr || data == nullptr) {\r
+        return;\r
+    }\r
+    if (type == SettingUnionItemType::PLAIN_TEXT) {\r
+        PlainTextItemView *itemGroup = dynamic_cast<PlainTextItemView*>(view);\r
+        if (itemGroup == nullptr) {\r
+            return;\r
+        }\r
+        PlainTextItemData* itemData = static_cast<PlainTextItemData*>(data);\r
+        itemGroup->UpdateViewData(itemData);\r
+    } else if(type == SettingUnionItemType::ICON_TEXT_TOGGLE) {\r
+        IconTextToggleItemView *itemGroup = dynamic_cast<IconTextToggleItemView*>(view);\r
+        if (itemGroup == nullptr) {\r
+            return;\r
+        }\r
+        IconTextToggleItemData* itemData = static_cast<IconTextToggleItemData*>(data);\r
+        itemGroup->UpdateViewData(itemData);\r
+        itemGroup->SetOnClickListener(g_pSettingSystemPage);\r
+    }  else if(type == SettingUnionItemType::ICON_TEXT_NAVIGATION) {\r
+        IconTextNavigationItemView *itemGroup = dynamic_cast<IconTextNavigationItemView*>(view);\r
+        if (itemGroup == nullptr) {\r
+            return;\r
+        }\r
+        IconTextNavigationItemData* itemData = static_cast<IconTextNavigationItemData*>(data);\r
+        itemGroup->UpdateViewData(itemData);\r
+        itemGroup->SetOnClickListener(g_pSettingSystemPage);\r
+    }\r
+    return;\r
+}\r
+}
\ No newline at end of file
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/settings/src/page/UnPairSecondConfirm.cpp b/code/sdk/application/wearable/evb/nativeapp/nativeui/settings/src/page/UnPairSecondConfirm.cpp
new file mode 100644 (file)
index 0000000..f61af57
--- /dev/null
@@ -0,0 +1,220 @@
+/*
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.
+ * Description: UnPairSecondConfirm
+ * Created: 2025-06-05
+ */
+
+#include "wearable_log.h"
+#include "SlicePageFactory.h"
+#include "PageTransitionMgr.h"
+#include "NativeAbility.h"
+#include "AppViewIDs.h"
+#include "ui_resource_settings.h"
+#include "main/LoadImg.h"
+#include "settings/page/SettingBluetoothPage.h"
+#include "settings/model/SettingBluetoothModel.h"
+#include "settings/page/UnPairSecondConfirm.h"
+
+namespace OHOS {
+static constexpr int16_t SETTING_ADDR2 = 2;
+static constexpr int16_t SETTING_ADDR3 = 3;
+static constexpr int16_t SETTING_ADDR4 = 4;
+static constexpr int16_t SETTING_ADDR5 = 5;
+static constexpr int16_t SETTING_UNPAIR_TITLE_Y = 60;
+static constexpr int16_t SETTING_UNPAIR_TITLE_HEIGHT = 40;
+static constexpr int16_t SETTING_UNPAIR_TITLE_FONT = 38;
+static constexpr int16_t SETTING_UNPAIR_CONTENT1_X = 30;
+static constexpr int16_t SETTING_UNPAIR_CONTENT1_Y = 135;
+static constexpr int16_t SETTING_UNPAIR_CONTENT2_Y = 180;
+static constexpr int16_t SETTING_UNPAIR_CONTENT3_Y = 225;
+static constexpr int16_t SETTING_UNPAIR_CONYENT_WIDTH = 394;
+static constexpr int16_t SETTING_UNPAIR_CONYENT_HEIGHT = 50;
+static constexpr int16_t SETTING_UNPAIR_CONTENT2_HEIGHT = 115;
+static constexpr int16_t SETTING_UNPAIR_CONTENT1_FONT = 35;
+static constexpr int16_t SETTING_UNPAIR_BTN_WIDTH = 85;
+static constexpr int16_t SETTING_UNPAIR_CANCEL_Y = 300;
+static constexpr int16_t SETTING_UNPAIR_CANCEL_X = 114;
+static constexpr int16_t SETTING_UNPAIR_CONFIRM_X = 254;
+static constexpr char *CONFIRM_BUTTON = "confirmButton";
+static constexpr char *CANCEL_BUTTON = "cancelButton";
+
+void UnPairSecondConfirm::OnCreateView(void* data)
+{
+    InitUnpairFragment();
+}
+
+void UnPairSecondConfirm::OnDestroyView()
+{
+    fragmentView_.RemoveAll();
+    if (title_ != nullptr) {
+        delete title_;
+        title_ = nullptr;
+    }
+    if (contentFirst_ != nullptr) {
+        delete contentFirst_;
+        contentFirst_ = nullptr;
+    }
+    if (contentSecond_ != nullptr) {
+        delete contentSecond_;
+        contentSecond_ = nullptr;
+    }
+    if (watchNameLabel_ != nullptr) {
+        delete watchNameLabel_;
+        watchNameLabel_ = nullptr;
+    }
+    if (cancel_ != nullptr) {
+        delete cancel_;
+        cancel_ = nullptr;
+    }
+    if (confirm_ != nullptr) {
+        delete confirm_;
+        confirm_ = nullptr;
+    }
+}
+
+void UnPairSecondConfirm::InitUnpairFragment()
+{
+    fragmentView_.SetTouchable(true);
+    fragmentView_.SetDraggable(true);
+    fragmentView_.SetOnDragListener(this);
+    title_ = new UILabel();
+    if (title_ == nullptr) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "UnPairSecondConfirm::InitUnpairFragment title_ new fail");
+        return;
+    }
+    title_->SetPosition(0, SETTING_UNPAIR_TITLE_Y, RESOLUTION_WIDTH, SETTING_UNPAIR_TITLE_HEIGHT);
+    title_->SetText("确定取消配对?");
+    title_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);
+    title_->SetFont(BOLD_VECTOR_FONT_FILENAME, SETTING_UNPAIR_TITLE_FONT);
+    title_->SetStyle(STYLE_TEXT_COLOR, Color::White().full);
+    std::string str1 = SettingBluetoothModel::GetInstance()->GetDeviceName();
+    std::string str = "此操作将会取消您与";
+    std::string str2 = "以下设备的配对:";
+    contentFirst_ = new UILabel();
+    if (contentFirst_ == nullptr) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "UnPairSecondConfirm::InitUnpairFragment contentFirst_ new fail");
+        return;
+    }
+    contentFirst_->SetPosition(0, SETTING_UNPAIR_CONTENT1_Y,
+        RESOLUTION_WIDTH, SETTING_UNPAIR_CONYENT_HEIGHT);
+    contentFirst_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);
+    contentFirst_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SETTING_UNPAIR_CONTENT1_FONT);
+    contentFirst_->SetStyle(STYLE_TEXT_COLOR, Color::White().full);
+    contentFirst_->SetText(str.c_str());
+
+    contentSecond_ = new UILabel();
+    if (contentSecond_ == nullptr) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "UnPairSecondConfirm::InitUnpairFragment contentSecond_ new fail");
+        return;
+    }
+    contentSecond_->SetPosition(SETTING_UNPAIR_CONTENT1_X, SETTING_UNPAIR_CONTENT2_Y,
+        SETTING_UNPAIR_CONYENT_WIDTH, SETTING_UNPAIR_CONYENT_HEIGHT);
+    contentSecond_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);
+    contentSecond_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SETTING_UNPAIR_CONTENT1_FONT);
+    contentSecond_->SetStyle(STYLE_TEXT_COLOR, Color::White().full);
+    contentSecond_->SetText(str2.c_str());
+
+    watchNameLabel_ = new UILabel();
+    if (watchNameLabel_ == nullptr) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "UnPairSecondConfirm::InitUnpairFragment watchNameLabel_ new fail");
+        return;
+    }
+    watchNameLabel_->SetPosition(0, SETTING_UNPAIR_CONTENT3_Y,
+        RESOLUTION_WIDTH, SETTING_UNPAIR_CONYENT_HEIGHT);
+    watchNameLabel_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);
+    watchNameLabel_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SETTING_UNPAIR_CONTENT1_FONT);
+    watchNameLabel_->SetStyle(STYLE_TEXT_COLOR, Color::White().full);
+    watchNameLabel_->SetText(str1.c_str());
+
+    cancel_ = new UIImageView();
+    if (cancel_ == nullptr) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "UnPairSecondConfirm::InitUnpairFragment cancel_ new fail");
+        return;
+    }
+    LOADIMG::LoadImageViewImg(cancel_, SETTING_IMAGE, IMAGE_CANCEL);
+    cancel_->SetPosition(SETTING_UNPAIR_CANCEL_X,
+        SETTING_UNPAIR_CANCEL_Y, SETTING_UNPAIR_BTN_WIDTH, SETTING_UNPAIR_BTN_WIDTH);
+    cancel_->SetTouchable(true);
+    cancel_->SetViewId(CANCEL_BUTTON);
+    cancel_->SetOnClickListener(this);
+    cancel_->SetVisible(true);
+    confirm_ = new UILabelButton();
+    if (confirm_ == nullptr) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "UnPairSecondConfirm::InitUnpairFragment confirm_ new fail");
+        return;
+    }
+    confirm_->SetPosition(SETTING_UNPAIR_CONFIRM_X,
+        SETTING_UNPAIR_CANCEL_Y, SETTING_UNPAIR_BTN_WIDTH, SETTING_UNPAIR_BTN_WIDTH);
+    confirm_->SetStyle(STYLE_BACKGROUND_COLOR, Color::Blue().full);
+    confirm_->SetViewId(CONFIRM_BUTTON);
+    confirm_->SetOnClickListener(this);
+    confirm_->SetVisible(true);
+    LOADIMG::LoadBtnImage(confirm_, SETTING_IMAGE, IMAGE_OK_BLUE, IMAGE_OK_BLUE);
+    confirm_->SetStyleForState(STYLE_BACKGROUND_COLOR, Color::Blue().full, UIButton::PRESSED);
+    confirm_->SetStyleForState(STYLE_BACKGROUND_COLOR, Color::Blue().full, UIButton::RELEASED);
+    confirm_->SetStyleForState(STYLE_BACKGROUND_COLOR, Color::Blue().full, UIButton::INACTIVE);
+
+    fragmentView_.Add(title_);
+    fragmentView_.Add(contentFirst_);
+    fragmentView_.Add(contentSecond_);
+    fragmentView_.Add(watchNameLabel_);
+    fragmentView_.Add(cancel_);
+    fragmentView_.Add(confirm_);
+}
+
+void UnPairSecondConfirm::RefreshFragment()
+{
+    if (watchNameLabel_ == nullptr) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "UnPairSecondConfirm::RefreshFragment fail");
+        return;
+    }
+    std::string str1 = SettingBluetoothModel::GetInstance()->GetDeviceName();
+    watchNameLabel_->SetText(str1.c_str());
+}
+
+bool UnPairSecondConfirm::OnClick(UIView &view, const ClickEvent &event)
+{
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "UnPairSecondConfirm::OnClick");
+    UNUSED(event);
+    if (strcmp(view.GetViewId(), CANCEL_BUTTON) == 0) {
+        // 此处仅退出页面,耳机仍存在,需要通知主页面 此时存在耳机列表,蓝牙主页通过该变量做出对应的显示
+        fragmentView_.SetVisible(false);
+        SettingBluetoothPage::GetInstance()->ChangeView(BT_MAIN_PAGE);
+    } else if (strcmp(view.GetViewId(), CONFIRM_BUTTON) == 0) {
+        SettingBluetoothModel::GetInstance()->HandleUnpairRequest();
+        bd_addr_t clickAddr;
+        (void)memcpy_s(clickAddr.addr, BD_ADDR_LEN,
+            SettingBluetoothModel::GetInstance()->GetSelectedDeviceInfo()->addr, BD_ADDR_LEN);
+        std::list<BtCaseInfo> &bluetoothCaseList = SettingBluetoothModel::GetInstance()->GetScansDevicesList();
+        for (auto it = bluetoothCaseList.begin(); it != bluetoothCaseList.end(); it++)  {
+            if ((clickAddr.addr[0] == it->addr[0]) && (clickAddr.addr[1] == it->addr[1])
+                && (clickAddr.addr[SETTING_ADDR2] == it->addr[SETTING_ADDR2])
+                && (clickAddr.addr[SETTING_ADDR3] == it->addr[SETTING_ADDR3])
+                && (clickAddr.addr[SETTING_ADDR4] == it->addr[SETTING_ADDR4])
+                && (clickAddr.addr[SETTING_ADDR5] == it->addr[SETTING_ADDR5])) {
+                WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "OnClick unpair device_name:%s", it->deviceName);
+                bluetoothCaseList.erase(it);
+            }
+        }
+        fragmentView_.SetVisible(false);
+        SettingBluetoothPage::GetInstance()->LoadFindDeviceList();
+        SettingBluetoothPage::GetInstance()->ChangeView(BT_MAIN_PAGE);
+    }
+    return true;
+}
+
+bool UnPairSecondConfirm::OnDragStart(UIView& view, const DragEvent& event)
+{
+    return true;
+}
+
+bool UnPairSecondConfirm::OnDrag(UIView& view, const DragEvent& event)
+{
+    return true;
+}
+
+bool UnPairSecondConfirm::OnDragEnd(UIView& view, const DragEvent& event)
+{
+    return true;
+}
+}
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/sleep/src/SleepDetailsPage.cpp b/code/sdk/application/wearable/evb/nativeapp/nativeui/sleep/src/SleepDetailsPage.cpp
new file mode 100644 (file)
index 0000000..3fabd9e
--- /dev/null
@@ -0,0 +1,587 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SleepDetailsPage\r
+ * Created: 2025-06-05\r
+ */\r
+#include <sys/time.h>\r
+#include <string>\r
+#include "ohos_timer.h"\r
+#include "wearable_log.h"\r
+#include "SlicePageFactory.h"\r
+#include "common/image_cache_manager.h"\r
+#include "AppViewIDs.h"\r
+#include "NativeAbility.h"\r
+#include "sleep/SleepView.h"\r
+#include "sleep/SleepModel.h"\r
+#include "sleep/SleepDetailsPage.h"\r
+\r
+namespace OHOS {\r
+static constexpr int16_t SLEEPDETAIL_SLEEP_X = 97;\r
+static constexpr int16_t SLEEPDETAIL_SLEEP_Y = 31;\r
+static constexpr int16_t SLEEPDETAIL_SLEEP_WIDTH = 260;\r
+static constexpr int16_t SLEEPDETAIL_SLEEP_HEIGHT = 53;\r
+static constexpr int16_t SLEEPDETAIL_SLEEP_FONT_SIZE = 38;\r
+static constexpr int16_t SLEEPDETAIL_IMAGE1_X = 77;\r
+static constexpr int16_t SLEEPDETAIL_IMAGE1_Y = 215;\r
+static constexpr int16_t SLEEPDETAIL_SOBERINGTIME_X = 103;\r
+static constexpr int16_t SLEEPDETAIL_SOBERINGTIME_Y = 205;\r
+static constexpr int16_t SLEEPDETAIL_SOBERINGTIME_WIDTH = 80;\r
+static constexpr int16_t SLEEPDETAIL_SOBERINGTIME_HEIGHT = 29;\r
+static constexpr int16_t SLEEPDETAIL_SOBERINGTIME_FONT_SIZE = 28;\r
+static constexpr int16_t SLEEPDETAIL_IMAGE2_Y = 254;\r
+static constexpr int16_t SLEEPDETAIL_IMAGE3_Y = 291;\r
+static constexpr int16_t SLEEPDETAIL_IMAGE4_Y = 330;\r
+static constexpr int16_t SLEEPDETAIL_RAPID_Y = 244;\r
+static constexpr int16_t SLEEPDETAIL_RAPID_WIDTH = 150;\r
+static constexpr int16_t SLEEPDETAIL_RAPID_HEIGHT = 38;\r
+static constexpr int16_t SLEEPDETAIL_LIGHT_Y = 283;\r
+static constexpr int16_t SLEEPDETAIL_DEEP_Y = 322;\r
+static constexpr int16_t SLEEPDETAIL_GRAYBG_X = 62;\r
+static constexpr int16_t SLEEPDETAIL_GRAYBG_Y = 185;\r
+static constexpr int16_t SLEEPDETAIL_ACTUALSLEEP_X = 180;\r
+static constexpr int16_t SLEEPDETAIL_ACTUAL_NORECODE_X = 96;\r
+static constexpr int16_t SLEEPDETAIL_ACTUALSLEEP_Y = 100;\r
+static constexpr int16_t SLEEPDETAIL_ACTUALSLEEP_WIDTH = 200;\r
+static constexpr int16_t SLEEPDETAIL_ACTUALSLEEP_HEIGHT = 35;\r
+static constexpr int16_t SLEEPDETAIL_ACTUALSLEEP_FONT_SIZE = 32;\r
+static constexpr int16_t SLEEPDETAIL_LABEL_WIDTH = 160;\r
+static constexpr int16_t SLEEPDETAIL_PADDING_RIGHT = 30;\r
+static constexpr int16_t SLEEPDETAIL_SOBERINGTEXT_X = 220;\r
+static constexpr int16_t SLEEPDETAIL_ACTUALSLEEP_NORECORD_X = 179;\r
+static constexpr int16_t SLEEPDETAIL_ACTUALSLEEP_NORECORD_Y = 110;\r
+static constexpr int16_t SLEEPDETAIL_SOBERTIMETEXT_X = 300;\r
+static constexpr int16_t SLEEPDETAIL_SOBERTIMETEXT_Y = 190;\r
+static constexpr int16_t SLEEPDETAIL_RAPIDTIMETEXT_Y = 230;\r
+static constexpr int16_t SLEEPDETAIL_LIGHTIMETEXT_Y = 270;\r
+static constexpr int16_t SLEEPDETAIL_DEEPIMETEXT_Y = 310;\r
+static constexpr int16_t SLEEPDETAIL_ACTUALSLEEPTIMEHOURS_FONT_SIZE = 40;\r
+static constexpr int16_t SLEEPDETAIL_ACTUALSLEEPTIMINUTES_HEIGHT = 50;\r
+static constexpr int16_t SLEEPDETAIL_ACTUALSLEEPTIMINUTES_FONT_SIZE = 40;\r
+static constexpr int16_t SLEEPDETAIL_ACTUALMINUTE_X = 230;\r
+static constexpr int16_t SLEEPDETAIL_ACTUALMINUTE_Y = 116;\r
+static constexpr int16_t SLEEPDETAIL_ACTUALHOUR_X = 135;\r
+static constexpr int16_t SLEEPDETAIL_ACTUALHOUR_Y = 100;\r
+static constexpr int16_t SLEEPDETAIL_ACTUALHOURTEXT_X = 170;\r
+static constexpr int16_t SLEEPDETAIL_ACTUALMINUTETEXT_X = 280;\r
+static constexpr int16_t ACTUALHOURS_X = 140;\r
+static constexpr int16_t ACTUALHOURSTEXT_X = 180;\r
+static constexpr int16_t ACTUALMINUTESTEXT_X = 270;\r
+\r
+REGIST_SLICE_PAGE(VIEW_SLEEPING, SLEEPING_PAGES::SLEEPING_DEATIL_PAGE, SleepDetailsPage, false);\r
+\r
+SleepDetailsPage::SleepDetailsPage()\r
+{\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SleepDetailsPage::SleepDetailsPage");\r
+}\r
+\r
+SleepDetailsPage::~SleepDetailsPage()\r
+{\r
+    if (group_ != nullptr) {\r
+        group_->RemoveAll();\r
+        delete group_;\r
+        group_ = nullptr;\r
+    }\r
+\r
+    if (bgImg_ != nullptr) {\r
+        delete bgImg_;\r
+        bgImg_ = nullptr;\r
+    }\r
+\r
+    if (sleepTitleLabel_ != nullptr) {\r
+        delete sleepTitleLabel_;\r
+        sleepTitleLabel_ = nullptr;\r
+    }\r
+\r
+    if (actualSleepNorecordTimeLabel_ != nullptr) {\r
+        delete actualSleepNorecordTimeLabel_;\r
+        actualSleepNorecordTimeLabel_ = nullptr;\r
+    }\r
+\r
+    if (actualSleepTimeHoursLabel_ != nullptr) {\r
+        delete actualSleepTimeHoursLabel_;\r
+        actualSleepTimeHoursLabel_ = nullptr;\r
+    }\r
+\r
+    if (actualSleepTimeHoursUnitLabel_ != nullptr) {\r
+        delete actualSleepTimeHoursUnitLabel_;\r
+        actualSleepTimeHoursUnitLabel_ = nullptr;\r
+    }\r
+\r
+    if (actualSleepTimeMinutesLabel_ != nullptr) {\r
+        delete actualSleepTimeMinutesLabel_;\r
+        actualSleepTimeMinutesLabel_ = nullptr;\r
+    }\r
+\r
+    if (actualSleepTimeMinutesUnitLabel_ != nullptr) {\r
+        delete actualSleepTimeMinutesUnitLabel_;\r
+        actualSleepTimeMinutesUnitLabel_ = nullptr;\r
+    }\r
+\r
+    if (grayBgImg_ != nullptr) {\r
+        delete grayBgImg_;\r
+        grayBgImg_ = nullptr;\r
+    }\r
+\r
+    if (redPointImg_ != nullptr) {\r
+        delete redPointImg_;\r
+        redPointImg_ = nullptr;\r
+    }\r
+\r
+    if (soberingTimeLabel_ != nullptr) {\r
+        delete soberingTimeLabel_;\r
+        soberingTimeLabel_ = nullptr;\r
+    }\r
+\r
+    if (soberingTimeUnitLabel_ != nullptr) {\r
+        delete soberingTimeUnitLabel_;\r
+        soberingTimeUnitLabel_ = nullptr;\r
+    }\r
+\r
+    if (orangePointImg_ != nullptr) {\r
+        delete orangePointImg_;\r
+        orangePointImg_ = nullptr;\r
+    }\r
+\r
+    if (rapidEyeMovementLabel_ != nullptr) {\r
+        delete rapidEyeMovementLabel_;\r
+        rapidEyeMovementLabel_ = nullptr;\r
+    }\r
+\r
+    if (rapidEyeMovementUnitLabel_ != nullptr) {\r
+        delete rapidEyeMovementUnitLabel_;\r
+        rapidEyeMovementUnitLabel_ = nullptr;\r
+    }\r
+\r
+    if (greenPointImg_ != nullptr) {\r
+        delete greenPointImg_;\r
+        greenPointImg_ = nullptr;\r
+    }\r
+\r
+    if (lightSleepTimeLabel_ != nullptr) {\r
+        delete lightSleepTimeLabel_;\r
+        lightSleepTimeLabel_ = nullptr;\r
+    }\r
+\r
+    if (lightSleepTimeUnitLabel_ != nullptr) {\r
+        delete lightSleepTimeUnitLabel_;\r
+        lightSleepTimeUnitLabel_ = nullptr;\r
+    }\r
+\r
+    if (bluePointImg_ != nullptr) {\r
+        delete bluePointImg_;\r
+        bluePointImg_ = nullptr;\r
+    }\r
+\r
+    if (deepSleepTimeLabel_ != nullptr) {\r
+        delete deepSleepTimeLabel_;\r
+        deepSleepTimeLabel_ = nullptr;\r
+    }\r
+\r
+    if (deepSleepTimeUnitLabel_ != nullptr) {\r
+        delete deepSleepTimeUnitLabel_;\r
+        deepSleepTimeUnitLabel_ = nullptr;\r
+    }\r
+    ImageCacheManager::GetInstance().UnloadAllInMultiRes(SLEEP_IMAGE);\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SleepDetailsPage::~SleepDetailsPage");\r
+}\r
+\r
+void SleepDetailsPage::OnStart(void *data)\r
+{\r
+    group_ = new UIScrollView();\r
+    if (group_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "group_ is nullptr");\r
+        return;\r
+    }\r
+    group_->SetPosition(0, 0);\r
+    group_->Resize(RESOLUTION_WIDTH, RESOLUTION_HEIGHT);\r
+    group_->SetViewId("sleepDetails");\r
+\r
+    bgImg_ = new UIImageView();\r
+    if (bgImg_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "bgImg_ is nullptr");\r
+        return;\r
+    }\r
+    LOADIMG::LoadImageViewImg(bgImg_, SLEEP_IMAGE, IMAGE_SLEEP_BACKGROUND);\r
+    bgImg_->SetPosition(0, 0, RESOLUTION_WIDTH, RESOLUTION_HEIGHT);\r
+    group_->Add(bgImg_);\r
+\r
+    sleepTitleLabel_ = new UILabel();\r
+    if (sleepTitleLabel_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "sleepTitleLabel_ is nullptr");\r
+        return;\r
+    }\r
+    sleepTitleLabel_->SetPosition(SLEEPDETAIL_SLEEP_X, SLEEPDETAIL_SLEEP_Y);\r
+    sleepTitleLabel_->Resize(SLEEPDETAIL_SLEEP_WIDTH, SLEEPDETAIL_SLEEP_HEIGHT);\r
+    sleepTitleLabel_->SetText("睡眠");\r
+    sleepTitleLabel_->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+    sleepTitleLabel_->SetTextColor(Color::White());\r
+    sleepTitleLabel_->SetFont(BOLD_VECTOR_FONT_FILENAME, SLEEPDETAIL_SLEEP_FONT_SIZE);\r
+    sleepTitleLabel_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+    group_->Add(sleepTitleLabel_);\r
+\r
+    InitPage();\r
+\r
+    if (GetRecord() == true) {\r
+        InitDetailPage();\r
+    } else {\r
+        InitNoDeatilPage();\r
+    };\r
+    group_->SetOnDragListener(this);\r
+    group_->SetDraggable(true);\r
+    group_->SetTouchable(true);\r
+    AddViewToPageContainer(group_);\r
+}\r
+\r
+void SleepDetailsPage::InitSoberingTime()\r
+{\r
+    redPointImg_ = new UIImageView();\r
+    if (redPointImg_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "redPointImg_ is nullptr");\r
+        return;\r
+    }\r
+    redPointImg_->SetPosition(SLEEPDETAIL_IMAGE1_X, SLEEPDETAIL_IMAGE1_Y);\r
+    LOADIMG::LoadImageViewImg(redPointImg_, SLEEP_IMAGE, IMAGE_SLEEP_RED_CIR);\r
+    group_->Add(redPointImg_);\r
+    soberingTimeLabel_ = new UILabel();\r
+    if (soberingTimeLabel_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "soberingTimeLabel_ is nullptr");\r
+        return;\r
+    }\r
+    soberingTimeLabel_->SetPosition(SLEEPDETAIL_SOBERINGTIME_X, SLEEPDETAIL_SOBERINGTIME_Y);\r
+    soberingTimeLabel_->Resize(SLEEPDETAIL_SOBERINGTIME_WIDTH, SLEEPDETAIL_SOBERINGTIME_HEIGHT);\r
+    soberingTimeLabel_->SetText("清醒");\r
+    soberingTimeLabel_->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+    soberingTimeLabel_->SetTextColor(Color::White());\r
+    soberingTimeLabel_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SLEEPDETAIL_SOBERINGTIME_FONT_SIZE);\r
+    soberingTimeLabel_->SetAlign(TEXT_ALIGNMENT_LEFT, TEXT_ALIGNMENT_CENTER);\r
+    group_->Add(soberingTimeLabel_);\r
+}\r
+\r
+void SleepDetailsPage::InitRapidEyeMovement()\r
+{\r
+    orangePointImg_ = new UIImageView();\r
+    if (orangePointImg_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "orangePointImg_ is nullptr");\r
+        return;\r
+    }\r
+    orangePointImg_->SetPosition(SLEEPDETAIL_IMAGE1_X, SLEEPDETAIL_IMAGE2_Y);\r
+    LOADIMG::LoadImageViewImg(orangePointImg_, SLEEP_IMAGE, IMAGE_SLEEP_ORANGE_CIR);\r
+    group_->Add(orangePointImg_);\r
+\r
+    rapidEyeMovementLabel_ = new UILabel();\r
+    if (rapidEyeMovementLabel_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "rapidEyeMovementLabel_ is nullptr");\r
+        return;\r
+    }\r
+    rapidEyeMovementLabel_->SetPosition(SLEEPDETAIL_SOBERINGTIME_X, SLEEPDETAIL_RAPID_Y);\r
+    rapidEyeMovementLabel_->Resize(SLEEPDETAIL_RAPID_WIDTH, SLEEPDETAIL_RAPID_HEIGHT);\r
+    rapidEyeMovementLabel_->SetText("快速动眼");\r
+    rapidEyeMovementLabel_->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+    rapidEyeMovementLabel_->SetTextColor(Color::White());\r
+    rapidEyeMovementLabel_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SLEEPDETAIL_SOBERINGTIME_FONT_SIZE);\r
+    rapidEyeMovementLabel_->SetAlign(TEXT_ALIGNMENT_LEFT, TEXT_ALIGNMENT_CENTER);\r
+    group_->Add(rapidEyeMovementLabel_);\r
+}\r
+\r
+void SleepDetailsPage::InitLightSleepTime()\r
+{\r
+    greenPointImg_ = new UIImageView();\r
+    if (greenPointImg_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "greenPointImg_ is nullptr");\r
+        return;\r
+    }\r
+    greenPointImg_->SetPosition(SLEEPDETAIL_IMAGE1_X, SLEEPDETAIL_IMAGE3_Y);\r
+    LOADIMG::LoadImageViewImg(greenPointImg_, SLEEP_IMAGE, IMAGE_SLEEP_GREEN_CIR);\r
+    group_->Add(greenPointImg_);\r
+\r
+    lightSleepTimeLabel_ = new UILabel();\r
+    if (lightSleepTimeLabel_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "lightSleepTimeLabel_ is nullptr");\r
+        return;\r
+    }\r
+    lightSleepTimeLabel_->SetPosition(SLEEPDETAIL_SOBERINGTIME_X, SLEEPDETAIL_LIGHT_Y);\r
+    lightSleepTimeLabel_->Resize(SLEEPDETAIL_SOBERINGTIME_WIDTH, SLEEPDETAIL_SOBERINGTIME_HEIGHT);\r
+    lightSleepTimeLabel_->SetText("浅睡");\r
+    lightSleepTimeLabel_->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+    lightSleepTimeLabel_->SetTextColor(Color::White());\r
+    lightSleepTimeLabel_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SLEEPDETAIL_SOBERINGTIME_FONT_SIZE);\r
+    lightSleepTimeLabel_->SetAlign(TEXT_ALIGNMENT_LEFT, TEXT_ALIGNMENT_CENTER);\r
+    group_->Add(lightSleepTimeLabel_);\r
+}\r
+\r
+void SleepDetailsPage::InitDeepSleepTime()\r
+{\r
+    bluePointImg_ = new UIImageView();\r
+    if (bluePointImg_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "bluePointImg_ is nullptr");\r
+        return;\r
+    }\r
+    bluePointImg_->SetPosition(SLEEPDETAIL_IMAGE1_X, SLEEPDETAIL_IMAGE4_Y);\r
+    LOADIMG::LoadImageViewImg(bluePointImg_, SLEEP_IMAGE, IMAGE_SLEEP_BLUE_CIR);\r
+    group_->Add(bluePointImg_);\r
+\r
+    deepSleepTimeLabel_ = new UILabel();\r
+    if (deepSleepTimeLabel_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "deepSleepTimeLabel_ is nullptr");\r
+        return;\r
+    }\r
+    deepSleepTimeLabel_->SetPosition(SLEEPDETAIL_SOBERINGTIME_X, SLEEPDETAIL_DEEP_Y);\r
+    deepSleepTimeLabel_->Resize(SLEEPDETAIL_SOBERINGTIME_WIDTH, SLEEPDETAIL_SOBERINGTIME_HEIGHT);\r
+    deepSleepTimeLabel_->SetText("深睡");\r
+    deepSleepTimeLabel_->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+    deepSleepTimeLabel_->SetTextColor(Color::White());\r
+    deepSleepTimeLabel_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SLEEPDETAIL_SOBERINGTIME_FONT_SIZE);\r
+    deepSleepTimeLabel_->SetAlign(TEXT_ALIGNMENT_LEFT, TEXT_ALIGNMENT_CENTER);\r
+    group_->Add(deepSleepTimeLabel_);\r
+}\r
+\r
+void SleepDetailsPage::InitPage()\r
+{\r
+    grayBgImg_ = new UIImageView();\r
+    if (grayBgImg_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "grayBgImg_ is nullptr");\r
+        return;\r
+    }\r
+    grayBgImg_->SetPosition(SLEEPDETAIL_GRAYBG_X, SLEEPDETAIL_GRAYBG_Y);\r
+    LOADIMG::LoadImageViewImg(grayBgImg_, SLEEP_IMAGE, IMAGE_SLEEP_RECORD_BG);\r
+    group_->Add(grayBgImg_);\r
+\r
+    // 加载详情四项\r
+    InitSoberingTime();\r
+    InitRapidEyeMovement();\r
+    InitLightSleepTime();\r
+    InitDeepSleepTime();\r
+}\r
+\r
+void SleepDetailsPage::LoadDeatilActualSleepTime()\r
+{\r
+    actualSleepTimeHoursLabel_ = new UILabel();\r
+    if (actualSleepTimeHoursLabel_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "actualSleepTimeHoursLabel_ is nullptr");\r
+        return;\r
+    }\r
+    actualSleepTimeHoursLabel_->SetPosition(SLEEPDETAIL_ACTUALHOUR_X, SLEEPDETAIL_ACTUALHOUR_Y);\r
+    actualSleepTimeHoursLabel_->Resize(SLEEPDETAIL_ACTUALSLEEPTIMINUTES_HEIGHT, SLEEPDETAIL_ACTUALSLEEPTIMINUTES_HEIGHT);\r
+    actualSleepTimeHoursLabel_->SetTextColor(Color::White());\r
+    actualSleepTimeHoursLabel_->SetFont(BOLD_VECTOR_FONT_FILENAME, SLEEPDETAIL_ACTUALSLEEPTIMEHOURS_FONT_SIZE);\r
+    group_->Add(actualSleepTimeHoursLabel_);\r
+\r
+    actualSleepTimeHoursUnitLabel_ = new UILabel();\r
+    if (actualSleepTimeHoursUnitLabel_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "actualSleepTimeHoursUnitLabel_ is nullptr");\r
+        return;\r
+    }\r
+    actualSleepTimeHoursUnitLabel_->SetText("小时");\r
+    actualSleepTimeHoursUnitLabel_->SetPosition(SLEEPDETAIL_ACTUALHOURTEXT_X, SLEEPDETAIL_ACTUALHOUR_Y);\r
+    actualSleepTimeHoursUnitLabel_->Resize(SLEEPDETAIL_SOBERINGTIME_WIDTH, SLEEPDETAIL_SOBERINGTIME_HEIGHT);\r
+    actualSleepTimeHoursUnitLabel_->SetTextColor(Color::White());\r
+    actualSleepTimeHoursUnitLabel_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SLEEPDETAIL_SOBERINGTIME_FONT_SIZE);\r
+    group_->Add(actualSleepTimeHoursUnitLabel_);\r
+\r
+    actualSleepTimeMinutesLabel_ = new UILabel();\r
+    if (actualSleepTimeMinutesLabel_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "actualSleepTimeMinutesLabel_ is nullptr");\r
+        return;\r
+    }\r
+\r
+    actualSleepTimeMinutesLabel_->SetPosition(SLEEPDETAIL_ACTUALMINUTE_X, SLEEPDETAIL_ACTUALHOUR_Y);\r
+    actualSleepTimeMinutesLabel_->Resize(SLEEPDETAIL_RAPID_WIDTH, SLEEPDETAIL_ACTUALSLEEPTIMINUTES_HEIGHT);\r
+    actualSleepTimeMinutesLabel_->SetTextColor(Color::White());\r
+    actualSleepTimeMinutesLabel_->SetFont(BOLD_VECTOR_FONT_FILENAME, SLEEPDETAIL_ACTUALSLEEPTIMINUTES_FONT_SIZE);\r
+    group_->Add(actualSleepTimeMinutesLabel_);\r
+\r
+    actualSleepTimeMinutesUnitLabel_ = new UILabel();\r
+    if (actualSleepTimeMinutesUnitLabel_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "actualSleepTimeHoursLabel_ is nullptr");\r
+        return;\r
+    }\r
+\r
+    actualSleepTimeMinutesUnitLabel_->SetText("分钟");\r
+    actualSleepTimeMinutesUnitLabel_->SetPosition(SLEEPDETAIL_ACTUALMINUTETEXT_X, SLEEPDETAIL_ACTUALMINUTE_Y);\r
+    actualSleepTimeMinutesUnitLabel_->Resize(SLEEPDETAIL_SOBERINGTIME_WIDTH, SLEEPDETAIL_SOBERINGTIME_HEIGHT);\r
+    actualSleepTimeMinutesUnitLabel_->SetTextColor(Color::White());\r
+    actualSleepTimeMinutesUnitLabel_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SLEEPDETAIL_SOBERINGTIME_FONT_SIZE);\r
+    group_->Add(actualSleepTimeMinutesUnitLabel_);\r
+}\r
+\r
+void SleepDetailsPage::InitActualSleepTime(std::tuple<uint32_t, uint32_t> timeTuple)\r
+{\r
+    LoadDeatilActualSleepTime();\r
+    uint32_t hours = std::get<0>(timeTuple);\r
+    uint32_t minutes = std::get<1>(timeTuple);\r
+    actualSleepTimeHoursLabel_->SetText(std::to_string(hours).c_str());\r
+    actualSleepTimeMinutesLabel_->SetText(std::to_string(minutes).c_str());\r
+}\r
+\r
+void SleepDetailsPage::InitDetailPage()\r
+{\r
+    InitActualSleepTime(SleepModel::GetInstance().GetSleepTime());\r
+\r
+    soberingTimeUnitLabel_ = new UILabel();\r
+    if (soberingTimeUnitLabel_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "soberingTimeUnitLabel_ is nullptr");\r
+        return;\r
+    }\r
+    soberingTimeUnitLabel_->SetText((SetTimeUnit(SleepModel::GetInstance().GetSoberingTime())).c_str());\r
+    soberingTimeUnitLabel_->SetPosition(SLEEPDETAIL_SOBERINGTEXT_X, SLEEPDETAIL_SOBERINGTIME_Y);\r
+    soberingTimeUnitLabel_->Resize(SLEEPDETAIL_LABEL_WIDTH, SLEEPDETAIL_RAPID_HEIGHT);\r
+    soberingTimeUnitLabel_->SetTextColor(Color::White());\r
+    soberingTimeUnitLabel_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SLEEPDETAIL_SOBERINGTIME_FONT_SIZE);\r
+    soberingTimeUnitLabel_->SetAlign(TEXT_ALIGNMENT_RIGHT, TEXT_ALIGNMENT_CENTER);\r
+    soberingTimeUnitLabel_->SetStyle(STYLE_PADDING_RIGHT, SLEEPDETAIL_PADDING_RIGHT);\r
+    group_->Add(soberingTimeUnitLabel_);\r
+\r
+    rapidEyeMovementUnitLabel_ = new UILabel();\r
+    if (rapidEyeMovementUnitLabel_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "rapidEyeMovementUnitLabel_ is nullptr");\r
+        return;\r
+    }\r
+    rapidEyeMovementUnitLabel_->SetText((SetTimeUnit(SleepModel::GetInstance().GetRapidEyeMovementTime())).c_str());\r
+    rapidEyeMovementUnitLabel_->SetPosition(SLEEPDETAIL_SOBERINGTEXT_X, SLEEPDETAIL_RAPID_Y);\r
+    rapidEyeMovementUnitLabel_->Resize(SLEEPDETAIL_LABEL_WIDTH, SLEEPDETAIL_RAPID_HEIGHT);\r
+    rapidEyeMovementUnitLabel_->SetTextColor(Color::White());\r
+    rapidEyeMovementUnitLabel_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SLEEPDETAIL_SOBERINGTIME_FONT_SIZE);\r
+    rapidEyeMovementUnitLabel_->SetAlign(TEXT_ALIGNMENT_RIGHT, TEXT_ALIGNMENT_CENTER);\r
+    rapidEyeMovementUnitLabel_->SetStyle(STYLE_PADDING_RIGHT, SLEEPDETAIL_PADDING_RIGHT);\r
+    group_->Add(rapidEyeMovementUnitLabel_);\r
+\r
+    lightSleepTimeUnitLabel_ = new UILabel();\r
+    if (lightSleepTimeUnitLabel_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "lightSleepTimeUnitLabel_ is nullptr");\r
+        return;\r
+    }\r
+    lightSleepTimeUnitLabel_->SetText((SetTimeUnit(SleepModel::GetInstance().GetLightSleepTime())).c_str());\r
+    lightSleepTimeUnitLabel_->SetPosition(SLEEPDETAIL_SOBERINGTEXT_X, SLEEPDETAIL_LIGHT_Y);\r
+    lightSleepTimeUnitLabel_->Resize(SLEEPDETAIL_LABEL_WIDTH, SLEEPDETAIL_RAPID_HEIGHT);\r
+    lightSleepTimeUnitLabel_->SetTextColor(Color::White());\r
+    lightSleepTimeUnitLabel_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SLEEPDETAIL_SOBERINGTIME_FONT_SIZE);\r
+    lightSleepTimeUnitLabel_->SetAlign(TEXT_ALIGNMENT_RIGHT, TEXT_ALIGNMENT_CENTER);\r
+    lightSleepTimeUnitLabel_->SetStyle(STYLE_PADDING_RIGHT, SLEEPDETAIL_PADDING_RIGHT);\r
+    group_->Add(lightSleepTimeUnitLabel_);\r
+\r
+    deepSleepTimeUnitLabel_ = new UILabel();\r
+    if (deepSleepTimeUnitLabel_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "deepSleepTimeUnitLabel_ is nullptr");\r
+        return;\r
+    }\r
+    deepSleepTimeUnitLabel_->SetText((SetTimeUnit(SleepModel::GetInstance().GetDeepSleepTime())).c_str());\r
+    deepSleepTimeUnitLabel_->SetPosition(SLEEPDETAIL_SOBERINGTEXT_X, SLEEPDETAIL_DEEP_Y);\r
+    deepSleepTimeUnitLabel_->Resize(SLEEPDETAIL_LABEL_WIDTH, SLEEPDETAIL_RAPID_HEIGHT);\r
+    deepSleepTimeUnitLabel_->SetTextColor(Color::White());\r
+    deepSleepTimeUnitLabel_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SLEEPDETAIL_SOBERINGTIME_FONT_SIZE);\r
+    deepSleepTimeUnitLabel_->SetAlign(TEXT_ALIGNMENT_RIGHT, TEXT_ALIGNMENT_CENTER);\r
+    deepSleepTimeUnitLabel_->SetStyle(STYLE_PADDING_RIGHT, SLEEPDETAIL_PADDING_RIGHT);\r
+    group_->Add(deepSleepTimeUnitLabel_);\r
+}\r
+\r
+void SleepDetailsPage::InitNoDeatilPage()\r
+{\r
+    actualSleepNorecordTimeLabel_ = new UILabel();\r
+    if (actualSleepNorecordTimeLabel_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "actualSleepNorecordTimeLabel_ is nullptr");\r
+        return;\r
+    }\r
+    actualSleepNorecordTimeLabel_->SetText("无记录");\r
+    actualSleepNorecordTimeLabel_->SetPosition(SLEEPDETAIL_ACTUALSLEEP_NORECORD_X, SLEEPDETAIL_ACTUALSLEEP_NORECORD_Y);\r
+    actualSleepNorecordTimeLabel_->Resize(SLEEPDETAIL_ACTUAL_NORECODE_X, SLEEPDETAIL_SOBERINGTIME_WIDTH);\r
+    actualSleepNorecordTimeLabel_->SetTextColor(Color::White());\r
+    actualSleepNorecordTimeLabel_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SLEEPDETAIL_ACTUALSLEEP_FONT_SIZE);\r
+    group_->Add(actualSleepNorecordTimeLabel_);\r
+\r
+    soberingTimeUnitLabel_ = new UILabel();\r
+    if (soberingTimeUnitLabel_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "soberingTimeUnitLabel_ is nullptr");\r
+        return;\r
+    }\r
+    soberingTimeUnitLabel_->SetText("--");\r
+    soberingTimeUnitLabel_->SetPosition(SLEEPDETAIL_SOBERINGTEXT_X, SLEEPDETAIL_SOBERINGTIME_Y);\r
+    soberingTimeUnitLabel_->Resize(SLEEPDETAIL_LABEL_WIDTH, SLEEPDETAIL_RAPID_HEIGHT);\r
+    soberingTimeUnitLabel_->SetTextColor(Color::White());\r
+    soberingTimeUnitLabel_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SLEEPDETAIL_SOBERINGTIME_FONT_SIZE);\r
+    soberingTimeUnitLabel_->SetAlign(TEXT_ALIGNMENT_RIGHT, TEXT_ALIGNMENT_CENTER);\r
+    group_->Add(soberingTimeUnitLabel_);\r
+\r
+    rapidEyeMovementUnitLabel_ = new UILabel();\r
+    if (rapidEyeMovementUnitLabel_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "rapidEyeMovementUnitLabel_ is nullptr");\r
+        return;\r
+    }\r
+    rapidEyeMovementUnitLabel_->SetText("--");\r
+    rapidEyeMovementUnitLabel_->SetPosition(SLEEPDETAIL_SOBERINGTEXT_X, SLEEPDETAIL_RAPID_Y);\r
+    rapidEyeMovementUnitLabel_->Resize(SLEEPDETAIL_LABEL_WIDTH, SLEEPDETAIL_RAPID_HEIGHT);\r
+    rapidEyeMovementUnitLabel_->SetTextColor(Color::White());\r
+    rapidEyeMovementUnitLabel_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SLEEPDETAIL_SOBERINGTIME_FONT_SIZE);\r
+    rapidEyeMovementUnitLabel_->SetAlign(TEXT_ALIGNMENT_RIGHT, TEXT_ALIGNMENT_CENTER);\r
+    group_->Add(rapidEyeMovementUnitLabel_);\r
+\r
+    lightSleepTimeUnitLabel_ = new UILabel();\r
+    if (lightSleepTimeUnitLabel_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "lightSleepTimeUnitLabel_ is nullptr");\r
+        return;\r
+    }\r
+    lightSleepTimeUnitLabel_->SetText("--");\r
+    lightSleepTimeUnitLabel_->SetPosition(SLEEPDETAIL_SOBERINGTEXT_X, SLEEPDETAIL_LIGHT_Y);\r
+    lightSleepTimeUnitLabel_->Resize(SLEEPDETAIL_LABEL_WIDTH, SLEEPDETAIL_RAPID_HEIGHT);\r
+    lightSleepTimeUnitLabel_->SetTextColor(Color::White());\r
+    lightSleepTimeUnitLabel_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SLEEPDETAIL_SOBERINGTIME_FONT_SIZE);\r
+    lightSleepTimeUnitLabel_->SetAlign(TEXT_ALIGNMENT_RIGHT, TEXT_ALIGNMENT_CENTER);\r
+    group_->Add(lightSleepTimeUnitLabel_);\r
+\r
+    deepSleepTimeUnitLabel_ = new UILabel();\r
+    if (deepSleepTimeUnitLabel_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "deepSleepTimeUnitLabel_ is nullptr");\r
+        return;\r
+    }\r
+    deepSleepTimeUnitLabel_->SetText("--");\r
+    deepSleepTimeUnitLabel_->SetPosition(SLEEPDETAIL_SOBERINGTEXT_X, SLEEPDETAIL_DEEP_Y);\r
+    deepSleepTimeUnitLabel_->Resize(SLEEPDETAIL_LABEL_WIDTH, SLEEPDETAIL_RAPID_HEIGHT);\r
+    deepSleepTimeUnitLabel_->SetTextColor(Color::White());\r
+    deepSleepTimeUnitLabel_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SLEEPDETAIL_SOBERINGTIME_FONT_SIZE);\r
+    deepSleepTimeUnitLabel_->SetAlign(TEXT_ALIGNMENT_RIGHT, TEXT_ALIGNMENT_CENTER);\r
+    group_->Add(deepSleepTimeUnitLabel_);\r
+}\r
+\r
+std::string SleepDetailsPage::SetTimeUnit(std::tuple<uint32_t, uint32_t> timeTuple)\r
+{\r
+    uint32_t hours = std::get<0>(timeTuple);\r
+    uint32_t minutes = std::get<1>(timeTuple);\r
+\r
+    std::string str = "";\r
+    if ((hours == 0) && (minutes != 0)) {\r
+        str = std::to_string(minutes) + "分钟";\r
+    } else if ((hours != 0) && (minutes == 0)) {\r
+        str = std::to_string(hours) + "小时";\r
+    } else if ((hours != 0) && (minutes != 0)) {\r
+        str = std::to_string(hours) + "小时" + std::to_string(minutes) + "分钟";\r
+    } else if ((hours == 0) && (minutes == 0)) {\r
+        str = "---";\r
+    }\r
+    return str;\r
+}\r
+\r
+bool SleepDetailsPage::OnDrag(UIView &view, const DragEvent &event)\r
+{\r
+    UNUSED(view);\r
+    if (event.GetDragDirection() == DragEvent::DIRECTION_TOP_TO_BOTTOM) {\r
+        NativeAbility::GetInstance().SwitchPageInSlice(SLEEPING_PAGES::SLEEPING_MAIN_PAGE,\r
+            TransitionType::TRANSITION_INVALID, false);\r
+    } else if (event.GetDragDirection() == DragEvent::DIRECTION_BOTTOM_TO_TOP) {\r
+        if (GetRecord() == false) {\r
+            NativeAbility::GetInstance().SwitchPageInSlice(SLEEPING_PAGES::SLEEPING_TARGET_PAGE,\r
+                TransitionType::TRANSITION_INVALID, false);\r
+        }\r
+    } else if ((event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT) &&\r
+               (event.GetDeltaX() > X_DRAG_OFFSET) && (event.GetDeltaX() > (DOUBLES * MATH_ABS(event.GetDeltaY())))) {\r
+        NativeAbility::GetInstance().ChangeSliceToApplist();\r
+    }\r
+    return true;\r
+}\r
+\r
+bool SleepDetailsPage::GetRecord()\r
+{\r
+    if (SleepModel::GetInstance().GetRecord()) {\r
+        return true;\r
+    }\r
+    return false;\r
+}\r
+}\r
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/sleep/src/SleepMainPage.cpp b/code/sdk/application/wearable/evb/nativeapp/nativeui/sleep/src/SleepMainPage.cpp
new file mode 100644 (file)
index 0000000..fd9e069
--- /dev/null
@@ -0,0 +1,655 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SleepMainPage\r
+ * Created: 2025-06-05\r
+ */\r
+\r
+#include <string>\r
+#include "components/ui_list_nested.h"\r
+#include "components/ui_scroll_view_nested.h"\r
+#include "NativeAbility.h"\r
+#include "SlicePageFactory.h"\r
+#include "PageTransitionMgr.h"\r
+#include "common/image_cache_manager.h"\r
+#include "diag_service.h"\r
+#include "msg_center_device.h"\r
+#include "diag_common.h"\r
+#include "sleep/SleepTargetTime.h"\r
+#include "sleep/SleepPresenter.h"\r
+#include "sleep/SleepView.h"\r
+#include "sleep/SleepMainPage.h"\r
+\r
+namespace OHOS {\r
+static constexpr int16_t SLEEPMAIN_SLEEP_X = 97;\r
+static constexpr int16_t SLEEPMAIN_SLEEP_Y = 31;\r
+static constexpr int16_t SLEEPMAIN_SLEEP_WIDTH = 260;\r
+static constexpr int16_t SLEEPMAIN_SLEEP_HEIGHT = 53;\r
+static constexpr int16_t SLEEPMAIN_SLEEP_FONT_SIZE = 38;\r
+static constexpr int16_t SLEEPMAIN_NORECORD_X = 179;\r
+static constexpr int16_t SLEEPMAIN_NORECORD_Y = 260;\r
+static constexpr int16_t SLEEPMAIN_NORECORD_WIDTH = 96;\r
+static constexpr int16_t SLEEPMAIN_NORECORD_HEIGHT = 48;\r
+static constexpr int16_t SLEEPMAIN_NORECORD_FONT_SIZE = 32;\r
+static constexpr int16_t SLEEPMAIN_TIPS_X = 78;\r
+static constexpr int16_t SLEEPMAIN_TIPS_Y = 310;\r
+static constexpr int16_t SLEEPMAIN_TIPS_WIDTH = 300;\r
+static constexpr int16_t SLEEPMAIN_TIPS_HEIGHT = 130;\r
+static constexpr int16_t SLEEPMAIN_TIPS_FONT_SIZE = 24;\r
+static constexpr int16_t SLEEPMAIN_TIPS_FONT_SIZE_TWO = 28;\r
+static constexpr int16_t SLEEPMAIN_SCORE_X = 164;\r
+static constexpr int16_t SLEEPMAIN_SCORE_Y = 129;\r
+static constexpr int16_t SLEEPMAIN_SCORE_WIDTH = 95;\r
+static constexpr int16_t SLEEPMAIN_SCORE_HEIGHT = 65;\r
+static constexpr int16_t SLEEPMAIN_SCORE_FONT_SIZE = 56;\r
+static constexpr int16_t SLEEPMAIN_MOONNORECORD_X = 154;\r
+static constexpr int16_t SLEEPMAIN_MOONNORECORD_Y = 60;\r
+static constexpr int16_t SLEEPMAIN_SCORETEXT_FONT_SIZE = 21;\r
+static constexpr int16_t SLEEP_SCORE_THRESHOLD_1 = 20;\r
+static constexpr int16_t SLEEP_SCORE_THRESHOLD_2 = 40;\r
+static constexpr int16_t SLEEP_SCORE_THRESHOLD_3 = 60;\r
+static constexpr int16_t SLEEP_SCORE_THRESHOLD_4 = 80;\r
+static constexpr int16_t SLEEP_SCORE_THRESHOLD_5 = 100;\r
+static constexpr int16_t SLEEP_FONT_SIZE_LARGE = 40;\r
+static constexpr int16_t SLEEPMAIN_SCORETEXT_X = 265;\r
+static constexpr int16_t SLEEPMAIN_SCORETEXT_Y = 161;\r
+static constexpr int16_t SLEEP_LABEL_WIDTH = 48;\r
+static constexpr int16_t SLEEP_LABEL_HEIGHT = 29;\r
+static constexpr int16_t SLEEP_TIME_LABEL_WIDTH = 100;\r
+static constexpr int16_t SLEEP_TIME_LABEL_HEIGHT = 50;\r
+static constexpr int16_t SLEEPMAIN_SETTING_X = 280;\r
+static constexpr int16_t SLEEPMAIN_SETTING_Y = 374;\r
+static constexpr int16_t SLEEPMAIN_ACTUALMINUTE_X = 230;\r
+static constexpr int16_t SLEEPMAIN_ACTUALMINUTE_Y = 319;\r
+static constexpr int16_t SLEEPMAIN_ACTUALHOUR_X = 135;\r
+static constexpr int16_t ACTUALMINUTES_Y = 303;\r
+static constexpr int16_t SLEEPMAIN_ACTUALHOURTEXT_X = 170;\r
+static constexpr int16_t SLEEPDETAIL_ACTUALSLEEPTIMEHOURS_FONT_SIZE = 32;\r
+static constexpr int16_t SLEEPMAIN_HEIGHT = 50;\r
+static constexpr int16_t SLEEPMAIN_ACTUALMINUTETEXT_X = 280;\r
+static constexpr int16_t SLEEPMAIN_CIR_HIGHT = 444;\r
+static constexpr int16_t SLEEPMAIN_CIR_X = 228;\r
+static constexpr int16_t SLEEPMAIN_CIR_Y = 228;\r
+static constexpr int16_t SLEEPMAIN_CIR_RADIUS = 215;\r
+static constexpr int16_t SLEEPMAIN_CIR_ANGLE = 360;\r
+static constexpr int16_t SLEEPMAIN_CIR_RANGE = 100;\r
+static constexpr int16_t SLEEPMAIN_CIR_LINE_WIDTH = 10;\r
+static constexpr int16_t SLEEPMAIN_SCORE = 100;\r
+static constexpr int16_t SLEEPMAIN_RATE = 100;\r
+static constexpr float MINUTE_HOUR = 60.0f;\r
+static constexpr int16_t TARGETTIME_LABEL_Y = 363;\r
+static constexpr int16_t TARGETTIMEBUTTON_X = 137;\r
+static constexpr int16_t TARGETTIME_LABEL_WIDTH = 184;\r
+static constexpr int16_t TARGETTIME_LABEL_HEIGHT = 46;\r
+static constexpr int16_t MAIN_SLEEP_COLOR_R = 181;\r
+static constexpr int16_t MAIN_SLEEP_COLOR_G = 402;\r
+static constexpr int16_t MAIN_SLEEP_COLOR_B = 255;\r
+static constexpr int16_t MAIN_SLEEP_OPT = 110;\r
+static constexpr int16_t MAIN_SLEEP_RANGE = 10;\r
+static constexpr int16_t MAIN_SLEEP_POSX_2 = 2;\r
+static constexpr int16_t MAIN_SLEEP_POSX_3 = 3;\r
+static constexpr int16_t MAIN_SLEEP_POSX_4 = 4;\r
+static constexpr int16_t MAIN_SLEEP_MOON_POSX = 198;\r
+static constexpr int16_t MAIN_SLEEP_SCORE_HEIGHT = 192;\r
+static constexpr int16_t MAIN_SLEEP_SCORE_X = 131;\r
+static constexpr int16_t MAIN_SLEEP_SCORE_Y = 200;\r
+static constexpr int16_t MAIN_SLEEP_STAR1_X = 145;\r
+static constexpr int16_t MAIN_SLEEP_STAR2_X = 180;\r
+static constexpr int16_t MAIN_SLEEP_STAR3_X = 215;\r
+static constexpr int16_t MAIN_SLEEP_STAR4_X = 250;\r
+static constexpr int16_t MAIN_SLEEP_STAR5_X = 285;\r
+static constexpr int16_t MAIN_SLEEP_STAR_Y = 255;\r
+static constexpr int16_t MAIN_SLEEP_SCORE_TEXT_FONT_SIZE = 55;\r
+static constexpr int16_t MAIN_SLEEP_STAR_NUM = 5;\r
+static constexpr int16_t SLEEP_MOON_NO_RECORD_X = 128;\r
+static constexpr char *TARGET_TIME = "targetTime";\r
+static constexpr int16_t g_posX[MAIN_SLEEP_STAR_NUM] = {MAIN_SLEEP_STAR1_X, MAIN_SLEEP_STAR2_X, MAIN_SLEEP_STAR3_X, MAIN_SLEEP_STAR4_X,\r
+                                 MAIN_SLEEP_STAR5_X};\r
+static constexpr int16_t g_posY = MAIN_SLEEP_STAR_Y;\r
+\r
+REGIST_SLICE_PAGE(VIEW_SLEEPING, SLEEPING_PAGES::SLEEPING_MAIN_PAGE, SleepMainPage, true);\r
+\r
+SleepMainPage::SleepMainPage()\r
+{\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SleepMainPage::SleepMainPage");\r
+}\r
+\r
+SleepMainPage::~SleepMainPage()\r
+{\r
+    if (group_ != nullptr) {\r
+        group_->RemoveAll();\r
+        delete group_;\r
+        group_ = nullptr;\r
+    }\r
+\r
+    if (imageViewMain_ != nullptr) {\r
+        delete imageViewMain_;\r
+        imageViewMain_ = nullptr;\r
+    }\r
+\r
+    if (sleepTitleLabel_ != nullptr) {\r
+        delete sleepTitleLabel_;\r
+        sleepTitleLabel_ = nullptr;\r
+    }\r
+\r
+    if (moonNoRecordImg_ != nullptr) {\r
+        delete moonNoRecordImg_;\r
+        moonNoRecordImg_ = nullptr;\r
+    }\r
+\r
+    if (moonImg_ != nullptr) {\r
+        delete moonImg_;\r
+        moonImg_ = nullptr;\r
+    }\r
+\r
+    if (noRecordLabel_ != nullptr) {\r
+        delete noRecordLabel_;\r
+        noRecordLabel_ = nullptr;\r
+    }\r
+\r
+    if (tipsLabel_ != nullptr) {\r
+        delete tipsLabel_;\r
+        tipsLabel_ = nullptr;\r
+    }\r
+\r
+    if (sleepScoresLabel_ != nullptr) {\r
+        delete sleepScoresLabel_;\r
+        sleepScoresLabel_ = nullptr;\r
+    }\r
+\r
+    if (scoreUnitLabel_ != nullptr) {\r
+        delete scoreUnitLabel_;\r
+        scoreUnitLabel_ = nullptr;\r
+    }\r
+\r
+    if (sleepScoreTextLabel_ != nullptr) {\r
+        delete sleepScoreTextLabel_;\r
+        sleepScoreTextLabel_ = nullptr;\r
+    }\r
+\r
+    if (scoreStarImg1_ != nullptr) {\r
+        delete scoreStarImg1_;\r
+        scoreStarImg1_ = nullptr;\r
+    }\r
+\r
+    if (scoreStarImg2_ != nullptr) {\r
+        delete scoreStarImg2_;\r
+        scoreStarImg2_ = nullptr;\r
+    }\r
+\r
+    if (scoreStarImg3_ != nullptr) {\r
+        delete scoreStarImg3_;\r
+        scoreStarImg3_ = nullptr;\r
+    }\r
+    if (scoreStarImg4_ != nullptr) {\r
+        delete scoreStarImg4_;\r
+        scoreStarImg4_ = nullptr;\r
+    }\r
+\r
+    if (scoreStarImg5_ != nullptr) {\r
+        delete scoreStarImg5_;\r
+        scoreStarImg5_ = nullptr;\r
+    }\r
+\r
+    if (settingImg_ != nullptr) {\r
+        delete settingImg_;\r
+        settingImg_ = nullptr;\r
+    }\r
+\r
+    if (targetTimeLabel_ != nullptr) {\r
+        delete targetTimeLabel_;\r
+        targetTimeLabel_ = nullptr;\r
+    }\r
+\r
+    if (targetSleepTimeHoursLabel_ != nullptr) {\r
+        delete targetSleepTimeHoursLabel_;\r
+        targetSleepTimeHoursLabel_ = nullptr;\r
+    }\r
+\r
+    if (targetSleepTimeHoursUnitLabel_ != nullptr) {\r
+        delete targetSleepTimeHoursUnitLabel_;\r
+        targetSleepTimeHoursUnitLabel_ = nullptr;\r
+    }\r
+\r
+    if (targetSleepTimeMinutesLabel_ != nullptr) {\r
+        delete targetSleepTimeMinutesLabel_;\r
+        targetSleepTimeMinutesLabel_ = nullptr;\r
+    }\r
+\r
+    if (targetSleepTimeMinutesUnitLabel_ != nullptr) {\r
+        delete targetSleepTimeMinutesUnitLabel_;\r
+        targetSleepTimeMinutesUnitLabel_ = nullptr;\r
+    }\r
+\r
+    if (targetTimeButton_ != nullptr) {\r
+        delete targetTimeButton_;\r
+        targetTimeButton_ = nullptr;\r
+    }\r
+\r
+    if (circleProgress_ != nullptr) {\r
+        delete circleProgress_;\r
+        circleProgress_ = nullptr;\r
+    }\r
+    ImageCacheManager::GetInstance().UnloadAllInMultiRes(SLEEP_IMAGE);\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SleepMainPage::~SleepMainPage");\r
+}\r
+\r
+void SleepMainPage::OnStart(void *data)\r
+{\r
+    group_ = new UIScrollView();\r
+    if (group_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "group_ is nullptr");\r
+        return;\r
+    }\r
+    group_->SetPosition(0, 0);\r
+    group_->Resize(RESOLUTION_WIDTH, RESOLUTION_HEIGHT);\r
+    group_->SetViewId("sleepMain");\r
+\r
+    imageViewMain_ = new UIImageView();\r
+    if (imageViewMain_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "imageViewMain_ is nullptr");\r
+        return;\r
+    }\r
+    LOADIMG::LoadImageViewImg(imageViewMain_, SLEEP_IMAGE, IMAGE_SLEEP_BACKGROUND);\r
+    imageViewMain_->SetPosition(0, 0, RESOLUTION_WIDTH, RESOLUTION_HEIGHT);\r
+    group_->Add(imageViewMain_);\r
+\r
+    if (GetRecord() == false) {\r
+        InitNoRecordPage();\r
+    } else {\r
+        InitRecordPage();\r
+    }\r
+\r
+    group_->SetOnDragListener(this);\r
+    group_->SetDraggable(true);\r
+    group_->SetTouchable(true);\r
+    AddViewToPageContainer(group_);\r
+}\r
+\r
+void SleepMainPage::InitNoRecordPage()\r
+{\r
+    sleepTitleLabel_ = new UILabel();\r
+    if (sleepTitleLabel_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "sleepTitleLabel_ is nullptr");\r
+        return;\r
+    }\r
+    sleepTitleLabel_->SetPosition(SLEEPMAIN_SLEEP_X, SLEEPMAIN_SLEEP_Y);\r
+    sleepTitleLabel_->Resize(SLEEPMAIN_SLEEP_WIDTH, SLEEPMAIN_SLEEP_HEIGHT);\r
+    sleepTitleLabel_->SetText("睡眠");\r
+    sleepTitleLabel_->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+    sleepTitleLabel_->SetTextColor(Color::White());\r
+    sleepTitleLabel_->SetFont(BOLD_VECTOR_FONT_FILENAME, SLEEPMAIN_SLEEP_FONT_SIZE);\r
+    sleepTitleLabel_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+    group_->Add(sleepTitleLabel_);\r
+\r
+    moonNoRecordImg_ = new UIImageView();\r
+    if (moonNoRecordImg_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "moonNoRecordImg_ is nullptr");\r
+        return;\r
+    }\r
+    LOADIMG::LoadImageViewImg(moonNoRecordImg_, SLEEP_IMAGE, IMAGE_SLEEP_NORECORD_SLEEP);\r
+    moonNoRecordImg_->SetPosition(SLEEP_MOON_NO_RECORD_X, SLEEPMAIN_MOONNORECORD_Y);\r
+    group_->Add(moonNoRecordImg_);\r
+\r
+    noRecordLabel_ = new UILabel();\r
+    if (noRecordLabel_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "noRecordLabel_ is nullptr");\r
+        return;\r
+    }\r
+    noRecordLabel_->SetPosition(SLEEPMAIN_NORECORD_X, SLEEPMAIN_NORECORD_Y);\r
+    noRecordLabel_->Resize(SLEEPMAIN_NORECORD_WIDTH, SLEEPMAIN_NORECORD_HEIGHT);\r
+    noRecordLabel_->SetText("无记录");\r
+    noRecordLabel_->SetTextColor(Color::White());\r
+    noRecordLabel_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SLEEPMAIN_NORECORD_FONT_SIZE);\r
+    noRecordLabel_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+    group_->Add(noRecordLabel_);\r
+\r
+    tipsLabel_ = new UILabel();\r
+    if (tipsLabel_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "tipsLabel_ is nullptr");\r
+        return;\r
+    }\r
+    tipsLabel_->SetPosition(SLEEPMAIN_TIPS_X, SLEEPMAIN_TIPS_Y);\r
+    tipsLabel_->Resize(SLEEPMAIN_TIPS_WIDTH, SLEEPMAIN_TIPS_HEIGHT);\r
+    tipsLabel_->SetText("睡眠时间过短或睡眠中动作幅度大,手表可能检测不到睡眠");\r
+    tipsLabel_->SetTextColor(Color::White());\r
+    tipsLabel_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SLEEPMAIN_TIPS_FONT_SIZE_TWO);\r
+    tipsLabel_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+    group_->Add(tipsLabel_);\r
+}\r
+\r
+void SleepMainPage::InitRecordPage()\r
+{\r
+    SleepModel::GetInstance().SendData();\r
+    InitCircleProgress();\r
+    moonImg_ = new UIImageView();\r
+    if (moonImg_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "moonImg_ is nullptr");\r
+        return;\r
+    }\r
+    moonImg_->SetPosition(MAIN_SLEEP_MOON_POSX, TARGETTIME_LABEL_HEIGHT);\r
+    LOADIMG::LoadImageViewImg(moonImg_, SLEEP_IMAGE, IMAGE_SLEEP_RECORD_SLEEP);\r
+    group_->Add(moonImg_);\r
+\r
+    sleepScoresLabel_ = new UILabel();\r
+    if (sleepScoresLabel_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "sleepScoresLabel_ is nullptr");\r
+        return;\r
+    }\r
+    sleepScoresLabel_->SetText(std::to_string(GetSleepingScores()).c_str());\r
+    sleepScoresLabel_->SetPosition(SLEEPMAIN_SCORE_X, SLEEPMAIN_SCORE_Y);\r
+    sleepScoresLabel_->Resize(SLEEPMAIN_SCORE_WIDTH, SLEEPMAIN_SCORE_HEIGHT);\r
+    sleepScoresLabel_->SetTextColor(Color::White());\r
+    sleepScoresLabel_->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+    sleepScoresLabel_->SetFont(BOLD_VECTOR_FONT_FILENAME, SLEEPMAIN_SCORE_FONT_SIZE);\r
+    sleepScoresLabel_->SetAlign(TEXT_ALIGNMENT_RIGHT, TEXT_ALIGNMENT_CENTER);\r
+    group_->Add(sleepScoresLabel_);\r
+\r
+    scoreUnitLabel_ = new UILabel();\r
+    if (scoreUnitLabel_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "scoreUnitLabel_ is nullptr");\r
+        return;\r
+    }\r
+    scoreUnitLabel_->SetText("分");\r
+    scoreUnitLabel_->SetPosition(SLEEPMAIN_SCORETEXT_X, SLEEPMAIN_SCORETEXT_Y);\r
+    scoreUnitLabel_->Resize(MAIN_SLEEP_SCORE_TEXT_FONT_SIZE, SLEEPMAIN_TIPS_FONT_SIZE);\r
+    scoreUnitLabel_->SetTextColor(Color::White());\r
+    scoreUnitLabel_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SLEEPMAIN_SCORETEXT_FONT_SIZE);\r
+    group_->Add(scoreUnitLabel_);\r
+    ScoreDisplay();\r
+\r
+    sleepScoreTextLabel_ = new UILabel();\r
+    if (sleepScoreTextLabel_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "sleepScoreTextLabel_ is nullptr");\r
+        return;\r
+    }\r
+    sleepScoreTextLabel_->SetText("夜间睡眠得分");\r
+    sleepScoreTextLabel_->Resize(MAIN_SLEEP_SCORE_HEIGHT, SLEEPMAIN_NORECORD_HEIGHT);\r
+    sleepScoreTextLabel_->SetPosition(MAIN_SLEEP_SCORE_X, MAIN_SLEEP_SCORE_Y);\r
+    sleepScoreTextLabel_->SetTextColor(Color::White());\r
+    sleepScoreTextLabel_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SLEEPDETAIL_ACTUALSLEEPTIMEHOURS_FONT_SIZE);\r
+    group_->Add(sleepScoreTextLabel_);\r
+\r
+    // 显示具体睡觉时间\r
+    LoadActualSleepTime(SleepModel::GetInstance().GetSleepTime());\r
+\r
+    // 加载目标按钮\r
+    LoadTargetTimeButton(SleepModel::GetInstance().GetTargetTime());\r
+}\r
+\r
+void SleepMainPage::InitScoreDisplayPicture()\r
+{\r
+    scoreStarImg1_ = new UIImageView();\r
+    if (scoreStarImg1_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "scoreStarImg1_ is nullptr");\r
+        return;\r
+    }\r
+    scoreStarImg1_->SetPosition(g_posX[0], g_posY);\r
+    group_->Add(scoreStarImg1_);\r
+\r
+    scoreStarImg2_ = new UIImageView();\r
+    if (scoreStarImg2_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "scoreStarImg2_ is nullptr");\r
+        return;\r
+    }\r
+    scoreStarImg2_->SetPosition(g_posX[1], g_posY);\r
+    group_->Add(scoreStarImg2_);\r
+\r
+    scoreStarImg3_ = new UIImageView();\r
+    if (scoreStarImg3_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "scoreStarImg3_ is nullptr");\r
+        return;\r
+    }\r
+    scoreStarImg3_->SetPosition(g_posX[MAIN_SLEEP_POSX_2], g_posY);\r
+    group_->Add(scoreStarImg3_);\r
+\r
+    scoreStarImg4_ = new UIImageView();\r
+    if (scoreStarImg4_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "scoreStarImg4_ is nullptr");\r
+        return;\r
+    }\r
+    scoreStarImg4_->SetPosition(g_posX[MAIN_SLEEP_POSX_3], g_posY);\r
+    group_->Add(scoreStarImg4_);\r
+\r
+    scoreStarImg5_ = new UIImageView();\r
+    if (scoreStarImg5_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "scoreStarImg5_ is nullptr");\r
+        return;\r
+    }\r
+    scoreStarImg5_->SetPosition(g_posX[MAIN_SLEEP_POSX_4], g_posY);\r
+    group_->Add(scoreStarImg5_);\r
+}\r
+\r
+void SleepMainPage::ScoreDisplay()\r
+{\r
+    InitScoreDisplayPicture();\r
+    if (GetSleepingScores() < SLEEP_SCORE_THRESHOLD_1) {\r
+        LOADIMG::LoadImageViewImg(scoreStarImg1_, SLEEP_IMAGE, IMAGE_SLEEP_STAR_GRAY);\r
+        LOADIMG::LoadImageViewImg(scoreStarImg2_, SLEEP_IMAGE, IMAGE_SLEEP_STAR_GRAY);\r
+        LOADIMG::LoadImageViewImg(scoreStarImg3_, SLEEP_IMAGE, IMAGE_SLEEP_STAR_GRAY);\r
+        LOADIMG::LoadImageViewImg(scoreStarImg4_, SLEEP_IMAGE, IMAGE_SLEEP_STAR_GRAY);\r
+        LOADIMG::LoadImageViewImg(scoreStarImg5_, SLEEP_IMAGE, IMAGE_SLEEP_STAR_GRAY);\r
+    } else if (GetSleepingScores() >= SLEEP_SCORE_THRESHOLD_1 && GetSleepingScores() < SLEEP_SCORE_THRESHOLD_2) {\r
+        LOADIMG::LoadImageViewImg(scoreStarImg1_, SLEEP_IMAGE, IMAGE_SLEEP_STAR_YELLOW);\r
+        LOADIMG::LoadImageViewImg(scoreStarImg2_, SLEEP_IMAGE, IMAGE_SLEEP_STAR_GRAY);\r
+        LOADIMG::LoadImageViewImg(scoreStarImg3_, SLEEP_IMAGE, IMAGE_SLEEP_STAR_GRAY);\r
+        LOADIMG::LoadImageViewImg(scoreStarImg4_, SLEEP_IMAGE, IMAGE_SLEEP_STAR_GRAY);\r
+        LOADIMG::LoadImageViewImg(scoreStarImg5_, SLEEP_IMAGE, IMAGE_SLEEP_STAR_GRAY);\r
+    } else if (GetSleepingScores() >= SLEEP_SCORE_THRESHOLD_2 && GetSleepingScores() < SLEEP_SCORE_THRESHOLD_3) {\r
+        LOADIMG::LoadImageViewImg(scoreStarImg1_, SLEEP_IMAGE, IMAGE_SLEEP_STAR_YELLOW);\r
+        LOADIMG::LoadImageViewImg(scoreStarImg2_, SLEEP_IMAGE, IMAGE_SLEEP_STAR_YELLOW);\r
+        LOADIMG::LoadImageViewImg(scoreStarImg3_, SLEEP_IMAGE, IMAGE_SLEEP_STAR_GRAY);\r
+        LOADIMG::LoadImageViewImg(scoreStarImg4_, SLEEP_IMAGE, IMAGE_SLEEP_STAR_GRAY);\r
+        LOADIMG::LoadImageViewImg(scoreStarImg5_, SLEEP_IMAGE, IMAGE_SLEEP_STAR_GRAY);\r
+    } else if (GetSleepingScores() >= SLEEP_SCORE_THRESHOLD_3 && GetSleepingScores() < SLEEP_SCORE_THRESHOLD_4) {\r
+        LOADIMG::LoadImageViewImg(scoreStarImg1_, SLEEP_IMAGE, IMAGE_SLEEP_STAR_YELLOW);\r
+        LOADIMG::LoadImageViewImg(scoreStarImg2_, SLEEP_IMAGE, IMAGE_SLEEP_STAR_YELLOW);\r
+        LOADIMG::LoadImageViewImg(scoreStarImg3_, SLEEP_IMAGE, IMAGE_SLEEP_STAR_YELLOW);\r
+        LOADIMG::LoadImageViewImg(scoreStarImg4_, SLEEP_IMAGE, IMAGE_SLEEP_STAR_GRAY);\r
+        LOADIMG::LoadImageViewImg(scoreStarImg5_, SLEEP_IMAGE, IMAGE_SLEEP_STAR_GRAY);\r
+    } else if (GetSleepingScores() >= SLEEP_SCORE_THRESHOLD_4 && GetSleepingScores() < SLEEP_SCORE_THRESHOLD_5) {\r
+        LOADIMG::LoadImageViewImg(scoreStarImg1_, SLEEP_IMAGE, IMAGE_SLEEP_STAR_YELLOW);\r
+        LOADIMG::LoadImageViewImg(scoreStarImg2_, SLEEP_IMAGE, IMAGE_SLEEP_STAR_YELLOW);\r
+        LOADIMG::LoadImageViewImg(scoreStarImg3_, SLEEP_IMAGE, IMAGE_SLEEP_STAR_YELLOW);\r
+        LOADIMG::LoadImageViewImg(scoreStarImg4_, SLEEP_IMAGE, IMAGE_SLEEP_STAR_YELLOW);\r
+        LOADIMG::LoadImageViewImg(scoreStarImg5_, SLEEP_IMAGE, IMAGE_SLEEP_STAR_GRAY);\r
+    } else if (GetSleepingScores() == SLEEP_SCORE_THRESHOLD_5) {\r
+        LOADIMG::LoadImageViewImg(scoreStarImg1_, SLEEP_IMAGE, IMAGE_SLEEP_STAR_YELLOW);\r
+        LOADIMG::LoadImageViewImg(scoreStarImg2_, SLEEP_IMAGE, IMAGE_SLEEP_STAR_YELLOW);\r
+        LOADIMG::LoadImageViewImg(scoreStarImg3_, SLEEP_IMAGE, IMAGE_SLEEP_STAR_YELLOW);\r
+        LOADIMG::LoadImageViewImg(scoreStarImg4_, SLEEP_IMAGE, IMAGE_SLEEP_STAR_YELLOW);\r
+        LOADIMG::LoadImageViewImg(scoreStarImg5_, SLEEP_IMAGE, IMAGE_SLEEP_STAR_YELLOW);\r
+    }\r
+}\r
+\r
+void SleepMainPage::InitSleepTimeLabel()\r
+{\r
+    targetSleepTimeHoursLabel_ = new UILabel();\r
+    if (targetSleepTimeHoursLabel_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "targetSleepTimeHoursLabel_ is nullptr");\r
+        return;\r
+    }\r
+    targetSleepTimeHoursLabel_->SetPosition(SLEEPMAIN_ACTUALHOUR_X, ACTUALMINUTES_Y);\r
+    targetSleepTimeHoursLabel_->Resize(SLEEPMAIN_HEIGHT, SLEEPMAIN_HEIGHT);\r
+    targetSleepTimeHoursLabel_->SetTextColor(Color::White());\r
+    targetSleepTimeHoursLabel_->SetFont(BOLD_VECTOR_FONT_FILENAME, SLEEP_FONT_SIZE_LARGE);\r
+    group_->Add(targetSleepTimeHoursLabel_);\r
+\r
+    targetSleepTimeHoursUnitLabel_ = new UILabel();\r
+    if (targetSleepTimeHoursUnitLabel_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "targetSleepTimeHoursUnitLabel_ is nullptr");\r
+        return;\r
+    }\r
+    targetSleepTimeHoursUnitLabel_->SetPosition(SLEEPMAIN_ACTUALHOURTEXT_X, SLEEPMAIN_ACTUALMINUTE_Y);\r
+    targetSleepTimeHoursUnitLabel_->Resize(SLEEP_LABEL_WIDTH, SLEEP_LABEL_HEIGHT);\r
+    targetSleepTimeHoursUnitLabel_->SetTextColor(Color::White());\r
+    targetSleepTimeHoursUnitLabel_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SLEEPMAIN_TIPS_FONT_SIZE);\r
+    targetSleepTimeHoursUnitLabel_->SetText("小时");\r
+    group_->Add(targetSleepTimeHoursUnitLabel_);\r
+\r
+    targetSleepTimeMinutesLabel_ = new UILabel();\r
+    if (targetSleepTimeMinutesLabel_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "targetSleepTimeMinutesLabel_ is nullptr");\r
+        return;\r
+    }\r
+    targetSleepTimeMinutesLabel_->SetPosition(SLEEPMAIN_ACTUALMINUTE_X, ACTUALMINUTES_Y);\r
+    targetSleepTimeMinutesLabel_->Resize(SLEEP_TIME_LABEL_WIDTH, SLEEP_TIME_LABEL_HEIGHT);\r
+    targetSleepTimeMinutesLabel_->SetTextColor(Color::White());\r
+    targetSleepTimeMinutesLabel_->SetFont(BOLD_VECTOR_FONT_FILENAME, SLEEP_FONT_SIZE_LARGE);\r
+    group_->Add(targetSleepTimeMinutesLabel_);\r
+\r
+    targetSleepTimeMinutesUnitLabel_ = new UILabel();\r
+    if (targetSleepTimeMinutesUnitLabel_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "targetSleepTimeMinutesUnitLabel_ is nullptr");\r
+        return;\r
+    }\r
+    targetSleepTimeMinutesUnitLabel_->SetPosition(SLEEPMAIN_ACTUALMINUTETEXT_X, SLEEPMAIN_ACTUALMINUTE_Y);\r
+    targetSleepTimeMinutesUnitLabel_->Resize(SLEEP_LABEL_WIDTH, SLEEP_LABEL_HEIGHT);\r
+    targetSleepTimeMinutesUnitLabel_->SetTextColor(Color::White());\r
+    targetSleepTimeMinutesUnitLabel_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SLEEPMAIN_TIPS_FONT_SIZE);\r
+    targetSleepTimeMinutesUnitLabel_->SetText("分钟");\r
+    group_->Add(targetSleepTimeMinutesUnitLabel_);\r
+}\r
+\r
+void SleepMainPage::LoadTargetTimeButton(std::tuple<uint32_t, uint32_t> timeTuple)\r
+{\r
+    uint32_t hours = std::get<0>(timeTuple);\r
+    uint32_t minutes = std::get<1>(timeTuple);\r
+    std::string str = "";\r
+    if ((hours == 0) && (minutes != 0)) {\r
+        str = std::to_string(minutes) + "分钟";\r
+    } else if ((hours != 0) && (minutes == 0)) {\r
+        str = std::to_string(hours) + "小时";\r
+    } else if ((hours != 0) && (minutes != 0)) {\r
+        if (minutes < MAIN_SLEEP_RANGE && hours >= MAIN_SLEEP_RANGE) {\r
+            str = " " + std::to_string(hours) + ":0" + std::to_string(minutes);\r
+        } else if (hours < MAIN_SLEEP_RANGE && minutes >= MAIN_SLEEP_RANGE) {\r
+            str = " 0" + std::to_string(hours) + ":" + std::to_string(minutes);\r
+        } else if (minutes < MAIN_SLEEP_RANGE && hours < MAIN_SLEEP_RANGE) {\r
+            str = " 0" + std::to_string(hours) + ":0" + std::to_string(minutes);\r
+        } else if (minutes >= MAIN_SLEEP_RANGE && hours >= MAIN_SLEEP_RANGE) {\r
+            str = " " + std::to_string(hours) + ":" + std::to_string(minutes);\r
+        }\r
+    }\r
+    targetTimeButton_ = new UILabelButton();\r
+    if (targetTimeButton_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "targetTimeButton_ is nullptr");\r
+        return;\r
+    }\r
+    targetTimeButton_->SetPosition(TARGETTIMEBUTTON_X, TARGETTIME_LABEL_Y);\r
+    targetTimeButton_->SetViewId(TARGET_TIME);\r
+    targetTimeButton_->SetOnClickListener(this);\r
+    targetTimeButton_->SetStyle(\r
+        STYLE_BACKGROUND_COLOR,\r
+        Color::GetColorFromRGBA(MAIN_SLEEP_COLOR_R, MAIN_SLEEP_COLOR_G, MAIN_SLEEP_COLOR_B, MAIN_SLEEP_OPT).full);\r
+    targetTimeButton_->SetStyleForState(\r
+        STYLE_BACKGROUND_COLOR,\r
+        Color::GetColorFromRGBA(MAIN_SLEEP_COLOR_R, MAIN_SLEEP_COLOR_G, MAIN_SLEEP_COLOR_B, MAIN_SLEEP_OPT).full,\r
+        UIButton::PRESSED);\r
+    targetTimeButton_->Resize(TARGETTIME_LABEL_WIDTH, TARGETTIME_LABEL_HEIGHT);\r
+    targetTimeButton_->SetTextColor(Color::White());\r
+    targetTimeButton_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SLEEPMAIN_TIPS_FONT_SIZE);\r
+    group_->Add(targetTimeButton_);\r
+\r
+    targetTimeLabel_ = new UILabel();\r
+    if (targetTimeLabel_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "targetTimeLabel_ is nullptr");\r
+        return;\r
+    }\r
+    std::string targetUnit = "目标" + str;\r
+    targetTimeLabel_->SetText(targetUnit.c_str());\r
+    targetTimeLabel_->SetPosition(SLEEPMAIN_MOONNORECORD_X, TARGETTIME_LABEL_Y);\r
+    targetTimeLabel_->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+    targetTimeLabel_->Resize(TARGETTIME_LABEL_WIDTH, TARGETTIME_LABEL_HEIGHT);\r
+    targetTimeLabel_->SetTextColor(Color::White());\r
+    targetTimeLabel_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SLEEPMAIN_TIPS_FONT_SIZE);\r
+    targetTimeLabel_->SetAlign(TEXT_ALIGNMENT_LEFT, TEXT_ALIGNMENT_CENTER);\r
+    group_->Add(targetTimeLabel_);\r
+\r
+    settingImg_ = new UIImageView();\r
+    if (settingImg_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "settingImg_ is nullptr");\r
+        return;\r
+    }\r
+    settingImg_->SetPosition(SLEEPMAIN_SETTING_X, SLEEPMAIN_SETTING_Y);\r
+    LOADIMG::LoadImageViewImg(settingImg_, SLEEP_IMAGE, IMAGE_SLEEP_SETTING);\r
+    group_->Add(settingImg_);\r
+}\r
+\r
+void SleepMainPage::LoadActualSleepTime(std::tuple<uint32_t, uint32_t> timeTuple)\r
+{\r
+    InitSleepTimeLabel();\r
+    uint32_t hours = std::get<0>(timeTuple);\r
+    uint32_t minutes = std::get<1>(timeTuple);\r
+    targetSleepTimeHoursLabel_->SetText(std::to_string(hours).c_str());\r
+    targetSleepTimeMinutesLabel_->SetText(std::to_string(minutes).c_str());\r
+}\r
+\r
+void SleepMainPage::InitCircleProgress()\r
+{\r
+    circleProgress_ = new UICircleProgress();\r
+    if (circleProgress_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "circleProgress_ is nullptr");\r
+        return;\r
+    }\r
+    circleProgress_->SetPosition(0, 0);\r
+    circleProgress_->Resize(SLEEPMAIN_CIR_HIGHT, SLEEPMAIN_CIR_HIGHT);\r
+    circleProgress_->SetCenterPosition(SLEEPMAIN_CIR_X, SLEEPMAIN_CIR_Y);\r
+    circleProgress_->SetRadius(SLEEPMAIN_CIR_RADIUS);\r
+    circleProgress_->SetStartAngle(0);\r
+    circleProgress_->SetEndAngle(SLEEPMAIN_CIR_ANGLE);\r
+    circleProgress_->SetRange(0, SLEEPMAIN_CIR_RANGE);\r
+    circleProgress_->SetBackgroundStyle(STYLE_LINE_COLOR, 0xFF6f29a0);\r
+    circleProgress_->SetForegroundStyle(STYLE_LINE_COLOR, 0xFFB566FF);\r
+    circleProgress_->SetBackgroundStyle(STYLE_LINE_WIDTH, SLEEPMAIN_CIR_LINE_WIDTH);\r
+    circleProgress_->SetForegroundStyle(STYLE_LINE_WIDTH, SLEEPMAIN_CIR_LINE_WIDTH);\r
+    group_->Add(circleProgress_);\r
+    circleProgress_->SetValue(GetSleepingScores());\r
+    circleProgress_->Invalidate();\r
+}\r
+\r
+uint32_t SleepMainPage::GetSleepingScores()\r
+{\r
+    uint32_t hours = SleepModel::GetInstance().GetSleepTimeHours();\r
+    uint32_t minutes = SleepModel::GetInstance().GetSleepTimeMinutes();\r
+    std::tuple<uint32_t, uint32_t> timeTuple = SleepModel::GetInstance().GetTargetTime();\r
+    uint32_t timeHours = std::get<0>(timeTuple);\r
+    uint32_t timeMinutes = std::get<1>(timeTuple);\r
+    if (((hours * MINUTE_HOUR) + minutes) > ((timeHours * MINUTE_HOUR) + timeMinutes)) {\r
+        return SLEEPMAIN_SCORE;\r
+    } else {\r
+        float score = ((hours * MINUTE_HOUR) + minutes) / ((timeHours * MINUTE_HOUR) + timeMinutes);\r
+        return uint32_t(score * SLEEPMAIN_RATE);\r
+    }\r
+}\r
+\r
+bool SleepMainPage::GetRecord()\r
+{\r
+    if (SleepModel::GetInstance().GetRecord()) {\r
+        return true;\r
+    }\r
+    return false;\r
+}\r
+\r
+bool SleepMainPage::OnClick(UIView &view, const ClickEvent &event)\r
+{\r
+    UNUSED(view);\r
+    if (strcmp(view.GetViewId(), TARGET_TIME) == 0) {\r
+        NativeAbility::GetInstance().SwitchPageInSlice(SLEEPING_PAGES::SLEEPING_TARGET_PAGE,\r
+            TransitionType::TRANSITION_INVALID, false);\r
+    }\r
+    return true;\r
+}\r
+\r
+bool SleepMainPage::OnDrag(UIView &view, const DragEvent &event)\r
+{\r
+    UNUSED(view);\r
+    if ((event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT) && (event.GetDeltaX() > X_DRAG_OFFSET) &&\r
+        (event.GetDeltaX() > (DOUBLES * MATH_ABS(event.GetDeltaY())))) {\r
+        NativeAbility::GetInstance().ChangeSliceToApplist();\r
+    } else if (event.GetDragDirection() == DragEvent::DIRECTION_BOTTOM_TO_TOP) {\r
+        NativeAbility::GetInstance().SwitchPageInSlice(SLEEPING_PAGES::SLEEPING_DEATIL_PAGE,\r
+            TransitionType::TRANSITION_INVALID, false);\r
+    }\r
+    return true;\r
+}\r
+}\r
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/sleep/src/SleepModel.cpp b/code/sdk/application/wearable/evb/nativeapp/nativeui/sleep/src/SleepModel.cpp
new file mode 100644 (file)
index 0000000..2fd9530
--- /dev/null
@@ -0,0 +1,271 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SleepModel\r
+ * Created: 2025-06-05\r
+ */\r
+\r
+#include <sys/time.h>\r
+#include <ctime>\r
+#include <string>\r
+#include <cstring>\r
+#include "main/HealthModel.h"\r
+#include "uiservice/ui_service.h"\r
+#include "wearable_log.h"\r
+#include "NativeAbility.h"\r
+#include "ui_test_group.h"\r
+#include "graphic_timer.h"\r
+#include "ohos_timer.h"\r
+#include "sleep/SleepModel.h"\r
+\r
+namespace OHOS {\r
+static constexpr uint64_t SLEEPMODEL_MINUTE_HOUR = 60;\r
+static constexpr uint64_t SLEEPMODEL_HOUR = 23;\r
+static constexpr uint64_t SLEEPMODEL_MINUTE = 59;\r
+static constexpr uint64_t SLEEPMODEL_ERROR = 100;\r
+\r
+SleepModel::SleepModel() {}\r
+\r
+SleepModel::~SleepModel() {}\r
+\r
+void SleepModel::LoadData()\r
+{\r
+    if (GetRecord() == false) {\r
+        SetSleepDataVec();\r
+        SetSoberingTime();\r
+        SetRapidEyeMovementTime();\r
+        SetLightSleepTime();\r
+        SetDeepSleepTime();\r
+    }\r
+}\r
+\r
+bool SleepModel::GetRecord()\r
+{\r
+    if (sleepDataVector_.empty() == true) {\r
+        return false;\r
+    }\r
+    return true;\r
+}\r
+\r
+std::string SleepModel::GetTodayDate()\r
+{\r
+    time_t now = time(nullptr);\r
+    struct tm *timeinfo = localtime(&now);\r
+    char buffer[80];\r
+    strftime(buffer, sizeof(buffer), "%Y-%m-%d", timeinfo);\r
+    return std::string(buffer);\r
+}\r
+\r
+uint8_t *SleepModel::SerializeSleepData(const SleepData *sleepData, size_t *outSize)\r
+{\r
+    if (sleepData == nullptr) {\r
+        return nullptr;\r
+    }\r
+    size_t dataSize = sizeof(SleepData);\r
+    *outSize = dataSize;\r
+    uint8_t *buffer = new uint8_t[dataSize];\r
+    uint8_t isSendValue = sleepData->isSended ? 1 : 0;\r
+    memcpy_s(buffer, sizeof(isSendValue), &isSendValue, sizeof(isSendValue));\r
+    memcpy_s(buffer + offsetof(SleepData, date), sizeof(sleepData->date), sleepData->date, sizeof(sleepData->date));\r
+    memcpy_s(buffer + offsetof(SleepData, type), sizeof(sleepData->type), &sleepData->type, sizeof(sleepData->type));\r
+    memcpy_s(buffer + offsetof(SleepData, typeSleepStart), sizeof(sleepData->typeSleepStart), sleepData->typeSleepStart,\r
+             sizeof(sleepData->typeSleepStart));\r
+    memcpy_s(buffer + offsetof(SleepData, typeSleepEnd), sizeof(sleepData->typeSleepEnd), sleepData->typeSleepEnd,\r
+             sizeof(sleepData->typeSleepEnd));\r
+    memcpy_s(buffer + offsetof(SleepData, sleepStart), sizeof(sleepData->sleepStart), sleepData->sleepStart,\r
+             sizeof(sleepData->sleepStart));\r
+    memcpy_s(buffer + offsetof(SleepData, sleepEnd), sizeof(sleepData->sleepEnd), sleepData->sleepEnd,\r
+             sizeof(sleepData->sleepEnd));\r
+    return buffer;\r
+}\r
+\r
+void SleepModel::SendData()\r
+{\r
+    // 发送数据\r
+    size_t dataSize;\r
+    for (int i = 0; i < sleepDataVector_.size(); i++) {\r
+        if (sleepDataVector_[i].isSended == true) {\r
+            continue;\r
+        }\r
+        uint8_t *serializedData = SerializeSleepData(&sleepDataVector_[i], &dataSize);\r
+        errcode_t ret;\r
+#ifdef _WIN32\r
+        ret = 0;\r
+#else\r
+        ret = msg_center_send_data(MSGCENTER_CMD_DEVICE, MSGCENTER_TYPE_ID_SLEEP_DATA, serializedData, dataSize);\r
+        delete[] serializedData;\r
+        WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "send sleep data ret = %d", ret);\r
+        if (ret == 0) {\r
+            sleepDataVector_[i].isSended = true;\r
+        }\r
+#endif\r
+    }\r
+}\r
+\r
+// sleepDataVector打桩数据,后续需要客户适配传感器自实现\r
+void SleepModel::SetSleepDataVec()\r
+{\r
+#ifndef _WIN32\r
+    std::string today = GetTodayDate();\r
+\r
+    sleepDataVector_.push_back({false, today.c_str(), SLEEP_TYPE_DEEP, (today + " 00:00:00").c_str(),\r
+                               (today + " 00:30:00").c_str(), (today + " 00:00:00").c_str(),\r
+                               (today + " 07:50:00").c_str()});\r
+\r
+    sleepDataVector_.push_back({false, today.c_str(), SLEEP_TYPE_EYEMOVE, (today + " 00:30:00").c_str(),\r
+                               (today + " 03:00:00").c_str(), (today + " 00:00:00").c_str(),\r
+                               (today + " 07:50:00").c_str()});\r
+\r
+    sleepDataVector_.push_back({false, today.c_str(), SLEEP_TYPE_LIGHT, (today + " 03:00:00").c_str(),\r
+                               (today + " 03:30:00").c_str(), (today + " 00:00:00").c_str(),\r
+                               (today + " 07:50:00").c_str()});\r
+\r
+    sleepDataVector_.push_back({false, today.c_str(), SLEEP_TYPE_SOBER, (today + " 03:30:00").c_str(),\r
+                               (today + " 05:30:00").c_str(), (today + " 00:00:00").c_str(),\r
+                               (today + " 07:50:00").c_str()});\r
+\r
+    sleepDataVector_.push_back({false, today.c_str(), SLEEP_TYPE_LIGHT, (today + " 05:30:00").c_str(),\r
+                               (today + " 06:00:00").c_str(), (today + " 00:00:00").c_str(),\r
+                               (today + " 07:50:00").c_str()});\r
+\r
+    sleepDataVector_.push_back({false, today.c_str(), SLEEP_TYPE_EYEMOVE, (today + " 06:00:00").c_str(),\r
+                               (today + " 07:30:00").c_str(), (today + " 00:00:00").c_str(),\r
+                               (today + " 07:50:00").c_str()});\r
+\r
+    sleepDataVector_.push_back({false, today.c_str(), SLEEP_TYPE_DEEP, (today + " 07:30:00").c_str(),\r
+                               (today + " 07:50:00").c_str(), (today + " 00:00:00").c_str(),\r
+                               (today + " 07:50:00").c_str()});\r
+#endif\r
+}\r
+\r
+SleepModel &SleepModel::GetInstance()\r
+{\r
+    static SleepModel instance;\r
+    return instance;\r
+}\r
+\r
+std::tuple<uint32_t, uint32_t> SleepModel::GetSoberingTime()\r
+{\r
+    return MinutesToHours(soberingTime_);\r
+}\r
+\r
+std::tuple<uint32_t, uint32_t> SleepModel::GetRapidEyeMovementTime()\r
+{\r
+    return MinutesToHours(eyeMoveTime_);\r
+}\r
+\r
+std::tuple<uint32_t, uint32_t> SleepModel::GetLightSleepTime()\r
+{\r
+    return MinutesToHours(lightTime_);\r
+}\r
+\r
+std::tuple<uint32_t, uint32_t> SleepModel::GetDeepSleepTime()\r
+{\r
+    return MinutesToHours(deepTime_);\r
+}\r
+\r
+std::tuple<uint32_t, uint32_t> SleepModel::GetSleepTime()\r
+{\r
+    return MinutesToHours(GetTotalSleepTime());\r
+}\r
+\r
+std::tuple<uint32_t, uint32_t> SleepModel::MinutesToHours(uint32_t minutes)\r
+{\r
+    if (minutes == 0) {\r
+        return std::make_tuple(0, 0);\r
+    }\r
+    int hours = minutes / SLEEPMODEL_MINUTE_HOUR;\r
+    int remainingMinutes = minutes % SLEEPMODEL_MINUTE_HOUR;\r
+\r
+    if (hours > SLEEPMODEL_HOUR || remainingMinutes > SLEEPMODEL_MINUTE) {\r
+        return std::make_tuple(SLEEPMODEL_ERROR, 0);\r
+    }\r
+\r
+    return std::make_tuple(hours, remainingMinutes);\r
+}\r
+\r
+uint32_t SleepModel::GetSleepTimeHours()\r
+{\r
+    std::tuple<uint32_t, uint32_t> timeTuple = GetSleepTime();\r
+    return std::get<0>(timeTuple);\r
+}\r
+\r
+uint32_t SleepModel::GetSleepTimeMinutes()\r
+{\r
+    std::tuple<uint32_t, uint32_t> timeTuple = GetSleepTime();\r
+    return std::get<1>(timeTuple);\r
+}\r
+\r
+void SleepModel::SetTargetTime(uint32_t minute)\r
+{\r
+    sleepTarget_ = minute;\r
+}\r
+\r
+std::tuple<uint32_t, uint32_t> SleepModel::GetTargetTime()\r
+{\r
+    return MinutesToHours(sleepTarget_);\r
+}\r
+\r
+uint32_t SleepModel::TimeDiffInMinutes(const std::string &timeStr1, const std::string &timeStr2)\r
+{\r
+    std::tm tm1 = {};\r
+    std::tm tm2 = {};\r
+\r
+    std::istringstream iss1(timeStr1);\r
+    std::istringstream iss2(timeStr2);\r
+\r
+    iss1 >> std::get_time(&tm1, "%Y-%m-%d %H:%M:%S");\r
+    if (iss1.fail()) {\r
+        return -1;\r
+    }\r
+\r
+    iss2 >> std::get_time(&tm2, "%Y-%m-%d %H:%M:%S");\r
+    if (iss2.fail()) {\r
+        return -1;\r
+    }\r
+\r
+    std::time_t t1 = std::mktime(&tm1);\r
+    std::time_t t2 = std::mktime(&tm2);\r
+    if (t1 == -1 || t2 == -1) {\r
+        return -1;\r
+    }\r
+\r
+    double diff_seconds = std::difftime(t2, t1);\r
+    return static_cast<uint32_t>(diff_seconds / SLEEPMODEL_MINUTE_HOUR);\r
+}\r
+\r
+// 遍历vector中的结构体  获取对应类型的时间差\r
+uint32_t SleepModel::GetDetailData(int type)\r
+{\r
+    uint32_t min = 0;\r
+    for (size_t i = 0; i < sleepDataVector_.size(); ++i) {\r
+        if (sleepDataVector_[i].type == type) {\r
+            min += TimeDiffInMinutes(sleepDataVector_[i].typeSleepStart, sleepDataVector_[i].typeSleepEnd);\r
+        }\r
+    }\r
+    return min;\r
+}\r
+\r
+// 获取总睡觉时间的时间差\r
+uint32_t SleepModel::GetTotalSleepTime()\r
+{\r
+    uint32_t time = TimeDiffInMinutes(sleepDataVector_[0].sleepStart, sleepDataVector_[0].sleepEnd);\r
+    return time;\r
+}\r
+\r
+void SleepModel::SetSoberingTime()\r
+{\r
+    soberingTime_ = GetDetailData(SLEEP_TYPE_SOBER);\r
+}\r
+void SleepModel::SetRapidEyeMovementTime()\r
+{\r
+    eyeMoveTime_ = GetDetailData(SLEEP_TYPE_EYEMOVE);\r
+}\r
+void SleepModel::SetLightSleepTime()\r
+{\r
+    lightTime_ = GetDetailData(SLEEP_TYPE_LIGHT);\r
+}\r
+void SleepModel::SetDeepSleepTime()\r
+{\r
+    deepTime_ = GetDetailData(SLEEP_TYPE_DEEP);\r
+}\r
+}\r
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/sleep/src/SleepPresenter.cpp b/code/sdk/application/wearable/evb/nativeapp/nativeui/sleep/src/SleepPresenter.cpp
new file mode 100644 (file)
index 0000000..76ced78
--- /dev/null
@@ -0,0 +1,13 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SleepPresenter\r
+ * Created: 2025-06-05\r
+ */\r
+\r
+#include "NativeRegisterManager.h"\r
+#include "sleep/SleepView.h"\r
+#include "sleep/SleepPresenter.h"\r
+\r
+namespace OHOS {\r
+REGIST_MENU(VIEW_SLEEPING, SleepView, SleepPresenter, SLEEP_ICON, SLEEP_ICON, "睡眠");\r
+}
\ No newline at end of file
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/sleep/src/SleepSleepingPage.cpp b/code/sdk/application/wearable/evb/nativeapp/nativeui/sleep/src/SleepSleepingPage.cpp
new file mode 100644 (file)
index 0000000..ac17563
--- /dev/null
@@ -0,0 +1,372 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SleepSleepingPage\r
+ * Created: 2025-06-05\r
+ */\r
+\r
+#include <string>\r
+#include "components/ui_list_nested.h"\r
+#include "components/ui_scroll_view_nested.h"\r
+#include "NativeAbility.h"\r
+#include "SlicePageFactory.h"\r
+#include "PageTransitionMgr.h"\r
+#include "common/image_cache_manager.h"\r
+#include "diag_service.h"\r
+#include "msg_center_device.h"\r
+#include "diag_common.h"\r
+#include "sleep/SleepTargetTime.h"\r
+#include "sleep/SleepPresenter.h"\r
+#include "sleep/SleepView.h"\r
+#include "sleep/SleepSleepingPage.h"\r
+\r
+namespace OHOS {\r
+\r
+REGIST_SLICE_PAGE(VIEW_SLEEPING, SLEEPING_PAGES::SLEEPING_SLEEP_PAGE, SleepSleepingPage, false);\r
+\r
+static constexpr int16_t SLEEPING_SLEEP_X = 97;\r
+static constexpr int16_t SLEEPING_SLEEP_Y = 31;\r
+static constexpr int16_t SLEEPING_SLEEP_WIDTH = 260;\r
+static constexpr int16_t SLEEPING_SLEEP_HEIGHT = 53;\r
+static constexpr int16_t SLEEPING_SLEEP_FONT_SIZE = 38;\r
+static constexpr int16_t SLEEPING_NORECORD_X = 135;\r
+static constexpr int16_t SLEEPING_NORECORD_Y = 220;\r
+static constexpr int16_t SLEEPING_NORECORD_WIDTH = 200;\r
+static constexpr int16_t SLEEPING_NORECORD_HEIGHT = 48;\r
+static constexpr int16_t SLEEPING_NORECORD_FONT_SIZE = 32;\r
+static constexpr int16_t SLEEPING_TIPS_FONT_SIZE = 24;\r
+static constexpr int16_t SLEEPING_FONT_SIZE_LARGE = 40;\r
+static constexpr int16_t SLEEPING_LABEL_WIDTH = 48;\r
+static constexpr int16_t SLEEPING_LABEL_HEIGHT = 29;\r
+static constexpr int16_t SLEEPING_TIME_LABEL_WIDTH = 95;\r
+static constexpr int16_t SLEEPING_TIME_LABEL_HEIGHT = 50;\r
+static constexpr int16_t SLEEPING_ACTUALMINUTE_X = 230;\r
+static constexpr int16_t SLEEPING_ACTUALMINUTE_Y = 314;\r
+static constexpr int16_t ACTUALMINUTES_X = 180;\r
+static constexpr int16_t ACTUALMINUTES_Y = 298;\r
+static constexpr int16_t SLEEPING_HEIGHT = 50;\r
+static constexpr int16_t SLEEPING_CIR_HIGHT = 444;\r
+static constexpr int16_t SLEEPING_CIR_X = 228;\r
+static constexpr int16_t SLEEPING_CIR_Y = 228;\r
+static constexpr int16_t SLEEPING_CIR_RADIUS = 215;\r
+static constexpr int16_t SLEEPING_CIR_ANGLE = 360;\r
+static constexpr int16_t SLEEPING_CIR_LINE_WIDTH = 10;\r
+static constexpr int16_t SLEEPING_TIMETEXT_HIGHT = 95;\r
+static constexpr int16_t SLEEPING_MOON_POSX = 178;\r
+static constexpr int16_t SLEEPING_TIME_ELAPSED = 5;\r
+static constexpr int16_t SLEEPING_BG_X = 120;\r
+static constexpr int16_t SLEEPING_BG_Y = 295;\r
+static constexpr int16_t SLEEPING_TIME_MINUTE_X = 157;\r
+static constexpr int16_t SLEEPING_TIME_HOUR_X = 128;\r
+static constexpr int16_t SLEEPING_TIME_HOUR_TEXT_X = 178;\r
+static constexpr int16_t SLEEPING_TIME_MINUTE1_X = 238;\r
+static constexpr int16_t SLEEPING_TIME_MINUTE1_TEXT_X = 288;\r
+\r
+SleepSleepingPage::SleepSleepingPage()\r
+{\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SleepSleepingPage::SleepSleepingPage");\r
+}\r
+\r
+SleepSleepingPage::~SleepSleepingPage()\r
+{\r
+    if (group_ != nullptr) {\r
+        group_->RemoveAll();\r
+        delete group_;\r
+        group_ = nullptr;\r
+    }\r
+\r
+    if (bgImg_ != nullptr) {\r
+        delete bgImg_;\r
+        bgImg_ = nullptr;\r
+    }\r
+\r
+    if (sleepTitleLabel_ != nullptr) {\r
+        delete sleepTitleLabel_;\r
+        sleepTitleLabel_ = nullptr;\r
+    }\r
+\r
+    if (moonImg_ != nullptr) {\r
+        delete moonImg_;\r
+        moonImg_ = nullptr;\r
+    }\r
+\r
+    if (sleepingLabel_ != nullptr) {\r
+        delete sleepingLabel_;\r
+        sleepingLabel_ = nullptr;\r
+    }\r
+\r
+    if (sleepTimeBgImg_ != nullptr) {\r
+        delete sleepTimeBgImg_;\r
+        sleepTimeBgImg_ = nullptr;\r
+    }\r
+\r
+    if (targetSleepTimeHoursLabel_ != nullptr) {\r
+        delete targetSleepTimeHoursLabel_;\r
+        targetSleepTimeHoursLabel_ = nullptr;\r
+    }\r
+\r
+    if (targetSleepTimeHoursUnitLabel_ != nullptr) {\r
+        delete targetSleepTimeHoursUnitLabel_;\r
+        targetSleepTimeHoursUnitLabel_ = nullptr;\r
+    }\r
+\r
+    if (targetSleepTimeMinutesLabel_ != nullptr) {\r
+        delete targetSleepTimeMinutesLabel_;\r
+        targetSleepTimeMinutesLabel_ = nullptr;\r
+    }\r
+\r
+    if (targetSleepTimeMinutesUnitLabel_ != nullptr) {\r
+        delete targetSleepTimeMinutesUnitLabel_;\r
+        targetSleepTimeMinutesUnitLabel_ = nullptr;\r
+    }\r
+\r
+    if (circleProgress_ != nullptr) {\r
+        delete circleProgress_;\r
+        circleProgress_ = nullptr;\r
+    }\r
+\r
+    if (callBack_ != nullptr) {\r
+        delete callBack_;\r
+        callBack_ = nullptr;\r
+    }\r
+\r
+    if (animator_ != nullptr) {\r
+        delete animator_;\r
+        animator_ = nullptr;\r
+    }\r
+    ImageCacheManager::GetInstance().UnloadAllInMultiRes(SLEEP_IMAGE);\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SleepSleepingPage::~SleepSleepingPage");\r
+}\r
+\r
+void SleepSleepingPage::OnStart(void *data)\r
+{\r
+    group_ = new UIScrollView();\r
+    if (group_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "group_ is nullptr");\r
+        return;\r
+    }\r
+    group_->SetPosition(0, 0);\r
+    group_->Resize(RESOLUTION_WIDTH, RESOLUTION_HEIGHT);\r
+\r
+    bgImg_ = new UIImageView();\r
+    if (bgImg_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "bgImg_ is nullptr");\r
+        return;\r
+    }\r
+    LOADIMG::LoadImageViewImg(bgImg_, SLEEP_IMAGE, IMAGE_SLEEP_BACKGROUND);\r
+    bgImg_->SetPosition(0, 0, RESOLUTION_WIDTH, RESOLUTION_HEIGHT);\r
+    group_->Add(bgImg_);\r
+    sleepTitleLabel_ = new UILabel();\r
+    if (sleepTitleLabel_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "sleepTitleLabel_ is nullptr");\r
+        return;\r
+    }\r
+    sleepTitleLabel_->SetPosition(SLEEPING_SLEEP_X, SLEEPING_SLEEP_Y);\r
+    sleepTitleLabel_->Resize(SLEEPING_SLEEP_WIDTH, SLEEPING_SLEEP_HEIGHT);\r
+    sleepTitleLabel_->SetText("睡眠");\r
+    sleepTitleLabel_->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+    sleepTitleLabel_->SetTextColor(Color::White());\r
+    sleepTitleLabel_->SetFont(BOLD_VECTOR_FONT_FILENAME, SLEEPING_SLEEP_FONT_SIZE);\r
+    sleepTitleLabel_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+    group_->Add(sleepTitleLabel_);\r
+\r
+    moonImg_ = new UIImageView();\r
+    if (moonImg_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "moonImg_ is nullptr");\r
+        return;\r
+    }\r
+    moonImg_->SetPosition(SLEEPING_MOON_POSX, SLEEPING_TIMETEXT_HIGHT);\r
+    LOADIMG::LoadImageViewImg(moonImg_, SLEEP_IMAGE, IMAGE_SLEEP_SLEEPING_MOON);\r
+    group_->Add(moonImg_);\r
+\r
+    sleepingLabel_ = new UILabel();\r
+    if (sleepingLabel_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "sleepingLabel_ is nullptr");\r
+        return;\r
+    }\r
+    sleepingLabel_->SetPosition(SLEEPING_NORECORD_X, SLEEPING_NORECORD_Y);\r
+    sleepingLabel_->Resize(SLEEPING_NORECORD_WIDTH, SLEEPING_NORECORD_HEIGHT);\r
+    sleepingLabel_->SetText("正在睡眠");\r
+    sleepingLabel_->SetTextColor(Color::White());\r
+    sleepingLabel_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SLEEPING_NORECORD_FONT_SIZE);\r
+    sleepingLabel_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+    group_->Add(sleepingLabel_);\r
+\r
+    InitCircleProgress();\r
+    InitSleepTimeLabel();\r
+    LoadTargetTimeForHourAndMin(SleepModel::GetInstance().GetTargetTime());\r
+    SleepModel::GetInstance().LoadData();\r
+\r
+    callBack_ = new SleepAnimatorCallback(this);\r
+    if (callBack_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "callBack_ is nullptr");\r
+        return;\r
+    }\r
+    animator_ = new Animator(callBack_, nullptr, 0, true);\r
+    if (animator_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "animator_ is nullptr");\r
+        return;\r
+    }\r
+\r
+    group_->SetOnDragListener(this);\r
+    group_->SetDraggable(true);\r
+    group_->SetTouchable(true);\r
+\r
+    animator_->Start();\r
+    gettimeofday(&startTime_, nullptr);\r
+    AddViewToPageContainer(group_);\r
+}\r
+\r
+void SleepSleepingPage::OnPause()\r
+{\r
+    animator_->Stop();\r
+}\r
+\r
+void SleepSleepingPage::SleepAnimatorCallback::Callback(UIView *view)\r
+{\r
+    (void)view;\r
+    struct timeval current_time;\r
+    gettimeofday(&current_time, nullptr);\r
+    uint32_t elapsed_seconds = current_time.tv_sec - page_->startTime_.tv_sec;\r
+    if (elapsed_seconds == SLEEPING_TIME_ELAPSED) {\r
+        page_->StopAnimator();\r
+    }\r
+}\r
+\r
+void SleepSleepingPage::StopAnimator()\r
+{\r
+    animator_->Stop();\r
+    NativeAbility::GetInstance().SwitchPageInSlice(SLEEPING_PAGES::SLEEPING_MAIN_PAGE,\r
+        TransitionType::TRANSITION_INVALID, false);\r
+}\r
+\r
+void SleepSleepingPage::InitSleepTimeLabel()\r
+{\r
+    sleepTimeBgImg_ = new UIImageView();\r
+    if (sleepTimeBgImg_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "sleepTimeBgImg_ is nullptr");\r
+        return;\r
+    }\r
+    sleepTimeBgImg_->SetPosition(SLEEPING_BG_X, SLEEPING_BG_Y);\r
+    LOADIMG::LoadImageViewImg(sleepTimeBgImg_, SLEEP_IMAGE, IMAGE_SLEEP_SLEEPING_TIME);\r
+    group_->Add(sleepTimeBgImg_);\r
+\r
+    targetSleepTimeHoursLabel_ = new UILabel();\r
+    if (targetSleepTimeHoursLabel_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "targetSleepTimeHoursLabel_ is nullptr");\r
+        return;\r
+    }\r
+    targetSleepTimeHoursLabel_->SetTextColor(Color::White());\r
+    targetSleepTimeHoursLabel_->SetFont(BOLD_VECTOR_FONT_FILENAME, SLEEPING_FONT_SIZE_LARGE);\r
+    targetSleepTimeHoursLabel_->SetVisible(false);\r
+\r
+    targetSleepTimeHoursUnitLabel_ = new UILabel();\r
+    if (targetSleepTimeHoursUnitLabel_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "targetSleepTimeHoursUnitLabel_ is nullptr");\r
+        return;\r
+    }\r
+    targetSleepTimeHoursUnitLabel_->SetText("小时");\r
+    targetSleepTimeHoursUnitLabel_->Resize(SLEEPING_LABEL_WIDTH, SLEEPING_LABEL_HEIGHT);\r
+    targetSleepTimeHoursUnitLabel_->SetTextColor(Color::White());\r
+    targetSleepTimeHoursUnitLabel_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SLEEPING_TIPS_FONT_SIZE);\r
+    targetSleepTimeHoursUnitLabel_->SetVisible(false);\r
+\r
+    targetSleepTimeMinutesLabel_ = new UILabel();\r
+    if (targetSleepTimeMinutesLabel_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "targetSleepTimeMinutesLabel_ is nullptr");\r
+        return;\r
+    }\r
+    targetSleepTimeMinutesLabel_->Resize(SLEEPING_TIME_LABEL_WIDTH, SLEEPING_TIME_LABEL_HEIGHT);\r
+    targetSleepTimeMinutesLabel_->SetTextColor(Color::White());\r
+    targetSleepTimeMinutesLabel_->SetFont(BOLD_VECTOR_FONT_FILENAME, SLEEPING_FONT_SIZE_LARGE);\r
+    targetSleepTimeMinutesLabel_->SetVisible(false);\r
+\r
+    targetSleepTimeMinutesUnitLabel_ = new UILabel();\r
+    if (targetSleepTimeMinutesUnitLabel_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "targetSleepTimeMinutesUnitLabel_ is nullptr");\r
+        return;\r
+    }\r
+    targetSleepTimeMinutesUnitLabel_->SetText("分钟");\r
+    targetSleepTimeMinutesUnitLabel_->Resize(SLEEPING_LABEL_WIDTH, SLEEPING_LABEL_HEIGHT);\r
+    targetSleepTimeMinutesUnitLabel_->SetTextColor(Color::White());\r
+    targetSleepTimeMinutesUnitLabel_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SLEEPING_TIPS_FONT_SIZE);\r
+    targetSleepTimeMinutesUnitLabel_->SetVisible(false);\r
+}\r
+\r
+void SleepSleepingPage::LoadTargetTimeForHourAndMin(std::tuple<uint32_t, uint32_t> timeTuple)\r
+{\r
+    uint32_t hours = std::get<0>(timeTuple);\r
+    uint32_t minutes = std::get<1>(timeTuple);\r
+\r
+    if ((hours == 0) && (minutes != 0)) {\r
+        targetSleepTimeMinutesLabel_->SetPosition(SLEEPING_TIME_MINUTE_X, ACTUALMINUTES_Y);\r
+        targetSleepTimeMinutesLabel_->SetVisible(true);\r
+        targetSleepTimeMinutesLabel_->SetText(std::to_string(minutes).c_str());\r
+        targetSleepTimeMinutesLabel_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+        group_->Add(targetSleepTimeMinutesLabel_);\r
+\r
+        targetSleepTimeMinutesUnitLabel_->SetPosition(SLEEPING_ACTUALMINUTE_X, SLEEPING_ACTUALMINUTE_Y);\r
+        targetSleepTimeMinutesUnitLabel_->SetVisible(true);\r
+        group_->Add(targetSleepTimeMinutesUnitLabel_);\r
+    } else if ((hours != 0) && (minutes == 0)) {\r
+        targetSleepTimeHoursLabel_->SetPosition(ACTUALMINUTES_X, ACTUALMINUTES_Y);\r
+        targetSleepTimeHoursLabel_->Resize(SLEEPING_HEIGHT, SLEEPING_HEIGHT);\r
+        targetSleepTimeHoursLabel_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+        targetSleepTimeHoursLabel_->SetVisible(true);\r
+        targetSleepTimeHoursLabel_->SetText(std::to_string(hours).c_str());\r
+        group_->Add(targetSleepTimeHoursLabel_);\r
+\r
+        targetSleepTimeHoursUnitLabel_->SetPosition(SLEEPING_ACTUALMINUTE_X, SLEEPING_ACTUALMINUTE_Y);\r
+        targetSleepTimeHoursUnitLabel_->SetVisible(true);\r
+        group_->Add(targetSleepTimeHoursUnitLabel_);\r
+    } else if ((hours != 0) && (minutes != 0)) {\r
+        targetSleepTimeHoursLabel_->SetPosition(SLEEPING_TIME_HOUR_X, ACTUALMINUTES_Y);\r
+        targetSleepTimeHoursLabel_->Resize(SLEEPING_HEIGHT, SLEEPING_HEIGHT);\r
+        targetSleepTimeHoursLabel_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+        targetSleepTimeHoursLabel_->SetVisible(true);\r
+        targetSleepTimeHoursLabel_->SetText(std::to_string(hours).c_str());\r
+        group_->Add(targetSleepTimeHoursLabel_);\r
+\r
+        targetSleepTimeHoursUnitLabel_->SetPosition(SLEEPING_TIME_HOUR_TEXT_X, SLEEPING_ACTUALMINUTE_Y);\r
+        targetSleepTimeHoursUnitLabel_->Resize(SLEEPING_HEIGHT, SLEEPING_LABEL_HEIGHT);\r
+        targetSleepTimeHoursUnitLabel_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+        targetSleepTimeHoursUnitLabel_->SetVisible(true);\r
+        group_->Add(targetSleepTimeHoursUnitLabel_);\r
+\r
+        targetSleepTimeMinutesLabel_->SetPosition(SLEEPING_TIME_MINUTE1_X, ACTUALMINUTES_Y);\r
+        targetSleepTimeMinutesLabel_->Resize(SLEEPING_HEIGHT, SLEEPING_HEIGHT);\r
+        targetSleepTimeMinutesLabel_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+        targetSleepTimeMinutesLabel_->SetVisible(true);\r
+        targetSleepTimeMinutesLabel_->SetText(std::to_string(minutes).c_str());\r
+        group_->Add(targetSleepTimeMinutesLabel_);\r
+\r
+        targetSleepTimeMinutesUnitLabel_->SetPosition(SLEEPING_TIME_MINUTE1_TEXT_X, SLEEPING_ACTUALMINUTE_Y);\r
+        targetSleepTimeMinutesUnitLabel_->Resize(SLEEPING_HEIGHT, SLEEPING_LABEL_HEIGHT);\r
+        targetSleepTimeMinutesUnitLabel_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+        targetSleepTimeMinutesUnitLabel_->SetVisible(true);\r
+        group_->Add(targetSleepTimeMinutesUnitLabel_);\r
+    }\r
+}\r
+\r
+void SleepSleepingPage::InitCircleProgress()\r
+{\r
+    circleProgress_ = new UICircleProgress();\r
+    if (circleProgress_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "circleProgress_ is nullptr");\r
+        return;\r
+    }\r
+    circleProgress_->SetPosition(0, 0);\r
+    circleProgress_->Resize(SLEEPING_CIR_HIGHT, SLEEPING_CIR_HIGHT);\r
+    circleProgress_->SetCenterPosition(SLEEPING_CIR_X, SLEEPING_CIR_Y);\r
+    circleProgress_->SetRadius(SLEEPING_CIR_RADIUS);\r
+    circleProgress_->SetBackgroundStyle(STYLE_LINE_COLOR, 0xFF6f29a0);\r
+    circleProgress_->SetForegroundStyle(STYLE_LINE_COLOR, 0xFFB566FF);\r
+    circleProgress_->SetBackgroundStyle(STYLE_LINE_WIDTH, SLEEPING_CIR_LINE_WIDTH);\r
+    circleProgress_->SetForegroundStyle(STYLE_LINE_WIDTH, SLEEPING_CIR_LINE_WIDTH);\r
+    circleProgress_->SetStartAngle(0);\r
+    circleProgress_->SetEndAngle(SLEEPING_CIR_ANGLE);\r
+    circleProgress_->SetRange(SLEEPING_TIME_ELAPSED, 0);\r
+    circleProgress_->SetValue(SLEEPING_TIME_ELAPSED);\r
+    group_->Add(circleProgress_);\r
+    circleProgress_->Invalidate();\r
+}\r
+}\r
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/sleep/src/SleepTargetTime.cpp b/code/sdk/application/wearable/evb/nativeapp/nativeui/sleep/src/SleepTargetTime.cpp
new file mode 100644 (file)
index 0000000..3f9c450
--- /dev/null
@@ -0,0 +1,322 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SleepTargetTime\r
+ * Created: 2025-06-05\r
+ */\r
+#include <string>\r
+#include "components/ui_list_nested.h"\r
+#include "components/ui_scroll_view_nested.h"\r
+#include "NativeAbility.h"\r
+#include "SlicePageFactory.h"\r
+#include "PageTransitionMgr.h"\r
+#include "common/image_cache_manager.h"\r
+#include "sleep/SleepMainPage.h"\r
+#include "sleep/SleepPresenter.h"\r
+#include "sleep/SleepView.h"\r
+#include "sleep/SleepTargetTime.h"\r
+\r
+namespace OHOS {\r
+static constexpr uint8_t BACKGROUND_FONT = 40;\r
+static constexpr uint8_t HIGHTLIGHT_FONT = 55;\r
+static constexpr int16_t TARGET_SLEEP_SETTARGET_X = 120;\r
+static constexpr int16_t TARGET_SLEEP_SETTARGET_Y = 40;\r
+static constexpr int16_t TARGET_SLEEP_SETTARGET_WIDTH = 200;\r
+static constexpr int16_t TARGET_SLEEP_SETTARGET_HIGHT = 38;\r
+static constexpr int16_t TARGET_SLEEP_SETTARGET_FONT_SIZE = 32;\r
+static constexpr int16_t TARGET_SLEEP_START_X = 112;\r
+static constexpr int16_t TARGET_SLEEP_START_Y = 347;\r
+static constexpr int16_t TARGET_SLEEP_START_WIDTH = 232;\r
+static constexpr int16_t TARGET_SLEEP_START_HIGHT = 76;\r
+static constexpr int16_t TARGET_SLEEP_PICKER2_X = 270;\r
+static constexpr int16_t TARGET_SLEEP_PICKER_Y = 132;\r
+static constexpr int16_t TARGET_SLEEP_PICKER_WIDTH = 80;\r
+static constexpr int16_t TARGET_SLEEP_PICKER_HIGHT = 185;\r
+static constexpr int16_t TARGET_SLEEP_PICKER_BORDER = 3;\r
+static constexpr int16_t TARGET_SLEEP_PICKER_RADIUS = 11;\r
+static constexpr int16_t TARGET_SLEEP_PICKER_ITEM = 70;\r
+static constexpr int16_t TARGET_SLEEP_PICKER_HOUR = 24;\r
+static constexpr int16_t TARGET_SLEEP_PICKER_MINUTE = 60;\r
+static constexpr int16_t TARGET_SLEEP_TIMERLABEL_X = 131;\r
+static constexpr int16_t TARGET_SLEEP_TIMERLABEL2_X = 273;\r
+static constexpr int16_t TARGET_SLEEP_TIMERLABEL_Y = 99;\r
+static constexpr int16_t TARGET_SLEEP_TIMERLABEL2_Y = 90;\r
+static constexpr int16_t TARGET_SLEEP_TIMERLABEL_WIDTH = 55;\r
+static constexpr int16_t TARGET_SLEEP_TIMERLABEL_HEIGHT = 30;\r
+static constexpr uint8_t TIMERLABEL_FONT = 24;\r
+static constexpr int16_t TARGET_SLEEP_COLOR_R = 181;\r
+static constexpr int16_t TARGET_SLEEP_COLOR_G = 402;\r
+static constexpr int16_t TARGET_SLEEP_COLOR_B = 255;\r
+static constexpr int16_t TARGET_SLEEP_PICKER1_X = 115;\r
+static constexpr int16_t TARGET_SLEEP_PICKER2_Y = 255;\r
+static constexpr char *START_BUTTON = "start";\r
+static constexpr char *HOUR_PICKER = "hourPicker";\r
+static constexpr char *MIN_PICKER = "minPicker";\r
+\r
+// 时间选择器分钟列\r
+static const char *g_uiPickerMinute[] = {"00", "01", "02", "03", "04", "05", "06", "07", "08", "09",\r
+                                         "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", \r
+                                         "20", "21", "22", "23", "24", "25", "26", "27", "28", "29",\r
+                                         "30", "31", "32", "33", "34", "35", "36", "37", "38", "39",\r
+                                         "40", "41", "42", "43", "44", "45", "46", "47", "48", "49",\r
+                                         "50", "51", "52", "53", "54", "55", "56", "57", "58", "59"};\r
+\r
+// 时间选择器小时列\r
+static const char *g_uiPickerHour[] = {"00", "01", "02", "03", "04", "05", "06", "07",\r
+                                       "08", "09", "10", "11", "12", "13", "14", "15",\r
+                                       "16", "17", "18", "19", "20", "21", "22", "23"};\r
+\r
+REGIST_SLICE_PAGE(VIEW_SLEEPING, SLEEPING_PAGES::SLEEPING_TARGET_PAGE, SleepTargetTime, false);\r
+\r
+SleepTargetTime::SleepTargetTime()\r
+{\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SleepTargetTime::SleepTargetTime");\r
+}\r
+\r
+SleepTargetTime::~SleepTargetTime()\r
+{\r
+    if (group_ != nullptr) {\r
+        group_->RemoveAll();\r
+        delete group_;\r
+        group_ = nullptr;\r
+    }\r
+\r
+    if (targetTitleLabel_ != nullptr) {\r
+        delete targetTitleLabel_;\r
+        targetTitleLabel_ = nullptr;\r
+    }\r
+\r
+    if (timerUnitLabel_ != nullptr) {\r
+        delete timerUnitLabel_;\r
+        timerUnitLabel_ = nullptr;\r
+    }\r
+\r
+    if (startButton_ != nullptr) {\r
+        delete startButton_;\r
+        startButton_ = nullptr;\r
+    }\r
+\r
+    for (int i = 0; i < PICKER_COUNT; i++) {\r
+        if (timerPicker_[i] != nullptr) {\r
+            delete timerPicker_[i];\r
+            timerPicker_[i] = nullptr;\r
+        }\r
+    }\r
+    ImageCacheManager::GetInstance().UnloadAllInMultiRes(SLEEP_IMAGE);\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SleepTargetTime::~SleepTargetTime");\r
+}\r
+\r
+void SleepTargetTime::OnStart(void *data)\r
+{\r
+    group_ = new UIScrollView();\r
+    if (group_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "group_ is nullptr");\r
+        return;\r
+    }\r
+    group_->SetPosition(0, 0);\r
+    group_->Resize(HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);\r
+\r
+    targetTitleLabel_ = new UILabel();\r
+    if (targetTitleLabel_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "targetTitleLabel_ is nullptr");\r
+        return;\r
+    }\r
+    targetTitleLabel_->SetPosition(TARGET_SLEEP_SETTARGET_X, TARGET_SLEEP_SETTARGET_Y);\r
+    targetTitleLabel_->Resize(TARGET_SLEEP_SETTARGET_WIDTH, TARGET_SLEEP_SETTARGET_HIGHT);\r
+    targetTitleLabel_->SetText("设置目标");\r
+    targetTitleLabel_->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+    targetTitleLabel_->SetTextColor(Color::White());\r
+    targetTitleLabel_->SetFont(BOLD_VECTOR_FONT_FILENAME, TARGET_SLEEP_SETTARGET_FONT_SIZE);\r
+    targetTitleLabel_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+    group_->Add(targetTitleLabel_);\r
+\r
+    InitStartButton();\r
+    CreateLabel();\r
+    CreatePicker();\r
+\r
+    group_->SetOnDragListener(this);\r
+    group_->SetDraggable(true);\r
+    group_->SetTouchable(true);\r
+    AddViewToPageContainer(group_);\r
+}\r
+\r
+void SleepTargetTime::InitStartButton()\r
+{\r
+    startButton_ = new UILabelButton();\r
+    if (startButton_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "startButton_ is nullptr");\r
+        return;\r
+    }\r
+    startButton_->SetPosition(TARGET_SLEEP_START_X, TARGET_SLEEP_START_Y);\r
+    startButton_->Resize(TARGET_SLEEP_START_WIDTH, TARGET_SLEEP_START_HIGHT);\r
+    startButton_->SetStyle(STYLE_BACKGROUND_OPA, OPA_OPAQUE);\r
+    startButton_->SetAlign(TEXT_ALIGNMENT_CENTER);\r
+    startButton_->SetViewId(START_BUTTON);\r
+    startButton_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, TARGET_SLEEP_SETTARGET_FONT_SIZE);\r
+    startButton_->SetStyle(STYLE_BACKGROUND_COLOR, Color::Purple().full);\r
+    startButton_->SetStyleForState(STYLE_BACKGROUND_COLOR, Color::White().full, UIButton::PRESSED);\r
+    startButton_->SetStyleForState(STYLE_BACKGROUND_COLOR, Color::White().full, UIButton::RELEASED);\r
+    startButton_->SetStyleForState(STYLE_BACKGROUND_COLOR, Color::Black().full, UIButton::INACTIVE);\r
+    startButton_->SetText("开始");\r
+    LOADIMG::LoadBtnImage(startButton_, SLEEP_IMAGE, IMAGE_SLEEP_START_GRAY, IMAGE_SLEEP_START_GRAY);\r
+    startButton_->SetOnClickListener(this);\r
+    startButton_->Disable();\r
+    group_->Add(startButton_);\r
+}\r
+\r
+void SleepTargetTime::SetPickerTime()\r
+{\r
+    std::tuple<uint32_t, uint32_t> time = SleepModel::GetInstance().GetTargetTime();\r
+    uint32_t timeHours = std::get<0>(time);\r
+    uint32_t timeMinutes = std::get<1>(time);\r
+    timerPicker_[0]->SetSelected(timeHours);\r
+    timerPicker_[1]->SetSelected(timeMinutes);\r
+}\r
+\r
+void SleepTargetTime::CreatePicker()\r
+{\r
+    int posX[PICKER_COUNT] = {TARGET_SLEEP_PICKER1_X, TARGET_SLEEP_PICKER2_Y};\r
+    int posY = TARGET_SLEEP_PICKER_Y;\r
+    for (int i = 0; i < PICKER_COUNT; i++) {\r
+        if (timerPicker_[i] == nullptr) {\r
+            timerPicker_[i] = new UIPicker();\r
+        }\r
+        timerPicker_[i]->SetPosition(posX[i], posY);\r
+        timerPicker_[i]->Resize(TARGET_SLEEP_PICKER_WIDTH, TARGET_SLEEP_PICKER_HIGHT);\r
+        timerPicker_[i]->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+        timerPicker_[i]->SetStyle(STYLE_BORDER_WIDTH, TARGET_SLEEP_PICKER_BORDER);\r
+        timerPicker_[i]->SetStyle(STYLE_BORDER_RADIUS, TARGET_SLEEP_PICKER_RADIUS);\r
+        timerPicker_[i]->SetStyle(STYLE_BORDER_COLOR, Color::Gray().full);\r
+        timerPicker_[i]->SetItemHeight(TARGET_SLEEP_PICKER_ITEM);\r
+        timerPicker_[i]->SetLoopState(true);\r
+        timerPicker_[i]->SetBackgroundFont(DEFAULT_VECTOR_FONT_FILENAME, BACKGROUND_FONT);\r
+        timerPicker_[i]->SetHighlightFont(DEFAULT_VECTOR_FONT_FILENAME, HIGHTLIGHT_FONT);\r
+        timerPicker_[i]->SetTextColor(Color::Gray(), Color::White());\r
+        if (i == 0) {\r
+            timerPicker_[i]->SetValues(g_uiPickerHour, TARGET_SLEEP_PICKER_HOUR);\r
+        } else {\r
+            timerPicker_[i]->SetValues(g_uiPickerMinute, TARGET_SLEEP_PICKER_MINUTE);\r
+        }\r
+        timerPicker_[i]->SetOnClickListener(this);\r
+        timerPicker_[i]->SetOnDragListener(this);\r
+        timerPicker_[i]->RegisterSelectedListener(this);\r
+        timerPicker_[i]->SetDraggable(true);\r
+        group_->Add(timerPicker_[i]);\r
+    }\r
+\r
+    timerPicker_[0]->SetViewId(HOUR_PICKER);\r
+    timerPicker_[1]->SetViewId(MIN_PICKER);\r
+    if (SleepModel::GetInstance().GetRecord() == true) {\r
+        startButton_->SetTextColor(Color::White());\r
+        startButton_->Enable();\r
+        LOADIMG::LoadBtnImage(startButton_, SLEEP_IMAGE, IMAGE_SLEEP_SETTIMEBTN, IMAGE_SLEEP_SETTIMEBTN);\r
+        SetPickerTime();\r
+    } else {\r
+        timerPicker_[0]->SetSelected(0);\r
+        timerPicker_[1]->SetSelected(0);\r
+    }\r
+}\r
+\r
+bool SleepTargetTime::OnClick(UIView &view, const ClickEvent &event)\r
+{\r
+    UNUSED(event);\r
+    if (strcmp(view.GetViewId(), START_BUTTON) == 0) {\r
+        uint8_t hour = std::stoi(g_uiPickerHour[timerPicker_[0]->GetSelected()]);\r
+        uint8_t minute = std::stoi(g_uiPickerMinute[timerPicker_[1]->GetSelected()]);\r
+        SleepModel::GetInstance().SetTargetTime((hour * TARGET_SLEEP_PICKER_MINUTE) + minute);\r
+        NativeAbility::GetInstance().SwitchPageInSlice(SLEEPING_PAGES::SLEEPING_SLEEP_PAGE,\r
+            TransitionType::TRANSITION_INVALID, false);\r
+    }\r
+    return true;\r
+}\r
+\r
+void SleepTargetTime::CreateLabel()\r
+{\r
+    timerUnitLabel_ = new UILabel();\r
+    if (timerUnitLabel_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "timerUnitLabel_ is nullptr");\r
+        return;\r
+    }\r
+    timerUnitLabel_->SetPosition(TARGET_SLEEP_TIMERLABEL_X, TARGET_SLEEP_TIMERLABEL_Y);\r
+    timerUnitLabel_->Resize(TARGET_SLEEP_TIMERLABEL_WIDTH, TARGET_SLEEP_TIMERLABEL_HEIGHT);\r
+    timerUnitLabel_->SetStyle(STYLE_BACKGROUND_OPA, OPA_OPAQUE);\r
+    timerUnitLabel_->SetText("小时");\r
+    timerUnitLabel_->SetStyle(STYLE_BACKGROUND_COLOR, 0xFFB566FF);\r
+    timerUnitLabel_->SetTextColor(Color::Black());\r
+    timerUnitLabel_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+    timerUnitLabel_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, TIMERLABEL_FONT);\r
+    timerUnitLabel_->SetVisible(false);\r
+    group_->Add(timerUnitLabel_);\r
+}\r
+\r
+bool SleepTargetTime::OnDrag(UIView &view, const DragEvent &event)\r
+{\r
+    if ((event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT) && (event.GetDeltaX() > X_DRAG_OFFSET) &&\r
+        (event.GetDeltaX() > (DOUBLES * MATH_ABS(event.GetDeltaY())))) {\r
+        NativeAbility::GetInstance().SwitchPageInSlice(SLEEPING_PAGES::SLEEPING_MAIN_PAGE,\r
+            TransitionType::TRANSITION_INVALID, false);\r
+    }\r
+    if (strcmp(view.GetViewId(), HOUR_PICKER) == 0) {\r
+        timerPicker_[0]->SetStyle(\r
+            STYLE_BORDER_COLOR,\r
+            Color::GetColorFromRGB(TARGET_SLEEP_COLOR_R, TARGET_SLEEP_COLOR_G, TARGET_SLEEP_COLOR_B).full);\r
+        timerPicker_[1]->SetStyle(STYLE_BORDER_COLOR, Color::Gray().full);\r
+        timerPicker_[0]->Invalidate();\r
+        timerPicker_[1]->Invalidate();\r
+        timerUnitLabel_->SetVisible(true);\r
+        timerUnitLabel_->SetPosition(TARGET_SLEEP_TIMERLABEL_X, TARGET_SLEEP_TIMERLABEL2_Y);\r
+        timerUnitLabel_->SetText("小时");\r
+        timerUnitLabel_->Invalidate();\r
+    } else if (strcmp(view.GetViewId(), MIN_PICKER) == 0) {\r
+        timerPicker_[1]->SetStyle(\r
+            STYLE_BORDER_COLOR,\r
+            Color::GetColorFromRGB(TARGET_SLEEP_COLOR_R, TARGET_SLEEP_COLOR_G, TARGET_SLEEP_COLOR_B).full);\r
+        timerPicker_[0]->SetStyle(STYLE_BORDER_COLOR, Color::Gray().full);\r
+        timerPicker_[0]->Invalidate();\r
+        timerPicker_[1]->Invalidate();\r
+        timerUnitLabel_->SetVisible(true);\r
+        timerUnitLabel_->SetPosition(TARGET_SLEEP_TIMERLABEL2_X, TARGET_SLEEP_TIMERLABEL2_Y);\r
+        timerUnitLabel_->SetText("分钟");\r
+        timerUnitLabel_->Invalidate();\r
+    }\r
+    return true;\r
+}\r
+\r
+void SleepTargetTime::OnPickerStoped(UIPicker &picker)\r
+{\r
+    if (strcmp(picker.GetViewId(), HOUR_PICKER) == 0) {\r
+        uint16_t hour = picker.GetSelected();\r
+        picker.SetStyle(STYLE_BORDER_COLOR,\r
+                        Color::GetColorFromRGB(TARGET_SLEEP_COLOR_R, TARGET_SLEEP_COLOR_G, TARGET_SLEEP_COLOR_B).full);\r
+        picker.Invalidate();\r
+        if ((hour == 0) && (timerPicker_[1]->GetSelected() == 0)) {\r
+            startButton_->Disable();\r
+            LOADIMG::LoadBtnImage(startButton_, SLEEP_IMAGE, IMAGE_SLEEP_START_GRAY, IMAGE_SLEEP_START_GRAY);\r
+        } else {\r
+            startButton_->SetTextColor(Color::White());\r
+            startButton_->Enable();\r
+            LOADIMG::LoadBtnImage(startButton_, SLEEP_IMAGE, IMAGE_SLEEP_SETTIMEBTN, IMAGE_SLEEP_SETTIMEBTN);\r
+        }\r
+        timerUnitLabel_->SetVisible(true);\r
+        timerUnitLabel_->SetPosition(TARGET_SLEEP_TIMERLABEL_X, TARGET_SLEEP_TIMERLABEL2_Y);\r
+        timerUnitLabel_->SetText("小时");\r
+        timerUnitLabel_->Invalidate();\r
+    } else if (strcmp(picker.GetViewId(), MIN_PICKER) == 0) {\r
+        uint16_t minute = picker.GetSelected();\r
+        picker.SetStyle(STYLE_BORDER_COLOR,\r
+                        Color::GetColorFromRGB(TARGET_SLEEP_COLOR_R, TARGET_SLEEP_COLOR_G, TARGET_SLEEP_COLOR_B).full);\r
+        picker.Invalidate();\r
+        if ((minute == 0) && (timerPicker_[0]->GetSelected() == 0)) {\r
+            startButton_->Disable();\r
+            LOADIMG::LoadBtnImage(startButton_, SLEEP_IMAGE, IMAGE_SLEEP_START_GRAY, IMAGE_SLEEP_START_GRAY);\r
+        } else {\r
+            startButton_->SetTextColor(Color::White());\r
+            startButton_->Enable();\r
+            LOADIMG::LoadBtnImage(startButton_, SLEEP_IMAGE, IMAGE_SLEEP_SETTIMEBTN, IMAGE_SLEEP_SETTIMEBTN);\r
+        }\r
+        timerUnitLabel_->SetVisible(true);\r
+        timerUnitLabel_->SetPosition(TARGET_SLEEP_TIMERLABEL2_X, TARGET_SLEEP_TIMERLABEL2_Y);\r
+        timerUnitLabel_->SetText("分钟");\r
+        timerUnitLabel_->Invalidate();\r
+    }\r
+}\r
+}\r
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/sport/src/SportCountdownPage.cpp b/code/sdk/application/wearable/evb/nativeapp/nativeui/sport/src/SportCountdownPage.cpp
new file mode 100644 (file)
index 0000000..f08e4ad
--- /dev/null
@@ -0,0 +1,166 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SportCountdownPage\r
+ * Create: 2025-06-06\r
+ */\r
+\r
+#include <sys/time.h>\r
+#include "wearable_log.h"\r
+#include "AppViewIDs.h"\r
+#include "NativeAbility.h"\r
+#include "SlicePageFactory.h"\r
+#include "sport/SportView.h"\r
+#include "sport/SportCountdownPage.h"\r
+\r
+namespace OHOS {\r
+static constexpr uint16_t TEXT_X = 164;\r
+static constexpr uint16_t TEXT_Y = 154;\r
+static constexpr uint16_t TEXT_W = 132;\r
+static constexpr uint16_t TEXT_H = 132;\r
+static constexpr uint16_t TEXT_FONT = 120;\r
+static constexpr uint16_t PROCESS_X = 90;\r
+static constexpr uint16_t PROCESS_Y = 90;\r
+static constexpr uint16_t PROCESS_W = 273;\r
+static constexpr uint16_t PROCESS_H = 273;\r
+static constexpr uint16_t PROCESS_CENTER_X = 135;\r
+static constexpr uint16_t PROCESS_CENTER_Y = 135;\r
+static constexpr uint16_t PROCESS_MAX_RANGE = 100;\r
+static constexpr uint16_t PROCESS_RADIUS = 120;\r
+static constexpr uint16_t PROCESS_START_ANGLE = 360;\r
+static constexpr uint16_t PROCESS_LINE_WIDTH = 20;\r
+static constexpr uint16_t COUNTDOWN_TIME = 3;\r
+static constexpr uint32_t MICRO_SECONDS_PER_SECOND = 1000000;\r
+\r
+REGIST_SLICE_PAGE(VIEW_SPORT, SportPages::SPORT_PAGE_COUNTDOWN, SportCountdownPage, false);\r
+\r
+void SportCountdownPage::UpdateCountdownView(uint64_t time)\r
+{\r
+    uint8_t reminTime = COUNTDOWN_TIME - (time / MICRO_SECONDS_PER_SECOND);\r
+    if (reminTime != 0) {\r
+        countdownText_->SetText(std::to_string(reminTime).c_str());\r
+    }\r
+    double precent = static_cast<double>(time) / (COUNTDOWN_TIME * MICRO_SECONDS_PER_SECOND);\r
+    countdownProgress_->SetValue(precent * PROCESS_MAX_RANGE);\r
+}\r
+\r
+void SportCountdownPage::SportCountdownAnimatorCallback::Callback(UIView *view)\r
+{\r
+    UNUSED(view);\r
+    struct timeval currTime = {0};\r
+    gettimeofday(&currTime, nullptr);\r
+    uint64_t time = ((uint64_t)currTime.tv_sec * MICRO_SECONDS_PER_SECOND + currTime.tv_usec) -\r
+                    ((uint64_t)page_->startTime_.tv_sec * MICRO_SECONDS_PER_SECOND + page_->startTime_.tv_usec);\r
+    page_->UpdateCountdownView(time);\r
+    if (time / MICRO_SECONDS_PER_SECOND >= COUNTDOWN_TIME) {\r
+        page_->animator_->Stop();\r
+        SportModel::GetInstance().StartSport(true);\r
+        NativeAbility::GetInstance().SwitchPageInSlice(SportPages::SPORT_PAGE_DATA,\r
+            TransitionType::TRANSITION_INVALID, false);\r
+    }\r
+}\r
+\r
+SportCountdownPage::~SportCountdownPage()\r
+{\r
+    if (group_ != nullptr) {\r
+        group_->RemoveAll();\r
+        delete group_;\r
+        group_ = nullptr;\r
+    }\r
+    if (countdownText_ != nullptr) {\r
+        delete countdownText_;\r
+        countdownText_ = nullptr;\r
+    }\r
+    if (countdownProgress_ != nullptr) {\r
+        delete countdownProgress_;\r
+        countdownProgress_ = nullptr;\r
+    }\r
+    if (animator_ != nullptr) {\r
+        delete animator_;\r
+        animator_ = nullptr;\r
+    }\r
+    if (callback_ != nullptr) {\r
+        delete callback_;\r
+        callback_ = nullptr;\r
+    }\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SportCountdownPage::~SportCountdownPage");\r
+}\r
+\r
+void SportCountdownPage::OnStart(void *data)\r
+{\r
+    gettimeofday(&startTime_, nullptr);\r
+    group_ = new UIViewGroup();\r
+    if (group_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SportCountdownPage group_ new fail");\r
+        return;\r
+    }\r
+    group_->SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);\r
+\r
+    countdownText_ = new UILabel();\r
+    if (countdownText_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SportCountdownPage countdownText_ new fail");\r
+        return;\r
+    }\r
+    countdownText_->SetPosition(TEXT_X, TEXT_Y, TEXT_W, TEXT_H);\r
+    countdownText_->SetFont(BOLD_VECTOR_FONT_FILENAME, TEXT_FONT);\r
+    countdownText_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+    group_->Add(countdownText_);\r
+\r
+    countdownProgress_ = new UICircleProgress();\r
+    if (countdownProgress_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SportCountdownPage new countdownProgress_ fail");\r
+        return;\r
+    }\r
+    countdownProgress_->SetPosition(PROCESS_X, PROCESS_Y, PROCESS_W, PROCESS_H);\r
+    countdownProgress_->SetCenterPosition(PROCESS_CENTER_X, PROCESS_CENTER_Y);\r
+    countdownProgress_->SetRange(PROCESS_MAX_RANGE, 0);\r
+    countdownProgress_->SetRadius(PROCESS_RADIUS);\r
+    countdownProgress_->SetStartAngle(PROCESS_START_ANGLE);\r
+    countdownProgress_->SetEndAngle(0);\r
+    countdownProgress_->SetForegroundStyle(STYLE_LINE_COLOR, 0xff14d3dd);\r
+    countdownProgress_->SetForegroundStyle(STYLE_LINE_WIDTH, PROCESS_LINE_WIDTH);\r
+    countdownProgress_->SetBackgroundStyle(STYLE_LINE_COLOR, 0xff549490);\r
+    countdownProgress_->SetBackgroundStyle(STYLE_LINE_WIDTH, PROCESS_LINE_WIDTH);\r
+    group_->Add(countdownProgress_);\r
+    AddViewToPageContainer(group_);\r
+\r
+    callback_ = new SportCountdownAnimatorCallback(this);\r
+    if (callback_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SportCountdownPage::OnStart callback_ new fail");\r
+        return;\r
+    }\r
+\r
+    animator_ = new Animator(callback_, nullptr, 0, true);\r
+    if (animator_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SportCountdownPage::OnStart new Animator animator_ fail");\r
+        return;\r
+    }\r
+}\r
+\r
+void SportCountdownPage::OnPause()\r
+{\r
+    if (animator_ != nullptr) {\r
+        if (animator_->GetState() != Animator::STOP) {\r
+            animator_->Stop();\r
+        }\r
+    }\r
+}\r
+\r
+void SportCountdownPage::OnResume()\r
+{\r
+    if (animator_ != nullptr) {\r
+        if (animator_->GetState() == Animator::STOP) {\r
+            animator_->Start();\r
+        }\r
+    }\r
+}\r
+\r
+bool SportCountdownPage::OnDrag(UIView &view, const DragEvent &event)\r
+{\r
+    return false;\r
+}\r
+\r
+bool SportCountdownPage::OnClick(UIView &view, const ClickEvent &event)\r
+{\r
+    return false;\r
+}\r
+}
\ No newline at end of file
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/sport/src/SportDataPage.cpp b/code/sdk/application/wearable/evb/nativeapp/nativeui/sport/src/SportDataPage.cpp
new file mode 100644 (file)
index 0000000..1b26a0e
--- /dev/null
@@ -0,0 +1,632 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SportDataPage\r
+ * Create: 2025-06-06\r
+ */\r
+\r
+#include "UiConfig.h"\r
+#include "main/LoadImg.h"\r
+#include "ui_resource_sport.h"\r
+#include "wearable_log.h"\r
+#include "AppViewIDs.h"\r
+#include "NativeAbility.h"\r
+#include "SlicePageFactory.h"\r
+#include "settings/model/SettingPowerModel.h"\r
+#include "sport/SportView.h"\r
+#include "sport/SportDataPage.h"\r
+\r
+namespace OHOS {\r
+static constexpr uint16_t TARGET_HALF = 2;\r
+static constexpr uint16_t NUM_ONE = 1;\r
+static constexpr uint16_t NUM_THOUSAND = 1000;\r
+static constexpr uint16_t BATTERY_LEVEL1 = 10;\r
+static constexpr uint16_t BATTERY_LEVEL2 = 20;\r
+static constexpr uint16_t BATTERY_LEVEL3 = 40;\r
+static constexpr uint16_t BATTERY_LEVEL4 = 70;\r
+static constexpr uint16_t BATTERY_LEVEL5 = 100;\r
+static constexpr uint16_t UNIT_SECS_PER_MIN = 60;\r
+static constexpr uint16_t HAND_POSITION_XPOS = 224;\r
+static constexpr uint16_t HAND_POSITION_YPOS = 4;\r
+static constexpr uint16_t HAND_CENTER_XPOS = 3;\r
+static constexpr uint16_t HAND_CENTER_YPOS = 223;\r
+static constexpr uint16_t HAND_WIDTH = 2;\r
+static constexpr uint16_t HAND_HEIGHT = 5;\r
+static constexpr uint16_t HEARTBEAT_MIN = 116;\r
+static constexpr uint16_t HEARTBEAT_MID = 156;\r
+static constexpr uint16_t HEARTBEAT_MAX = 195;\r
+static constexpr uint16_t HEARTBEAT_CONVERT_UNIT = 600;\r
+static constexpr uint16_t HEARTBEAT_BASE1 = 24000;\r
+static constexpr uint16_t HEARTBEAT_BASE2 = 36000;\r
+static constexpr uint16_t HEARTBEAT_IMAGE_X = 132;\r
+static constexpr uint16_t HEARTBEAT_IMAGE_Y = 174;\r
+static constexpr uint16_t BATTERY_ICON_X = 160;\r
+static constexpr uint16_t BATTERY_ICON_Y = 405;\r
+static constexpr uint16_t BATTERY_LABEL_FONT = 20;\r
+static constexpr uint16_t BATTERY_LABEL_X = 164;\r
+static constexpr uint16_t BATTERY_LABEL_Y = 405;\r
+static constexpr uint16_t BATTERY_LABEL_W = 35;\r
+static constexpr uint16_t BATTERY_LABEL_H = 20;\r
+static constexpr uint16_t TIME_LABEL_FONT = 32;\r
+static constexpr uint16_t TIME_LABEL_X = 219;\r
+static constexpr uint16_t TIME_LABEL_Y = 395;\r
+static constexpr uint16_t TIME_LABEL_W = 84;\r
+static constexpr uint16_t TIME_LABEL_H = 47;\r
+static constexpr uint16_t TOP_VALUE_LABEL_FONT = 100;\r
+static constexpr uint16_t VALUE_LABEL_FONT = 56;\r
+static constexpr uint16_t UNIT_LABEL_FONT = 24;\r
+static constexpr uint16_t TOP_VALUE_LABEL_X = 142;\r
+static constexpr uint16_t TOP_VALUE_LABEL_Y = 73;\r
+static constexpr uint16_t TOP_VALUE_LABEL_W = 172;\r
+static constexpr uint16_t TOP_VALUE_LABEL_H = 100;\r
+static constexpr uint16_t TOP_UNIT_LABEL_X = 160;\r
+static constexpr uint16_t TOP_UNIT_LABEL_Y = 173;\r
+static constexpr uint16_t TOP_UNIT_LABEL_W = 166;\r
+static constexpr uint16_t TOP_UNIT_LABEL_H = 25;\r
+static constexpr uint16_t LEFT_VALUE_LABEL_X = 44;\r
+static constexpr uint16_t LEFT_VALUE_LABEL_Y = 212;\r
+static constexpr uint16_t LEFT_VALUE_LABEL_W = 175;\r
+static constexpr uint16_t LEFT_VALUE_LABEL_H = 56;\r
+static constexpr uint16_t LEFT_UNIT_LABEL_X = 44;\r
+static constexpr uint16_t LEFT_UNIT_LABEL_Y = 272;\r
+static constexpr uint16_t LEFT_UNIT_LABEL_W = 175;\r
+static constexpr uint16_t LEFT_UNIT_LABEL_H = 25;\r
+static constexpr uint16_t RIGHT_VALUE_LABEL_X = 227;\r
+static constexpr uint16_t RIGHT_VALUE_LABEL_Y = 212;\r
+static constexpr uint16_t RIGHT_VALUE_LABEL_W = 175;\r
+static constexpr uint16_t RIGHT_VALUE_LABEL_H = 56;\r
+static constexpr uint16_t RIGHT_UNIT_LABEL_X = 227;\r
+static constexpr uint16_t RIGHT_UNIT_LABEL_Y = 272;\r
+static constexpr uint16_t RIGHT_UNIT_LABEL_W = 175;\r
+static constexpr uint16_t RIGHT_UNIT_LABEL_H = 25;\r
+static constexpr uint16_t BOTTOM_VALUE_LABEL_X = 120;\r
+static constexpr uint16_t BOTTOM_VALUE_LABEL_Y = 309;\r
+static constexpr uint16_t BOTTOM_VALUE_LABEL_W = 221;\r
+static constexpr uint16_t BOTTOM_VALUE_LABEL_H = 56;\r
+static constexpr uint16_t BOTTOM_UNIT_LABEL_X = 205;\r
+static constexpr uint16_t BOTTOM_UNIT_LABEL_Y = 369;\r
+static constexpr uint16_t BOTTOM_UNIT_LABEL_W = 50;\r
+static constexpr uint16_t BOTTOM_UNIT_LABEL_H = 25;\r
+static constexpr uint16_t SEP_LINE_X = 225;\r
+static constexpr uint16_t SEP_LINE_Y = 220;\r
+static constexpr uint16_t SEP_LINE_W = 2;\r
+static constexpr uint16_t SEP_LINE_H = 80;\r
+\r
+REGIST_SLICE_PAGE(VIEW_SPORT, SportPages::SPORT_PAGE_DATA, SportDataPage, false);\r
+\r
+void SportDataPage::SportDataAnimatorCallback::Callback(UIView *view)\r
+{\r
+    UNUSED(view);\r
+\r
+    uint16_t heartRate = SportModel::GetInstance().GetHeartRate();\r
+    if (heartRate < HEARTBEAT_MIN) {\r
+        heartRate = HEARTBEAT_BASE2;\r
+    } else if (heartRate < HEARTBEAT_MID) {\r
+        heartRate = (heartRate - HEARTBEAT_MIN) * HEARTBEAT_CONVERT_UNIT + HEARTBEAT_BASE2;\r
+    } else if (heartRate < HEARTBEAT_MAX) {\r
+        heartRate = (heartRate - HEARTBEAT_MID) * HEARTBEAT_CONVERT_UNIT;\r
+    } else {\r
+        heartRate = HEARTBEAT_BASE1;\r
+    }\r
+    page_->sweepClock_->SetSweepTime24Hour(0, 0, heartRate);\r
+    page_->sweepClock_->Invalidate();\r
+\r
+    std::string currTime = GetCurrentTimeStr();\r
+    page_->timeLabel_->SetText(currTime.c_str());\r
+    page_->timeLabel_->Invalidate();\r
+\r
+    uint8_t battery = SettingPowerModel::GetInstance().GetBatteryPowerLevel();\r
+    page_->batteryLabel_->SetText(std::to_string(battery).c_str());\r
+    page_->batteryLabel_->Invalidate();\r
+\r
+    if (battery < BATTERY_LEVEL1) {\r
+        LOADIMG::LoadImageViewImg(page_->batteryIcon_, SPORT_IMAGE, IMAGE_SPORT_BATTERY1);\r
+    } else if (battery < BATTERY_LEVEL2) {\r
+        LOADIMG::LoadImageViewImg(page_->batteryIcon_, SPORT_IMAGE, IMAGE_SPORT_BATTERY2);\r
+    } else if (battery < BATTERY_LEVEL3) {\r
+        LOADIMG::LoadImageViewImg(page_->batteryIcon_, SPORT_IMAGE, IMAGE_SPORT_BATTERY3);\r
+    } else if (battery < BATTERY_LEVEL4) {\r
+        LOADIMG::LoadImageViewImg(page_->batteryIcon_, SPORT_IMAGE, IMAGE_SPORT_BATTERY4);\r
+    } else if (battery <= BATTERY_LEVEL5) {\r
+        LOADIMG::LoadImageViewImg(page_->batteryIcon_, SPORT_IMAGE, IMAGE_SPORT_BATTERY5);\r
+    }\r
+\r
+    page_->UpdateDataViewByType();\r
+    page_->CheckTarget();\r
+    page_->CheckRemind();\r
+}\r
+\r
+SportDataPage::~SportDataPage()\r
+{\r
+    if (sweepClock_ != nullptr) {\r
+        sweepClock_->RemoveAll();\r
+        delete sweepClock_;\r
+        sweepClock_ = nullptr;\r
+    }\r
+    if (timeLabel_ != nullptr) {\r
+        delete timeLabel_;\r
+        timeLabel_ = nullptr;\r
+    }\r
+    if (batteryIcon_ != nullptr) {\r
+        delete batteryIcon_;\r
+        batteryIcon_ = nullptr;\r
+    }\r
+    if (batteryLabel_ != nullptr) {\r
+        delete batteryLabel_;\r
+        batteryLabel_ = nullptr;\r
+    }\r
+    if (heartRateScale_ != nullptr) {\r
+        delete heartRateScale_;\r
+        heartRateScale_ = nullptr;\r
+    }\r
+    if (heartRatePointer_ != nullptr) {\r
+        delete heartRatePointer_;\r
+        heartRatePointer_ = nullptr;\r
+    }\r
+    if (separateLine_ != nullptr) {\r
+        delete separateLine_;\r
+        separateLine_ = nullptr;\r
+    }\r
+    if (topValueLabel_ != nullptr) {\r
+        delete topValueLabel_;\r
+        topValueLabel_ = nullptr;\r
+    }\r
+    if (topUnitLabel_ != nullptr) {\r
+        delete topUnitLabel_;\r
+        topUnitLabel_ = nullptr;\r
+    }\r
+    if (leftValueLabel_ != nullptr) {\r
+        delete leftValueLabel_;\r
+        leftValueLabel_ = nullptr;\r
+    }\r
+    if (leftUnitLabel_ != nullptr) {\r
+        delete leftUnitLabel_;\r
+        leftUnitLabel_ = nullptr;\r
+    }\r
+    if (rightValueLabel_ != nullptr) {\r
+        delete rightValueLabel_;\r
+        rightValueLabel_ = nullptr;\r
+    }\r
+    if (rightUnitLabel_ != nullptr) {\r
+        delete rightUnitLabel_;\r
+        rightUnitLabel_ = nullptr;\r
+    }\r
+    if (bottomValueLabel_ != nullptr) {\r
+        delete bottomValueLabel_;\r
+        bottomValueLabel_ = nullptr;\r
+    }\r
+    if (bottomUnitLabel_ != nullptr) {\r
+        delete bottomUnitLabel_;\r
+        bottomUnitLabel_ = nullptr;\r
+    }\r
+    if (secondHand_ != nullptr) {\r
+        delete secondHand_;\r
+        secondHand_ = nullptr;\r
+    }\r
+    if (animator_ != nullptr) {\r
+        delete animator_;\r
+        animator_ = nullptr;\r
+    }\r
+    if (callback_ != nullptr) {\r
+        delete callback_;\r
+        callback_ = nullptr;\r
+    }\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SportDataPage::~SportDataPage");\r
+}\r
+\r
+void SportDataPage::InitTimeLableVIew()\r
+{\r
+    timeLabel_ = new UILabel();\r
+    if (timeLabel_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SportDataPage timeLabel_ new fail");\r
+        return;\r
+    }\r
+    timeLabel_->SetPosition(TIME_LABEL_X, TIME_LABEL_Y, TIME_LABEL_W, TIME_LABEL_H);\r
+    timeLabel_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, TIME_LABEL_FONT);\r
+    timeLabel_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+    sweepClock_->Add(timeLabel_);\r
+}\r
+\r
+void SportDataPage::InitBatteryView()\r
+{\r
+    batteryIcon_ = new UIImageView();\r
+    if (batteryIcon_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SportDataPage batteryIcon_ new fail");\r
+        return;\r
+    }\r
+    batteryIcon_->SetPosition(BATTERY_ICON_X, BATTERY_ICON_Y);\r
+    batteryIcon_->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+    sweepClock_->Add(batteryIcon_);\r
+\r
+    batteryLabel_ = new UILabel();\r
+    if (batteryLabel_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SportDataPage batteryLabel_ new fail");\r
+        return;\r
+    }\r
+    batteryLabel_->SetPosition(BATTERY_LABEL_X, BATTERY_LABEL_Y, BATTERY_LABEL_W, BATTERY_LABEL_H);\r
+    batteryLabel_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, BATTERY_LABEL_FONT);\r
+    batteryLabel_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+    sweepClock_->Add(batteryLabel_);\r
+}\r
+\r
+void SportDataPage::ShowUpHeartRate()\r
+{\r
+    heartRateScale_ = new UIImageView();\r
+    if (heartRateScale_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SportDataPage heartRateScale_ new fail");\r
+        return;\r
+    }\r
+    heartRateScale_->SetPosition(0, 0);\r
+    LOADIMG::LoadImageViewImg(heartRateScale_, SPORT_IMAGE, IMAGE_SPORT_SCALE);\r
+    sweepClock_->Add(heartRateScale_);\r
+\r
+    heartRatePointer_ = new UIImageView();\r
+    if (heartRatePointer_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SportDataPage heartRatePointer_ new fail");\r
+        return;\r
+    }\r
+    heartRatePointer_->SetPosition(HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y);\r
+    LOADIMG::LoadImageViewImg(heartRatePointer_, SPORT_IMAGE, IMAGE_SPORT_HEART2);\r
+    sweepClock_->Add(heartRatePointer_);\r
+\r
+    SportType sportType = SportModel::GetInstance().GetSportType();\r
+    if (sportType == SPORT_TYPE_CLIMBING) {\r
+        heartRatePointer_->SetVisible(false);\r
+    } else {\r
+        heartRatePointer_->SetVisible(true);\r
+    }\r
+}\r
+\r
+void SportDataPage::ShowUpTopView()\r
+{\r
+    topValueLabel_ = new UILabel();\r
+    if (topValueLabel_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SportDataPage topValueLabel_ new fail");\r
+        return;\r
+    }\r
+    topValueLabel_->SetPosition(TOP_VALUE_LABEL_X, TOP_VALUE_LABEL_Y, TOP_VALUE_LABEL_W, TOP_VALUE_LABEL_H);\r
+    topValueLabel_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+    topValueLabel_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, TOP_VALUE_LABEL_FONT);\r
+    sweepClock_->Add(topValueLabel_);\r
+\r
+    topUnitLabel_ = new UILabel();\r
+    if (topUnitLabel_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SportDataPage topUnitLabel_ new fail");\r
+        return;\r
+    }\r
+    topUnitLabel_->SetPosition(TOP_UNIT_LABEL_X, TOP_UNIT_LABEL_Y, TOP_UNIT_LABEL_W, TOP_UNIT_LABEL_H);\r
+    topUnitLabel_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+    topUnitLabel_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, UNIT_LABEL_FONT);\r
+    sweepClock_->Add(topUnitLabel_);\r
+}\r
+\r
+void SportDataPage::ShowUpLeftView()\r
+{\r
+    leftValueLabel_ = new UILabel();\r
+    if (leftValueLabel_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SportDataPage leftValueLabel_ new fail");\r
+        return;\r
+    }\r
+    leftValueLabel_->SetPosition(LEFT_VALUE_LABEL_X, LEFT_VALUE_LABEL_Y, LEFT_VALUE_LABEL_W, LEFT_VALUE_LABEL_H);\r
+    leftValueLabel_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+    leftValueLabel_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, VALUE_LABEL_FONT);\r
+    sweepClock_->Add(leftValueLabel_);\r
+\r
+    leftUnitLabel_ = new UILabel();\r
+    if (leftUnitLabel_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SportDataPage leftUnitLabel_ new fail");\r
+        return;\r
+    }\r
+    leftUnitLabel_->SetPosition(LEFT_UNIT_LABEL_X, LEFT_UNIT_LABEL_Y, LEFT_UNIT_LABEL_W, LEFT_UNIT_LABEL_H);\r
+    leftUnitLabel_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+    leftUnitLabel_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, UNIT_LABEL_FONT);\r
+    sweepClock_->Add(leftUnitLabel_);\r
+}\r
+\r
+void SportDataPage::ShowUpRightView()\r
+{\r
+    rightValueLabel_ = new UILabel();\r
+    if (rightValueLabel_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SportDataPage rightValueLabel_ new fail");\r
+        return;\r
+    }\r
+    rightValueLabel_->SetPosition(RIGHT_VALUE_LABEL_X, RIGHT_VALUE_LABEL_Y, RIGHT_VALUE_LABEL_W, RIGHT_VALUE_LABEL_H);\r
+    rightValueLabel_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+    rightValueLabel_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, VALUE_LABEL_FONT);\r
+    sweepClock_->Add(rightValueLabel_);\r
+\r
+    rightUnitLabel_ = new UILabel();\r
+    if (rightUnitLabel_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SportDataPage rightUnitLabel_ new fail");\r
+        return;\r
+    }\r
+    rightUnitLabel_->SetPosition(RIGHT_UNIT_LABEL_X, RIGHT_UNIT_LABEL_Y, RIGHT_UNIT_LABEL_W, RIGHT_UNIT_LABEL_H);\r
+    rightUnitLabel_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+    rightUnitLabel_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, UNIT_LABEL_FONT);\r
+    sweepClock_->Add(rightUnitLabel_);\r
+}\r
+\r
+void SportDataPage::ShowUpBottomView()\r
+{\r
+    bottomValueLabel_ = new UILabel();\r
+    if (bottomValueLabel_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SportDataPage bottomValueLabel_ new fail");\r
+        return;\r
+    }\r
+    bottomValueLabel_->SetPosition(BOTTOM_VALUE_LABEL_X, BOTTOM_VALUE_LABEL_Y, BOTTOM_VALUE_LABEL_W,\r
+                                   BOTTOM_VALUE_LABEL_H);\r
+    bottomValueLabel_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+    bottomValueLabel_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, VALUE_LABEL_FONT);\r
+    sweepClock_->Add(bottomValueLabel_);\r
+\r
+    bottomUnitLabel_ = new UILabel();\r
+    if (bottomUnitLabel_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SportDataPage bottomUnitLabel_ new fail");\r
+        return;\r
+    }\r
+    bottomUnitLabel_->SetPosition(BOTTOM_UNIT_LABEL_X, BOTTOM_UNIT_LABEL_Y, BOTTOM_UNIT_LABEL_W, BOTTOM_UNIT_LABEL_H);\r
+    bottomUnitLabel_->SetText("时间");\r
+    bottomUnitLabel_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+    bottomUnitLabel_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, UNIT_LABEL_FONT);\r
+    sweepClock_->Add(bottomUnitLabel_);\r
+}\r
+\r
+void SportDataPage::ShowUpSeparateLine()\r
+{\r
+    separateLine_ = new UICanvas();\r
+    if (separateLine_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SportDataPage ShowUpSeparateLine new fail");\r
+        return;\r
+    }\r
+    separateLine_->SetPosition(SEP_LINE_X, SEP_LINE_Y, SEP_LINE_W, SEP_LINE_H);\r
+    separateLine_->SetStyle(STYLE_BACKGROUND_COLOR, Color::Gray().full);\r
+    sweepClock_->Add(separateLine_);\r
+}\r
+\r
+void SportDataPage::OnStart(void *data)\r
+{\r
+    sweepClock_ = new UISweepClock();\r
+    if (sweepClock_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SportDataPage sweepClock_ new fail");\r
+        return;\r
+    }\r
+    sweepClock_->SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);\r
+    sweepClock_->SetOnDragListener(this);\r
+    sweepClock_->SetDraggable(true);\r
+    sweepClock_->SetTouchable(true);\r
+\r
+    secondHand_ = new Image();\r
+    if (secondHand_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "secondHand new fail");\r
+        return;\r
+    }\r
+    LOADIMG::LoadImageImg(secondHand_, SPORT_IMAGE, IMAGE_SPORT_TRIANGLE);\r
+    sweepClock_->SetHandImage(UISweepClock::HandType::SECOND_HAND, *secondHand_,\r
+                              {HAND_POSITION_XPOS, HAND_POSITION_YPOS}, {HAND_CENTER_XPOS, HAND_CENTER_YPOS});\r
+    sweepClock_->SetHandLine(UISweepClock::HandType::HOUR_HAND, {HAND_POSITION_XPOS, HAND_POSITION_YPOS},\r
+                             {HAND_CENTER_XPOS, HAND_CENTER_YPOS}, Color::White(), HAND_WIDTH, HAND_HEIGHT,\r
+                             OPA_TRANSPARENT);\r
+    sweepClock_->SetHandLine(UISweepClock::HandType::MINUTE_HAND, {HAND_POSITION_XPOS, HAND_POSITION_YPOS},\r
+                             {HAND_CENTER_XPOS, HAND_CENTER_YPOS}, Color::White(), HAND_WIDTH, HAND_HEIGHT,\r
+                             OPA_TRANSPARENT);\r
+    sweepClock_->SetWorkMode(UISweepClock::WorkMode::NORMAL);\r
+\r
+    ShowUpHeartRate();\r
+    InitTimeLableVIew();\r
+    InitBatteryView();\r
+    ShowUpTopView();\r
+    ShowUpLeftView();\r
+    ShowUpRightView();\r
+    ShowUpBottomView();\r
+    ShowUpSeparateLine();\r
+    AddViewToPageContainer(sweepClock_);\r
+\r
+    callback_ = new SportDataAnimatorCallback(this);\r
+    if (callback_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SportDataPage::OnStart callback_ new fail");\r
+        return;\r
+    }\r
+\r
+    animator_ = new Animator(callback_, nullptr, 0, true);\r
+    if (animator_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SportDataPage::OnStart new Animator animator_ fail");\r
+        return;\r
+    }\r
+}\r
+\r
+void SportDataPage::OnPause()\r
+{\r
+    if (animator_ != nullptr) {\r
+        if (animator_->GetState() != Animator::STOP) {\r
+            animator_->Stop();\r
+        }\r
+    }\r
+}\r
+\r
+void SportDataPage::OnResume()\r
+{\r
+    if (animator_ != nullptr) {\r
+        if (animator_->GetState() == Animator::STOP) {\r
+            animator_->Start();\r
+        }\r
+    }\r
+}\r
+\r
+bool SportDataPage::OnDrag(UIView &view, const DragEvent &event)\r
+{\r
+    if ((event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT) && (event.GetDeltaX() > X_DRAG_OFFSET) &&\r
+        (event.GetDeltaX() > (DOUBLES * MATH_ABS(event.GetDeltaY())))) {\r
+        SportModel::GetInstance().PauseAndReport(true);\r
+        NativeAbility::GetInstance().SwitchPageInSlice(SportPages::SPORT_PAGE_PAUSE,\r
+            TransitionType::TRANSITION_INVALID, false);\r
+    }\r
+    return true;\r
+}\r
+\r
+bool SportDataPage::OnClick(UIView &view, const ClickEvent &event)\r
+{\r
+    return false;\r
+}\r
+\r
+void SportDataPage::UpdateDataViewByType()\r
+{\r
+    uint32_t elapsedTime = SportModel::GetInstance().GetElapsedTime();\r
+    std::string sportTimeStr = FormatSportTime(elapsedTime);\r
+    bottomValueLabel_->SetText(sportTimeStr.c_str());\r
+\r
+    SportType sportType = SportModel::GetInstance().GetSportType();\r
+    sport_info_t *sportInfo = SportModel::GetInstance().GetSportInfo(sportType);\r
+    if (sportType == SPORT_TYPE_OUTDOOR_RUNNING) {\r
+        topValueLabel_->SetText(std::to_string(sportInfo->data.heartRate).c_str());\r
+        topUnitLabel_->SetText("心率(次/分钟)");\r
+        leftValueLabel_->SetText(CalculateSpeed(sportInfo->data.distance, elapsedTime).c_str());\r
+        leftUnitLabel_->SetText("配速(/km)");\r
+        rightValueLabel_->SetText(ConvertDistance(sportInfo->data.distance).c_str());\r
+        rightUnitLabel_->SetText("距离(km)");\r
+    } else if (sportType == SPORT_TYPE_INDOOR_RUNNING) {\r
+        topValueLabel_->SetText(std::to_string(sportInfo->data.heartRate).c_str());\r
+        topUnitLabel_->SetText("心率(次/分钟)");\r
+        leftValueLabel_->SetText(CalculateSpeed(sportInfo->data.distance, elapsedTime).c_str());\r
+        leftUnitLabel_->SetText("配速(/km)");\r
+        rightValueLabel_->SetText(ConvertDistance(sportInfo->data.distance).c_str());\r
+        rightUnitLabel_->SetText("距离(km)");\r
+    } else if (sportType == SPORT_TYPE_CYCLING) {\r
+        topValueLabel_->SetText(std::to_string(sportInfo->data.heartRate).c_str());\r
+        topUnitLabel_->SetText("心率(次/分钟)");\r
+        leftValueLabel_->SetText(CalculateSpeed(sportInfo->data.distance, elapsedTime).c_str());\r
+        leftUnitLabel_->SetText("配速(/km)");\r
+        rightValueLabel_->SetText(ConvertDistance(sportInfo->data.distance).c_str());\r
+        rightUnitLabel_->SetText("距离(km)");\r
+    } else if (sportType == SPORT_TYPE_CLIMBING) {\r
+        topValueLabel_->SetText(std::to_string(sportInfo->data.altitude).c_str());\r
+        topUnitLabel_->SetText("海拔(m)");\r
+        leftValueLabel_->SetText(std::to_string(sportInfo->data.ascent).c_str());\r
+        leftUnitLabel_->SetText("累计上升(m)");\r
+        rightValueLabel_->SetText(std::to_string(sportInfo->data.descent).c_str());\r
+        rightUnitLabel_->SetText("累计下降(m)");\r
+    } else if (sportType == SPORT_TYPE_INDOOR_SWIMMING) {\r
+        topValueLabel_->SetText(std::to_string(sportInfo->data.heartRate).c_str());\r
+        topUnitLabel_->SetText("心率(次/分钟)");\r
+        leftValueLabel_->SetText(std::to_string(sportInfo->data.calorie).c_str());\r
+        leftUnitLabel_->SetText("热量(kcal)");\r
+        rightValueLabel_->SetText(ConvertDistance(sportInfo->data.distance).c_str());\r
+        rightUnitLabel_->SetText("距离(km)");\r
+    } else if (sportType == SPORT_TYPE_OUTDOOR_SWIMMING) {\r
+        topValueLabel_->SetText(std::to_string(sportInfo->data.heartRate).c_str());\r
+        topUnitLabel_->SetText("心率(次/分钟)");\r
+        leftValueLabel_->SetText(std::to_string(sportInfo->data.calorie).c_str());\r
+        leftUnitLabel_->SetText("热量(kcal)");\r
+        rightValueLabel_->SetText(ConvertDistance(sportInfo->data.distance).c_str());\r
+        rightUnitLabel_->SetText("距离(km)");\r
+    }\r
+}\r
+\r
+void SportDataPage::CheckTarget()\r
+{\r
+    sport_info_t *sportInfo = SportModel::GetInstance().GetCurrSportInfo();\r
+    if (!sportInfo->isTargetSetted) {\r
+        return;\r
+    }\r
+    if (sportInfo->targetType == SPORT_TARGET_DISTANCE) {\r
+        SportType sportType = SportModel::GetInstance().GetSportType();\r
+        if (sportType == SPORT_TYPE_INDOOR_SWIMMING) {\r
+            if (!sportInfo->targetComplete && sportInfo->data.lap >= sportInfo->targetValue) {\r
+                sportInfo->targetComplete = true;\r
+                sportInfo->promptType = SPORT_SET_TYPE_TARGET;\r
+                NativeAbility::GetInstance().SwitchPageInSlice(SportPages::SPORT_PAGE_TARGET_PROMPT,\r
+                    TransitionType::TRANSITION_INVALID, false);\r
+            } else if (!sportInfo->targetHalf && sportInfo->data.lap >= sportInfo->targetValue / TARGET_HALF) {\r
+                sportInfo->targetHalf = true;\r
+                sportInfo->promptType = SPORT_SET_TYPE_TARGET;\r
+                NativeAbility::GetInstance().SwitchPageInSlice(SportPages::SPORT_PAGE_TARGET_PROMPT,\r
+                    TransitionType::TRANSITION_INVALID, false);\r
+            }\r
+        } else {\r
+            if (!sportInfo->targetComplete && sportInfo->data.distance >= sportInfo->targetValue * NUM_THOUSAND) {\r
+                sportInfo->targetComplete = true;\r
+                sportInfo->promptType = SPORT_SET_TYPE_TARGET;\r
+                NativeAbility::GetInstance().SwitchPageInSlice(SportPages::SPORT_PAGE_TARGET_PROMPT,\r
+                    TransitionType::TRANSITION_INVALID, false);\r
+            } else if (!sportInfo->targetHalf &&\r
+                       sportInfo->data.distance >= sportInfo->targetValue * NUM_THOUSAND / TARGET_HALF) {\r
+                sportInfo->targetHalf = true;\r
+                sportInfo->promptType = SPORT_SET_TYPE_TARGET;\r
+                NativeAbility::GetInstance().SwitchPageInSlice(SportPages::SPORT_PAGE_TARGET_PROMPT,\r
+                    TransitionType::TRANSITION_INVALID, false);\r
+            }\r
+        }\r
+    } else if (sportInfo->targetType == SPORT_TARGET_TIME) {\r
+        uint32_t elapsedTime = SportModel::GetInstance().GetElapsedTime();\r
+        if (!sportInfo->targetComplete && elapsedTime >= sportInfo->targetValue * UNIT_SECS_PER_MIN) {\r
+            sportInfo->targetComplete = true;\r
+            sportInfo->promptType = SPORT_SET_TYPE_TARGET;\r
+            NativeAbility::GetInstance().SwitchPageInSlice(SportPages::SPORT_PAGE_TARGET_PROMPT,\r
+                    TransitionType::TRANSITION_INVALID, false);\r
+        } else if (!sportInfo->targetHalf && elapsedTime >= sportInfo->targetValue * UNIT_SECS_PER_MIN / TARGET_HALF) {\r
+            sportInfo->targetHalf = true;\r
+            sportInfo->promptType = SPORT_SET_TYPE_TARGET;\r
+            NativeAbility::GetInstance().SwitchPageInSlice(SportPages::SPORT_PAGE_TARGET_PROMPT,\r
+                    TransitionType::TRANSITION_INVALID, false);\r
+        }\r
+    } else if (sportInfo->targetType == SPORT_TARGET_CALORIE) {\r
+        if (!sportInfo->targetComplete && sportInfo->data.calorie >= sportInfo->targetValue) {\r
+            sportInfo->targetComplete = true;\r
+            sportInfo->promptType = SPORT_SET_TYPE_TARGET;\r
+            NativeAbility::GetInstance().SwitchPageInSlice(SportPages::SPORT_PAGE_TARGET_PROMPT,\r
+                    TransitionType::TRANSITION_INVALID, false);\r
+        } else if (!sportInfo->targetHalf && sportInfo->data.calorie >= sportInfo->targetValue / TARGET_HALF) {\r
+            sportInfo->targetHalf = true;\r
+            sportInfo->promptType = SPORT_SET_TYPE_TARGET;\r
+            NativeAbility::GetInstance().SwitchPageInSlice(SportPages::SPORT_PAGE_TARGET_PROMPT,\r
+                    TransitionType::TRANSITION_INVALID, false);\r
+        }\r
+    }\r
+}\r
+\r
+void SportDataPage::CheckRemind()\r
+{\r
+    sport_info_t *sportInfo = SportModel::GetInstance().GetCurrSportInfo();\r
+    if (sportInfo->enableHeartRemind) {\r
+        if (sportInfo->data.heartRate >= GetHeartRateRangeBounder(sportInfo->heartRange) &&\r
+            sportInfo->data.heartRate < GetHeartRateRangeBounder(sportInfo->heartRange + NUM_ONE)) {\r
+            if (!sportInfo->isHeartReminded) {\r
+                sportInfo->isHeartReminded = true;\r
+                sportInfo->promptType = SPORT_SET_TYPE_HEARTRATE;\r
+                NativeAbility::GetInstance().SwitchPageInSlice(SportPages::SPORT_PAGE_TARGET_PROMPT,\r
+                    TransitionType::TRANSITION_INVALID, false);\r
+            }\r
+        } else {\r
+            sportInfo->isHeartReminded = false;\r
+        }\r
+    }\r
+\r
+    if (sportInfo->remindType == SPORT_REMIND_INTERVAL_NONE || !sportInfo->isRemindSetted) {\r
+        return;\r
+    } else if (sportInfo->remindType == SPORT_REMIND_INTERVAL_DISTANCE) {\r
+        SportType sportType = SportModel::GetInstance().GetSportType();\r
+        if (sportType == SPORT_TYPE_INDOOR_SWIMMING) {\r
+            if (sportInfo->data.lap >= (sportInfo->remindTimes + NUM_ONE) * sportInfo->remindValue) {\r
+                sportInfo->remindTimes++;\r
+                sportInfo->promptType = SPORT_SET_TYPE_REMIND;\r
+                NativeAbility::GetInstance().SwitchPageInSlice(SportPages::SPORT_PAGE_TARGET_PROMPT,\r
+                    TransitionType::TRANSITION_INVALID, false);\r
+            }\r
+        } else {\r
+            if (sportInfo->data.distance >=\r
+                (sportInfo->remindTimes + NUM_ONE) * sportInfo->remindValue * NUM_THOUSAND) {\r
+                sportInfo->remindTimes++;\r
+                sportInfo->promptType = SPORT_SET_TYPE_REMIND;\r
+                NativeAbility::GetInstance().SwitchPageInSlice(SportPages::SPORT_PAGE_TARGET_PROMPT,\r
+                    TransitionType::TRANSITION_INVALID, false);\r
+            }\r
+        }\r
+    } else if (sportInfo->remindType == SPORT_REMIND_INTERVAL_TIME) {\r
+        uint32_t elapsedTime = SportModel::GetInstance().GetElapsedTime();\r
+        if (elapsedTime >= (sportInfo->remindTimes + NUM_ONE) * sportInfo->remindValue * UNIT_SECS_PER_MIN) {\r
+            sportInfo->remindTimes++;\r
+            sportInfo->promptType = SPORT_SET_TYPE_REMIND;\r
+            NativeAbility::GetInstance().SwitchPageInSlice(SportPages::SPORT_PAGE_TARGET_PROMPT,\r
+                    TransitionType::TRANSITION_INVALID, false);\r
+        }\r
+    }\r
+}\r
+}
\ No newline at end of file
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/sport/src/SportHeartRateRangeItemView.cpp b/code/sdk/application/wearable/evb/nativeapp/nativeui/sport/src/SportHeartRateRangeItemView.cpp
new file mode 100644 (file)
index 0000000..a516c15
--- /dev/null
@@ -0,0 +1,78 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SportHeartRateRangeItemView\r
+ * Create: 2025-06-06\r
+ */\r
+\r
+#include "wearable_log.h"\r
+#include "UiConfig.h"\r
+#include "main/LoadImg.h"\r
+#include "ui_resource_sport.h"\r
+#include "sport/SportModel.h"\r
+#include "sport/SportHeartRateRangeItemView.h"\r
+\r
+namespace OHOS {\r
+static constexpr uint16_t BG_X = 0;\r
+static constexpr uint16_t BG_Y = 6;\r
+static constexpr uint16_t TITLE_X = 39;\r
+static constexpr uint16_t TITLE_Y = 17;\r
+static constexpr uint16_t TITLE_W = 200;\r
+static constexpr uint16_t TITLE_H = 29;\r
+static constexpr uint16_t TITLE_FONT = 24;\r
+static constexpr uint16_t RANGE_X = 39;\r
+static constexpr uint16_t RANGE_Y = 50;\r
+static constexpr uint16_t RANGE_W = 264;\r
+static constexpr uint16_t RANGE_H = 39;\r
+static constexpr uint16_t RANGE_FONT = 32;\r
+static constexpr uint16_t BUTTON_X = 350;\r
+static constexpr uint16_t BUTTON_Y = 32;\r
+static constexpr uint16_t BUTTON_W = 44;\r
+static constexpr uint16_t BUTTON_H = 44;\r
+\r
+SportHeartRateRangeItemView::SportHeartRateRangeItemView()\r
+{\r
+    bgImage_.SetPosition(BG_X, BG_Y);\r
+    LOADIMG::LoadImageViewImg(&bgImage_, SPORT_IMAGE, IMAGE_SPORT_ITEMBG);\r
+\r
+    title_.SetPosition(TITLE_X, TITLE_Y, TITLE_W, TITLE_H);\r
+    title_.SetFont(DEFAULT_VECTOR_FONT_FILENAME, TITLE_FONT);\r
+    title_.SetAlign(TEXT_ALIGNMENT_LEFT, TEXT_ALIGNMENT_CENTER);\r
+    title_.SetStyle(STYLE_TEXT_COLOR, Color::Gray().full);\r
+    title_.SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+\r
+    range_.SetPosition(RANGE_X, RANGE_Y, RANGE_W, RANGE_H);\r
+    range_.SetFont(DEFAULT_VECTOR_FONT_FILENAME, RANGE_FONT);\r
+    range_.SetAlign(TEXT_ALIGNMENT_LEFT, TEXT_ALIGNMENT_CENTER);\r
+    range_.SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+\r
+    button_.SetPosition(BUTTON_X, BUTTON_Y, BUTTON_W, BUTTON_H);\r
+    button_.SetImages(ImageCacheManager::GetInstance().LoadOneInMultiRes(IMAGE_SPORT_RADIO1, SPORT_IMAGE),\r
+                      ImageCacheManager::GetInstance().LoadOneInMultiRes(IMAGE_SPORT_RADIO0, SPORT_IMAGE));\r
+\r
+    Add(&bgImage_);\r
+    Add(&title_);\r
+    Add(&range_);\r
+    Add(&button_);\r
+}\r
+\r
+SportHeartRateRangeItemView::~SportHeartRateRangeItemView()\r
+{\r
+    Remove(&bgImage_);\r
+    Remove(&title_);\r
+    Remove(&range_);\r
+    Remove(&button_);\r
+}\r
+\r
+void SportHeartRateRangeItemView::SetItemInfo(const SportHeartRateRangeItem &itemInfo)\r
+{\r
+    title_.SetText(itemInfo.title);\r
+    range_.SetText(GetHeartRateRangeDescription(itemInfo.itemId));\r
+    sport_info_t *sportInfo = SportModel::GetInstance().GetCurrSportInfo();\r
+    if (sportInfo->heartRange == itemInfo.itemId) {\r
+        button_.SetState(UICheckBox::UICheckBoxState::SELECTED);\r
+    } else {\r
+        button_.SetState(UICheckBox::UICheckBoxState::UNSELECTED);\r
+    }\r
+    SetViewId(itemInfo.viewId);\r
+}\r
+}
\ No newline at end of file
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/sport/src/SportHeartRateRangePage.cpp b/code/sdk/application/wearable/evb/nativeapp/nativeui/sport/src/SportHeartRateRangePage.cpp
new file mode 100644 (file)
index 0000000..1200835
--- /dev/null
@@ -0,0 +1,171 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SportHeartRateRangePage\r
+ * Create: 2025-06-06\r
+ */\r
+\r
+#include "wearable_log.h"\r
+#include "UiConfig.h"\r
+#include "AppViewIDs.h"\r
+#include "NativeAbility.h"\r
+#include "SlicePageFactory.h"\r
+#include "sport/SportView.h"\r
+#include "sport/SportPresenter.h"\r
+#include "sport/SportHeartRateRangePage.h"\r
+\r
+namespace OHOS {\r
+static constexpr uint16_t LABELS_X = 100;\r
+static constexpr uint16_t LABELS_Y = 38;\r
+static constexpr uint16_t LABELS_W = 253;\r
+static constexpr uint16_t LABELS_H = 53;\r
+static constexpr uint16_t LABELS_FONT = 38;\r
+static constexpr uint16_t LIST_X = 20;\r
+static constexpr uint16_t LIST_Y = 100;\r
+static constexpr uint16_t LIST_W = 415;\r
+static constexpr uint16_t LIST_H = 485;\r
+static constexpr uint16_t LIST_ITEM_W = 415;\r
+static constexpr uint16_t LIST_ITEM_H = 108;\r
+static constexpr uint16_t REBOUND_SIZE = 60;\r
+static constexpr uint16_t TOP_BLANK_SIZE = 38;\r
+static constexpr uint16_t BOTTOM_BLANK_SIZE = 60;\r
+\r
+REGIST_SLICE_PAGE(VIEW_SPORT, SportPages::SPORT_PAGE_HEARTRATE_RANGE, SportHeartRateRangePage, false);\r
+\r
+static SportHeartRateRangePage *g_SportHeartRateRangePageInstance = nullptr;\r
+\r
+static UIView *CreateViewCb(uint8_t type)\r
+{\r
+    SportHeartRateRangeItemView *item = new SportHeartRateRangeItemView();\r
+    if (item == nullptr) {\r
+        return nullptr;\r
+    }\r
+    item->SetPosition(0, 0, LIST_ITEM_W, LIST_ITEM_H);\r
+    item->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+    item->SetTouchable(true);\r
+    item->SetOnClickListener(g_SportHeartRateRangePageInstance);\r
+    return item;\r
+}\r
+\r
+static void UpdateViewCb(UIView *view, void *data, uint8_t type)\r
+{\r
+    if (view == nullptr || data == nullptr) {\r
+        return;\r
+    }\r
+    SportHeartRateRangeItemView *item = dynamic_cast<SportHeartRateRangeItemView *>(view);\r
+    if (item == nullptr) {\r
+        return;\r
+    }\r
+    SportHeartRateRangeItem *itemInfo = static_cast<SportHeartRateRangeItem *>(data);\r
+    item->SetItemInfo(*itemInfo);\r
+}\r
+\r
+SportHeartRateRangePage::SportHeartRateRangePage()\r
+{\r
+    g_SportHeartRateRangePageInstance = this;\r
+}\r
+\r
+SportHeartRateRangePage::~SportHeartRateRangePage()\r
+{\r
+    if (group_ != nullptr) {\r
+        group_->RemoveAll();\r
+        delete group_;\r
+        group_ = nullptr;\r
+    }\r
+    if (titleLabel_ != nullptr) {\r
+        delete titleLabel_;\r
+        titleLabel_ = nullptr;\r
+    }\r
+    if (heartRateRangeList_ != nullptr) {\r
+        delete heartRateRangeList_;\r
+        heartRateRangeList_ = nullptr;\r
+    }\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SportHeartRateRangePage::~SportHeartRateRangePage");\r
+}\r
+\r
+void SportHeartRateRangePage::CreateUILabel()\r
+{\r
+    titleLabel_ = new UILabel();\r
+    if (titleLabel_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SportHeartRateRangePage titleLabel_ new fail");\r
+        return;\r
+    }\r
+    titleLabel_->SetPosition(LABELS_X, LABELS_Y, LABELS_W, LABELS_H);\r
+    titleLabel_->SetText("心率范围");\r
+    titleLabel_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+    titleLabel_->SetFont(BOLD_VECTOR_FONT_FILENAME, LABELS_FONT);\r
+    group_->Add(titleLabel_);\r
+}\r
+\r
+void SportHeartRateRangePage::CreateUIList()\r
+{\r
+    heartRateRangeList_ = new UISimpleList();\r
+    if (heartRateRangeList_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SportHeartRateRangePage heartRateRangeList_ new fail");\r
+        return;\r
+    }\r
+    heartRateRangeList_->SetPosition(LIST_X, LIST_Y, LIST_W, LIST_H);\r
+    heartRateRangeList_->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+    heartRateRangeList_->SetBoundaryIntercept(DragEvent::DIRECTION_TOP_TO_BOTTOM, false);\r
+    heartRateRangeList_->SetBoundaryIntercept(DragEvent::DIRECTION_BOTTOM_TO_TOP, false);\r
+\r
+    for (uint8_t i = 0; i < SPORT_HEARTRATE_RANGE_MAX; ++i) {\r
+        Contents content;\r
+        content.createFunc = CreateViewCb;\r
+        content.updateFunc = UpdateViewCb;\r
+        content.type = 0;\r
+        content.data = reinterpret_cast<void *>(&heartRateRanges_[i]);\r
+        heartRateRangeList_->AddContent(content);\r
+    }\r
+    heartRateRangeList_->RefreshList();\r
+    group_->Add(heartRateRangeList_);\r
+}\r
+\r
+void SportHeartRateRangePage::OnStart(void *data)\r
+{\r
+    group_ = new UIScrollView();\r
+    if (group_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SportHeartRateRangePage group_ new fail");\r
+        return;\r
+    }\r
+    group_->SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);\r
+    group_->SetOnDragListener(this);\r
+    group_->SetDraggable(true);\r
+    group_->SetTouchable(true);\r
+    group_->SetReboundSize(REBOUND_SIZE, UIAbstractScroll::Direction::BOTTOM);\r
+    group_->SetScrollBlankSize(TOP_BLANK_SIZE, UIAbstractScroll::Direction::TOP);\r
+    group_->SetScrollBlankSize(BOTTOM_BLANK_SIZE, UIAbstractScroll::Direction::BOTTOM);\r
+\r
+    CreateUILabel();\r
+    CreateUIList();\r
+    AddViewToPageContainer(group_);\r
+}\r
+\r
+bool SportHeartRateRangePage::OnDrag(UIView &view, const DragEvent &event)\r
+{\r
+    if ((event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT) && (event.GetDeltaX() > X_DRAG_OFFSET) &&\r
+        (event.GetDeltaX() > (DOUBLES * MATH_ABS(event.GetDeltaY())))) {\r
+        NativeAbility::GetInstance().SwitchPageInSlice(SportPages::SPORT_PAGE_REMIND_HEARTRATE,\r
+            TransitionType::TRANSITION_INVALID, false);\r
+    }\r
+    return true;\r
+}\r
+\r
+bool SportHeartRateRangePage::OnClick(UIView &view, const ClickEvent &event)\r
+{\r
+    sport_info_t *sportInfo = SportModel::GetInstance().GetCurrSportInfo();\r
+    if (strcmp(view.GetViewId(), SPORT_HEARTRATE_RANGE_ITEM_1) == 0) {\r
+        sportInfo->heartRange = SPORT_HEARTRATE_RANGE_ITEM1;\r
+    } else if (strcmp(view.GetViewId(), SPORT_HEARTRATE_RANGE_ITEM_2) == 0) {\r
+        sportInfo->heartRange = SPORT_HEARTRATE_RANGE_ITEM2;\r
+    } else if (strcmp(view.GetViewId(), SPORT_HEARTRATE_RANGE_ITEM_3) == 0) {\r
+        sportInfo->heartRange = SPORT_HEARTRATE_RANGE_ITEM3;\r
+    } else if (strcmp(view.GetViewId(), SPORT_HEARTRATE_RANGE_ITEM_4) == 0) {\r
+        sportInfo->heartRange = SPORT_HEARTRATE_RANGE_ITEM4;\r
+    }\r
+    heartRateRangeList_->RefreshList();\r
+    SportModel::GetInstance().SaveConfig(SPORT_CONFIG_INFO);\r
+    NativeAbility::GetInstance().SwitchPageInSlice(SportPages::SPORT_PAGE_REMIND_HEARTRATE,\r
+        TransitionType::TRANSITION_INVALID, false);\r
+    return true;\r
+}\r
+}
\ No newline at end of file
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/sport/src/SportMenuItemView.cpp b/code/sdk/application/wearable/evb/nativeapp/nativeui/sport/src/SportMenuItemView.cpp
new file mode 100644 (file)
index 0000000..f4eb224
--- /dev/null
@@ -0,0 +1,60 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SportMenuItemView\r
+ * Create: 2025-06-06\r
+ */\r
+\r
+#include "wearable_log.h"\r
+#include "UiConfig.h"\r
+#include "ui_resource_sport.h"\r
+#include "main/LoadImg.h"\r
+#include "sport/SportMenuItemView.h"\r
+\r
+namespace OHOS {\r
+static constexpr uint16_t BG_X = 0;\r
+static constexpr uint16_t BG_Y = 10;\r
+static constexpr uint16_t ICON_X = 16;\r
+static constexpr uint16_t ICON_Y = 25;\r
+static constexpr uint16_t LABEL_X = 124;\r
+static constexpr uint16_t LABEL_Y = 47;\r
+static constexpr uint16_t LABEL_W = 166;\r
+static constexpr uint16_t LABEL_H = 40;\r
+static constexpr uint16_t LABEL_FONT = 32;\r
+static constexpr uint16_t IMAGE_X = 344;\r
+static constexpr uint16_t IMAGE_Y = 44;\r
+\r
+SportMenuItemView::SportMenuItemView()\r
+{\r
+    bgImage_.SetPosition(BG_X, BG_Y);\r
+\r
+    icon_.SetPosition(ICON_X, ICON_Y);\r
+\r
+    label_.SetPosition(LABEL_X, LABEL_Y, LABEL_W, LABEL_H);\r
+    label_.SetFont(DEFAULT_VECTOR_FONT_FILENAME, LABEL_FONT);\r
+    label_.SetAlign(TEXT_ALIGNMENT_LEFT, TEXT_ALIGNMENT_CENTER);\r
+\r
+    LOADIMG::LoadImageViewImg(&settingImage_, SPORT_IMAGE, IMAGE_SPORT_SETTING);\r
+    settingImage_.SetPosition(IMAGE_X, IMAGE_Y);\r
+\r
+    Add(&bgImage_);\r
+    Add(&icon_);\r
+    Add(&label_);\r
+    Add(&settingImage_);\r
+}\r
+\r
+SportMenuItemView::~SportMenuItemView()\r
+{\r
+    Remove(&bgImage_);\r
+    Remove(&icon_);\r
+    Remove(&label_);\r
+    Remove(&settingImage_);\r
+}\r
+\r
+void SportMenuItemView::SetItemInfo(const SportMenuItem &itemInfo)\r
+{\r
+    LOADIMG::LoadImageViewImg(&bgImage_, SPORT_IMAGE, itemInfo.bgId);\r
+    LOADIMG::LoadImageViewImg(&icon_, SPORT_IMAGE, itemInfo.iconId);\r
+    label_.SetText(itemInfo.label);\r
+    SetViewId(itemInfo.viewId);\r
+}\r
+}
\ No newline at end of file
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/sport/src/SportMenuPage.cpp b/code/sdk/application/wearable/evb/nativeapp/nativeui/sport/src/SportMenuPage.cpp
new file mode 100644 (file)
index 0000000..f91d3d6
--- /dev/null
@@ -0,0 +1,207 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SportMenuPage\r
+ * Create: 2025-06-06\r
+ */\r
+\r
+#include "UiConfig.h"\r
+#include "main/LoadImg.h"\r
+#include "wearable_log.h"\r
+#include "AppViewIDs.h"\r
+#include "NativeAbility.h"\r
+#include "SlicePageFactory.h"\r
+#include "sport/SportView.h"\r
+#include "sport/SportMenuPage.h"\r
+\r
+namespace OHOS {\r
+static constexpr uint16_t TITLI_LABEL_FONT = 38;\r
+static constexpr uint16_t TITLI_LABEL_X = 100;\r
+static constexpr uint16_t TITLI_LABEL_Y = 38;\r
+static constexpr uint16_t TITLI_LABEL_W = 253;\r
+static constexpr uint16_t TITLI_LABEL_H = 53;\r
+static constexpr uint16_t LIST_X = 19;\r
+static constexpr uint16_t LIST_Y = 108;\r
+static constexpr uint16_t LIST_W = 415;\r
+static constexpr uint16_t LIST_H = 780;\r
+static constexpr uint16_t LIST_ITEM_W = 415;\r
+static constexpr uint16_t LIST_ITEM_H = 129;\r
+static constexpr uint16_t REBOUND_SIZE = 60;\r
+static constexpr uint16_t BLANK_SIZE = 100;\r
+static constexpr uint16_t SETTINGS_START_XPOS = 364;\r
+\r
+REGIST_SLICE_PAGE(VIEW_SPORT, SportPages::SPORT_PAGE_MENU, SportMenuPage, true);\r
+\r
+static SportMenuPage *g_SportMenuPageInstance = nullptr;\r
+\r
+static UIView *CreateViewCb(uint8_t type)\r
+{\r
+    SportMenuItemView *item = new SportMenuItemView();\r
+    if (item == nullptr) {\r
+        return nullptr;\r
+    }\r
+    item->SetPosition(0, 0, LIST_ITEM_W, LIST_ITEM_H);\r
+    item->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+    item->SetTouchable(true);\r
+    item->SetOnClickListener(g_SportMenuPageInstance);\r
+    return item;\r
+}\r
+\r
+static void UpdateViewCb(UIView *view, void *data, uint8_t type)\r
+{\r
+    if (view == nullptr || data == nullptr) {\r
+        return;\r
+    }\r
+    SportMenuItemView *item = dynamic_cast<SportMenuItemView *>(view);\r
+    if (item == nullptr) {\r
+        return;\r
+    }\r
+    SportMenuItem *itemInfo = static_cast<SportMenuItem *>(data);\r
+    item->SetItemInfo(*itemInfo);\r
+}\r
+\r
+SportMenuPage::SportMenuPage()\r
+{\r
+    g_SportMenuPageInstance = this;\r
+}\r
+\r
+SportMenuPage::~SportMenuPage()\r
+{\r
+    bool ret = ImageCacheManager::GetInstance().UnloadAllInMultiRes(SPORT_IMAGE);\r
+    if (ret == false) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "UnloadSportImage fail");\r
+    }\r
+\r
+    if (group_ != nullptr) {\r
+        group_->RemoveAll();\r
+        delete group_;\r
+        group_ = nullptr;\r
+    }\r
+    if (background_ != nullptr) {\r
+        delete background_;\r
+        background_ = nullptr;\r
+    }\r
+    if (titleLabel_ != nullptr) {\r
+        delete titleLabel_;\r
+        titleLabel_ = nullptr;\r
+    }\r
+    if (sportList_ != nullptr) {\r
+        delete sportList_;\r
+        sportList_ = nullptr;\r
+    }\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SportMenuPage::~SportMenuPage");\r
+}\r
+\r
+void SportMenuPage::InitBackgroundView()\r
+{\r
+    background_ = new UIImageView();\r
+    if (background_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SportMenuPage background_ new fail");\r
+        return;\r
+    }\r
+    background_->SetPosition(0, 0);\r
+    LOADIMG::LoadImageViewImg(background_, SPORT_IMAGE, IMAGE_SPORT_BG);\r
+    group_->Add(background_);\r
+}\r
+\r
+void SportMenuPage::CreateUILabel()\r
+{\r
+    titleLabel_ = new UILabel();\r
+    if (titleLabel_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SportMenuPage titleLabel_ new fail");\r
+        return;\r
+    }\r
+\r
+    titleLabel_->SetPosition(TITLI_LABEL_X, TITLI_LABEL_Y, TITLI_LABEL_W, TITLI_LABEL_H);\r
+    titleLabel_->SetText("运动");\r
+    titleLabel_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+    titleLabel_->SetFont(BOLD_VECTOR_FONT_FILENAME, TITLI_LABEL_FONT);\r
+    group_->Add(titleLabel_);\r
+}\r
+\r
+void SportMenuPage::CreateUIList()\r
+{\r
+    sportList_ = new UISimpleList();\r
+    if (sportList_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SportMenuPage sportList_ new fail");\r
+        return;\r
+    }\r
+\r
+    sportList_->SetPosition(LIST_X, LIST_Y, LIST_W, LIST_H);\r
+    sportList_->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+    sportList_->SetBoundaryIntercept(DragEvent::DIRECTION_TOP_TO_BOTTOM, false);\r
+    sportList_->SetBoundaryIntercept(DragEvent::DIRECTION_BOTTOM_TO_TOP, false);\r
+\r
+    for (uint8_t i = 0; i < SPORT_TYPE_MAX; ++i) {\r
+        Contents content;\r
+        content.createFunc = CreateViewCb;\r
+        content.updateFunc = UpdateViewCb;\r
+        content.type = 0;\r
+        content.data = reinterpret_cast<void *>(&sportMenu_[i]);\r
+        sportList_->AddContent(content);\r
+    }\r
+    sportList_->RefreshList();\r
+    group_->Add(sportList_);\r
+}\r
+\r
+void SportMenuPage::OnStart(void *data)\r
+{\r
+    bool ret = ImageCacheManager::GetInstance().LoadAllInMultiRes(SPORT_IMAGE);\r
+    if (ret == false) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "LoadSportImage fail");\r
+        return;\r
+    }\r
+    group_ = new UIScrollView();\r
+    if (group_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SportMenuPage group_ new fail");\r
+        return;\r
+    }\r
+    group_->SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);\r
+    group_->SetOnDragListener(this);\r
+    group_->SetDraggable(true);\r
+    group_->SetTouchable(true);\r
+    group_->SetYScrollBarVisible(true);\r
+    group_->SetReboundSize(REBOUND_SIZE, UIAbstractScroll::Direction::BOTTOM);\r
+    group_->SetScrollBlankSize(BLANK_SIZE, UIAbstractScroll::Direction::BOTTOM);\r
+\r
+    InitBackgroundView();\r
+    CreateUILabel();\r
+    CreateUIList();\r
+    AddViewToPageContainer(group_);\r
+}\r
+\r
+bool SportMenuPage::OnDrag(UIView &view, const DragEvent &event)\r
+{\r
+    if ((event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT) && (event.GetDeltaX() > X_DRAG_OFFSET) &&\r
+        (event.GetDeltaX() > (DOUBLES * MATH_ABS(event.GetDeltaY())))) {\r
+        NativeAbility::GetInstance().ChangeSliceToApplist();\r
+    }\r
+    return true;\r
+}\r
+\r
+bool SportMenuPage::OnClick(UIView &view, const ClickEvent &event)\r
+{\r
+    if (strcmp(view.GetViewId(), SPORT_ITEM_OUTDOOR_RUNNING) == 0) {\r
+        SportModel::GetInstance().SetSportType(SPORT_TYPE_OUTDOOR_RUNNING);\r
+    } else if (strcmp(view.GetViewId(), SPORT_ITEM_INDOOR_RUNNING) == 0) {\r
+        SportModel::GetInstance().SetSportType(SPORT_TYPE_INDOOR_RUNNING);\r
+    } else if (strcmp(view.GetViewId(), SPORT_ITEM_CYCLING) == 0) {\r
+        SportModel::GetInstance().SetSportType(SPORT_TYPE_CYCLING);\r
+    } else if (strcmp(view.GetViewId(), SPORT_ITEM_CLIMBING) == 0) {\r
+        SportModel::GetInstance().SetSportType(SPORT_TYPE_CLIMBING);\r
+    } else if (strcmp(view.GetViewId(), SPORT_ITEM_INDOOR_SWIMMING) == 0) {\r
+        SportModel::GetInstance().SetSportType(SPORT_TYPE_INDOOR_SWIMMING);\r
+    } else if (strcmp(view.GetViewId(), SPORT_ITEM_OUTDOOR_SWIMMING) == 0) {\r
+        SportModel::GetInstance().SetSportType(SPORT_TYPE_OUTDOOR_SWIMMING);\r
+    }\r
+\r
+    bool isSettingClicked = event.GetCurrentPos().x > SETTINGS_START_XPOS ? true : false;\r
+    if (isSettingClicked) {\r
+        NativeAbility::GetInstance().SwitchPageInSlice(SportPages::SPORT_PAGE_SETTINGS,\r
+            TransitionType::TRANSITION_INVALID, false);\r
+    } else {\r
+        NativeAbility::GetInstance().SwitchPageInSlice(SportPages::SPORT_PAGE_PREPARE,\r
+            TransitionType::TRANSITION_INVALID, false);\r
+    }\r
+    return true;\r
+}\r
+}
\ No newline at end of file
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/sport/src/SportMistouchPage.cpp b/code/sdk/application/wearable/evb/nativeapp/nativeui/sport/src/SportMistouchPage.cpp
new file mode 100644 (file)
index 0000000..f4f8c22
--- /dev/null
@@ -0,0 +1,277 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SportMistouchPage\r
+ * Create: 2025-06-06\r
+ */\r
+\r
+#include "UiConfig.h"\r
+#include "main/LoadImg.h"\r
+#include "wearable_log.h"\r
+#include "ui_resource_sport.h"\r
+#include "AppViewIDs.h"\r
+#include "NativeAbility.h"\r
+#include "SlicePageFactory.h"\r
+#include "sport/SportView.h"\r
+#include "sport/SportMistouchPage.h"\r
+\r
+namespace OHOS {\r
+static constexpr uint16_t TITLE_X = 100;\r
+static constexpr uint16_t TITLE_Y = 39;\r
+static constexpr uint16_t TITLE_W = 253;\r
+static constexpr uint16_t TITLE_H = 53;\r
+static constexpr uint16_t TITLE_FONT = 38;\r
+static constexpr uint16_t SCREEN_BG_X = 19;\r
+static constexpr uint16_t SCREEN_BG_Y = 107;\r
+static constexpr uint16_t SCREEN_ICON_X = 27;\r
+static constexpr uint16_t SCREEN_ICON_Y = 115;\r
+static constexpr uint16_t SCREEN_TITLE_X = 100;\r
+static constexpr uint16_t SCREEN_TITLE_Y = 134;\r
+static constexpr uint16_t SCREEN_TITLE_W = 222;\r
+static constexpr uint16_t SCREEN_TITLE_H = 39;\r
+static constexpr uint16_t SCREEN_TITLE_FONT = 32;\r
+static constexpr uint16_t SCREEN_BUTTON_X = 323;\r
+static constexpr uint16_t SCREEN_BUTTON_Y = 131;\r
+static constexpr uint16_t SCREEN_BUTTON_W = 82;\r
+static constexpr uint16_t SCREEN_BUTTON_H = 47;\r
+static constexpr uint16_t SCREEN_TEXT_X = 19;\r
+static constexpr uint16_t SCREEN_TEXT_Y = 224;\r
+static constexpr uint16_t SCREEN_TEXT_W = 415;\r
+static constexpr uint16_t SCREEN_TEXT_H = 146;\r
+static constexpr uint16_t SCREEN_TEXT_FONT = 36;\r
+static constexpr uint16_t CROWN_BG_X = 19;\r
+static constexpr uint16_t CROWN_BG_Y = 394;\r
+static constexpr uint16_t CROWN_ICON_X = 27;\r
+static constexpr uint16_t CROWN_ICON_Y = 402;\r
+static constexpr uint16_t CROWN_TITLE_X = 100;\r
+static constexpr uint16_t CROWN_TITLE_Y = 421;\r
+static constexpr uint16_t CROWN_TITLE_W = 222;\r
+static constexpr uint16_t CROWN_TITLE_H = 39;\r
+static constexpr uint16_t CROWN_TITLE_FONT = 32;\r
+static constexpr uint16_t CROWN_BUTTON_X = 323;\r
+static constexpr uint16_t CROWN_BUTTON_Y = 417;\r
+static constexpr uint16_t CROWN_BUTTON_W = 82;\r
+static constexpr uint16_t CROWN_BUTTON_H = 47;\r
+static constexpr uint16_t CROWN_TEXT_X = 19;\r
+static constexpr uint16_t CROWN_TEXT_Y = 510;\r
+static constexpr uint16_t CROWN_TEXT_W = 415;\r
+static constexpr uint16_t CROWN_TEXT_H = 146;\r
+static constexpr uint16_t CROWN_TEXT_FONT = 36;\r
+static constexpr uint16_t REBOUND_SIZE = 60;\r
+static constexpr uint16_t TOP_BLANK_SIZE = 36;\r
+static constexpr uint16_t BOTTOM_BLANK_SIZE = 100;\r
+\r
+REGIST_SLICE_PAGE(VIEW_SPORT, SportPages::SPORT_PAGE_MISTOUCH, SportMistouchPage, false);\r
+\r
+SportMistouchPage::~SportMistouchPage()\r
+{\r
+    if (group_ != nullptr) {\r
+        group_->RemoveAll();\r
+        delete group_;\r
+        group_ = nullptr;\r
+    }\r
+    if (title_ != nullptr) {\r
+        delete title_;\r
+        title_ = nullptr;\r
+    }\r
+    if (bgScreen_ != nullptr) {\r
+        delete bgScreen_;\r
+        bgScreen_ = nullptr;\r
+    }\r
+    if (imageScreen_ != nullptr) {\r
+        delete imageScreen_;\r
+        imageScreen_ = nullptr;\r
+    }\r
+    if (titleScreen_ != nullptr) {\r
+        delete titleScreen_;\r
+        titleScreen_ = nullptr;\r
+    }\r
+    if (buttonScreen_ != nullptr) {\r
+        delete buttonScreen_;\r
+        buttonScreen_ = nullptr;\r
+    }\r
+    if (textScreen_ != nullptr) {\r
+        delete textScreen_;\r
+        textScreen_ = nullptr;\r
+    }\r
+    if (bgCrown_ != nullptr) {\r
+        delete bgCrown_;\r
+        bgCrown_ = nullptr;\r
+    }\r
+    if (imageCrown_ != nullptr) {\r
+        delete imageCrown_;\r
+        imageCrown_ = nullptr;\r
+    }\r
+    if (titleCrown_ != nullptr) {\r
+        delete titleCrown_;\r
+        titleCrown_ = nullptr;\r
+    }\r
+    if (buttonCrown_ != nullptr) {\r
+        delete buttonCrown_;\r
+        buttonCrown_ = nullptr;\r
+    }\r
+    if (textCrown_ != nullptr) {\r
+        delete textCrown_;\r
+        textCrown_ = nullptr;\r
+    }\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SportMistouchPage::~SportMistouchPage");\r
+}\r
+\r
+void SportMistouchPage::OnStart(void *data)\r
+{\r
+    group_ = new UIScrollView();\r
+    if (group_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SportMistouchPage group_ new fail");\r
+        return;\r
+    }\r
+    group_->SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);\r
+    group_->SetOnDragListener(this);\r
+    group_->SetDraggable(true);\r
+    group_->SetTouchable(true);\r
+    group_->SetElastic(true);\r
+    group_->SetYScrollBarVisible(true);\r
+    group_->SetReboundSize(REBOUND_SIZE);\r
+    group_->SetScrollBlankSize(TOP_BLANK_SIZE, UIAbstractScroll::Direction::TOP);\r
+    group_->SetScrollBlankSize(BOTTOM_BLANK_SIZE, UIAbstractScroll::Direction::BOTTOM);\r
+\r
+    title_ = new UILabel();\r
+    if (title_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SportMistouchPage title_ new fail");\r
+        return;\r
+    }\r
+    title_->SetPosition(TITLE_X, TITLE_Y, TITLE_W, TITLE_H);\r
+    title_->SetText("运动防误触");\r
+    title_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+    title_->SetFont(BOLD_VECTOR_FONT_FILENAME, TITLE_FONT);\r
+    group_->Add(title_);\r
+\r
+    bgScreen_ = new UIImageView();\r
+    if (bgScreen_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SportMistouchPage bgScreen_ new fail");\r
+        return;\r
+    }\r
+    bgScreen_->SetPosition(SCREEN_BG_X, SCREEN_BG_Y);\r
+    LOADIMG::LoadImageViewImg(bgScreen_, SPORT_IMAGE, IMAGE_SPORT_ITEMBG);\r
+    group_->Add(bgScreen_);\r
+\r
+    buttonScreen_ = new UIToggleButton();\r
+    if (buttonScreen_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SportMistouchPage buttonScreen_ new fail");\r
+        return;\r
+    }\r
+    buttonScreen_->SetPosition(SCREEN_BUTTON_X, SCREEN_BUTTON_Y, SCREEN_BUTTON_W, SCREEN_BUTTON_H);\r
+    buttonScreen_->SetViewId(SPORT_MISTOUCH_SCREEN_BUTTON);\r
+    buttonScreen_->SetImages(ImageCacheManager::GetInstance().LoadOneInMultiRes(IMAGE_SPORT_TOGGLE1, SPORT_IMAGE),\r
+                             ImageCacheManager::GetInstance().LoadOneInMultiRes(IMAGE_SPORT_TOGGLE0, SPORT_IMAGE));\r
+    buttonScreen_->SetState(false);\r
+    buttonScreen_->SetOnClickListener(this);\r
+    group_->Add(buttonScreen_);\r
+\r
+    titleScreen_ = new UILabel();\r
+    if (titleScreen_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SportMistouchPage titleScreen_ new fail");\r
+        return;\r
+    }\r
+    titleScreen_->SetPosition(SCREEN_TITLE_X, SCREEN_TITLE_Y, SCREEN_TITLE_W, SCREEN_TITLE_H);\r
+    titleScreen_->SetText("自动锁定屏幕");\r
+    titleScreen_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+    titleScreen_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SCREEN_TITLE_FONT);\r
+    group_->Add(titleScreen_);\r
+\r
+    imageScreen_ = new UIImageView();\r
+    if (imageScreen_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SportMistouchPage imageScreen_ new fail");\r
+        return;\r
+    }\r
+    imageScreen_->SetPosition(SCREEN_ICON_X, SCREEN_ICON_Y);\r
+    LOADIMG::LoadImageViewImg(imageScreen_, SPORT_IMAGE, IMAGE_SPORT_SCREEN);\r
+    group_->Add(imageScreen_);\r
+\r
+    textScreen_ = new UILabel();\r
+    if (textScreen_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SportMistouchPage textScreen_ new fail");\r
+        return;\r
+    }\r
+    textScreen_->SetPosition(SCREEN_TEXT_X, SCREEN_TEXT_Y, SCREEN_TEXT_W, SCREEN_TEXT_H);\r
+    textScreen_->SetText("开启后,运动中熄屏将自动锁定屏幕触摸功能,长按表冠可解锁。");\r
+    textScreen_->SetLineBreakMode(UILabel::LINE_BREAK_WRAP);\r
+    textScreen_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+    textScreen_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SCREEN_TEXT_FONT);\r
+    group_->Add(textScreen_);\r
+\r
+    bgCrown_ = new UIImageView();\r
+    if (bgCrown_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SportMistouchPage bgCrown_ new fail");\r
+        return;\r
+    }\r
+    bgCrown_->SetPosition(CROWN_BG_X, CROWN_BG_Y);\r
+    LOADIMG::LoadImageViewImg(bgCrown_, SPORT_IMAGE, IMAGE_SPORT_ITEMBG);\r
+    group_->Add(bgCrown_);\r
+\r
+    buttonCrown_ = new UIToggleButton();\r
+    if (buttonCrown_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SportMistouchPage buttonCrown_ new fail");\r
+        return;\r
+    }\r
+    buttonCrown_->SetPosition(CROWN_BUTTON_X, CROWN_BUTTON_Y, CROWN_BUTTON_W, CROWN_BUTTON_H);\r
+    buttonCrown_->SetViewId(SPORT_MISTOUCH_CROWN_BUTTON);\r
+    buttonCrown_->SetImages(ImageCacheManager::GetInstance().LoadOneInMultiRes(IMAGE_SPORT_TOGGLE1, SPORT_IMAGE),\r
+                            ImageCacheManager::GetInstance().LoadOneInMultiRes(IMAGE_SPORT_TOGGLE0, SPORT_IMAGE));\r
+    buttonCrown_->SetState(false);\r
+    buttonCrown_->SetOnClickListener(this);\r
+    group_->Add(buttonCrown_);\r
+\r
+    titleCrown_ = new UILabel();\r
+    if (titleCrown_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SportMistouchPage titleCrown_ new fail");\r
+        return;\r
+    }\r
+    titleCrown_->SetPosition(CROWN_TITLE_X, CROWN_TITLE_Y, CROWN_TITLE_W, CROWN_TITLE_H);\r
+    titleCrown_->SetText("自动锁定表冠");\r
+    titleCrown_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+    titleCrown_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, CROWN_TITLE_FONT);\r
+    group_->Add(titleCrown_);\r
+\r
+    imageCrown_ = new UIImageView();\r
+    if (imageCrown_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SportMistouchPage imageCrown_ new fail");\r
+        return;\r
+    }\r
+    imageCrown_->SetPosition(CROWN_ICON_X, CROWN_ICON_Y);\r
+    LOADIMG::LoadImageViewImg(imageCrown_, SPORT_IMAGE, IMAGE_SPORT_CROWN);\r
+    group_->Add(imageCrown_);\r
+\r
+    textCrown_ = new UILabel();\r
+    if (textCrown_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SportMistouchPage textCrown_ new fail");\r
+        return;\r
+    }\r
+    textCrown_->SetPosition(CROWN_TEXT_X, CROWN_TEXT_Y, CROWN_TEXT_W, CROWN_TEXT_H);\r
+    textCrown_->SetText("开启后,运动中熄屏将自动锁定表冠点按、旋钮功能,长按表冠可解锁。");\r
+    textCrown_->SetLineBreakMode(UILabel::LINE_BREAK_WRAP);\r
+    textCrown_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+    textCrown_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, CROWN_TEXT_FONT);\r
+    group_->Add(textCrown_);\r
+\r
+    AddViewToPageContainer(group_);\r
+}\r
+\r
+bool SportMistouchPage::OnDrag(UIView &view, const DragEvent &event)\r
+{\r
+    if ((event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT) && (event.GetDeltaX() > X_DRAG_OFFSET) &&\r
+        (event.GetDeltaX() > (DOUBLES * MATH_ABS(event.GetDeltaY())))) {\r
+        NativeAbility::GetInstance().SwitchPageInSlice(SportPages::SPORT_PAGE_SETTINGS,\r
+            TransitionType::TRANSITION_INVALID, false);\r
+    }\r
+    return true;\r
+}\r
+\r
+bool SportMistouchPage::OnClick(UIView &view, const ClickEvent &event)\r
+{\r
+    if (strcmp(view.GetViewId(), SPORT_MISTOUCH_SCREEN_BUTTON) == 0) {\r
+        // 暂不支持\r
+    } else if (strcmp(view.GetViewId(), SPORT_MISTOUCH_CROWN_BUTTON) == 0) {\r
+        // 暂不支持\r
+    }\r
+    return true;\r
+}\r
+}
\ No newline at end of file
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/sport/src/SportModel.cpp b/code/sdk/application/wearable/evb/nativeapp/nativeui/sport/src/SportModel.cpp
new file mode 100644 (file)
index 0000000..a9c54bf
--- /dev/null
@@ -0,0 +1,495 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SportModel\r
+ * Create: 2025-06-06\r
+ */\r
+\r
+#include <fstream>\r
+#include <string>\r
+#include <sys/time.h>\r
+#include "wearable_log.h"\r
+#include "msg_center_device.h"\r
+#ifdef BUILD_IN_LINUX\r
+#include "localtime.h"\r
+#endif\r
+#include "sport/SportModel.h"\r
+\r
+namespace OHOS {\r
+static constexpr uint16_t NUM_TEN = 10;\r
+static constexpr uint16_t NUM_HUNDRED = 100;\r
+static constexpr uint16_t NUM_THOUSAND = 1000;\r
+static constexpr uint16_t UNIT_SECS_PER_MIN = 60;\r
+static constexpr uint16_t UNIT_SECS_PER_HOUR = 3600;\r
+static const uint16_t COUNT_TIMES = 100;\r
+static const uint16_t DISTANCE_RANGE = 200;\r
+static const uint16_t HEARTRATE_MIN_VALUE = 116;\r
+static const uint16_t HEARTRATE_MAX_VALUE = 195;\r
+static const uint16_t CALORIE_RANGE = 8;\r
+static const uint16_t ALTITUDE_RANGE = 4;\r
+static const uint16_t ASCENT_RANGE = 7;\r
+static const uint16_t DESCENT_RANGE = 6;\r
+static const uint16_t g_targetDistanceValues[] = {1, 3, 5, 7, 10, 15, 20, 25, 30, 40};  // 距离Picker值集,单位为km\r
+static const uint16_t g_targetTimeValues[] = {10, 20, 30, 60, 120, 180, 200};  // 时间Picker值集,单位为分钟\r
+static const uint16_t g_targetCalorieValues[] = {100, 200, 300, 500, 600, 800, 1000};  // 热量Picker值集,单位为千卡\r
+static const uint16_t g_targetLapValues[] = {1, 2, 4, 6, 8, 10, 12, 16, 20, 30};  // 室内游泳趟数Picker值集,单位为趟\r
+static const char *g_remindHeartRateRange[] = {"116-136次/分", "136-156次/分", "156-176次/分", "176-195次/分"};\r
+static const uint16_t g_heartRateRangeBounder[] = {116, 136, 156, 176, 195};\r
+static const char *SPORT_INFO_FILE = SPORT_CONFIG_PATH "sport_info.dat";\r
+static const char *SPORT_RECORD_FILE = SPORT_CONFIG_PATH "sport_record.dat";\r
+\r
+std::string GetCurrentTimeStr()\r
+{\r
+    struct tm localTime;\r
+    time_t seconds = time(nullptr);\r
+    localtime_r(&seconds, &localTime);\r
+    std::string currTime;\r
+    if (localTime.tm_hour < NUM_TEN) {\r
+        currTime += "0";\r
+    }\r
+    currTime += std::to_string(localTime.tm_hour) + ":";\r
+    if (localTime.tm_min < NUM_TEN) {\r
+        currTime += "0";\r
+    }\r
+    currTime += std::to_string(localTime.tm_min);\r
+    return currTime;\r
+}\r
+\r
+std::string ConvertDistance(uint32_t distance)\r
+{\r
+    std::string distanceStr;\r
+    uint32_t distanceIntPart = distance / NUM_THOUSAND;\r
+    uint32_t distanceFractionalPart = (distance % NUM_THOUSAND) / NUM_TEN;\r
+    if (distanceIntPart > NUM_HUNDRED) {\r
+        distanceStr = std::to_string(distanceIntPart);\r
+    } else if (distanceIntPart > NUM_TEN) {\r
+        distanceStr = std::to_string(distanceIntPart) + "." + std::to_string(distanceFractionalPart / NUM_TEN);\r
+    } else {\r
+        if (distanceFractionalPart < NUM_TEN) {\r
+            distanceStr = std::to_string(distanceIntPart) + ".0" + std::to_string(distanceFractionalPart);\r
+        } else {\r
+            distanceStr = std::to_string(distanceIntPart) + "." + std::to_string(distanceFractionalPart);\r
+        }\r
+    }\r
+    return distanceStr;\r
+}\r
+\r
+std::string FormatSportTime(uint32_t uiSportTime)\r
+{\r
+    std::string strSportTime;\r
+    std::string hours;\r
+    std::string minute;\r
+    std::string seconds;\r
+    uint32_t hour = uiSportTime / UNIT_SECS_PER_HOUR;\r
+    uiSportTime %= UNIT_SECS_PER_HOUR;\r
+    uint32_t min = uiSportTime / UNIT_SECS_PER_MIN;\r
+    uiSportTime %= UNIT_SECS_PER_MIN;\r
+    uint32_t sec = uiSportTime;\r
+    if (hour >= 0 && hour < NUM_TEN) {\r
+        hours = "0" + std::to_string(hour);\r
+    } else {\r
+        hours = std::to_string(hour);\r
+    }\r
+    if (min >= 0 && min < NUM_TEN) {\r
+        minute = "0" + std::to_string(min);\r
+    } else {\r
+        minute = std::to_string(min);\r
+    }\r
+    if (sec >= 0 && sec < NUM_TEN) {\r
+        seconds = "0" + std::to_string(sec);\r
+    } else {\r
+        seconds = std::to_string(sec);\r
+    }\r
+    strSportTime = hours + ":" + minute + ":" + seconds;\r
+    return strSportTime;\r
+}\r
+\r
+std::string CalculateSpeed(uint32_t distance, uint32_t time)\r
+{\r
+    if (distance == 0) {\r
+        return "00'00\"";\r
+    }\r
+    std::string speedStr;\r
+    uint64_t speed = time * NUM_THOUSAND / distance;\r
+    uint64_t min = speed / UNIT_SECS_PER_MIN;\r
+    uint64_t sec = speed % UNIT_SECS_PER_MIN;\r
+    speedStr = std::to_string(min) + "'";\r
+    if (sec >= 0 && sec < NUM_TEN) {\r
+        speedStr += "0";\r
+    }\r
+    speedStr += std::to_string(sec) + "\"";\r
+    return speedStr;\r
+}\r
+\r
+const char *GetHeartRateRangeDescription(uint8_t range)\r
+{\r
+    return g_remindHeartRateRange[range];\r
+}\r
+\r
+uint16_t GetHeartRateRangeBounder(uint8_t index)\r
+{\r
+    return g_heartRateRangeBounder[index];\r
+}\r
+\r
+#if defined(_WIN32)\r
+void SportModel::SportAnimatorCallback::Callback(UIView *view)\r
+{\r
+    static uint64_t count = 0;\r
+    static bool increase = true;\r
+    if (count++ % COUNT_TIMES == 0) {\r
+        uint32_t randNum = rand();\r
+        uint32_t distance = randNum % DISTANCE_RANGE;\r
+        uint16_t calorie = randNum % CALORIE_RANGE;\r
+        uint16_t altitude = randNum % ALTITUDE_RANGE;\r
+        uint16_t ascent = randNum % ASCENT_RANGE;\r
+        uint16_t descent = randNum % DESCENT_RANGE;\r
+\r
+        sport_info_t *sportInfo = SportModel::GetInstance().GetCurrSportInfo();\r
+        sportInfo->data.distance += distance;\r
+        if (sportInfo->data.heartRate < HEARTRATE_MIN_VALUE) {\r
+            sportInfo->data.heartRate = HEARTRATE_MIN_VALUE;\r
+            increase = true;\r
+        }\r
+        if (sportInfo->data.heartRate > HEARTRATE_MAX_VALUE) {\r
+            sportInfo->data.heartRate = HEARTRATE_MAX_VALUE;\r
+            increase = false;\r
+        }\r
+        if (increase) {\r
+            sportInfo->data.heartRate++;\r
+        } else {\r
+            sportInfo->data.heartRate--;\r
+        }\r
+        sportInfo->data.calorie += calorie;\r
+        sportInfo->data.altitude += altitude;\r
+        sportInfo->data.ascent += ascent;\r
+        sportInfo->data.descent += descent;\r
+        sportInfo->data.lap++;\r
+    }\r
+}\r
+#else\r
+static void GenerateDataCallback(void *data)\r
+{\r
+    static bool increase = true;\r
+    uint32_t randNum = rand();\r
+    uint32_t distance = randNum % DISTANCE_RANGE;\r
+    uint16_t calorie = randNum % CALORIE_RANGE;\r
+    uint16_t altitude = randNum % ALTITUDE_RANGE;\r
+    uint16_t ascent = randNum % ASCENT_RANGE;\r
+    uint16_t descent = randNum % DESCENT_RANGE;\r
+\r
+    sport_info_t *sportInfo = SportModel::GetInstance().GetCurrSportInfo();\r
+    sportInfo->data.distance += distance;\r
+    if (sportInfo->data.heartRate < HEARTRATE_MIN_VALUE) {\r
+        sportInfo->data.heartRate = HEARTRATE_MIN_VALUE;\r
+        increase = true;\r
+    }\r
+    if (sportInfo->data.heartRate > HEARTRATE_MAX_VALUE) {\r
+        sportInfo->data.heartRate = HEARTRATE_MAX_VALUE;\r
+        increase = false;\r
+    }\r
+    if (increase) {\r
+        sportInfo->data.heartRate++;\r
+    } else {\r
+        sportInfo->data.heartRate--;\r
+    }\r
+    sportInfo->data.calorie += calorie;\r
+    sportInfo->data.altitude += altitude;\r
+    sportInfo->data.ascent += ascent;\r
+    sportInfo->data.descent += descent;\r
+    sportInfo->data.lap++;\r
+\r
+    if (!SportModel::GetInstance().IsStartByWatch()) {\r
+        msg_center_send_data(MSGCENTER_CMD_DEVICE, MSGCENTER_TYPE_ID_SPORT_REPORT_DATA, &sportInfo->data,\r
+                             sizeof(sport_data_t));\r
+    }\r
+}\r
+\r
+void SportModel::InitGenerateSportData()\r
+{\r
+    uint32_t tick = GetOSTick(2000);\r
+    generateDataHandle_ = new GraphicTimer(tick, GenerateDataCallback, nullptr, true);\r
+    if (generateDataHandle_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SportModel::InitGenerateSportData new GraphicTimer failed!!");\r
+        return;\r
+    }\r
+}\r
+\r
+void SportModel::StartGenerateSportData()\r
+{\r
+    if (generateDataHandle_ != nullptr) {\r
+        bool retTimer = generateDataHandle_->Start();\r
+        if (!retTimer) {\r
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "StartGenerateSportData failed!!");\r
+            if (generateDataHandle_ != nullptr) {\r
+                delete generateDataHandle_;\r
+                generateDataHandle_ = nullptr;\r
+            }\r
+            return;\r
+        }\r
+    }\r
+}\r
+\r
+void SportModel::StopGenerateSportData()\r
+{\r
+    if (generateDataHandle_ != nullptr) {\r
+        generateDataHandle_->Stop();\r
+    }\r
+}\r
+#endif\r
+\r
+SportModel::SportModel()\r
+{\r
+    LoadConfig();\r
+#if defined(_WIN32)\r
+    callback_ = new SportAnimatorCallback();\r
+    if (callback_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SportModel::SportModel callback_ new fail");\r
+        return;\r
+    }\r
+\r
+    animator_ = new Animator(callback_, nullptr, 0, true);\r
+    if (animator_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SportModel::SportModel new Animator animator_ fail");\r
+        return;\r
+    }\r
+#else\r
+    InitGenerateSportData();\r
+#endif\r
+}\r
+\r
+SportModel::~SportModel() {}\r
+\r
+SportModel &SportModel::GetInstance()\r
+{\r
+    static SportModel instance;\r
+    return instance;\r
+}\r
+\r
+void SportModel::SetSportType(SportType sportType)\r
+{\r
+    curSport_ = sportType;\r
+}\r
+\r
+SportType SportModel::GetSportType(void)\r
+{\r
+    return curSport_;\r
+}\r
+\r
+void SportModel::SetTargetValue(uint16_t index)\r
+{\r
+    SportTarget target = info_[curSport_].targetType;\r
+    if (target == SPORT_TARGET_DISTANCE) {\r
+        if (curSport_ == SPORT_TYPE_INDOOR_SWIMMING) {\r
+            info_[curSport_].targetValue = g_targetLapValues[index];\r
+        } else {\r
+            info_[curSport_].targetValue = g_targetDistanceValues[index];\r
+        }\r
+    } else if (target == SPORT_TARGET_TIME) {\r
+        info_[curSport_].targetValue = g_targetTimeValues[index];\r
+    } else if (target == SPORT_TARGET_CALORIE) {\r
+        info_[curSport_].targetValue = g_targetCalorieValues[index];\r
+    }\r
+}\r
+\r
+void SportModel::SetRemindValue(uint16_t index)\r
+{\r
+    SportRemindInterval remind = info_[curSport_].remindType;\r
+    if (remind == SPORT_REMIND_INTERVAL_DISTANCE) {\r
+        if (curSport_ == SPORT_TYPE_INDOOR_SWIMMING) {\r
+            info_[curSport_].remindValue = g_targetLapValues[index];\r
+        } else {\r
+            info_[curSport_].remindValue = g_targetDistanceValues[index];\r
+        }\r
+    } else if (remind == SPORT_REMIND_INTERVAL_TIME) {\r
+        info_[curSport_].remindValue = g_targetTimeValues[index];\r
+    }\r
+    info_[curSport_].remindIndex = index;\r
+}\r
+\r
+uint32_t SportModel::GetElapsedTime()\r
+{\r
+    if (state_ == SportState::RUNNING) {\r
+        uint32_t now = time(nullptr);\r
+        return info_[curSport_].data.elapsedTime + (now - info_[curSport_].startTimeTemp);\r
+    }\r
+    return info_[curSport_].data.elapsedTime;\r
+}\r
+\r
+void SportModel::SetGpsSignal(GpsSignal gpsSignal)\r
+{\r
+    gpsSignal_ = gpsSignal;\r
+}\r
+\r
+GpsSignal SportModel::GetGpsSignal(void)\r
+{\r
+    return gpsSignal_;\r
+}\r
+\r
+uint16_t SportModel::GetHeartRate(void)\r
+{\r
+    return info_[curSport_].data.heartRate;\r
+}\r
+\r
+sport_info_t *SportModel::GetSportInfo(SportType type)\r
+{\r
+    return &info_[type];\r
+}\r
+\r
+sport_info_t *SportModel::GetCurrSportInfo()\r
+{\r
+    return GetSportInfo(curSport_);\r
+}\r
+\r
+void SportModel::StartSport(bool startedByWatch)\r
+{\r
+    if (state_ == SportState::STOPPED) {\r
+        state_ = SportState::RUNNING;\r
+        isStartByWatch_ = startedByWatch;\r
+        info_[curSport_].targetHalf = false;\r
+        info_[curSport_].targetComplete = false;\r
+        info_[curSport_].isHeartReminded = false;\r
+        info_[curSport_].remindTimes = 0;\r
+        (void)memset_s(&(info_[curSport_].data), sizeof(info_[curSport_].data), 0, sizeof(sport_data_t));\r
+        info_[curSport_].data.startTime = time(nullptr);\r
+        info_[curSport_].startTimeTemp = info_[curSport_].data.startTime;\r
+#if defined(_WIN32)\r
+        animator_->Start();\r
+#else\r
+        StartGenerateSportData();\r
+#endif\r
+    }\r
+}\r
+\r
+void SportModel::PauseAndReport(bool isReport)\r
+{\r
+    if (state_ == SportState::RUNNING) {\r
+        state_ = SportState::PAUSED;\r
+        info_[curSport_].data.elapsedTime += time(nullptr) - info_[curSport_].startTimeTemp;\r
+#if defined(_WIN32)\r
+        animator_->Stop();\r
+#else\r
+        StopGenerateSportData();\r
+        if (isReport) {\r
+            sport_control_t control = {0};\r
+            control.action = static_cast<uint8_t>(SPORT_ACTION_PAUSE);\r
+            control.type = static_cast<uint8_t>(curSport_);\r
+            msg_center_send_data(MSGCENTER_CMD_DEVICE, MSGCENTER_TYPE_ID_SPORT_REPORT_ACTION, &control,\r
+                                 sizeof(sport_control_t));\r
+        }\r
+#endif\r
+    }\r
+}\r
+\r
+void SportModel::ResumeAndReport(bool isReport)\r
+{\r
+    if (state_ == SportState::PAUSED) {\r
+        state_ = SportState::RUNNING;\r
+        info_[curSport_].startTimeTemp = time(nullptr);\r
+#if defined(_WIN32)\r
+        animator_->Start();\r
+#else\r
+        StartGenerateSportData();\r
+        if (isReport) {\r
+            sport_control_t control = {0};\r
+            control.action = static_cast<uint8_t>(SPORT_ACTION_RESUME);\r
+            control.type = static_cast<uint8_t>(curSport_);\r
+            msg_center_send_data(MSGCENTER_CMD_DEVICE, MSGCENTER_TYPE_ID_SPORT_REPORT_ACTION, &control,\r
+                                 sizeof(sport_control_t));\r
+        }\r
+#endif\r
+    }\r
+}\r
+\r
+void SportModel::StopAndReport(bool isReport)\r
+{\r
+    if (state_ != SportState::STOPPED) {\r
+        state_ = SportState::STOPPED;\r
+        info_[curSport_].data.type = static_cast<uint8_t>(curSport_);\r
+        info_[curSport_].data.endTime = time(nullptr);\r
+#if defined(_WIN32)\r
+        animator_->Stop();\r
+#else\r
+        StopGenerateSportData();\r
+        if (isReport) {\r
+            sport_control_t control = {0};\r
+            control.action = static_cast<uint8_t>(SPORT_ACTION_STOP);\r
+            control.type = static_cast<uint8_t>(curSport_);\r
+            msg_center_send_data(MSGCENTER_CMD_DEVICE, MSGCENTER_TYPE_ID_SPORT_REPORT_ACTION, &control,\r
+                                 sizeof(sport_control_t));\r
+        }\r
+#endif\r
+    }\r
+}\r
+\r
+bool SportModel::IsStartByWatch()\r
+{\r
+    return isStartByWatch_;\r
+}\r
+\r
+void SportModel::AddRecord()\r
+{\r
+    if (isStartByWatch_) {\r
+        records_.push_back(info_[curSport_].data);\r
+    }\r
+    SaveConfig(SPORT_CONFIG_RECORD);\r
+}\r
+\r
+std::vector<sport_data_t> &SportModel::GetRecord()\r
+{\r
+    return records_;\r
+}\r
+\r
+void SportModel::ClearRecord()\r
+{\r
+    records_.clear();\r
+    std::remove(SPORT_RECORD_FILE);\r
+}\r
+\r
+void SportModel::LoadConfig()\r
+{\r
+    std::ifstream infoFile(SPORT_INFO_FILE, std::ios::binary);\r
+    if (infoFile) {\r
+        for (uint8_t i = 0; i < SPORT_TYPE_MAX; i++) {\r
+            infoFile.read(reinterpret_cast<char *>(&info_[i]), sizeof(sport_info_t));\r
+        }\r
+        infoFile.close();\r
+    }\r
+    std::ifstream recordFile(SPORT_RECORD_FILE, std::ios::binary);\r
+    if (recordFile) {\r
+        uint16_t num = 0;\r
+        recordFile.read(reinterpret_cast<char *>(&num), sizeof(uint16_t));\r
+        for (uint8_t i = 0; i < num; i++) {\r
+            sport_data_t data;\r
+            recordFile.read(reinterpret_cast<char *>(&data), sizeof(sport_data_t));\r
+            records_.push_back(data);\r
+        }\r
+        recordFile.close();\r
+    }\r
+}\r
+\r
+void SportModel::SaveConfig(uint8_t config)\r
+{\r
+    if (config == SPORT_CONFIG_INFO) {\r
+        std::ofstream infoFile(SPORT_INFO_FILE, std::ios::binary);\r
+        if (infoFile) {\r
+            infoFile.write(reinterpret_cast<char *>(&info_), SPORT_TYPE_MAX * sizeof(sport_info_t));\r
+            infoFile.close();\r
+        }\r
+    } else if (config == SPORT_CONFIG_RECORD) {\r
+        std::ofstream recordFile(SPORT_RECORD_FILE, std::ios::binary);\r
+        if (recordFile) {\r
+            uint16_t num = records_.size();\r
+            recordFile.write(reinterpret_cast<char *>(&num), sizeof(uint16_t));\r
+            for (uint8_t i = 0; i < num; i++) {\r
+                recordFile.write(reinterpret_cast<char *>(&records_[i]), sizeof(sport_data_t));\r
+            }\r
+            recordFile.close();\r
+        }\r
+    }\r
+}\r
+\r
+void SportModel::ClearData()\r
+{\r
+    std::remove(SPORT_INFO_FILE);\r
+    std::remove(SPORT_RECORD_FILE);\r
+}\r
+}\r
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/sport/src/SportPausePage.cpp b/code/sdk/application/wearable/evb/nativeapp/nativeui/sport/src/SportPausePage.cpp
new file mode 100644 (file)
index 0000000..8a490f7
--- /dev/null
@@ -0,0 +1,215 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SportPausePage\r
+ * Create: 2025-06-06\r
+ */\r
+\r
+#include "UiConfig.h"\r
+#include "main/LoadImg.h"\r
+#include "ui_resource_sport.h"\r
+#include "wearable_log.h"\r
+#include "AppViewIDs.h"\r
+#include "NativeAbility.h"\r
+#include "SlicePageFactory.h"\r
+#include "sport/SportView.h"\r
+#include "sport/SportPausePage.h"\r
+\r
+namespace OHOS {\r
+static constexpr uint16_t NUM_THOUSAND = 1000;\r
+static constexpr uint16_t TIME_LABEL_FONT = 48;\r
+static constexpr uint16_t TIME_LABEL_X = 166;\r
+static constexpr uint16_t TIME_LABEL_Y = 35;\r
+static constexpr uint16_t TIME_LABEL_W = 122;\r
+static constexpr uint16_t TIME_LABEL_H = 48;\r
+static constexpr uint16_t TEXT_LABEL_FONT = 64;\r
+static constexpr uint16_t TEXT_LABEL_X = 130;\r
+static constexpr uint16_t TEXT_LABEL_Y = 151;\r
+static constexpr uint16_t TEXT_LABEL_W = 194;\r
+static constexpr uint16_t TEXT_LABEL_H = 80;\r
+static constexpr uint16_t BUTTON_X1 = 54;\r
+static constexpr uint16_t BUTTON_X2 = 217;\r
+static constexpr uint16_t BUTTON_Y = 250;\r
+static constexpr uint16_t BUTTON_W = 184;\r
+static constexpr uint16_t BUTTON_H = 184;\r
+\r
+REGIST_SLICE_PAGE(VIEW_SPORT, SportPages::SPORT_PAGE_PAUSE, SportPausePage, false);\r
+\r
+void SportPausePage::SportPauseAnimatorCallback::Callback(UIView *view)\r
+{\r
+    UILabel *timeLabel = dynamic_cast<UILabel *>(view);\r
+    if (timeLabel == nullptr) {\r
+        return;\r
+    }\r
+    std::string currTime = GetCurrentTimeStr();\r
+    timeLabel->SetText(currTime.c_str());\r
+    timeLabel->Invalidate();\r
+}\r
+\r
+SportPausePage::~SportPausePage()\r
+{\r
+    if (group_ != nullptr) {\r
+        group_->RemoveAll();\r
+        delete group_;\r
+        group_ = nullptr;\r
+    }\r
+    if (timeLabel_ != nullptr) {\r
+        delete timeLabel_;\r
+        timeLabel_ = nullptr;\r
+    }\r
+    if (textLabel_ != nullptr) {\r
+        delete textLabel_;\r
+        textLabel_ = nullptr;\r
+    }\r
+    if (continueButton_ != nullptr) {\r
+        delete continueButton_;\r
+        continueButton_ = nullptr;\r
+    }\r
+    if (finishButton_ != nullptr) {\r
+        delete finishButton_;\r
+        finishButton_ = nullptr;\r
+    }\r
+    if (animator_ != nullptr) {\r
+        delete animator_;\r
+        animator_ = nullptr;\r
+    }\r
+    if (callback_ != nullptr) {\r
+        delete callback_;\r
+        callback_ = nullptr;\r
+    }\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SportPausePage::~SportPausePage");\r
+}\r
+\r
+void SportPausePage::CreateUILabel()\r
+{\r
+    timeLabel_ = new UILabel();\r
+    if (timeLabel_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SportPausePage timeLabel_ new fail");\r
+        return;\r
+    }\r
+    timeLabel_->SetPosition(TIME_LABEL_X, TIME_LABEL_Y, TIME_LABEL_W, TIME_LABEL_H);\r
+    timeLabel_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+    timeLabel_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, TIME_LABEL_FONT);\r
+    group_->Add(timeLabel_);\r
+\r
+    textLabel_ = new UILabel();\r
+    if (textLabel_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SportPausePage textLabel_ new fail");\r
+        return;\r
+    }\r
+    textLabel_->SetPosition(TEXT_LABEL_X, TEXT_LABEL_Y, TEXT_LABEL_W, TEXT_LABEL_H);\r
+    textLabel_->SetText("已暂停");\r
+    textLabel_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+    textLabel_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, TEXT_LABEL_FONT);\r
+    group_->Add(textLabel_);\r
+\r
+    callback_ = new SportPauseAnimatorCallback();\r
+    if (callback_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SportPausePage::OnStart callback_ new fail");\r
+        return;\r
+    }\r
+\r
+    animator_ = new Animator(callback_, timeLabel_, 0, true);\r
+    if (animator_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SportPausePage::OnStart new Animator animator_ fail");\r
+        return;\r
+    }\r
+}\r
+\r
+void SportPausePage::OnPause()\r
+{\r
+    if (animator_ != nullptr) {\r
+        if (animator_->GetState() != Animator::STOP) {\r
+            animator_->Stop();\r
+        }\r
+    }\r
+}\r
+\r
+void SportPausePage::OnResume()\r
+{\r
+    if (animator_ != nullptr) {\r
+        if (animator_->GetState() == Animator::STOP) {\r
+            animator_->Start();\r
+        }\r
+    }\r
+}\r
+\r
+void SportPausePage::CreateUIButton()\r
+{\r
+    finishButton_ = new UILabelButton();\r
+    if (finishButton_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SportPausePage finishButton_ new fail");\r
+        return;\r
+    }\r
+    finishButton_->SetPosition(BUTTON_X1, BUTTON_Y, BUTTON_W, BUTTON_H);\r
+    finishButton_->SetViewId(SPORT_PAUSE_FINISH_BUTTON);\r
+    finishButton_->SetStyleForState(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT, UIButton::RELEASED);\r
+    finishButton_->SetStyleForState(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT, UIButton::PRESSED);\r
+    finishButton_->SetStyleForState(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT, UIButton::INACTIVE);\r
+    LOADIMG::LoadBtnImage(finishButton_, SPORT_IMAGE, IMAGE_SPORT_STOP, IMAGE_SPORT_STOP);\r
+    finishButton_->SetOnClickListener(this);\r
+    group_->Add(finishButton_);\r
+\r
+    continueButton_ = new UILabelButton();\r
+    if (continueButton_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SportPausePage continueButton_ new fail");\r
+        return;\r
+    }\r
+    continueButton_->SetPosition(BUTTON_X2, BUTTON_Y, BUTTON_W, BUTTON_H);\r
+    continueButton_->SetViewId(SPORT_PAUSE_CONTINUE_BUTTON);\r
+    continueButton_->SetStyleForState(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT, UIButton::RELEASED);\r
+    continueButton_->SetStyleForState(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT, UIButton::PRESSED);\r
+    continueButton_->SetStyleForState(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT, UIButton::INACTIVE);\r
+    LOADIMG::LoadBtnImage(continueButton_, SPORT_IMAGE, IMAGE_SPORT_START, IMAGE_SPORT_START);\r
+    continueButton_->SetOnClickListener(this);\r
+    group_->Add(continueButton_);\r
+}\r
+\r
+void SportPausePage::OnStart(void *data)\r
+{\r
+    group_ = new UIViewGroup();\r
+    if (group_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SportPausePage group_ new fail");\r
+        return;\r
+    }\r
+    group_->SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);\r
+    group_->SetOnDragListener(this);\r
+    group_->SetDraggable(true);\r
+    group_->SetTouchable(true);\r
+\r
+    CreateUILabel();\r
+    CreateUIButton();\r
+    AddViewToPageContainer(group_);\r
+}\r
+\r
+bool SportPausePage::OnDrag(UIView &view, const DragEvent &event)\r
+{\r
+    if ((event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT) && (event.GetDeltaX() > X_DRAG_OFFSET) &&\r
+        (event.GetDeltaX() > (DOUBLES * MATH_ABS(event.GetDeltaY())))) {\r
+        SportModel::GetInstance().ResumeAndReport(true);\r
+        NativeAbility::GetInstance().SwitchPageInSlice(SportPages::SPORT_PAGE_DATA,\r
+            TransitionType::TRANSITION_INVALID, false);\r
+    }\r
+    return true;\r
+}\r
+\r
+bool SportPausePage::OnClick(UIView &view, const ClickEvent &event)\r
+{\r
+    if (strcmp(view.GetViewId(), SPORT_PAUSE_CONTINUE_BUTTON) == 0) {\r
+        SportModel::GetInstance().ResumeAndReport(true);\r
+        NativeAbility::GetInstance().SwitchPageInSlice(SportPages::SPORT_PAGE_DATA,\r
+            TransitionType::TRANSITION_INVALID, false);\r
+    } else if (strcmp(view.GetViewId(), SPORT_PAUSE_FINISH_BUTTON) == 0) {\r
+        sport_info_t *sportInfo = SportModel::GetInstance().GetCurrSportInfo();\r
+        if (sportInfo->data.distance < NUM_THOUSAND) {\r
+            NativeAbility::GetInstance().SwitchPageInSlice(SportPages::SPORT_PAGE_PROMPT,\r
+                TransitionType::TRANSITION_INVALID, false);\r
+        } else {\r
+            SportModel::GetInstance().StopAndReport(true);\r
+            SportModel::GetInstance().AddRecord();\r
+            NativeAbility::GetInstance().SwitchPageInSlice(SportPages::SPORT_PAGE_MENU,\r
+                TransitionType::TRANSITION_INVALID, false);\r
+        }\r
+    }\r
+    return true;\r
+}\r
+}
\ No newline at end of file
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/sport/src/SportPreparePage.cpp b/code/sdk/application/wearable/evb/nativeapp/nativeui/sport/src/SportPreparePage.cpp
new file mode 100644 (file)
index 0000000..041bba0
--- /dev/null
@@ -0,0 +1,422 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SportPreparePage\r
+ * Create: 2025-06-06\r
+ */\r
+\r
+#include <sys/time.h>\r
+#include "UiConfig.h"\r
+#include "main/LoadImg.h"\r
+#include "ui_resource_sport.h"\r
+#include "wearable_log.h"\r
+#include "AppViewIDs.h"\r
+#include "NativeAbility.h"\r
+#include "SlicePageFactory.h"\r
+#include "settings/model/SettingPowerModel.h"\r
+#include "sport/SportView.h"\r
+#include "sport/SportPreparePage.h"\r
+\r
+namespace OHOS {\r
+static constexpr uint16_t LOCATING_OVERTIME_SECOND = 2;\r
+static constexpr uint16_t BATTERY_LEVEL1 = 10;\r
+static constexpr uint16_t BATTERY_LEVEL2 = 20;\r
+static constexpr uint16_t BATTERY_LEVEL3 = 40;\r
+static constexpr uint16_t BATTERY_LEVEL4 = 70;\r
+static constexpr uint16_t BATTERY_LEVEL5 = 100;\r
+static constexpr uint16_t HEARTBEAT_IMAGE_X = 351;\r
+static constexpr uint16_t HEARTBEAT_IMAGE_Y = 223;\r
+static constexpr uint16_t HEARTBEAT_LABEL_X = 329;\r
+static constexpr uint16_t HEARTBEAT_LABEL_Y = 182;\r
+static constexpr uint16_t HEARTBEAT_LABEL_W = 102;\r
+static constexpr uint16_t HEARTBEAT_LABEL_H = 48;\r
+static constexpr uint16_t HEARTBEAT_LABEL_FONT = 32;\r
+static constexpr uint16_t BATTERY_ICON_X = 159;\r
+static constexpr uint16_t BATTERY_ICON_Y = 31;\r
+static constexpr uint16_t BATTERY_LABEL_FONT = 20;\r
+static constexpr uint16_t BATTERY_LABEL_X = 163;\r
+static constexpr uint16_t BATTERY_LABEL_Y = 31;\r
+static constexpr uint16_t BATTERY_LABEL_W = 35;\r
+static constexpr uint16_t BATTERY_LABEL_H = 22;\r
+static constexpr uint16_t GPS_X = 48;\r
+static constexpr uint16_t GPS_Y = 225;\r
+static constexpr uint16_t SIGNAL_X = 44;\r
+static constexpr uint16_t SIGNAL_Y = 175;\r
+static constexpr uint16_t TIME_LABEL_FONT = 32;\r
+static constexpr uint16_t TIME_LABEL_X = 214;\r
+static constexpr uint16_t TIME_LABEL_Y = 23;\r
+static constexpr uint16_t TIME_LABEL_W = 82;\r
+static constexpr uint16_t TIME_LABEL_H = 47;\r
+static constexpr uint16_t LOCATING_LABEL_FONT = 32;\r
+static constexpr uint16_t LOCATING_LABEL_X = 165;\r
+static constexpr uint16_t LOCATING_LABEL_Y = 80;\r
+static constexpr uint16_t LOCATING_LABEL_W = 164;\r
+static constexpr uint16_t LOCATING_LABEL_H = 34;\r
+static constexpr uint16_t CENTER_IMAGE_X = 132;\r
+static constexpr uint16_t CENTER_IMAGE_Y = 132;\r
+static constexpr uint16_t GO_BUTTON_X = 63;\r
+static constexpr uint16_t GO_BUTTON_Y = 361;\r
+static constexpr uint16_t GO_BUTTON_W = 328;\r
+static constexpr uint16_t GO_BUTTON_H = 93;\r
+\r
+REGIST_SLICE_PAGE(VIEW_SPORT, SportPages::SPORT_PAGE_PREPARE, SportPreparePage, false);\r
+\r
+void SportPreparePage::SportPrepareAnimatorCallback::Callback(UIView *view)\r
+{\r
+    UNUSED(view);\r
+\r
+    std::string currTime = GetCurrentTimeStr();\r
+    page_->timeLabel_->SetText(currTime.c_str());\r
+    page_->timeLabel_->Invalidate();\r
+\r
+    uint8_t battery = SettingPowerModel::GetInstance().GetBatteryPowerLevel();\r
+    page_->batteryLabel_->SetText(std::to_string(battery).c_str());\r
+    page_->batteryLabel_->Invalidate();\r
+\r
+    if (battery < BATTERY_LEVEL1) {\r
+        LOADIMG::LoadImageViewImg(page_->batteryIcon_, SPORT_IMAGE, IMAGE_SPORT_BATTERY1);\r
+    } else if (battery < BATTERY_LEVEL2) {\r
+        LOADIMG::LoadImageViewImg(page_->batteryIcon_, SPORT_IMAGE, IMAGE_SPORT_BATTERY2);\r
+    } else if (battery < BATTERY_LEVEL3) {\r
+        LOADIMG::LoadImageViewImg(page_->batteryIcon_, SPORT_IMAGE, IMAGE_SPORT_BATTERY3);\r
+    } else if (battery < BATTERY_LEVEL4) {\r
+        LOADIMG::LoadImageViewImg(page_->batteryIcon_, SPORT_IMAGE, IMAGE_SPORT_BATTERY4);\r
+    } else if (battery <= BATTERY_LEVEL5) {\r
+        LOADIMG::LoadImageViewImg(page_->batteryIcon_, SPORT_IMAGE, IMAGE_SPORT_BATTERY5);\r
+    }\r
+\r
+    time_t now = time(nullptr);\r
+    if (!page_->isOverTime_ && (now - page_->startTime_ > LOCATING_OVERTIME_SECOND)) {\r
+        page_->isOverTime_ = true;\r
+        page_->InitGpsSignalImage();\r
+    }\r
+}\r
+\r
+SportPreparePage::~SportPreparePage()\r
+{\r
+    if (group_ != nullptr) {\r
+        group_->RemoveAll();\r
+        delete group_;\r
+        group_ = nullptr;\r
+    }\r
+    if (background_ != nullptr) {\r
+        delete background_;\r
+        background_ = nullptr;\r
+    }\r
+    if (timeLabel_ != nullptr) {\r
+        delete timeLabel_;\r
+        timeLabel_ = nullptr;\r
+    }\r
+    if (batteryIcon_ != nullptr) {\r
+        delete batteryIcon_;\r
+        batteryIcon_ = nullptr;\r
+    }\r
+    if (batteryLabel_ != nullptr) {\r
+        delete batteryLabel_;\r
+        batteryLabel_ = nullptr;\r
+    }\r
+    if (gpsImageView_ != nullptr) {\r
+        delete gpsImageView_;\r
+        gpsImageView_ = nullptr;\r
+    }\r
+    if (gpsSignalView_ != nullptr) {\r
+        delete gpsSignalView_;\r
+        gpsSignalView_ = nullptr;\r
+    }\r
+    if (heartRateImageView_ != nullptr) {\r
+        delete heartRateImageView_;\r
+        heartRateImageView_ = nullptr;\r
+    }\r
+    if (heartRateLabel_ != nullptr) {\r
+        delete heartRateLabel_;\r
+        heartRateLabel_ = nullptr;\r
+    }\r
+    if (locatingLabel_ != nullptr) {\r
+        delete locatingLabel_;\r
+        locatingLabel_ = nullptr;\r
+    }\r
+    if (goButton_ != nullptr) {\r
+        delete goButton_;\r
+        goButton_ = nullptr;\r
+    }\r
+    if (iconImageView_ != nullptr) {\r
+        delete iconImageView_;\r
+        iconImageView_ = nullptr;\r
+    }\r
+    if (animator_ != nullptr) {\r
+        delete animator_;\r
+        animator_ = nullptr;\r
+    }\r
+    if (callback_ != nullptr) {\r
+        delete callback_;\r
+        callback_ = nullptr;\r
+    }\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SportPreparePage::~SportPreparePage");\r
+}\r
+\r
+void SportPreparePage::InitGpsSignalImage()\r
+{\r
+    locatingLabel_->SetVisible(false);\r
+    LOADIMG::LoadImageViewImg(gpsSignalView_, SPORT_IMAGE, IMAGE_SPORT_SIGNAL2);\r
+}\r
+\r
+void SportPreparePage::InitTimeLableVIew()\r
+{\r
+    timeLabel_ = new UILabel();\r
+    if (timeLabel_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SportPreparePage timeLabel_ new fail");\r
+        return;\r
+    }\r
+    timeLabel_->SetPosition(TIME_LABEL_X, TIME_LABEL_Y, TIME_LABEL_W, TIME_LABEL_H);\r
+    timeLabel_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, TIME_LABEL_FONT);\r
+    group_->Add(timeLabel_);\r
+}\r
+\r
+void SportPreparePage::InitBatteryView()\r
+{\r
+    batteryIcon_ = new UIImageView();\r
+    if (batteryIcon_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SportPreparePage batteryIcon_ new fail");\r
+        return;\r
+    }\r
+    batteryIcon_->SetPosition(BATTERY_ICON_X, BATTERY_ICON_Y);\r
+    batteryIcon_->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+    group_->Add(batteryIcon_);\r
+\r
+    batteryLabel_ = new UILabel();\r
+    if (batteryLabel_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SportPreparePage batteryLabel_ new fail");\r
+        return;\r
+    }\r
+    batteryLabel_->SetPosition(BATTERY_LABEL_X, BATTERY_LABEL_Y, BATTERY_LABEL_W, BATTERY_LABEL_H);\r
+    batteryLabel_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, BATTERY_LABEL_FONT);\r
+    batteryLabel_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+    group_->Add(batteryLabel_);\r
+}\r
+\r
+void SportPreparePage::InitCenterView()\r
+{\r
+    iconImageView_ = new UIImageView();\r
+    if (iconImageView_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SportPreparePage iconImageView_ new fail");\r
+        return;\r
+    }\r
+    iconImageView_->SetPosition(CENTER_IMAGE_X, CENTER_IMAGE_Y);\r
+    SportType sportType = SportModel::GetInstance().GetSportType();\r
+    if (sportType == SPORT_TYPE_OUTDOOR_RUNNING) {\r
+        LOADIMG::LoadImageViewImg(iconImageView_, SPORT_IMAGE, IMAGE_SPORT_OUTDOOR_RUNNING2);\r
+    } else if (sportType == SPORT_TYPE_INDOOR_RUNNING) {\r
+        LOADIMG::LoadImageViewImg(iconImageView_, SPORT_IMAGE, IMAGE_SPORT_INDOOR_RUNNING2);\r
+    } else if (sportType == SPORT_TYPE_CYCLING) {\r
+        LOADIMG::LoadImageViewImg(iconImageView_, SPORT_IMAGE, IMAGE_SPORT_CYCLING2);\r
+    } else if (sportType == SPORT_TYPE_CLIMBING) {\r
+        LOADIMG::LoadImageViewImg(iconImageView_, SPORT_IMAGE, IMAGE_SPORT_CLIMBING2);\r
+    } else if (sportType == SPORT_TYPE_INDOOR_SWIMMING) {\r
+        LOADIMG::LoadImageViewImg(iconImageView_, SPORT_IMAGE, IMAGE_SPORT_INDOOR_SWIMMING2);\r
+    } else if (sportType == SPORT_TYPE_OUTDOOR_SWIMMING) {\r
+        LOADIMG::LoadImageViewImg(iconImageView_, SPORT_IMAGE, IMAGE_SPORT_OUTDOOR_SWIMMING2);\r
+    }\r
+    group_->Add(iconImageView_);\r
+}\r
+\r
+void SportPreparePage::InitGPSView()\r
+{\r
+    locatingLabel_ = new UILabel();\r
+    if (locatingLabel_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SportPreparePage locatingLabel_ new fail");\r
+        return;\r
+    }\r
+    locatingLabel_->SetPosition(LOCATING_LABEL_X, LOCATING_LABEL_Y, LOCATING_LABEL_W, LOCATING_LABEL_H);\r
+    locatingLabel_->SetText("定位中...");\r
+    locatingLabel_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, LOCATING_LABEL_FONT);\r
+    locatingLabel_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+    group_->Add(locatingLabel_);\r
+\r
+    gpsSignalView_ = new UIImageView();\r
+    if (gpsSignalView_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SportPreparePage gpsSignalView_ new fail");\r
+        return;\r
+    }\r
+    gpsSignalView_->SetPosition(SIGNAL_X, SIGNAL_Y);\r
+    GpsSignal signal = SportModel::GetInstance().GetGpsSignal();\r
+    if (signal == SPORT_GPS_SIGNAL0) {\r
+        LOADIMG::LoadImageViewImg(gpsSignalView_, SPORT_IMAGE, IMAGE_SPORT_SIGNAL0);\r
+    } else if (signal == SPORT_GPS_SIGNAL1) {\r
+        LOADIMG::LoadImageViewImg(gpsSignalView_, SPORT_IMAGE, IMAGE_SPORT_SIGNAL1);\r
+    } else if (signal == SPORT_GPS_SIGNAL2) {\r
+        LOADIMG::LoadImageViewImg(gpsSignalView_, SPORT_IMAGE, IMAGE_SPORT_SIGNAL2);\r
+    } else if (signal == SPORT_GPS_SIGNAL3) {\r
+        LOADIMG::LoadImageViewImg(gpsSignalView_, SPORT_IMAGE, IMAGE_SPORT_SIGNAL3);\r
+    }\r
+    group_->Add(gpsSignalView_);\r
+\r
+    gpsImageView_ = new UIImageView();\r
+    if (gpsImageView_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SportPreparePage gpsImageView_ new fail");\r
+        return;\r
+    }\r
+    gpsImageView_->SetPosition(GPS_X, GPS_Y);\r
+    LOADIMG::LoadImageViewImg(gpsImageView_, SPORT_IMAGE, IMAGE_SPORT_GPS);\r
+    group_->Add(gpsImageView_);\r
+\r
+    SportType sportType = SportModel::GetInstance().GetSportType();\r
+    if (sportType == SPORT_TYPE_INDOOR_RUNNING || sportType == SPORT_TYPE_INDOOR_SWIMMING) {\r
+        locatingLabel_->SetVisible(false);\r
+        gpsSignalView_->SetVisible(false);\r
+        gpsImageView_->SetVisible(false);\r
+    } else {\r
+        locatingLabel_->SetVisible(true);\r
+        gpsSignalView_->SetVisible(true);\r
+        gpsImageView_->SetVisible(true);\r
+    }\r
+}\r
+\r
+void SportPreparePage::InitHeartRateView()\r
+{\r
+    heartRateLabel_ = new UILabel();\r
+    if (heartRateLabel_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SportPreparePage heartRateLabel_ new fail");\r
+        return;\r
+    }\r
+    heartRateLabel_->SetPosition(HEARTBEAT_LABEL_X, HEARTBEAT_LABEL_Y, HEARTBEAT_LABEL_W, HEARTBEAT_LABEL_H);\r
+    heartRateLabel_->SetText("95");  // 桩数据\r
+    heartRateLabel_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, HEARTBEAT_LABEL_FONT);\r
+    heartRateLabel_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+    group_->Add(heartRateLabel_);\r
+\r
+    heartRateImageView_ = new UIImageView();\r
+    if (heartRateImageView_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SportPreparePage heartRateImageView_ new fail");\r
+        return;\r
+    }\r
+    heartRateImageView_->SetPosition(HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y);\r
+    LOADIMG::LoadImageViewImg(heartRateImageView_, SPORT_IMAGE, IMAGE_SPORT_HEART1);\r
+    group_->Add(heartRateImageView_);\r
+}\r
+\r
+void SportPreparePage::InitGoButtonView()\r
+{\r
+    goButton_ = new UILabelButton();\r
+    if (goButton_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SportPreparePage goButton_ new fail");\r
+        return;\r
+    }\r
+    goButton_->SetPosition(GO_BUTTON_X, GO_BUTTON_Y, GO_BUTTON_W, GO_BUTTON_H);\r
+    goButton_->SetViewId(SPORT_PREPARE_GO_BUTTON);\r
+    goButton_->SetStyleForState(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT, UIButton::RELEASED);\r
+    goButton_->SetStyleForState(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT, UIButton::PRESSED);\r
+    goButton_->SetStyleForState(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT, UIButton::INACTIVE);\r
+    SportType sportType = SportModel::GetInstance().GetSportType();\r
+    if (sportType == SPORT_TYPE_OUTDOOR_RUNNING) {\r
+        LOADIMG::LoadBtnImage(goButton_, SPORT_IMAGE, IMAGE_SPORT_GO1, IMAGE_SPORT_GO1);\r
+    } else if (sportType == SPORT_TYPE_INDOOR_RUNNING) {\r
+        LOADIMG::LoadBtnImage(goButton_, SPORT_IMAGE, IMAGE_SPORT_GO2, IMAGE_SPORT_GO2);\r
+    } else if (sportType == SPORT_TYPE_CYCLING) {\r
+        LOADIMG::LoadBtnImage(goButton_, SPORT_IMAGE, IMAGE_SPORT_GO3, IMAGE_SPORT_GO3);\r
+    } else if (sportType == SPORT_TYPE_CLIMBING) {\r
+        LOADIMG::LoadBtnImage(goButton_, SPORT_IMAGE, IMAGE_SPORT_GO4, IMAGE_SPORT_GO4);\r
+    } else if (sportType == SPORT_TYPE_INDOOR_SWIMMING) {\r
+        LOADIMG::LoadBtnImage(goButton_, SPORT_IMAGE, IMAGE_SPORT_GO6, IMAGE_SPORT_GO6);\r
+    } else if (sportType == SPORT_TYPE_OUTDOOR_SWIMMING) {\r
+        LOADIMG::LoadBtnImage(goButton_, SPORT_IMAGE, IMAGE_SPORT_GO5, IMAGE_SPORT_GO5);\r
+    }\r
+    goButton_->SetOnClickListener(this);\r
+    group_->Add(goButton_);\r
+}\r
+\r
+void SportPreparePage::InitBackgroundView()\r
+{\r
+    background_ = new UIImageView();\r
+    if (background_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SportPreparePage background_ new fail");\r
+        return;\r
+    }\r
+    background_->SetPosition(0, 0);\r
+    SportType sportType = SportModel::GetInstance().GetSportType();\r
+    if (sportType == SPORT_TYPE_OUTDOOR_RUNNING) {\r
+        LOADIMG::LoadImageViewImg(background_, SPORT_IMAGE, IMAGE_SPORT_BG6);\r
+    } else if (sportType == SPORT_TYPE_INDOOR_RUNNING) {\r
+        LOADIMG::LoadImageViewImg(background_, SPORT_IMAGE, IMAGE_SPORT_BG1);\r
+    } else if (sportType == SPORT_TYPE_CYCLING) {\r
+        LOADIMG::LoadImageViewImg(background_, SPORT_IMAGE, IMAGE_SPORT_BG4);\r
+    } else if (sportType == SPORT_TYPE_CLIMBING) {\r
+        LOADIMG::LoadImageViewImg(background_, SPORT_IMAGE, IMAGE_SPORT_BG3);\r
+    } else if (sportType == SPORT_TYPE_INDOOR_SWIMMING) {\r
+        LOADIMG::LoadImageViewImg(background_, SPORT_IMAGE, IMAGE_SPORT_BG2);\r
+    } else if (sportType == SPORT_TYPE_OUTDOOR_SWIMMING) {\r
+        LOADIMG::LoadImageViewImg(background_, SPORT_IMAGE, IMAGE_SPORT_BG5);\r
+    }\r
+    group_->Add(background_);\r
+}\r
+\r
+void SportPreparePage::OnStart(void *data)\r
+{\r
+    startTime_ = time(nullptr);  // 用于在 animator 回调中, 模拟显示 '定位中'\r
+    group_ = new UIViewGroup();\r
+    if (group_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SportPreparePage group_ new fail");\r
+        return;\r
+    }\r
+    group_->SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);\r
+    group_->SetOnDragListener(this);\r
+    group_->SetDraggable(true);\r
+    group_->SetTouchable(true);\r
+\r
+    InitBackgroundView();\r
+    InitTimeLableVIew();\r
+    InitBatteryView();\r
+    InitCenterView();\r
+    InitGPSView();\r
+    InitHeartRateView();\r
+    InitGoButtonView();\r
+    AddViewToPageContainer(group_);\r
+\r
+    callback_ = new SportPrepareAnimatorCallback(this);\r
+    if (callback_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SportPreparePage::OnStart callback_ new fail");\r
+        return;\r
+    }\r
+\r
+    animator_ = new Animator(callback_, nullptr, 0, true);\r
+    if (animator_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SportPreparePage::OnStart new Animator animator_ fail");\r
+        return;\r
+    }\r
+}\r
+\r
+void SportPreparePage::OnPause()\r
+{\r
+    if (animator_ != nullptr) {\r
+        if (animator_->GetState() != Animator::STOP) {\r
+            animator_->Stop();\r
+        }\r
+    }\r
+}\r
+\r
+void SportPreparePage::OnResume()\r
+{\r
+    if (animator_ != nullptr) {\r
+        if (animator_->GetState() == Animator::STOP) {\r
+            animator_->Start();\r
+        }\r
+    }\r
+}\r
+\r
+bool SportPreparePage::OnDrag(UIView &view, const DragEvent &event)\r
+{\r
+    if ((event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT) && (event.GetDeltaX() > X_DRAG_OFFSET) &&\r
+        (event.GetDeltaX() > (DOUBLES * MATH_ABS(event.GetDeltaY())))) {\r
+        NativeAbility::GetInstance().SwitchPageInSlice(SportPages::SPORT_PAGE_MENU,\r
+            TransitionType::TRANSITION_INVALID, false);\r
+    }\r
+    return true;\r
+}\r
+\r
+bool SportPreparePage::OnClick(UIView &view, const ClickEvent &event)\r
+{\r
+    if (strcmp(view.GetViewId(), SPORT_PREPARE_GO_BUTTON) == 0) {\r
+        NativeAbility::GetInstance().SwitchPageInSlice(SportPages::SPORT_PAGE_COUNTDOWN,\r
+            TransitionType::TRANSITION_INVALID, false);\r
+    }\r
+    return true;\r
+}\r
+}
\ No newline at end of file
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/sport/src/SportPresenter.cpp b/code/sdk/application/wearable/evb/nativeapp/nativeui/sport/src/SportPresenter.cpp
new file mode 100644 (file)
index 0000000..b510e85
--- /dev/null
@@ -0,0 +1,13 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SportPresenter\r
+ * Create: 2025-06-06\r
+ */\r
+\r
+#include "NativeRegisterManager.h"\r
+#include "sport/SportView.h"\r
+#include "sport/SportPresenter.h"\r
+\r
+namespace OHOS {\r
+REGIST_MENU(VIEW_SPORT, SportView, SportPresenter, SPORT_ICON, SPORT_ICON, "运动");\r
+}\r
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/sport/src/SportPromptPage.cpp b/code/sdk/application/wearable/evb/nativeapp/nativeui/sport/src/SportPromptPage.cpp
new file mode 100644 (file)
index 0000000..f5d7132
--- /dev/null
@@ -0,0 +1,149 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SportPromptPage\r
+ * Create: 2025-06-06\r
+ */\r
+\r
+#include "wearable_log.h"\r
+#include "UiConfig.h"\r
+#include "main/LoadImg.h"\r
+#include "ui_resource_sport.h"\r
+#include "AppViewIDs.h"\r
+#include "NativeAbility.h"\r
+#include "SlicePageFactory.h"\r
+#include "sport/SportView.h"\r
+#include "sport/SportModel.h"\r
+#include "sport/SportPromptPage.h"\r
+\r
+namespace OHOS {\r
+static constexpr uint16_t ICON_X = 173;\r
+static constexpr uint16_t ICON_Y = 48;\r
+static constexpr uint16_t LABEL_X = 24;\r
+static constexpr uint16_t LABEL_Y = 177;\r
+static constexpr uint16_t LABEL_W = 405;\r
+static constexpr uint16_t LABEL_H = 100;\r
+static constexpr uint16_t LABEL_FONT = 36;\r
+static constexpr uint16_t BUTTON_X1 = 104;\r
+static constexpr uint16_t BUTTON_X2 = 240;\r
+static constexpr uint16_t BUTTON_Y = 296;\r
+static constexpr uint16_t BUTTON_W = 109;\r
+static constexpr uint16_t BUTTON_H = 109;\r
+static const char *PROMPT_CONTENT = "本次运动距离过短,不会记录数据。是否结束?";\r
+\r
+REGIST_SLICE_PAGE(VIEW_SPORT, SportPages::SPORT_PAGE_PROMPT, SportPromptPage, false);\r
+\r
+SportPromptPage::~SportPromptPage()\r
+{\r
+    if (group_ != nullptr) {\r
+        group_->RemoveAll();\r
+        delete group_;\r
+        group_ = nullptr;\r
+    }\r
+    if (promptLabel_ != nullptr) {\r
+        delete promptLabel_;\r
+        promptLabel_ = nullptr;\r
+    }\r
+    if (promptIcon_ != nullptr) {\r
+        delete promptIcon_;\r
+        promptIcon_ = nullptr;\r
+    }\r
+    if (cancelButton_ != nullptr) {\r
+        delete cancelButton_;\r
+        cancelButton_ = nullptr;\r
+    }\r
+    if (confirmButton_ != nullptr) {\r
+        delete confirmButton_;\r
+        confirmButton_ = nullptr;\r
+    }\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SportPromptPage::~SportPromptPage");\r
+}\r
+\r
+void SportPromptPage::CreateUILabel()\r
+{\r
+    promptIcon_ = new UIImageView();\r
+    if (promptIcon_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SportPromptPage promptIcon_ new fail");\r
+        return;\r
+    }\r
+    promptIcon_->SetPosition(ICON_X, ICON_Y);\r
+    LOADIMG::LoadImageViewImg(promptIcon_, SPORT_IMAGE, IMAGE_SPORT_FACE);\r
+    group_->Add(promptIcon_);\r
+\r
+    promptLabel_ = new UILabel();\r
+    if (promptLabel_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SportPromptPage promptLabel_ new fail");\r
+        return;\r
+    }\r
+    promptLabel_->SetPosition(LABEL_X, LABEL_Y, LABEL_W, LABEL_H);\r
+    promptLabel_->SetText(PROMPT_CONTENT);\r
+    promptLabel_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, LABEL_FONT);\r
+    promptLabel_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+    group_->Add(promptLabel_);\r
+}\r
+\r
+void SportPromptPage::CreateUIButton()\r
+{\r
+    cancelButton_ = new UIButton();\r
+    if (cancelButton_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SportPromptPage cancelButton_ new fail");\r
+        return;\r
+    }\r
+    cancelButton_->SetPosition(BUTTON_X1, BUTTON_Y, BUTTON_W, BUTTON_H);\r
+    cancelButton_->SetViewId(SPORT_PROMPT_CANCEL_BUTTON);\r
+    cancelButton_->SetStyleForState(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT, UIButton::RELEASED);\r
+    cancelButton_->SetStyleForState(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT, UIButton::PRESSED);\r
+    cancelButton_->SetStyleForState(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT, UIButton::INACTIVE);\r
+    LOADIMG::LoadBtnImage(cancelButton_, SPORT_IMAGE, IMAGE_SPORT_CANCEL, IMAGE_SPORT_CANCEL);\r
+    cancelButton_->SetOnClickListener(this);\r
+    group_->Add(cancelButton_);\r
+\r
+    confirmButton_ = new UIButton();\r
+    if (confirmButton_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SportPromptPage confirmButton_ new fail");\r
+        return;\r
+    }\r
+    confirmButton_->SetPosition(BUTTON_X2, BUTTON_Y, BUTTON_W, BUTTON_H);\r
+    confirmButton_->SetViewId(SPORT_PROMPT_CONFIRM_BUTTON);\r
+    confirmButton_->SetStyleForState(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT, UIButton::RELEASED);\r
+    confirmButton_->SetStyleForState(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT, UIButton::PRESSED);\r
+    confirmButton_->SetStyleForState(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT, UIButton::INACTIVE);\r
+    LOADIMG::LoadBtnImage(confirmButton_, SPORT_IMAGE, IMAGE_SPORT_CONFIRM, IMAGE_SPORT_CONFIRM);\r
+    confirmButton_->SetOnClickListener(this);\r
+    group_->Add(confirmButton_);\r
+}\r
+\r
+void SportPromptPage::OnStart(void *data)\r
+{\r
+    group_ = new UIViewGroup();\r
+    if (group_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SportPromptPage group_ new fail");\r
+        return;\r
+    }\r
+    group_->SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);\r
+    group_->SetOnDragListener(this);\r
+    group_->SetDraggable(true);\r
+    group_->SetTouchable(true);\r
+\r
+    CreateUILabel();\r
+    CreateUIButton();\r
+    AddViewToPageContainer(group_);\r
+}\r
+\r
+bool SportPromptPage::OnDrag(UIView &view, const DragEvent &event)\r
+{\r
+    return true;\r
+}\r
+\r
+bool SportPromptPage::OnClick(UIView &view, const ClickEvent &event)\r
+{\r
+    if (strcmp(view.GetViewId(), SPORT_PROMPT_CANCEL_BUTTON) == 0) {\r
+        NativeAbility::GetInstance().SwitchPageInSlice(SportPages::SPORT_PAGE_PAUSE,\r
+            TransitionType::TRANSITION_INVALID, false);\r
+    } else if (strcmp(view.GetViewId(), SPORT_PROMPT_CONFIRM_BUTTON) == 0) {\r
+        SportModel::GetInstance().StopAndReport(true);\r
+        NativeAbility::GetInstance().SwitchPageInSlice(SportPages::SPORT_PAGE_MENU,\r
+            TransitionType::TRANSITION_INVALID, false);\r
+    }\r
+    return true;\r
+}\r
+}
\ No newline at end of file
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/sport/src/SportRemindHeartRateItemView.cpp b/code/sdk/application/wearable/evb/nativeapp/nativeui/sport/src/SportRemindHeartRateItemView.cpp
new file mode 100644 (file)
index 0000000..071a4ed
--- /dev/null
@@ -0,0 +1,100 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SportRemindHeartRateItemView\r
+ * Create: 2025-06-06\r
+ */\r
+\r
+#include "main/LoadImg.h"\r
+#include "ui_resource_sport.h"\r
+#include "wearable_log.h"\r
+#include "UiConfig.h"\r
+#include "sport/SportModel.h"\r
+#include "sport/SportRemindHeartRateItemView.h"\r
+\r
+namespace OHOS {\r
+static constexpr uint16_t BG_X = 0;\r
+static constexpr uint16_t BG_Y = 6;\r
+static constexpr uint16_t ICON_X = 8;\r
+static constexpr uint16_t ICON_Y = 13;\r
+static constexpr uint16_t LABEL_X = 100;\r
+static constexpr uint16_t LABEL_Y = 17;\r
+static constexpr uint16_t LABEL_W = 207;\r
+static constexpr uint16_t LABEL_H = 39;\r
+static constexpr uint16_t LABEL_FONT = 32;\r
+static constexpr uint16_t HITS_X = 100;\r
+static constexpr uint16_t HITS_Y = 60;\r
+static constexpr uint16_t HITS_W = 176;\r
+static constexpr uint16_t HITS_H = 29;\r
+static constexpr uint16_t HITS_FONT = 24;\r
+static constexpr uint16_t IMAGE_X = 370;\r
+static constexpr uint16_t IMAGE_Y = 38;\r
+static constexpr uint16_t BUTTON_X = 304;\r
+static constexpr uint16_t BUTTON_Y = 33;\r
+static constexpr uint16_t BUTTON_W = 81;\r
+static constexpr uint16_t BUTTON_H = 46;\r
+\r
+SportRemindHeartRateItemView::SportRemindHeartRateItemView()\r
+{\r
+    bgImage_.SetPosition(BG_X, BG_Y);\r
+    LOADIMG::LoadImageViewImg(&bgImage_, SPORT_IMAGE, IMAGE_SPORT_ITEMBG);\r
+\r
+    icon_.SetPosition(ICON_X, ICON_Y);\r
+\r
+    label_.SetPosition(LABEL_X, LABEL_Y, LABEL_W, LABEL_H);\r
+    label_.SetFont(DEFAULT_VECTOR_FONT_FILENAME, LABEL_FONT);\r
+    label_.SetAlign(TEXT_ALIGNMENT_LEFT, TEXT_ALIGNMENT_CENTER);\r
+    label_.SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+\r
+    hits_.SetPosition(HITS_X, HITS_Y, HITS_W, HITS_H);\r
+    hits_.SetFont(DEFAULT_VECTOR_FONT_FILENAME, HITS_FONT);\r
+    hits_.SetAlign(TEXT_ALIGNMENT_LEFT, TEXT_ALIGNMENT_CENTER);\r
+    hits_.SetStyle(STYLE_TEXT_COLOR, Color::Gray().full);\r
+    hits_.SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+\r
+    nextImage_.SetPosition(IMAGE_X, IMAGE_Y);\r
+    LOADIMG::LoadImageViewImg(&nextImage_, SPORT_IMAGE, IMAGE_SPORT_NEXT);\r
+\r
+    button_.SetPosition(BUTTON_X, BUTTON_Y, BUTTON_W, BUTTON_H);\r
+    button_.SetImages(ImageCacheManager::GetInstance().LoadOneInMultiRes(IMAGE_SPORT_TOGGLE1, SPORT_IMAGE),\r
+                      ImageCacheManager::GetInstance().LoadOneInMultiRes(IMAGE_SPORT_TOGGLE0, SPORT_IMAGE));\r
+\r
+    Add(&bgImage_);\r
+    Add(&icon_);\r
+    Add(&label_);\r
+    Add(&hits_);\r
+    Add(&button_);\r
+    Add(&nextImage_);\r
+}\r
+\r
+SportRemindHeartRateItemView::~SportRemindHeartRateItemView()\r
+{\r
+    Remove(&bgImage_);\r
+    Remove(&icon_);\r
+    Remove(&label_);\r
+    Remove(&hits_);\r
+    Remove(&button_);\r
+    Remove(&nextImage_);\r
+}\r
+\r
+void SportRemindHeartRateItemView::SetItemInfo(const SportRemindHeartRateItem &itemInfo)\r
+{\r
+    LOADIMG::LoadImageViewImg(&icon_, SPORT_IMAGE, itemInfo.iconId);\r
+    label_.SetText(itemInfo.label);\r
+    sport_info_t *sportInfo = SportModel::GetInstance().GetCurrSportInfo();\r
+    if (itemInfo.itemId == SPORT_REMIND_HEARTRATE_ENABLE) {\r
+        button_.SetVisible(true);\r
+        button_.SetState(sportInfo->enableHeartRemind);\r
+        if (sportInfo->enableHeartRemind) {\r
+            hits_.SetText("开启");\r
+        } else {\r
+            hits_.SetText("关闭");\r
+        }\r
+        nextImage_.SetVisible(false);\r
+    } else if (itemInfo.itemId == SPORT_REMIND_HEARTRATE_RANGE) {\r
+        button_.SetVisible(false);\r
+        nextImage_.SetVisible(true);\r
+        hits_.SetText(GetHeartRateRangeDescription(sportInfo->heartRange));\r
+    }\r
+    SetViewId(itemInfo.viewId);\r
+}\r
+}
\ No newline at end of file
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/sport/src/SportRemindHeartRatePage.cpp b/code/sdk/application/wearable/evb/nativeapp/nativeui/sport/src/SportRemindHeartRatePage.cpp
new file mode 100644 (file)
index 0000000..f8d7813
--- /dev/null
@@ -0,0 +1,163 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SportRemindHeartRatePage\r
+ * Create: 2025-06-06\r
+ */\r
+\r
+#include "UiConfig.h"\r
+#include "wearable_log.h"\r
+#include "AppViewIDs.h"\r
+#include "NativeAbility.h"\r
+#include "SlicePageFactory.h"\r
+#include "sport/SportView.h"\r
+#include "sport/SportRemindHeartRatePage.h"\r
+\r
+namespace OHOS {\r
+static constexpr uint16_t LABELS_X = 100;\r
+static constexpr uint16_t LABELS_Y = 38;\r
+static constexpr uint16_t LABELS_W = 253;\r
+static constexpr uint16_t LABELS_H = 53;\r
+static constexpr uint16_t LABELS_FONT = 38;\r
+static constexpr uint16_t LIST_X = 20;\r
+static constexpr uint16_t LIST_Y = 100;\r
+static constexpr uint16_t LIST_W = 415;\r
+static constexpr uint16_t LIST_H = 324;\r
+static constexpr uint16_t LIST_ITEM_W = 415;\r
+static constexpr uint16_t LIST_ITEM_H = 108;\r
+static constexpr uint16_t LIST_REBOUND_SIZE = 60;\r
+\r
+REGIST_SLICE_PAGE(VIEW_SPORT, SportPages::SPORT_PAGE_REMIND_HEARTRATE, SportRemindHeartRatePage, false);\r
+\r
+static SportRemindHeartRatePage *g_SportRemindHeartRatePageInstance = nullptr;\r
+\r
+static UIView *CreateViewCb(uint8_t type)\r
+{\r
+    SportRemindHeartRateItemView *item = new SportRemindHeartRateItemView();\r
+    if (item == nullptr) {\r
+        return nullptr;\r
+    }\r
+    item->SetPosition(0, 0, LIST_ITEM_W, LIST_ITEM_H);\r
+    item->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+    item->SetTouchable(true);\r
+    item->SetOnClickListener(g_SportRemindHeartRatePageInstance);\r
+    return item;\r
+}\r
+\r
+static void UpdateViewCb(UIView *view, void *data, uint8_t type)\r
+{\r
+    if (view == nullptr || data == nullptr) {\r
+        return;\r
+    }\r
+    SportRemindHeartRateItemView *item = dynamic_cast<SportRemindHeartRateItemView *>(view);\r
+    if (item == nullptr) {\r
+        return;\r
+    }\r
+    SportRemindHeartRateItem *itemInfo = static_cast<SportRemindHeartRateItem *>(data);\r
+    item->SetItemInfo(*itemInfo);\r
+}\r
+\r
+SportRemindHeartRatePage::SportRemindHeartRatePage()\r
+{\r
+    g_SportRemindHeartRatePageInstance = this;\r
+}\r
+\r
+SportRemindHeartRatePage::~SportRemindHeartRatePage()\r
+{\r
+    if (group_ != nullptr) {\r
+        group_->RemoveAll();\r
+        delete group_;\r
+        group_ = nullptr;\r
+    }\r
+    if (titleLabel_ != nullptr) {\r
+        delete titleLabel_;\r
+        titleLabel_ = nullptr;\r
+    }\r
+    if (remindHeartRateList_ != nullptr) {\r
+        delete remindHeartRateList_;\r
+        remindHeartRateList_ = nullptr;\r
+    }\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SportRemindHeartRatePage::~SportRemindHeartRatePage");\r
+}\r
+\r
+void SportRemindHeartRatePage::CreateUILabel()\r
+{\r
+    titleLabel_ = new UILabel();\r
+    if (titleLabel_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SportRemindHeartRatePage titleLabel_ new fail");\r
+        return;\r
+    }\r
+    titleLabel_->SetPosition(LABELS_X, LABELS_Y, LABELS_W, LABELS_H);\r
+    titleLabel_->SetText("心率提醒");\r
+    titleLabel_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+    titleLabel_->SetFont(BOLD_VECTOR_FONT_FILENAME, LABELS_FONT);\r
+    group_->Add(titleLabel_);\r
+}\r
+\r
+void SportRemindHeartRatePage::CreateUIList()\r
+{\r
+    remindHeartRateList_ = new UISimpleList();\r
+    if (remindHeartRateList_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SportRemindHeartRatePage remindHeartRateList_ new fail");\r
+        return;\r
+    }\r
+    remindHeartRateList_->SetPosition(LIST_X, LIST_Y, LIST_W, LIST_H);\r
+    remindHeartRateList_->SetThrowDrag(true);\r
+    remindHeartRateList_->SetDraggable(true);\r
+    remindHeartRateList_->SetReboundSize(LIST_REBOUND_SIZE);\r
+    remindHeartRateList_->EnableAutoAlign(true);\r
+    remindHeartRateList_->SetElastic(true);\r
+    remindHeartRateList_->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+\r
+    for (uint8_t i = 0; i < SPORT_REMIND_HEARTRATE_MAX; ++i) {\r
+        Contents content;\r
+        content.createFunc = CreateViewCb;\r
+        content.updateFunc = UpdateViewCb;\r
+        content.type = 0;\r
+        content.data = reinterpret_cast<void *>(&remindHeartRates_[i]);\r
+        remindHeartRateList_->AddContent(content);\r
+    }\r
+    remindHeartRateList_->RefreshList();\r
+    group_->Add(remindHeartRateList_);\r
+}\r
+\r
+void SportRemindHeartRatePage::OnStart(void *data)\r
+{\r
+    group_ = new UIViewGroup();\r
+    if (group_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SportRemindHeartRatePage group_ new fail");\r
+        return;\r
+    }\r
+    group_->SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);\r
+    group_->SetOnDragListener(this);\r
+    group_->SetDraggable(true);\r
+    group_->SetTouchable(true);\r
+\r
+    CreateUILabel();\r
+    CreateUIList();\r
+    AddViewToPageContainer(group_);\r
+}\r
+\r
+bool SportRemindHeartRatePage::OnDrag(UIView &view, const DragEvent &event)\r
+{\r
+    if ((event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT) && (event.GetDeltaX() > X_DRAG_OFFSET) &&\r
+        (event.GetDeltaX() > (DOUBLES * MATH_ABS(event.GetDeltaY())))) {\r
+        NativeAbility::GetInstance().SwitchPageInSlice(SportPages::SPORT_PAGE_REMIND,\r
+            TransitionType::TRANSITION_INVALID, false);\r
+    }\r
+    return true;\r
+}\r
+\r
+bool SportRemindHeartRatePage::OnClick(UIView &view, const ClickEvent &event)\r
+{\r
+    if (strcmp(view.GetViewId(), SPORT_REMIND_HEARTRATE_ITEM_ENABLE) == 0) {\r
+        sport_info_t *sportInfo = SportModel::GetInstance().GetCurrSportInfo();\r
+        sportInfo->enableHeartRemind = !sportInfo->enableHeartRemind;\r
+        remindHeartRateList_->RefreshList();\r
+        SportModel::GetInstance().SaveConfig(SPORT_CONFIG_INFO);\r
+    } else if (strcmp(view.GetViewId(), SPORT_REMIND_HEARTRATE_ITEM_RANGE) == 0) {\r
+        NativeAbility::GetInstance().SwitchPageInSlice(SportPages::SPORT_PAGE_HEARTRATE_RANGE,\r
+            TransitionType::TRANSITION_INVALID, false);\r
+    }\r
+    return true;\r
+}\r
+}
\ No newline at end of file
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/sport/src/SportRemindIntervalItemView.cpp b/code/sdk/application/wearable/evb/nativeapp/nativeui/sport/src/SportRemindIntervalItemView.cpp
new file mode 100644 (file)
index 0000000..aab3e77
--- /dev/null
@@ -0,0 +1,73 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SportRemindIntervalItemView\r
+ * Create: 2025-06-06\r
+ */\r
+\r
+#include "main/LoadImg.h"\r
+#include "ui_resource_sport.h"\r
+#include "wearable_log.h"\r
+#include "UiConfig.h"\r
+#include "sport/SportModel.h"\r
+#include "sport/SportRemindIntervalItemView.h"\r
+\r
+namespace OHOS {\r
+static constexpr uint16_t BG_X = 0;\r
+static constexpr uint16_t BG_Y = 6;\r
+static constexpr uint16_t ICON_X = 8;\r
+static constexpr uint16_t ICON_Y = 13;\r
+static constexpr uint16_t LABEL_X = 100;\r
+static constexpr uint16_t LABEL_Y = 31;\r
+static constexpr uint16_t LABEL_W = 179;\r
+static constexpr uint16_t LABEL_H = 37;\r
+static constexpr uint16_t LABEL_FONT = 32;\r
+static constexpr uint16_t IMAGE_X = 370;\r
+static constexpr uint16_t IMAGE_Y = 38;\r
+\r
+SportRemindIntervalItemView::SportRemindIntervalItemView()\r
+{\r
+    bgImage_.SetPosition(BG_X, BG_Y);\r
+    LOADIMG::LoadImageViewImg(&bgImage_, SPORT_IMAGE, IMAGE_SPORT_ITEMBG);\r
+\r
+    icon_.SetPosition(ICON_X, ICON_Y);\r
+\r
+    label_.SetPosition(LABEL_X, LABEL_Y, LABEL_W, LABEL_H);\r
+    label_.SetFont(DEFAULT_VECTOR_FONT_FILENAME, LABEL_FONT);\r
+    label_.SetAlign(TEXT_ALIGNMENT_LEFT, TEXT_ALIGNMENT_CENTER);\r
+    label_.SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+\r
+    nextImage_.SetPosition(IMAGE_X, IMAGE_Y);\r
+    LOADIMG::LoadImageViewImg(&nextImage_, SPORT_IMAGE, IMAGE_SPORT_NEXT);\r
+\r
+    Add(&bgImage_);\r
+    Add(&icon_);\r
+    Add(&label_);\r
+    Add(&nextImage_);\r
+}\r
+\r
+SportRemindIntervalItemView::~SportRemindIntervalItemView()\r
+{\r
+    Remove(&bgImage_);\r
+    Remove(&icon_);\r
+    Remove(&label_);\r
+    Remove(&nextImage_);\r
+}\r
+\r
+void SportRemindIntervalItemView::SetItemInfo(const SportRemindIntervalItem &itemInfo)\r
+{\r
+    SportType sportType = SportModel::GetInstance().GetSportType();\r
+    if (itemInfo.itemId == SPORT_REMIND_INTERVAL_DISTANCE && sportType == SPORT_TYPE_INDOOR_SWIMMING) {\r
+        LOADIMG::LoadImageViewImg(&icon_, SPORT_IMAGE, IMAGE_SPORT_LAP);\r
+        label_.SetText("趟数");\r
+        nextImage_.SetVisible(true);\r
+    } else {\r
+        LOADIMG::LoadImageViewImg(&icon_, SPORT_IMAGE, itemInfo.iconId);\r
+        label_.SetText(itemInfo.label);\r
+        nextImage_.SetVisible(true);\r
+    }\r
+    if (itemInfo.itemId == SPORT_REMIND_INTERVAL_NONE) {\r
+        nextImage_.SetVisible(false);\r
+    }\r
+    SetViewId(itemInfo.viewId);\r
+}\r
+}
\ No newline at end of file
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/sport/src/SportRemindIntervalPage.cpp b/code/sdk/application/wearable/evb/nativeapp/nativeui/sport/src/SportRemindIntervalPage.cpp
new file mode 100644 (file)
index 0000000..fb95d8a
--- /dev/null
@@ -0,0 +1,192 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SportRemindIntervalPage\r
+ * Create: 2025-06-06\r
+ */\r
+\r
+#include "UiConfig.h"\r
+#include "main/LoadImg.h"\r
+#include "wearable_log.h"\r
+#include "AppViewIDs.h"\r
+#include "NativeAbility.h"\r
+#include "SlicePageFactory.h"\r
+#include "sport/SportView.h"\r
+#include "sport/SportRemindIntervalPage.h"\r
+\r
+namespace OHOS {\r
+static constexpr uint16_t LABELS_X = 100;\r
+static constexpr uint16_t LABELS_Y = 38;\r
+static constexpr uint16_t LABELS_W = 253;\r
+static constexpr uint16_t LABELS_H = 53;\r
+static constexpr uint16_t LABELS_FONT = 38;\r
+static constexpr uint16_t LIST_X = 20;\r
+static constexpr uint16_t LIST_Y = 100;\r
+static constexpr uint16_t LIST_W = 415;\r
+static constexpr uint16_t LIST_H = 324;\r
+static constexpr uint16_t LIST_ITEM_W = 415;\r
+static constexpr uint16_t LIST_ITEM_H = 108;\r
+static constexpr uint16_t REBOUND_SIZE = 60;\r
+static constexpr uint16_t BLANK_SIZE = 60;\r
+\r
+REGIST_SLICE_PAGE(VIEW_SPORT, SportPages::SPORT_PAGE_REMIND_INTERVAL, SportRemindIntervalPage, false);\r
+\r
+static SportRemindIntervalPage *g_SportRemindIntervalPageInstance = nullptr;\r
+\r
+static UIView *CreateViewCb(uint8_t type)\r
+{\r
+    SportRemindIntervalItemView *item = new SportRemindIntervalItemView();\r
+    if (item == nullptr) {\r
+        return nullptr;\r
+    }\r
+    item->SetPosition(0, 0, LIST_ITEM_W, LIST_ITEM_H);\r
+    item->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+    item->SetTouchable(true);\r
+    item->SetOnClickListener(g_SportRemindIntervalPageInstance);\r
+    return item;\r
+}\r
+\r
+static void UpdateViewCb(UIView *view, void *data, uint8_t type)\r
+{\r
+    if (view == nullptr || data == nullptr) {\r
+        return;\r
+    }\r
+    SportRemindIntervalItemView *item = dynamic_cast<SportRemindIntervalItemView *>(view);\r
+    if (item == nullptr) {\r
+        return;\r
+    }\r
+    SportRemindIntervalItem *itemInfo = static_cast<SportRemindIntervalItem *>(data);\r
+    item->SetItemInfo(*itemInfo);\r
+}\r
+\r
+SportRemindIntervalPage::SportRemindIntervalPage()\r
+{\r
+    g_SportRemindIntervalPageInstance = this;\r
+}\r
+\r
+SportRemindIntervalPage::~SportRemindIntervalPage()\r
+{\r
+    if (group_ != nullptr) {\r
+        group_->RemoveAll();\r
+        delete group_;\r
+        group_ = nullptr;\r
+    }\r
+    if (background_ != nullptr) {\r
+        delete background_;\r
+        background_ = nullptr;\r
+    }\r
+    if (titleLabel_ != nullptr) {\r
+        delete titleLabel_;\r
+        titleLabel_ = nullptr;\r
+    }\r
+    if (remindIntervalList_ != nullptr) {\r
+        delete remindIntervalList_;\r
+        remindIntervalList_ = nullptr;\r
+    }\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SportRemindIntervalPage::~SportRemindIntervalPage");\r
+}\r
+\r
+void SportRemindIntervalPage::InitBackgroundView()\r
+{\r
+    background_ = new UIImageView();\r
+    if (background_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SportRemindIntervalPage background_ new fail");\r
+        return;\r
+    }\r
+    background_->SetPosition(0, 0);\r
+    LOADIMG::LoadImageViewImg(background_, SPORT_IMAGE, IMAGE_SPORT_BG);\r
+    group_->Add(background_);\r
+}\r
+\r
+void SportRemindIntervalPage::CreateUILabel()\r
+{\r
+    titleLabel_ = new UILabel();\r
+    if (titleLabel_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SportRemindIntervalPage titleLabel_ new fail");\r
+        return;\r
+    }\r
+    titleLabel_->SetPosition(LABELS_X, LABELS_Y, LABELS_W, LABELS_H);\r
+    titleLabel_->SetText("间隔提醒");\r
+    titleLabel_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+    titleLabel_->SetFont(BOLD_VECTOR_FONT_FILENAME, LABELS_FONT);\r
+    group_->Add(titleLabel_);\r
+}\r
+\r
+void SportRemindIntervalPage::CreateUIList()\r
+{\r
+    remindIntervalList_ = new UISimpleList();\r
+    if (remindIntervalList_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SportRemindIntervalPage remindIntervalList_ new fail");\r
+        return;\r
+    }\r
+    remindIntervalList_->SetPosition(LIST_X, LIST_Y, LIST_W, LIST_H);\r
+    remindIntervalList_->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+    remindIntervalList_->SetBoundaryIntercept(DragEvent::DIRECTION_TOP_TO_BOTTOM, false);\r
+    remindIntervalList_->SetBoundaryIntercept(DragEvent::DIRECTION_BOTTOM_TO_TOP, false);\r
+\r
+    for (uint8_t i = 0; i < SPORT_REMIND_INTERVAL_MAX; ++i) {\r
+        Contents content;\r
+        content.createFunc = CreateViewCb;\r
+        content.updateFunc = UpdateViewCb;\r
+        content.type = 0;\r
+        content.data = reinterpret_cast<void *>(&remindIntervals_[i]);\r
+        remindIntervalList_->AddContent(content);\r
+    }\r
+    remindIntervalList_->RefreshList();\r
+    group_->Add(remindIntervalList_);\r
+}\r
+\r
+void SportRemindIntervalPage::OnStart(void *data)\r
+{\r
+    group_ = new UIScrollView();\r
+    if (group_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SportRemindIntervalPage group_ new fail");\r
+        return;\r
+    }\r
+    group_->SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);\r
+    group_->SetOnDragListener(this);\r
+    group_->SetDraggable(true);\r
+    group_->SetTouchable(true);\r
+    group_->SetReboundSize(REBOUND_SIZE, UIAbstractScroll::Direction::BOTTOM);\r
+    group_->SetScrollBlankSize(BLANK_SIZE, UIAbstractScroll::Direction::BOTTOM);\r
+\r
+    InitBackgroundView();\r
+    CreateUILabel();\r
+    CreateUIList();\r
+    AddViewToPageContainer(group_);\r
+}\r
+\r
+bool SportRemindIntervalPage::OnDrag(UIView &view, const DragEvent &event)\r
+{\r
+    if ((event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT) && (event.GetDeltaX() > X_DRAG_OFFSET) &&\r
+        (event.GetDeltaX() > (DOUBLES * MATH_ABS(event.GetDeltaY())))) {\r
+        NativeAbility::GetInstance().SwitchPageInSlice(SportPages::SPORT_PAGE_REMIND,\r
+            TransitionType::TRANSITION_INVALID, false);\r
+    }\r
+    return true;\r
+}\r
+\r
+bool SportRemindIntervalPage::OnClick(UIView &view, const ClickEvent &event)\r
+{\r
+    sport_info_t *sportInfo = SportModel::GetInstance().GetCurrSportInfo();\r
+    if (strcmp(view.GetViewId(), SPORT_REMIND_INTERVAL_ITEM_DISTANCE) == 0) {\r
+        sportInfo->setType = SPORT_SET_TYPE_REMIND;\r
+        sportInfo->remindTypeTemp = sportInfo->remindType;\r
+        sportInfo->remindType = SPORT_REMIND_INTERVAL_DISTANCE;\r
+        NativeAbility::GetInstance().SwitchPageInSlice(SportPages::SPORT_PAGE_TARGET_SETTING,\r
+            TransitionType::TRANSITION_INVALID, false);\r
+    } else if (strcmp(view.GetViewId(), SPORT_REMIND_INTERVAL_ITEM_TIME) == 0) {\r
+        sportInfo->setType = SPORT_SET_TYPE_REMIND;\r
+        sportInfo->remindTypeTemp = sportInfo->remindType;\r
+        sportInfo->remindType = SPORT_REMIND_INTERVAL_TIME;\r
+        NativeAbility::GetInstance().SwitchPageInSlice(SportPages::SPORT_PAGE_TARGET_SETTING,\r
+            TransitionType::TRANSITION_INVALID, false);\r
+    } else if (strcmp(view.GetViewId(), SPORT_REMIND_INTERVAL_ITEM_NONE) == 0) {\r
+        sportInfo->remindTypeTemp = sportInfo->remindType;\r
+        sportInfo->remindType = SPORT_REMIND_INTERVAL_NONE;\r
+        SportModel::GetInstance().SaveConfig(SPORT_CONFIG_INFO);\r
+        NativeAbility::GetInstance().SwitchPageInSlice(SportPages::SPORT_PAGE_REMIND,\r
+            TransitionType::TRANSITION_INVALID, false);\r
+    }\r
+    return true;\r
+}\r
+}
\ No newline at end of file
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/sport/src/SportRemindItemView.cpp b/code/sdk/application/wearable/evb/nativeapp/nativeui/sport/src/SportRemindItemView.cpp
new file mode 100644 (file)
index 0000000..fc2276a
--- /dev/null
@@ -0,0 +1,96 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SportRemindItemView\r
+ * Create: 2025-06-06\r
+ */\r
+\r
+#include "main/LoadImg.h"\r
+#include "ui_resource_sport.h"\r
+#include "wearable_log.h"\r
+#include "UiConfig.h"\r
+#include "sport/SportModel.h"\r
+#include "sport/SportRemindItemView.h"\r
+\r
+namespace OHOS {\r
+static constexpr uint16_t BG_X = 0;\r
+static constexpr uint16_t BG_Y = 6;\r
+static constexpr uint16_t ICON_X = 8;\r
+static constexpr uint16_t ICON_Y = 13;\r
+static constexpr uint16_t LABEL_X = 100;\r
+static constexpr uint16_t LABEL_Y = 17;\r
+static constexpr uint16_t LABEL_W = 207;\r
+static constexpr uint16_t LABEL_H = 39;\r
+static constexpr uint16_t LABEL_FONT = 32;\r
+static constexpr uint16_t HITS_X = 100;\r
+static constexpr uint16_t HITS_Y = 60;\r
+static constexpr uint16_t HITS_W = 176;\r
+static constexpr uint16_t HITS_H = 29;\r
+static constexpr uint16_t HITS_FONT = 24;\r
+static constexpr uint16_t IMAGE_X = 370;\r
+static constexpr uint16_t IMAGE_Y = 38;\r
+\r
+SportRemindItemView::SportRemindItemView()\r
+{\r
+    bgImage_.SetPosition(BG_X, BG_Y);\r
+    LOADIMG::LoadImageViewImg(&bgImage_, SPORT_IMAGE, IMAGE_SPORT_ITEMBG);\r
+\r
+    icon_.SetPosition(ICON_X, ICON_Y);\r
+\r
+    label_.SetPosition(LABEL_X, LABEL_Y, LABEL_W, LABEL_H);\r
+    label_.SetFont(DEFAULT_VECTOR_FONT_FILENAME, LABEL_FONT);\r
+    label_.SetAlign(TEXT_ALIGNMENT_LEFT, TEXT_ALIGNMENT_CENTER);\r
+    label_.SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+\r
+    hits_.SetPosition(HITS_X, HITS_Y, HITS_W, HITS_H);\r
+    hits_.SetFont(DEFAULT_VECTOR_FONT_FILENAME, HITS_FONT);\r
+    hits_.SetAlign(TEXT_ALIGNMENT_LEFT, TEXT_ALIGNMENT_CENTER);\r
+    hits_.SetStyle(STYLE_TEXT_COLOR, Color::Gray().full);\r
+    hits_.SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+\r
+    nextImage_.SetPosition(IMAGE_X, IMAGE_Y);\r
+    LOADIMG::LoadImageViewImg(&nextImage_, SPORT_IMAGE, IMAGE_SPORT_NEXT);\r
+\r
+    Add(&bgImage_);\r
+    Add(&icon_);\r
+    Add(&label_);\r
+    Add(&hits_);\r
+    Add(&nextImage_);\r
+}\r
+\r
+SportRemindItemView::~SportRemindItemView()\r
+{\r
+    Remove(&bgImage_);\r
+    Remove(&icon_);\r
+    Remove(&label_);\r
+    Remove(&hits_);\r
+    Remove(&nextImage_);\r
+}\r
+\r
+void SportRemindItemView::SetItemInfo(const SportRemindItem &itemInfo)\r
+{\r
+    LOADIMG::LoadImageViewImg(&icon_, SPORT_IMAGE, itemInfo.iconId);\r
+    label_.SetText(itemInfo.label);\r
+    sport_info_t *sportInfo = SportModel::GetInstance().GetCurrSportInfo();\r
+    if (itemInfo.itemId == SPORT_REMIND_INTERVAL) {\r
+        if (sportInfo->remindType == SPORT_REMIND_INTERVAL_NONE || !sportInfo->isRemindSetted) {\r
+            hits_.SetText("无提醒");\r
+        } else if (sportInfo->remindType == SPORT_REMIND_INTERVAL_DISTANCE) {\r
+            SportType sportType = SportModel::GetInstance().GetSportType();\r
+            if (sportType == SPORT_TYPE_INDOOR_SWIMMING) {\r
+                hits_.SetText((std::to_string(sportInfo->remindValue) + "趟").c_str());\r
+            } else {\r
+                hits_.SetText((std::to_string(sportInfo->remindValue) + "km").c_str());\r
+            }\r
+        } else if (sportInfo->remindType == SPORT_REMIND_INTERVAL_TIME) {\r
+            hits_.SetText((std::to_string(sportInfo->remindValue) + "分钟").c_str());\r
+        }\r
+    } else if (itemInfo.itemId == SPORT_REMIND_HEARTRATE) {\r
+        if (!sportInfo->enableHeartRemind) {\r
+            hits_.SetText("关闭");\r
+        } else {\r
+            hits_.SetText("开启");\r
+        }\r
+    }\r
+    SetViewId(itemInfo.viewId);\r
+}\r
+}
\ No newline at end of file
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/sport/src/SportRemindPage.cpp b/code/sdk/application/wearable/evb/nativeapp/nativeui/sport/src/SportRemindPage.cpp
new file mode 100644 (file)
index 0000000..84fe66d
--- /dev/null
@@ -0,0 +1,179 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SportRemindPage\r
+ * Create: 2025-06-06\r
+ */\r
+\r
+#include "UiConfig.h"\r
+#include "main/LoadImg.h"\r
+#include "wearable_log.h"\r
+#include "AppViewIDs.h"\r
+#include "NativeAbility.h"\r
+#include "SlicePageFactory.h"\r
+#include "sport/SportView.h"\r
+#include "sport/SportRemindPage.h"\r
+\r
+namespace OHOS {\r
+static constexpr uint16_t LABELS_X = 100;\r
+static constexpr uint16_t LABELS_Y = 38;\r
+static constexpr uint16_t LABELS_W = 253;\r
+static constexpr uint16_t LABELS_H = 53;\r
+static constexpr uint16_t LABELS_FONT = 38;\r
+static constexpr uint16_t LIST_X = 20;\r
+static constexpr uint16_t LIST_Y = 100;\r
+static constexpr uint16_t LIST_W = 415;\r
+static constexpr uint16_t LIST_H = 324;\r
+static constexpr uint16_t LIST_ITEM_W = 415;\r
+static constexpr uint16_t LIST_ITEM_H = 108;\r
+static constexpr uint16_t LIST_REBOUND_SIZE = 60;\r
+\r
+REGIST_SLICE_PAGE(VIEW_SPORT, SportPages::SPORT_PAGE_REMIND, SportRemindPage, false);\r
+\r
+static SportRemindPage *g_SportRemindPageInstance = nullptr;\r
+\r
+static UIView *CreateViewCb(uint8_t type)\r
+{\r
+    SportRemindItemView *item = new SportRemindItemView();\r
+    if (item == nullptr) {\r
+        return nullptr;\r
+    }\r
+    item->SetPosition(0, 0, LIST_ITEM_W, LIST_ITEM_H);\r
+    item->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+    item->SetTouchable(true);\r
+    item->SetOnClickListener(g_SportRemindPageInstance);\r
+    return item;\r
+}\r
+\r
+static void UpdateViewCb(UIView *view, void *data, uint8_t type)\r
+{\r
+    if (view == nullptr || data == nullptr) {\r
+        return;\r
+    }\r
+    SportRemindItemView *item = dynamic_cast<SportRemindItemView *>(view);\r
+    if (item == nullptr) {\r
+        return;\r
+    }\r
+    SportRemindItem *itemInfo = static_cast<SportRemindItem *>(data);\r
+    item->SetItemInfo(*itemInfo);\r
+}\r
+\r
+SportRemindPage::SportRemindPage()\r
+{\r
+    g_SportRemindPageInstance = this;\r
+}\r
+\r
+SportRemindPage::~SportRemindPage()\r
+{\r
+    if (group_ != nullptr) {\r
+        group_->RemoveAll();\r
+        delete group_;\r
+        group_ = nullptr;\r
+    }\r
+    if (background_ != nullptr) {\r
+        delete background_;\r
+        background_ = nullptr;\r
+    }\r
+    if (titleLabel_ != nullptr) {\r
+        delete titleLabel_;\r
+        titleLabel_ = nullptr;\r
+    }\r
+    if (remindList_ != nullptr) {\r
+        delete remindList_;\r
+        remindList_ = nullptr;\r
+    }\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SportRemindPage::~SportRemindPage");\r
+}\r
+\r
+void SportRemindPage::InitBackgroundView()\r
+{\r
+    background_ = new UIImageView();\r
+    if (background_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SportRemindPage background_ new fail");\r
+        return;\r
+    }\r
+    background_->SetPosition(0, 0);\r
+    LOADIMG::LoadImageViewImg(background_, SPORT_IMAGE, IMAGE_SPORT_BG);\r
+    group_->Add(background_);\r
+}\r
+\r
+void SportRemindPage::CreateUILabel()\r
+{\r
+    titleLabel_ = new UILabel();\r
+    if (titleLabel_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SportRemindPage titleLabel_ new fail");\r
+        return;\r
+    }\r
+    titleLabel_->SetPosition(LABELS_X, LABELS_Y, LABELS_W, LABELS_H);\r
+    titleLabel_->SetText("提醒");\r
+    titleLabel_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+    titleLabel_->SetFont(BOLD_VECTOR_FONT_FILENAME, LABELS_FONT);\r
+    group_->Add(titleLabel_);\r
+}\r
+\r
+void SportRemindPage::CreateUIList()\r
+{\r
+    remindList_ = new UISimpleList();\r
+    if (remindList_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SportRemindPage remindList_ new fail");\r
+        return;\r
+    }\r
+    remindList_->SetPosition(LIST_X, LIST_Y, LIST_W, LIST_H);\r
+    remindList_->SetThrowDrag(true);\r
+    remindList_->SetDraggable(true);\r
+    remindList_->SetReboundSize(LIST_REBOUND_SIZE);\r
+    remindList_->EnableAutoAlign(true);\r
+    remindList_->SetElastic(true);\r
+    remindList_->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+\r
+    for (uint8_t i = 0; i < SPORT_REMIND_MAX; ++i) {\r
+        Contents content;\r
+        content.createFunc = CreateViewCb;\r
+        content.updateFunc = UpdateViewCb;\r
+        content.type = 0;\r
+        content.data = reinterpret_cast<void *>(&reminds_[i]);\r
+        remindList_->AddContent(content);\r
+    }\r
+    remindList_->RefreshList();\r
+    group_->Add(remindList_);\r
+}\r
+\r
+void SportRemindPage::OnStart(void *data)\r
+{\r
+    group_ = new UIViewGroup();\r
+    if (group_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SportRemindPage group_ new fail");\r
+        return;\r
+    }\r
+    group_->SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);\r
+    group_->SetOnDragListener(this);\r
+    group_->SetDraggable(true);\r
+    group_->SetTouchable(true);\r
+\r
+    InitBackgroundView();\r
+    CreateUILabel();\r
+    CreateUIList();\r
+    AddViewToPageContainer(group_);\r
+}\r
+\r
+bool SportRemindPage::OnDrag(UIView &view, const DragEvent &event)\r
+{\r
+    if ((event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT) && (event.GetDeltaX() > X_DRAG_OFFSET) &&\r
+        (event.GetDeltaX() > (DOUBLES * MATH_ABS(event.GetDeltaY())))) {\r
+            NativeAbility::GetInstance().SwitchPageInSlice(SportPages::SPORT_PAGE_SETTINGS,\r
+                TransitionType::TRANSITION_INVALID, false);\r
+    }\r
+    return true;\r
+}\r
+\r
+bool SportRemindPage::OnClick(UIView &view, const ClickEvent &event)\r
+{\r
+    if (strcmp(view.GetViewId(), SPORT_REMIND_ITEM_INTERVAL) == 0) {\r
+        NativeAbility::GetInstance().SwitchPageInSlice(SportPages::SPORT_PAGE_REMIND_INTERVAL,\r
+            TransitionType::TRANSITION_INVALID, false);\r
+    } else if (strcmp(view.GetViewId(), SPORT_REMIND_ITEM_HEARTRATE) == 0) {\r
+        NativeAbility::GetInstance().SwitchPageInSlice(SportPages::SPORT_PAGE_REMIND_HEARTRATE,\r
+            TransitionType::TRANSITION_INVALID, false);\r
+    }\r
+    return true;\r
+}\r
+}
\ No newline at end of file
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/sport/src/SportSettingsItemView.cpp b/code/sdk/application/wearable/evb/nativeapp/nativeui/sport/src/SportSettingsItemView.cpp
new file mode 100644 (file)
index 0000000..0a8a572
--- /dev/null
@@ -0,0 +1,116 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SportSettingsItemView\r
+ * Create: 2025-06-06\r
+ */\r
+\r
+#include "main/LoadImg.h"\r
+#include "ui_resource_sport.h"\r
+#include "wearable_log.h"\r
+#include "UiConfig.h"\r
+#include "sport/SportModel.h"\r
+#include "sport/SportSettingsItemView.h"\r
+\r
+namespace OHOS {\r
+static constexpr uint16_t BG_X = 0;\r
+static constexpr uint16_t BG_Y = 6;\r
+static constexpr uint16_t ICON_X = 8;\r
+static constexpr uint16_t ICON_Y = 13;\r
+static constexpr uint16_t LABEL_X = 100;\r
+static constexpr uint16_t LABEL_Y1 = 17;\r
+static constexpr uint16_t LABEL_Y2 = 31;\r
+static constexpr uint16_t LABEL_W = 207;\r
+static constexpr uint16_t LABEL_H = 39;\r
+static constexpr uint16_t LABEL_FONT = 32;\r
+static constexpr uint16_t HITS_X = 100;\r
+static constexpr uint16_t HITS_Y = 60;\r
+static constexpr uint16_t HITS_W = 176;\r
+static constexpr uint16_t HITS_H = 29;\r
+static constexpr uint16_t HITS_FONT = 24;\r
+static constexpr uint16_t IMAGE_X = 370;\r
+static constexpr uint16_t IMAGE_Y = 38;\r
+\r
+SportSettingsItemView::SportSettingsItemView()\r
+{\r
+    bgImage_.SetPosition(BG_X, BG_Y);\r
+    LOADIMG::LoadImageViewImg(&bgImage_, SPORT_IMAGE, IMAGE_SPORT_ITEMBG);\r
+\r
+    icon_.SetPosition(ICON_X, ICON_Y);\r
+\r
+    label_.SetFont(DEFAULT_VECTOR_FONT_FILENAME, LABEL_FONT);\r
+    label_.SetAlign(TEXT_ALIGNMENT_LEFT, TEXT_ALIGNMENT_CENTER);\r
+    label_.SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+\r
+    hits_.SetPosition(HITS_X, HITS_Y, HITS_W, HITS_H);\r
+    hits_.SetFont(DEFAULT_VECTOR_FONT_FILENAME, HITS_FONT);\r
+    hits_.SetAlign(TEXT_ALIGNMENT_LEFT, TEXT_ALIGNMENT_CENTER);\r
+    hits_.SetStyle(STYLE_TEXT_COLOR, Color::Gray().full);\r
+    hits_.SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+\r
+    nextImage_.SetPosition(IMAGE_X, IMAGE_Y);\r
+    LOADIMG::LoadImageViewImg(&nextImage_, SPORT_IMAGE, IMAGE_SPORT_NEXT);\r
+\r
+    Add(&bgImage_);\r
+    Add(&icon_);\r
+    Add(&label_);\r
+    Add(&hits_);\r
+    Add(&nextImage_);\r
+}\r
+\r
+SportSettingsItemView::~SportSettingsItemView()\r
+{\r
+    Remove(&bgImage_);\r
+    Remove(&icon_);\r
+    Remove(&label_);\r
+    Remove(&hits_);\r
+    Remove(&nextImage_);\r
+}\r
+\r
+void SportSettingsItemView::SetItemInfo(const SportSettingsItem &itemInfo)\r
+{\r
+    LOADIMG::LoadImageViewImg(&icon_, SPORT_IMAGE, itemInfo.iconId);\r
+    label_.SetText(itemInfo.label);\r
+    SetViewId(itemInfo.viewId);\r
+    sport_info_t *sportInfo = SportModel::GetInstance().GetCurrSportInfo();\r
+    if (itemInfo.itemId == SPORT_SET_TYPE_TARGET) {\r
+        label_.SetPosition(LABEL_X, LABEL_Y1, LABEL_W, LABEL_H);\r
+        hits_.SetVisible(true);\r
+        if (!sportInfo->isTargetSetted) {\r
+            hits_.SetText("无目标");\r
+        } else if (sportInfo->targetType == SPORT_TARGET_DISTANCE) {\r
+            SportType sportType = SportModel::GetInstance().GetSportType();\r
+            if (sportType == SPORT_TYPE_INDOOR_SWIMMING) {\r
+                hits_.SetText((std::to_string(sportInfo->targetValue) + "趟").c_str());\r
+            } else {\r
+                hits_.SetText((std::to_string(sportInfo->targetValue) + "km").c_str());\r
+            }\r
+        } else if (sportInfo->targetType == SPORT_TARGET_TIME) {\r
+            hits_.SetText((std::to_string(sportInfo->targetValue) + "分钟").c_str());\r
+        } else if (sportInfo->targetType == SPORT_TARGET_CALORIE) {\r
+            hits_.SetText((std::to_string(sportInfo->targetValue) + "千卡").c_str());\r
+        }\r
+    } else if (itemInfo.itemId == SPORT_SET_TYPE_REMIND) {\r
+        label_.SetPosition(LABEL_X, LABEL_Y1, LABEL_W, LABEL_H);\r
+        hits_.SetVisible(true);\r
+        if (sportInfo->remindType == SPORT_REMIND_INTERVAL_DISTANCE) {\r
+            SportType sportType = SportModel::GetInstance().GetSportType();\r
+            if (sportType == SPORT_TYPE_INDOOR_SWIMMING) {\r
+                hits_.SetText((std::to_string(sportInfo->remindValue) + "趟").c_str());\r
+            } else {\r
+                hits_.SetText((std::to_string(sportInfo->remindValue) + "km").c_str());\r
+            }\r
+        } else if (sportInfo->remindType == SPORT_REMIND_INTERVAL_TIME) {\r
+            hits_.SetText((std::to_string(sportInfo->remindValue) + "分钟").c_str());\r
+        } else if (sportInfo->remindType == SPORT_REMIND_INTERVAL_NONE || !sportInfo->isRemindSetted) {\r
+            if (sportInfo->enableHeartRemind) {\r
+                hits_.SetText(GetHeartRateRangeDescription(sportInfo->heartRange));\r
+            } else {\r
+                hits_.SetText("无提醒");\r
+            }\r
+        }\r
+    } else if (itemInfo.itemId == SPORT_SET_TYPE_MISTOUCH) {\r
+        label_.SetPosition(LABEL_X, LABEL_Y2, LABEL_W, LABEL_H);\r
+        hits_.SetVisible(false);\r
+    }\r
+}\r
+}
\ No newline at end of file
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/sport/src/SportSettingsPage.cpp b/code/sdk/application/wearable/evb/nativeapp/nativeui/sport/src/SportSettingsPage.cpp
new file mode 100644 (file)
index 0000000..8a5c852
--- /dev/null
@@ -0,0 +1,182 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SportSettingsPage\r
+ * Create: 2025-06-06\r
+ */\r
+\r
+#include "UiConfig.h"\r
+#include "main/LoadImg.h"\r
+#include "wearable_log.h"\r
+#include "AppViewIDs.h"\r
+#include "NativeAbility.h"\r
+#include "SlicePageFactory.h"\r
+#include "sport/SportView.h"\r
+#include "sport/SportSettingsPage.h"\r
+\r
+namespace OHOS {\r
+static constexpr uint16_t LABELS_X = 100;\r
+static constexpr uint16_t LABELS_Y = 38;\r
+static constexpr uint16_t LABELS_W = 253;\r
+static constexpr uint16_t LABELS_H = 53;\r
+static constexpr uint16_t LABELS_FONT = 38;\r
+static constexpr uint16_t LIST_X = 20;\r
+static constexpr uint16_t LIST_Y = 100;\r
+static constexpr uint16_t LIST_W = 415;\r
+static constexpr uint16_t LIST_H = 324;\r
+static constexpr uint16_t LIST_ITEM_W = 415;\r
+static constexpr uint16_t LIST_ITEM_H = 108;\r
+static constexpr uint16_t REBOUND_SIZE = 60;\r
+static constexpr uint16_t BLANK_SIZE = 60;\r
+\r
+REGIST_SLICE_PAGE(VIEW_SPORT, SportPages::SPORT_PAGE_SETTINGS, SportSettingsPage, false);\r
+\r
+static SportSettingsPage *g_SportSettingsPageInstance = nullptr;\r
+\r
+static UIView *CreateViewCb(uint8_t type)\r
+{\r
+    SportSettingsItemView *item = new SportSettingsItemView();\r
+    if (item == nullptr) {\r
+        return nullptr;\r
+    }\r
+    item->SetPosition(0, 0, LIST_ITEM_W, LIST_ITEM_H);\r
+    item->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+    item->SetTouchable(true);\r
+    item->SetOnClickListener(g_SportSettingsPageInstance);\r
+    return item;\r
+}\r
+\r
+static void UpdateViewCb(UIView *view, void *data, uint8_t type)\r
+{\r
+    if (view == nullptr || data == nullptr) {\r
+        return;\r
+    }\r
+    SportSettingsItemView *item = dynamic_cast<SportSettingsItemView *>(view);\r
+    if (item == nullptr) {\r
+        return;\r
+    }\r
+    SportSettingsItem *itemInfo = static_cast<SportSettingsItem *>(data);\r
+    item->SetItemInfo(*itemInfo);\r
+}\r
+\r
+SportSettingsPage::SportSettingsPage()\r
+{\r
+    g_SportSettingsPageInstance = this;\r
+}\r
+\r
+SportSettingsPage::~SportSettingsPage()\r
+{\r
+    if (group_ != nullptr) {\r
+        group_->RemoveAll();\r
+        delete group_;\r
+        group_ = nullptr;\r
+    }\r
+    if (background_ != nullptr) {\r
+        delete background_;\r
+        background_ = nullptr;\r
+    }\r
+    if (titleLabel_ != nullptr) {\r
+        delete titleLabel_;\r
+        titleLabel_ = nullptr;\r
+    }\r
+    if (settingList_ != nullptr) {\r
+        delete settingList_;\r
+        settingList_ = nullptr;\r
+    }\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SportSettingsPage::~SportSettingsPage");\r
+}\r
+\r
+void SportSettingsPage::InitBackgroundView()\r
+{\r
+    background_ = new UIImageView();\r
+    if (background_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SportSettingsPage background_ new fail");\r
+        return;\r
+    }\r
+    background_->SetPosition(0, 0);\r
+    LOADIMG::LoadImageViewImg(background_, SPORT_IMAGE, IMAGE_SPORT_BG);\r
+    group_->Add(background_);\r
+}\r
+\r
+void SportSettingsPage::CreateUILabel()\r
+{\r
+    titleLabel_ = new UILabel();\r
+    if (titleLabel_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SportSettingsPage titleLabel_ new fail");\r
+        return;\r
+    }\r
+    titleLabel_->SetPosition(LABELS_X, LABELS_Y, LABELS_W, LABELS_H);\r
+    titleLabel_->SetText("设置");\r
+    titleLabel_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+    titleLabel_->SetFont(BOLD_VECTOR_FONT_FILENAME, LABELS_FONT);\r
+    group_->Add(titleLabel_);\r
+}\r
+\r
+void SportSettingsPage::CreateUIList()\r
+{\r
+    settingList_ = new UISimpleList();\r
+    if (settingList_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SportSettingsPage settingList_ new fail");\r
+        return;\r
+    }\r
+    settingList_->SetPosition(LIST_X, LIST_Y, LIST_W, LIST_H);\r
+    settingList_->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+    settingList_->SetBoundaryIntercept(DragEvent::DIRECTION_TOP_TO_BOTTOM, false);\r
+    settingList_->SetBoundaryIntercept(DragEvent::DIRECTION_BOTTOM_TO_TOP, false);\r
+\r
+    for (uint8_t i = 0; i < SPORT_SET_TYPE_MAX; ++i) {\r
+        Contents content;\r
+        content.createFunc = CreateViewCb;\r
+        content.updateFunc = UpdateViewCb;\r
+        content.type = 0;\r
+        content.data = reinterpret_cast<void *>(&settings_[i]);\r
+        settingList_->AddContent(content);\r
+    }\r
+    settingList_->RefreshList();\r
+    group_->Add(settingList_);\r
+}\r
+\r
+void SportSettingsPage::OnStart(void *data)\r
+{\r
+    group_ = new UIScrollView();\r
+    if (group_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SportSettingsPage group_ new fail");\r
+        return;\r
+    }\r
+    group_->SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);\r
+    group_->SetOnDragListener(this);\r
+    group_->SetDraggable(true);\r
+    group_->SetTouchable(true);\r
+    group_->SetReboundSize(REBOUND_SIZE, UIAbstractScroll::Direction::BOTTOM);\r
+    group_->SetScrollBlankSize(BLANK_SIZE, UIAbstractScroll::Direction::BOTTOM);\r
+\r
+    InitBackgroundView();\r
+    CreateUILabel();\r
+    CreateUIList();\r
+    AddViewToPageContainer(group_);\r
+}\r
+\r
+bool SportSettingsPage::OnDrag(UIView &view, const DragEvent &event)\r
+{\r
+    if ((event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT) && (event.GetDeltaX() > X_DRAG_OFFSET) &&\r
+        (event.GetDeltaX() > (DOUBLES * MATH_ABS(event.GetDeltaY())))) {\r
+        NativeAbility::GetInstance().SwitchPageInSlice(SportPages::SPORT_PAGE_MENU,\r
+            TransitionType::TRANSITION_INVALID, false);\r
+    }\r
+    return true;\r
+}\r
+\r
+bool SportSettingsPage::OnClick(UIView &view, const ClickEvent &event)\r
+{\r
+    if (strcmp(view.GetViewId(), SETTINGS_ITEM_TARGET) == 0) {\r
+        NativeAbility::GetInstance().SwitchPageInSlice(SportPages::SPORT_PAGE_TARGET,\r
+            TransitionType::TRANSITION_INVALID, false);\r
+    } else if (strcmp(view.GetViewId(), SETTINGS_ITEM_REMIND) == 0) {\r
+        NativeAbility::GetInstance().SwitchPageInSlice(SportPages::SPORT_PAGE_REMIND,\r
+            TransitionType::TRANSITION_INVALID, false);\r
+    } else if (strcmp(view.GetViewId(), SETTINGS_ITEM_MISTOUCH) == 0) {\r
+        NativeAbility::GetInstance().SwitchPageInSlice(SportPages::SPORT_PAGE_MISTOUCH,\r
+            TransitionType::TRANSITION_INVALID, false);\r
+    }\r
+    return true;\r
+}\r
+}
\ No newline at end of file
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/sport/src/SportTargetItemView.cpp b/code/sdk/application/wearable/evb/nativeapp/nativeui/sport/src/SportTargetItemView.cpp
new file mode 100644 (file)
index 0000000..2afb640
--- /dev/null
@@ -0,0 +1,68 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SportTargetItemView\r
+ * Create: 2025-06-06\r
+ */\r
+\r
+#include "wearable_log.h"\r
+#include "UiConfig.h"\r
+#include "main/LoadImg.h"\r
+#include "ui_resource_sport.h"\r
+#include "sport/SportModel.h"\r
+#include "sport/SportTargetItemView.h"\r
+\r
+namespace OHOS {\r
+static constexpr uint16_t BG_X = 0;\r
+static constexpr uint16_t BG_Y = 6;\r
+static constexpr uint16_t ICON_X = 8;\r
+static constexpr uint16_t ICON_Y = 13;\r
+static constexpr uint16_t LABEL_X = 100;\r
+static constexpr uint16_t LABEL_Y = 31;\r
+static constexpr uint16_t LABEL_W = 179;\r
+static constexpr uint16_t LABEL_H = 37;\r
+static constexpr uint16_t LABEL_FONT = 32;\r
+static constexpr uint16_t IMAGE_X = 370;\r
+static constexpr uint16_t IMAGE_Y = 38;\r
+\r
+SportTargetItemView::SportTargetItemView()\r
+{\r
+    bgImage_.SetPosition(BG_X, BG_Y);\r
+    LOADIMG::LoadImageViewImg(&bgImage_, SPORT_IMAGE, IMAGE_SPORT_ITEMBG);\r
+\r
+    icon_.SetPosition(ICON_X, ICON_Y);\r
+\r
+    label_.SetPosition(LABEL_X, LABEL_Y, LABEL_W, LABEL_H);\r
+    label_.SetFont(DEFAULT_VECTOR_FONT_FILENAME, LABEL_FONT);\r
+    label_.SetAlign(TEXT_ALIGNMENT_LEFT, TEXT_ALIGNMENT_CENTER);\r
+    label_.SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+\r
+    nextImage_.SetPosition(IMAGE_X, IMAGE_Y);\r
+    LOADIMG::LoadImageViewImg(&nextImage_, SPORT_IMAGE, IMAGE_SPORT_NEXT);\r
+\r
+    Add(&bgImage_);\r
+    Add(&icon_);\r
+    Add(&label_);\r
+    Add(&nextImage_);\r
+}\r
+\r
+SportTargetItemView::~SportTargetItemView()\r
+{\r
+    Remove(&bgImage_);\r
+    Remove(&icon_);\r
+    Remove(&label_);\r
+    Remove(&nextImage_);\r
+}\r
+\r
+void SportTargetItemView::SetItemInfo(const SportTargetItem &itemInfo)\r
+{\r
+    SportType sportType = SportModel::GetInstance().GetSportType();\r
+    if (itemInfo.itemId == SPORT_TARGET_DISTANCE && sportType == SPORT_TYPE_INDOOR_SWIMMING) {\r
+        LOADIMG::LoadImageViewImg(&icon_, SPORT_IMAGE, IMAGE_SPORT_LAP);\r
+        label_.SetText("趟数");\r
+    } else {\r
+        LOADIMG::LoadImageViewImg(&icon_, SPORT_IMAGE, itemInfo.iconId);\r
+        label_.SetText(itemInfo.label);\r
+    }\r
+    SetViewId(itemInfo.viewId);\r
+}\r
+}
\ No newline at end of file
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/sport/src/SportTargetPage.cpp b/code/sdk/application/wearable/evb/nativeapp/nativeui/sport/src/SportTargetPage.cpp
new file mode 100644 (file)
index 0000000..91e7843
--- /dev/null
@@ -0,0 +1,186 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SportTargetPage\r
+ * Create: 2025-06-06\r
+ */\r
+\r
+#include "UiConfig.h"\r
+#include "main/LoadImg.h"\r
+#include "wearable_log.h"\r
+#include "AppViewIDs.h"\r
+#include "NativeAbility.h"\r
+#include "SlicePageFactory.h"\r
+#include "sport/SportView.h"\r
+#include "sport/SportTargetPage.h"\r
+\r
+namespace OHOS {\r
+static constexpr uint16_t LABELS_X = 100;\r
+static constexpr uint16_t LABELS_Y = 38;\r
+static constexpr uint16_t LABELS_W = 253;\r
+static constexpr uint16_t LABELS_H = 53;\r
+static constexpr uint16_t LABELS_FONT = 38;\r
+static constexpr uint16_t LIST_X = 20;\r
+static constexpr uint16_t LIST_Y = 100;\r
+static constexpr uint16_t LIST_W = 415;\r
+static constexpr uint16_t LIST_H = 324;\r
+static constexpr uint16_t LIST_ITEM_W = 415;\r
+static constexpr uint16_t LIST_ITEM_H = 108;\r
+static constexpr uint16_t REBOUND_SIZE = 60;\r
+static constexpr uint16_t BLANK_SIZE = 60;\r
+\r
+REGIST_SLICE_PAGE(VIEW_SPORT, SportPages::SPORT_PAGE_TARGET, SportTargetPage, false);\r
+\r
+static SportTargetPage *g_SportTargetPageInstance = nullptr;\r
+\r
+static UIView *CreateViewCb(uint8_t type)\r
+{\r
+    SportTargetItemView *item = new SportTargetItemView();\r
+    if (item == nullptr) {\r
+        return nullptr;\r
+    }\r
+    item->SetPosition(0, 0, LIST_ITEM_W, LIST_ITEM_H);\r
+    item->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+    item->SetTouchable(true);\r
+    item->SetOnClickListener(g_SportTargetPageInstance);\r
+    return item;\r
+}\r
+\r
+static void UpdateViewCb(UIView *view, void *data, uint8_t type)\r
+{\r
+    if (view == nullptr || data == nullptr) {\r
+        return;\r
+    }\r
+    SportTargetItemView *item = dynamic_cast<SportTargetItemView *>(view);\r
+    if (item == nullptr) {\r
+        return;\r
+    }\r
+    SportTargetItem *itemInfo = static_cast<SportTargetItem *>(data);\r
+    item->SetItemInfo(*itemInfo);\r
+}\r
+\r
+SportTargetPage::SportTargetPage()\r
+{\r
+    g_SportTargetPageInstance = this;\r
+}\r
+\r
+SportTargetPage::~SportTargetPage()\r
+{\r
+    if (group_ != nullptr) {\r
+        group_->RemoveAll();\r
+        delete group_;\r
+        group_ = nullptr;\r
+    }\r
+    if (background_ != nullptr) {\r
+        delete background_;\r
+        background_ = nullptr;\r
+    }\r
+    if (titleLabel_ != nullptr) {\r
+        delete titleLabel_;\r
+        titleLabel_ = nullptr;\r
+    }\r
+    if (targetList_ != nullptr) {\r
+        delete targetList_;\r
+        targetList_ = nullptr;\r
+    }\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SportTargetPage::~SportTargetPage");\r
+}\r
+\r
+void SportTargetPage::InitBackgroundView()\r
+{\r
+    background_ = new UIImageView();\r
+    if (background_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SportTargetPage background_ new fail");\r
+        return;\r
+    }\r
+    background_->SetPosition(0, 0);\r
+    LOADIMG::LoadImageViewImg(background_, SPORT_IMAGE, IMAGE_SPORT_BG);\r
+    group_->Add(background_);\r
+}\r
+\r
+void SportTargetPage::CreateUILabel()\r
+{\r
+    titleLabel_ = new UILabel();\r
+    if (titleLabel_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SportTargetPage titleLabel_ new fail");\r
+        return;\r
+    }\r
+    titleLabel_->SetPosition(LABELS_X, LABELS_Y, LABELS_W, LABELS_H);\r
+    titleLabel_->SetText("目标");\r
+    titleLabel_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+    titleLabel_->SetFont(BOLD_VECTOR_FONT_FILENAME, LABELS_FONT);\r
+    group_->Add(titleLabel_);\r
+}\r
+\r
+void SportTargetPage::CreateUIList()\r
+{\r
+    targetList_ = new UISimpleList();\r
+    if (targetList_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SportTargetPage targetList_ new fail");\r
+        return;\r
+    }\r
+    targetList_->SetPosition(LIST_X, LIST_Y, LIST_W, LIST_H);\r
+    targetList_->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+    targetList_->SetBoundaryIntercept(DragEvent::DIRECTION_TOP_TO_BOTTOM, false);\r
+    targetList_->SetBoundaryIntercept(DragEvent::DIRECTION_BOTTOM_TO_TOP, false);\r
+\r
+    for (uint8_t i = 0; i < SPORT_TARGET_MAX; ++i) {\r
+        Contents content;\r
+        content.createFunc = CreateViewCb;\r
+        content.updateFunc = UpdateViewCb;\r
+        content.type = 0;\r
+        content.data = reinterpret_cast<void *>(&targets_[i]);\r
+        targetList_->AddContent(content);\r
+    }\r
+    targetList_->RefreshList();\r
+    group_->Add(targetList_);\r
+}\r
+\r
+void SportTargetPage::OnStart(void *data)\r
+{\r
+    group_ = new UIScrollView();\r
+    if (group_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SportTargetPage group_ new fail");\r
+        return;\r
+    }\r
+    group_->SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);\r
+    group_->SetOnDragListener(this);\r
+    group_->SetDraggable(true);\r
+    group_->SetTouchable(true);\r
+    group_->SetReboundSize(REBOUND_SIZE, UIAbstractScroll::Direction::BOTTOM);\r
+    group_->SetScrollBlankSize(BLANK_SIZE, UIAbstractScroll::Direction::BOTTOM);\r
+\r
+    InitBackgroundView();\r
+    CreateUILabel();\r
+    CreateUIList();\r
+    AddViewToPageContainer(group_);\r
+}\r
+\r
+bool SportTargetPage::OnDrag(UIView &view, const DragEvent &event)\r
+{\r
+    if ((event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT) && (event.GetDeltaX() > X_DRAG_OFFSET) &&\r
+        (event.GetDeltaX() > (DOUBLES * MATH_ABS(event.GetDeltaY())))) {\r
+        NativeAbility::GetInstance().SwitchPageInSlice(SportPages::SPORT_PAGE_SETTINGS,\r
+            TransitionType::TRANSITION_INVALID, false);\r
+    }\r
+    return true;\r
+}\r
+\r
+bool SportTargetPage::OnClick(UIView &view, const ClickEvent &event)\r
+{\r
+    sport_info_t *sportInfo = SportModel::GetInstance().GetCurrSportInfo();\r
+    sportInfo->setType = SPORT_SET_TYPE_TARGET;\r
+    if (strcmp(view.GetViewId(), SPORT_TARGET_ITEM_DISTANCE) == 0) {\r
+        sportInfo->targetTypeTemp = sportInfo->targetType;\r
+        sportInfo->targetType = SPORT_TARGET_DISTANCE;\r
+    } else if (strcmp(view.GetViewId(), SPORT_TARGET_ITEM_TIME) == 0) {\r
+        sportInfo->targetTypeTemp = sportInfo->targetType;\r
+        sportInfo->targetType = SPORT_TARGET_TIME;\r
+    } else if (strcmp(view.GetViewId(), SPORT_TARGET_ITEM_CALORIE) == 0) {\r
+        sportInfo->targetTypeTemp = sportInfo->targetType;\r
+        sportInfo->targetType = SPORT_TARGET_CALORIE;\r
+    }\r
+    NativeAbility::GetInstance().SwitchPageInSlice(SportPages::SPORT_PAGE_TARGET_SETTING,\r
+        TransitionType::TRANSITION_INVALID, false);\r
+    return true;\r
+}\r
+}
\ No newline at end of file
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/sport/src/SportTargetPromptPage.cpp b/code/sdk/application/wearable/evb/nativeapp/nativeui/sport/src/SportTargetPromptPage.cpp
new file mode 100644 (file)
index 0000000..2c5c211
--- /dev/null
@@ -0,0 +1,207 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SportTargetPromptPage\r
+ * Create: 2025-06-06\r
+ */\r
+\r
+#include <sys/time.h>\r
+#include "wearable_log.h"\r
+#include "UiConfig.h"\r
+#include "main/LoadImg.h"\r
+#include "ui_resource_sport.h"\r
+#include "AppViewIDs.h"\r
+#include "NativeAbility.h"\r
+#include "SlicePageFactory.h"\r
+#include "sport/SportView.h"\r
+#include "sport/SportTargetPromptPage.h"\r
+\r
+namespace OHOS {\r
+static constexpr uint16_t PAGE_VISIBLE_SECOND = 3;\r
+static constexpr uint16_t PROMPT_DISTANCE_INDEX = 0;\r
+static constexpr uint16_t PROMPT_TIME_INDEX = 1;\r
+static constexpr uint16_t PROMPT_LAP_INDEX = 2;\r
+static constexpr uint16_t IMAGE_X = 46;\r
+static constexpr uint16_t IMAGE_Y = 72;\r
+static constexpr uint16_t IMAGE_COMPLETE_X = 85;\r
+static constexpr uint16_t IMAGE_COMPLETE_Y = 32;\r
+static constexpr uint16_t IMAGE_HEART_X = 167;\r
+static constexpr uint16_t IMAGE_HEART_Y = 118;\r
+static constexpr uint16_t LABEL_X = 25;\r
+static constexpr uint16_t LABEL_Y = 250;\r
+static constexpr uint16_t LABEL_W = 404;\r
+static constexpr uint16_t LABEL_H = 49;\r
+static constexpr uint16_t LABEL_FONT = 36;\r
+static const char *PROMPT_HALF_CONTENT = "本次运动目标已完成50%";\r
+static const char *PROMPT_FINISH_CONTENT = "本次运动目标已完成";\r
+static const int PROPMT_IMAGES[][10] = {\r
+    {IMAGE_SPORT_1KM, IMAGE_SPORT_3KM, IMAGE_SPORT_5KM, IMAGE_SPORT_7KM, IMAGE_SPORT_10KM, IMAGE_SPORT_15KM,\r
+     IMAGE_SPORT_20KM, IMAGE_SPORT_25KM, IMAGE_SPORT_30KM, IMAGE_SPORT_40KM},\r
+    {IMAGE_SPORT_10MIN, IMAGE_SPORT_20MIN, IMAGE_SPORT_30MIN, IMAGE_SPORT_60MIN, IMAGE_SPORT_120MIN, IMAGE_SPORT_180MIN,\r
+     IMAGE_SPORT_200MIN},\r
+    {IMAGE_SPORT_LAP1, IMAGE_SPORT_LAP2, IMAGE_SPORT_LAP4, IMAGE_SPORT_LAP6, IMAGE_SPORT_LAP8, IMAGE_SPORT_LAP10,\r
+     IMAGE_SPORT_LAP12, IMAGE_SPORT_LAP16, IMAGE_SPORT_LAP20, IMAGE_SPORT_LAP30},\r
+};\r
+\r
+REGIST_SLICE_PAGE(VIEW_SPORT, SportPages::SPORT_PAGE_TARGET_PROMPT, SportTargetPromptPage, false);\r
+\r
+void SportTargetPromptPage::SportPromptAnimatorCallback::Callback(UIView *view)\r
+{\r
+    UNUSED(view);\r
+\r
+    time_t now = time(nullptr);\r
+    if (now - page_->startTime_ > PAGE_VISIBLE_SECOND) {\r
+        NativeAbility::GetInstance().SwitchPageInSlice(SportPages::SPORT_PAGE_DATA,\r
+            TransitionType::TRANSITION_INVALID, false);\r
+    }\r
+}\r
+\r
+SportTargetPromptPage::~SportTargetPromptPage()\r
+{\r
+    if (group_ != nullptr) {\r
+        group_->RemoveAll();\r
+        delete group_;\r
+        group_ = nullptr;\r
+    }\r
+    if (promptIcon_ != nullptr) {\r
+        delete promptIcon_;\r
+        promptIcon_ = nullptr;\r
+    }\r
+    if (promptLabel_ != nullptr) {\r
+        delete promptLabel_;\r
+        promptLabel_ = nullptr;\r
+    }\r
+    if (animator_ != nullptr) {\r
+        delete animator_;\r
+        animator_ = nullptr;\r
+    }\r
+    if (callback_ != nullptr) {\r
+        delete callback_;\r
+        callback_ = nullptr;\r
+    }\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SportTargetPromptPage::~SportTargetPromptPage");\r
+}\r
+\r
+void SportTargetPromptPage::CreatePromptView()\r
+{\r
+    promptIcon_ = new UIImageView();\r
+    if (promptIcon_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SportTargetPromptPage promptIcon_ new fail");\r
+        return;\r
+    }\r
+    promptIcon_->SetPosition(IMAGE_X, IMAGE_Y);\r
+    group_->Add(promptIcon_);\r
+\r
+    promptLabel_ = new UILabel();\r
+    if (promptLabel_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SportTargetPromptPage promptLabel_ new fail");\r
+        return;\r
+    }\r
+    promptLabel_->SetPosition(LABEL_X, LABEL_Y, LABEL_W, LABEL_H);\r
+    promptLabel_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, LABEL_FONT);\r
+    promptLabel_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+    group_->Add(promptLabel_);\r
+\r
+    sport_info_t *sportInfo = SportModel::GetInstance().GetCurrSportInfo();\r
+    if (sportInfo->promptType == SPORT_SET_TYPE_TARGET) {\r
+        if (sportInfo->targetComplete) {\r
+            promptLabel_->SetText(PROMPT_FINISH_CONTENT);\r
+            promptIcon_->SetPosition(IMAGE_COMPLETE_X, IMAGE_COMPLETE_Y);\r
+            LOADIMG::LoadImageViewImg(promptIcon_, SPORT_IMAGE, IMAGE_SPORT_FINISH);\r
+        } else if (sportInfo->targetHalf) {\r
+            promptLabel_->SetText(PROMPT_HALF_CONTENT);\r
+            LOADIMG::LoadImageViewImg(promptIcon_, SPORT_IMAGE, IMAGE_SPORT_HALF);\r
+        }\r
+    } else if (sportInfo->promptType == SPORT_SET_TYPE_REMIND) {\r
+        std::string promptStr;\r
+        if (sportInfo->remindType == SPORT_REMIND_INTERVAL_DISTANCE) {\r
+            SportType sportType = SportModel::GetInstance().GetSportType();\r
+            if (sportType == SPORT_TYPE_INDOOR_SWIMMING) {\r
+                promptStr = "第" + std::to_string(sportInfo->remindTimes) + "个" +\r
+                            std::to_string(sportInfo->remindValue) + "趟已完成!";\r
+                promptLabel_->SetText(promptStr.c_str());\r
+                LOADIMG::LoadImageViewImg(promptIcon_, SPORT_IMAGE,\r
+                                          PROPMT_IMAGES[PROMPT_LAP_INDEX][sportInfo->remindIndex]);\r
+            } else {\r
+                promptStr = "第" + std::to_string(sportInfo->remindTimes) + "个" +\r
+                            std::to_string(sportInfo->remindValue) + "公里已完成!";\r
+                promptLabel_->SetText(promptStr.c_str());\r
+                LOADIMG::LoadImageViewImg(promptIcon_, SPORT_IMAGE,\r
+                                          PROPMT_IMAGES[PROMPT_DISTANCE_INDEX][sportInfo->remindIndex]);\r
+            }\r
+        } else if (sportInfo->remindType == SPORT_REMIND_INTERVAL_TIME) {\r
+            promptStr = "第" + std::to_string(sportInfo->remindTimes) + "个" + std::to_string(sportInfo->remindValue) +\r
+                        "分钟已完成!";\r
+            promptLabel_->SetText(promptStr.c_str());\r
+            LOADIMG::LoadImageViewImg(promptIcon_, SPORT_IMAGE,\r
+                                      PROPMT_IMAGES[PROMPT_TIME_INDEX][sportInfo->remindIndex]);\r
+        }\r
+    } else if (sportInfo->promptType == SPORT_SET_TYPE_HEARTRATE) {\r
+        std::string promptStr = "当前心率" + std::to_string(sportInfo->data.heartRate) + "次/分!";\r
+        promptLabel_->SetText(promptStr.c_str());\r
+        promptIcon_->SetPosition(IMAGE_HEART_X, IMAGE_HEART_Y);\r
+        LOADIMG::LoadImageViewImg(promptIcon_, SPORT_IMAGE, IMAGE_SPORT_HEART3);\r
+    }\r
+}\r
+\r
+void SportTargetPromptPage::OnStart(void *data)\r
+{\r
+    startTime_ = time(nullptr);\r
+    group_ = new UIViewGroup();\r
+    if (group_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SportTargetPromptPage group_ new fail");\r
+        return;\r
+    }\r
+    group_->SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);\r
+    group_->SetOnDragListener(this);\r
+    group_->SetDraggable(true);\r
+    group_->SetTouchable(true);\r
+\r
+    CreatePromptView();\r
+    AddViewToPageContainer(group_);\r
+\r
+    callback_ = new SportPromptAnimatorCallback(this);\r
+    if (callback_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SportTargetPromptPage::OnStart callback_ new fail");\r
+        return;\r
+    }\r
+\r
+    animator_ = new Animator(callback_, nullptr, 0, true);\r
+    if (animator_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SportTargetPromptPage::OnStart new Animator animator_ fail");\r
+        return;\r
+    }\r
+}\r
+\r
+void SportTargetPromptPage::OnPause()\r
+{\r
+    if (animator_ != nullptr) {\r
+        if (animator_->GetState() != Animator::STOP) {\r
+            animator_->Stop();\r
+        }\r
+    }\r
+}\r
+\r
+void SportTargetPromptPage::OnResume()\r
+{\r
+    if (animator_ != nullptr) {\r
+        if (animator_->GetState() == Animator::STOP) {\r
+            animator_->Start();\r
+        }\r
+    }\r
+}\r
+\r
+bool SportTargetPromptPage::OnDrag(UIView &view, const DragEvent &event)\r
+{\r
+    if ((event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT) && (event.GetDeltaX() > X_DRAG_OFFSET) &&\r
+        (event.GetDeltaX() > (DOUBLES * MATH_ABS(event.GetDeltaY())))) {\r
+        NativeAbility::GetInstance().SwitchPageInSlice(SportPages::SPORT_PAGE_DATA,\r
+            TransitionType::TRANSITION_INVALID, false);\r
+    }\r
+    return true;\r
+}\r
+\r
+bool SportTargetPromptPage::OnClick(UIView &view, const ClickEvent &event)\r
+{\r
+    return false;\r
+}\r
+}
\ No newline at end of file
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/sport/src/SportTargetSettingPage.cpp b/code/sdk/application/wearable/evb/nativeapp/nativeui/sport/src/SportTargetSettingPage.cpp
new file mode 100644 (file)
index 0000000..c3a10c3
--- /dev/null
@@ -0,0 +1,243 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SportTargetSettingPage\r
+ * Create: 2025-06-06\r
+ */\r
+\r
+#include "UiConfig.h"\r
+#include "main/LoadImg.h"\r
+#include "ui_resource_sport.h"\r
+#include "wearable_log.h"\r
+#include "AppViewIDs.h"\r
+#include "NativeAbility.h"\r
+#include "SlicePageFactory.h"\r
+#include "sport/SportView.h"\r
+#include "sport/SportTargetSettingPage.h"\r
+\r
+namespace OHOS {\r
+static constexpr uint16_t LABELS_X = 100;\r
+static constexpr uint16_t LABELS_Y = 39;\r
+static constexpr uint16_t LABELS_W = 253;\r
+static constexpr uint16_t LABELS_H = 53;\r
+static constexpr uint16_t LABELS_FONT = 38;\r
+static constexpr uint16_t PICKER_X = 103;\r
+static constexpr uint16_t PICKER_Y = 122;\r
+static constexpr uint16_t PICKER_W = 247;\r
+static constexpr uint16_t PICKER_H = 212;\r
+static constexpr uint16_t BACKGROUND_FONT = 38;\r
+static constexpr uint16_t HIGHTLIGHT_FONT = 44;\r
+static constexpr uint16_t PICKER_ITEM_H = 65;\r
+static constexpr uint16_t BUTTON_X = 63;\r
+static constexpr uint16_t BUTTON_Y = 361;\r
+static constexpr uint16_t BUTTON_W = 328;\r
+static constexpr uint16_t BUTTON_H = 93;\r
+\r
+REGIST_SLICE_PAGE(VIEW_SPORT, SportPages::SPORT_PAGE_TARGET_SETTING, SportTargetSettingPage, false);\r
+\r
+SportTargetSettingPage::~SportTargetSettingPage()\r
+{\r
+    if (group_ != nullptr) {\r
+        group_->RemoveAll();\r
+        delete group_;\r
+        group_ = nullptr;\r
+    }\r
+    if (titleLabel_ != nullptr) {\r
+        delete titleLabel_;\r
+        titleLabel_ = nullptr;\r
+    }\r
+    if (picker_ != nullptr) {\r
+        delete picker_;\r
+        picker_ = nullptr;\r
+    }\r
+    if (confirmButton_ != nullptr) {\r
+        delete confirmButton_;\r
+        confirmButton_ = nullptr;\r
+    }\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SportTargetSettingPage::~SportTargetSettingPage");\r
+}\r
+\r
+void SportTargetSettingPage::CreateUILabel()\r
+{\r
+    titleLabel_ = new UILabel();\r
+    if (titleLabel_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SportTargetSettingPage titleLabel_ new fail");\r
+        return;\r
+    }\r
+    titleLabel_->SetPosition(LABELS_X, LABELS_Y, LABELS_W, LABELS_H);\r
+    titleLabel_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+    titleLabel_->SetFont(BOLD_VECTOR_FONT_FILENAME, LABELS_FONT);\r
+    group_->Add(titleLabel_);\r
+}\r
+\r
+void SportTargetSettingPage::CreateUIPicker()\r
+{\r
+    picker_ = new UIPicker();\r
+    if (picker_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SportTargetSettingPage picker_ new fail");\r
+        return;\r
+    }\r
+    picker_->SetPosition(PICKER_X, PICKER_Y, PICKER_W, PICKER_H);\r
+    picker_->SetItemHeight(PICKER_ITEM_H);\r
+    picker_->SetBackgroundFont(DEFAULT_VECTOR_FONT_FILENAME, BACKGROUND_FONT);\r
+    picker_->SetHighlightFont(DEFAULT_VECTOR_FONT_FILENAME, HIGHTLIGHT_FONT);\r
+    group_->Add(picker_);\r
+}\r
+\r
+void SportTargetSettingPage::CreateUIButton()\r
+{\r
+    confirmButton_ = new UILabelButton();\r
+    if (confirmButton_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SportTargetSettingPage confirmButton_ new fail");\r
+        return;\r
+    }\r
+    confirmButton_->SetPosition(BUTTON_X, BUTTON_Y, BUTTON_W, BUTTON_H);\r
+    confirmButton_->SetViewId(TARGET_SETTING_CONFIRM_BUTTON);\r
+    confirmButton_->SetStyleForState(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT, UIButton::RELEASED);\r
+    confirmButton_->SetStyleForState(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT, UIButton::PRESSED);\r
+    confirmButton_->SetStyleForState(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT, UIButton::INACTIVE);\r
+\r
+    sport_info_t *sportInfo = SportModel::GetInstance().GetCurrSportInfo();\r
+    if (sportInfo->setType == SPORT_SET_TYPE_TARGET) {\r
+        if (sportInfo->targetType == SPORT_TARGET_DISTANCE) {\r
+            LOADIMG::LoadBtnImage(confirmButton_, SPORT_IMAGE, IMAGE_SPORT_OK1, IMAGE_SPORT_OK1);\r
+        } else if (sportInfo->targetType == SPORT_TARGET_TIME) {\r
+            LOADIMG::LoadBtnImage(confirmButton_, SPORT_IMAGE, IMAGE_SPORT_OK3, IMAGE_SPORT_OK3);\r
+        } else if (sportInfo->targetType == SPORT_TARGET_CALORIE) {\r
+            LOADIMG::LoadBtnImage(confirmButton_, SPORT_IMAGE, IMAGE_SPORT_OK2, IMAGE_SPORT_OK2);\r
+        }\r
+    } else if (sportInfo->setType == SPORT_SET_TYPE_REMIND) {\r
+        if (sportInfo->remindType == SPORT_REMIND_INTERVAL_DISTANCE) {\r
+            LOADIMG::LoadBtnImage(confirmButton_, SPORT_IMAGE, IMAGE_SPORT_OK1, IMAGE_SPORT_OK1);\r
+        } else if (sportInfo->remindType == SPORT_REMIND_INTERVAL_TIME) {\r
+            LOADIMG::LoadBtnImage(confirmButton_, SPORT_IMAGE, IMAGE_SPORT_OK3, IMAGE_SPORT_OK3);\r
+        }\r
+    }\r
+\r
+    confirmButton_->SetOnClickListener(this);\r
+    group_->Add(confirmButton_);\r
+}\r
+\r
+void SportTargetSettingPage::OnStart(void *data)\r
+{\r
+    group_ = new UIViewGroup();\r
+    if (group_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SportTargetSettingPage group_ new fail");\r
+        return;\r
+    }\r
+    group_->SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);\r
+    group_->SetOnDragListener(this);\r
+    group_->SetDraggable(true);\r
+    group_->SetTouchable(true);\r
+\r
+    CreateUILabel();\r
+    CreateUIPicker();\r
+    CreateUIButton();\r
+    AddViewToPageContainer(group_);\r
+\r
+    sport_info_t *sportInfo = SportModel::GetInstance().GetCurrSportInfo();\r
+    if (sportInfo->setType == SPORT_SET_TYPE_TARGET) {\r
+        UpdateViewByTargetType();\r
+    } else if (sportInfo->setType == SPORT_SET_TYPE_REMIND) {\r
+        UpdateViewByRemindType();\r
+    }\r
+}\r
+\r
+bool SportTargetSettingPage::OnDrag(UIView &view, const DragEvent &event)\r
+{\r
+    if ((event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT) && (event.GetDeltaX() > X_DRAG_OFFSET) &&\r
+        (event.GetDeltaX() > (DOUBLES * MATH_ABS(event.GetDeltaY())))) {\r
+        sport_info_t *sportInfo = SportModel::GetInstance().GetCurrSportInfo();\r
+        if (sportInfo->setType == SPORT_SET_TYPE_TARGET) {\r
+            sportInfo->targetType = sportInfo->targetTypeTemp;\r
+            NativeAbility::GetInstance().SwitchPageInSlice(SportPages::SPORT_PAGE_TARGET,\r
+                TransitionType::TRANSITION_INVALID, false);\r
+        } else if (sportInfo->setType == SPORT_SET_TYPE_REMIND) {\r
+            sportInfo->remindType = sportInfo->remindTypeTemp;\r
+            NativeAbility::GetInstance().SwitchPageInSlice(SportPages::SPORT_PAGE_REMIND,\r
+                TransitionType::TRANSITION_INVALID, false);\r
+        }\r
+    }\r
+    return true;\r
+}\r
+\r
+bool SportTargetSettingPage::OnClick(UIView &view, const ClickEvent &event)\r
+{\r
+    if (strcmp(view.GetViewId(), TARGET_SETTING_CONFIRM_BUTTON) == 0) {\r
+        uint16_t index = picker_->GetSelected();\r
+        sport_info_t *sportInfo = SportModel::GetInstance().GetCurrSportInfo();\r
+        if (sportInfo->setType == SPORT_SET_TYPE_TARGET) {\r
+            SportModel::GetInstance().SetTargetValue(index);\r
+            sportInfo->isTargetSetted = true;\r
+            SportModel::GetInstance().SaveConfig(SPORT_CONFIG_INFO);\r
+            NativeAbility::GetInstance().SwitchPageInSlice(SportPages::SPORT_PAGE_TARGET,\r
+                TransitionType::TRANSITION_INVALID, false);\r
+        } else if (sportInfo->setType == SPORT_SET_TYPE_REMIND) {\r
+            SportModel::GetInstance().SetRemindValue(index);\r
+            sportInfo->isRemindSetted = true;\r
+            SportModel::GetInstance().SaveConfig(SPORT_CONFIG_INFO);\r
+            NativeAbility::GetInstance().SwitchPageInSlice(SportPages::SPORT_PAGE_REMIND,\r
+                TransitionType::TRANSITION_INVALID, false);\r
+        }\r
+    }\r
+    return true;\r
+}\r
+\r
+void SportTargetSettingPage::UpdateViewByTargetType()\r
+{\r
+    sport_info_t *sportInfo = SportModel::GetInstance().GetCurrSportInfo();\r
+    if (sportInfo->targetType == SPORT_TARGET_DISTANCE) {\r
+        SportType sportType = SportModel::GetInstance().GetSportType();\r
+        if (sportType == SPORT_TYPE_INDOOR_SWIMMING) {\r
+            titleLabel_->SetText("趟数");\r
+            const char *uiLapData[] = {"1趟", "2趟", "4趟", "6趟", "8趟", "10趟", "12趟", "16趟", "20趟", "30趟"};\r
+            picker_->SetTextColor(Color::Gray(), Color::GetColorFromRGB(0x52, 0xe4, 0xeb));\r
+            picker_->SetValues(uiLapData, sizeof(uiLapData) / sizeof(uiLapData[0]));\r
+        } else {\r
+            titleLabel_->SetText("距离");\r
+            const char *uiDistanceData[] = {"1km", "3km", "5km", "7km", "10km", "15km", "20km", "25km", "30km", "40km"};\r
+            picker_->SetTextColor(Color::Gray(), Color::GetColorFromRGB(0x52, 0xe4, 0xeb));\r
+            picker_->SetValues(uiDistanceData, sizeof(uiDistanceData) / sizeof(uiDistanceData[0]));\r
+        }\r
+    } else if (sportInfo->targetType == SPORT_TARGET_TIME) {\r
+        titleLabel_->SetText("时间");\r
+        const char *uiTimeData[] = {"10分钟", "20分钟", "30分钟", "60分钟", "120分钟", "180分钟", "200分钟"};\r
+        picker_->SetTextColor(Color::Gray(), Color::GetColorFromRGB(0xff, 0x75, 0x00));\r
+        picker_->SetValues(uiTimeData, sizeof(uiTimeData) / sizeof(uiTimeData[0]));\r
+    } else if (sportInfo->targetType == SPORT_TARGET_CALORIE) {\r
+        titleLabel_->SetText("热量");\r
+        const char *uiCalorieData[] = {"100千卡", "200千卡", "300千卡", "500千卡", "600千卡", "800千卡", "1000千卡"};\r
+        picker_->SetTextColor(Color::Gray(), Color::GetColorFromRGB(0xff, 0x4d, 0x4f));\r
+        picker_->SetValues(uiCalorieData, sizeof(uiCalorieData) / sizeof(uiCalorieData[0]));\r
+    }\r
+    titleLabel_->Invalidate();\r
+    picker_->Invalidate();\r
+    confirmButton_->Invalidate();\r
+}\r
+\r
+void SportTargetSettingPage::UpdateViewByRemindType()\r
+{\r
+    sport_info_t *sportInfo = SportModel::GetInstance().GetCurrSportInfo();\r
+    if (sportInfo->remindType == SPORT_REMIND_INTERVAL_DISTANCE) {\r
+        SportType sportType = SportModel::GetInstance().GetSportType();\r
+        if (sportType == SPORT_TYPE_INDOOR_SWIMMING) {\r
+            titleLabel_->SetText("趟数");\r
+            const char *uiLapData[] = {"1趟", "2趟", "4趟", "6趟", "8趟", "10趟", "12趟", "16趟", "20趟", "30趟"};\r
+            picker_->SetTextColor(Color::Gray(), Color::GetColorFromRGB(0x52, 0xe4, 0xeb));\r
+            picker_->SetValues(uiLapData, sizeof(uiLapData) / sizeof(uiLapData[0]));\r
+        } else {\r
+            titleLabel_->SetText("距离");\r
+            const char *uiDistanceData[] = {"1km", "3km", "5km", "7km", "10km", "15km", "20km", "25km", "30km", "40km"};\r
+            picker_->SetTextColor(Color::Gray(), Color::GetColorFromRGB(0x52, 0xe4, 0xeb));\r
+            picker_->SetValues(uiDistanceData, sizeof(uiDistanceData) / sizeof(uiDistanceData[0]));\r
+        }\r
+    } else if (sportInfo->remindType == SPORT_REMIND_INTERVAL_TIME) {\r
+        titleLabel_->SetText("时间");\r
+        const char *uiTimeData[] = {"10分钟", "20分钟", "30分钟", "60分钟", "120分钟", "180分钟", "200分钟"};\r
+        picker_->SetTextColor(Color::Gray(), Color::GetColorFromRGB(0xff, 0x75, 0x00));\r
+        picker_->SetValues(uiTimeData, sizeof(uiTimeData) / sizeof(uiTimeData[0]));\r
+    }\r
+    titleLabel_->Invalidate();\r
+    picker_->Invalidate();\r
+    confirmButton_->Invalidate();\r
+}\r
+}
\ No newline at end of file
index 80c4cfe..2d6c6cf 100644 (file)
@@ -1,18 +1,12 @@
 /*\r
- * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
  * Description: StopwatchItemView\r
  * Create: 2025-06-06\r
  */\r
 \r
-#include "UiConfig.h"\r
 #include "stopwatch/StopwatchItemView.h"\r
-#include "common/image_cache_manager.h"\r
-#include "ui_stopwatch_resource.h"\r
-#include "wearable_log.h"\r
 \r
 namespace OHOS {\r
-static constexpr uint16_t STOPWATCH_ITEM_WIDTH = 312;\r
-static constexpr uint16_t STOPWATCH_ITEM_HEIGHT = 60;\r
 static constexpr uint16_t STOPWATCH_ITEM_BG_XPOS = 6;\r
 static constexpr uint16_t STOPWATCH_ITEM_BG_YPOS = 8;\r
 static constexpr uint16_t STOPWATCH_ITEM_BG_WIDTH = 300;\r
@@ -29,10 +23,6 @@ static constexpr uint32_t STOPWATCH_ITEM_FONT_COLOR = 0xffff8530;
 \r
 StopwatchItemView::StopwatchItemView()\r
 {\r
-    SetPosition(0, 0, STOPWATCH_ITEM_WIDTH, STOPWATCH_ITEM_HEIGHT);\r
-    SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
-    SetTouchable(true);\r
-\r
     itemBg_.SetPosition(STOPWATCH_ITEM_BG_XPOS, STOPWATCH_ITEM_BG_YPOS);\r
     itemBg_.Resize(STOPWATCH_ITEM_BG_WIDTH, STOPWATCH_ITEM_BG_HEIGHT);\r
     itemBg_.SetStyle(STYLE_BACKGROUND_COLOR, Color::Gray().full);\r
@@ -65,9 +55,9 @@ StopwatchItemView::~StopwatchItemView()
     Remove(&itemBg_);\r
 }\r
 \r
-void StopwatchItemView::SetItemInfo(int16_t index, const StopwatchItem &itemInfo)\r
+void StopwatchItemView::SetItemInfo(const StopwatchItem &itemInfo)\r
 {\r
-    nameLabel_.SetText(("分段" + std::to_string(index)).c_str());\r
+    nameLabel_.SetText(("分段" + std::to_string(itemInfo.index)).c_str());\r
     recordLabel_.SetText(itemInfo.record.c_str());\r
     if (itemInfo.isLatest) {\r
         nameLabel_.SetStyle(STYLE_TEXT_COLOR, STOPWATCH_ITEM_FONT_COLOR);\r
index d73b785..36dde07 100644 (file)
@@ -1,11 +1,12 @@
 /*\r
- * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
  * Description: StopwatchModel\r
  * Create: 2025-06-06\r
  */\r
+\r
 #include <sys/time.h>\r
-#include "stopwatch/StopwatchModel.h"\r
 #include "wearable_log.h"\r
+#include "stopwatch/StopwatchModel.h"\r
 \r
 namespace OHOS {\r
 static constexpr uint16_t UNIT_SEC_TO_MSEC = 1000;\r
@@ -36,13 +37,13 @@ void StopwatchModel::SetStartTime()
 \r
 void StopwatchModel::SaveElapsedTime()\r
 {\r
-    uiSavedElapsedTime_ += uiElapsedTime_;\r
-    uiElapsedTime_ = 0;\r
+    savedElapsedTime_ += elapsedTime_;\r
+    elapsedTime_ = 0;\r
 }\r
 \r
 uint64_t StopwatchModel::GetElapsedTime()\r
 {\r
-    return uiSavedElapsedTime_ + uiElapsedTime_;\r
+    return savedElapsedTime_ + elapsedTime_;\r
 }\r
 \r
 uint64_t StopwatchModel::UpdateElapsedTime()\r
@@ -54,31 +55,26 @@ uint64_t StopwatchModel::UpdateElapsedTime()
     struct timeval64 currTime = {0};\r
     gettimeofday64(&currTime, NULL);\r
 #endif\r
-    uiElapsedTime_ = (currTime.tv_sec * UNIT_SEC_TO_MSEC + currTime.tv_usec / UNIT_SEC_TO_MSEC) -\r
-                     (startTime_.tv_sec * UNIT_SEC_TO_MSEC + startTime_.tv_usec / UNIT_SEC_TO_MSEC);\r
-    return uiSavedElapsedTime_ + uiElapsedTime_;\r
+    elapsedTime_ = (currTime.tv_sec * UNIT_SEC_TO_MSEC + currTime.tv_usec / UNIT_SEC_TO_MSEC) -\r
+                   (startTime_.tv_sec * UNIT_SEC_TO_MSEC + startTime_.tv_usec / UNIT_SEC_TO_MSEC);\r
+    return savedElapsedTime_ + elapsedTime_;\r
 }\r
 \r
 void StopwatchModel::ResetCounter()\r
 {\r
-    uiElapsedTime_ = 0;\r
-    uiSavedElapsedTime_ = 0;\r
+    elapsedTime_ = 0;\r
+    savedElapsedTime_ = 0;\r
     records_.Clear();\r
 }\r
 \r
-bool StopwatchModel::GetActiveState()\r
-{\r
-    return bIsActive_;\r
-}\r
-\r
-void StopwatchModel::SetActiveState()\r
+bool StopwatchModel::GetRunningState()\r
 {\r
-    bIsActive_ = true;\r
+    return isRunning_;\r
 }\r
 \r
-void StopwatchModel::SetInactiveState()\r
+void StopwatchModel::SetRunningState(bool isRunning)\r
 {\r
-    bIsActive_ = false;\r
+    isRunning_ = isRunning;\r
 }\r
 \r
 List<StopwatchItem> &StopwatchModel::GetRecordsList()\r
@@ -97,24 +93,23 @@ void StopwatchModel::AddRecordToList(const StopwatchItem &record)
     records_.PushFront(record);\r
 }\r
 \r
-bool StopwatchModel::IsInRecordView()\r
+bool StopwatchModel::GetRecordListVisible()\r
 {\r
-    return bIsRecordView_;\r
+    return isRecordListVisible_;\r
 }\r
 \r
-void StopwatchModel::SetRecordViewState(bool state)\r
+void StopwatchModel::SetRecordListVisible(bool isVisible)\r
 {\r
-    bIsRecordView_ = state;\r
+    isRecordListVisible_ = isVisible;\r
 }\r
 \r
-void StopwatchModel::ClearData()\r
+bool StopwatchModel::GetTimeOverRangeState()\r
 {\r
-    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "StopwatchModel::ClearData start");\r
-    uiElapsedTime_ = 0;\r
-    uiSavedElapsedTime_ = 0;\r
-    bIsActive_ = false;\r
-    bIsRecordView_ = false;\r
-    startTime_ = {0};\r
-    records_.Clear();\r
+    return isTimeOverRange_;\r
+}\r
+\r
+void StopwatchModel::SetTimeOverRangeState(bool isTimeOverRange)\r
+{\r
+    isTimeOverRange_ = isTimeOverRange;\r
 }\r
 }\r
index 0652df3..f7194f8 100644 (file)
@@ -1,43 +1,44 @@
 /*\r
- * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
  * Description: StopwatchPage\r
  * Create: 2025-06-06\r
  */\r
 \r
 #include <string>\r
 #include <sys/time.h>\r
-#include "stopwatch/StopwatchPage.h"\r
-#include "stopwatch/StopwatchView.h"\r
-#include "stopwatch/StopwatchPresenter.h"\r
-#include "stopwatch/StopwatchModel.h"\r
 #include "NativeAbility.h"\r
 #include "SlicePageFactory.h"\r
 #include "NativeRegisterManager.h"\r
 #include "UiConfig.h"\r
 #include "common/image_cache_manager.h"\r
-#include "ui_stopwatch_resource.h"\r
+#include "ui_resource_stopwatch.h"\r
 #include "main/LoadImg.h"\r
 #ifdef BUILD_IN_LINUX\r
 #include "localtime.h"\r
 #endif\r
+#include "stopwatch/StopwatchView.h"\r
+#include "stopwatch/StopwatchPresenter.h"\r
+#include "stopwatch/StopwatchModel.h"\r
+#include "stopwatch/StopwatchPage.h"\r
 \r
 namespace OHOS {\r
-static constexpr char *STOPWATCH_START = "stopwatch_start";\r
-static constexpr char *STOPWATCH_RESET = "stopwatch_reset";\r
-static constexpr uint16_t OFFSET = 4;\r
+static const char *STOPWATCH_APP_NAME = "秒表";\r
+static const char *STOPWATCH_START_PAUSE = "stopwatch_start_pause";    // 开始/暂停按钮\r
+static const char *STOPWATCH_RESET_RECORD = "stopwatch_reset_record";  // 重置/分段按钮\r
+static const char *STOPWATCH_RECORD_LIST = "stopwatch_record_list";\r
 static constexpr uint16_t NUM_TEN = 10;\r
 static constexpr uint16_t UNIT_SEC_TO_MSEC = 1000;\r
 static constexpr uint16_t UNIT_SECS_PER_MIN = 60;\r
 static constexpr uint16_t UNIT_SECS_PER_HOUR = 3600;\r
 static constexpr uint16_t MAX_RECORD_SIZE = 20;\r
-static constexpr uint16_t STOPWATCH_CONTAINER_XPOS = 0;\r
-static constexpr uint16_t STOPWATCH_CONTAINER_YPOS = 0;\r
 static constexpr uint16_t STOPWATCH_HAND_POSITION_XPOS = 224;\r
 static constexpr uint16_t STOPWATCH_HAND_POSITION_YPOS = 4;\r
 static constexpr uint16_t STOPWATCH_HAND_CENTER_XPOS = 3;\r
 static constexpr uint16_t STOPWATCH_HAND_CENTER_YPOS = 223;\r
 static constexpr uint16_t STOPWATCH_HAND_WIDTH = 2;\r
 static constexpr uint16_t STOPWATCH_HAND_HEIGHT = 5;\r
+static constexpr uint16_t STOPWATCH_IMAGE_SCALE_XPOS = 4;\r
+static constexpr uint16_t STOPWATCH_IMAGE_SCALE_YPOS = 4;\r
 static constexpr uint16_t STOPWATCH_LABEL_CURTIME_XPOS = 199;\r
 static constexpr uint16_t STOPWATCH_LABEL_CURTIME_YPOS = 54;\r
 static constexpr uint16_t STOPWATCH_LABEL_CURTIME_WIDTH = 67;\r
@@ -48,12 +49,13 @@ static constexpr uint16_t STOPWATCH_LABEL_APPNAME_YPOS = 82;
 static constexpr uint16_t STOPWATCH_LABEL_APPNAME_WIDTH = 64;\r
 static constexpr uint16_t STOPWATCH_LABEL_APPNAME_HEIGHT = 38;\r
 static constexpr uint16_t STOPWATCH_LABEL_APPNAME_FONT_SIZE = 32;\r
-static constexpr uint16_t STOPWATCH_LABEL_ELSTIME_XPOS = 87;\r
+static constexpr uint16_t STOPWATCH_LABEL_ELSTIME_XPOS = 78;\r
 static constexpr uint16_t STOPWATCH_LABEL_ELSTIME_YPOS1 = 176;\r
 static constexpr uint16_t STOPWATCH_LABEL_ELSTIME_YPOS2 = 82;\r
 static constexpr uint16_t STOPWATCH_LABEL_ELSTIME_WIDTH = 302;\r
 static constexpr uint16_t STOPWATCH_LABEL_ELSTIME_HEIGHT = 90;\r
 static constexpr uint16_t STOPWATCH_LABEL_ELSTIME_FONT_SIZE = 72;\r
+static constexpr uint16_t STOPWATCH_LABEL_ELSTIME_FONT_OPA = 76;\r
 static constexpr uint16_t STOPWATCH_BUTTON_SRART_XPOS = 250;\r
 static constexpr uint16_t STOPWATCH_BUTTON_SRART_YPOS = 302;\r
 static constexpr uint16_t STOPWATCH_BUTTON_PAUSE_XPOS = 110;\r
@@ -64,7 +66,9 @@ static constexpr uint16_t STOPWATCH_LIST_RECORD_XPOS = 73;
 static constexpr uint16_t STOPWATCH_LIST_RECORD_YPOS = 170;\r
 static constexpr uint16_t STOPWATCH_LIST_RECORD_WIDTH = 312;\r
 static constexpr uint16_t STOPWATCH_LIST_RECORD_HEIGHT = 122;\r
-static constexpr uint16_t STOPWATCH_LABEL_REBOUND_SIZE = 60;\r
+static constexpr uint16_t STOPWATCH_LIST_REBOUND_SIZE = 60;\r
+static constexpr uint16_t STOPWATCH_LIST_ITEM_WIDTH = 312;\r
+static constexpr uint16_t STOPWATCH_LIST_ITEM_HEIGHT = 60;\r
 \r
 REGIST_SLICE_PAGE(VIEW_STOPWATCH, STOPWATCH_PAGES::STOPWATCH_MAIN_PAGE, StopwatchPage, true);\r
 \r
@@ -128,17 +132,42 @@ static std::string FormatElapsedTime(uint64_t uiElapsedTime)
     return strElapsedTime;\r
 }\r
 \r
+static UIView *CreateViewCb(uint8_t type)\r
+{\r
+    StopwatchItemView *item = new StopwatchItemView();\r
+    if (item == nullptr) {\r
+        return nullptr;\r
+    }\r
+    item->SetPosition(0, 0, STOPWATCH_LIST_ITEM_WIDTH, STOPWATCH_LIST_ITEM_HEIGHT);\r
+    item->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+    item->SetTouchable(true);\r
+    return item;\r
+}\r
+\r
+static void UpdateViewCb(UIView *view, void *data, uint8_t type)\r
+{\r
+    if (view == nullptr || data == nullptr) {\r
+        return;\r
+    }\r
+    StopwatchItemView *item = dynamic_cast<StopwatchItemView *>(view);\r
+    if (item == nullptr) {\r
+        return;\r
+    }\r
+    StopwatchItem *itemInfo = static_cast<StopwatchItem *>(data);\r
+    item->SetItemInfo(*itemInfo);\r
+}\r
+\r
 void StopwatchPage::StopwatchAnimatorCallback::Callback(UIView *view)\r
 {\r
     UNUSED(view);\r
     uint64_t uiElapsedTime = StopwatchModel::GetInstance().UpdateElapsedTime();\r
     uint64_t millisecs = GetMilliSeconds(uiElapsedTime);\r
-    stopwatchPage->GetSweepClock()->SetSweepTime24Hour(0, 0, millisecs);\r
-    stopwatchPage->GetSweepClock()->Invalidate();\r
+    page_->sweepClock_->SetSweepTime24Hour(0, 0, millisecs);\r
+    page_->sweepClock_->Invalidate();\r
     std::string strElapsedTime = FormatElapsedTime(uiElapsedTime);\r
-    stopwatchPage->GetElapsedTimeLabel()->SetText(strElapsedTime.c_str());\r
+    page_->elapsedTime_->SetText(strElapsedTime.c_str());\r
     if (uiElapsedTime >= UNIT_SECS_PER_HOUR * UNIT_SEC_TO_MSEC) {\r
-        stopwatchPage->Overflowing();\r
+        page_->TimeOverRange();\r
     }\r
 }\r
 \r
@@ -160,10 +189,9 @@ StopwatchPage::StopwatchPage()
 \r
 StopwatchPage::~StopwatchPage()\r
 {\r
-    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "StopwatchPage::~StopwatchPage");\r
-    bool ret = ImageCacheManager::GetInstance().UnloadAllInMultiRes(PNG_APPLIST_STOPWATCH_IMAGE);\r
+    bool ret = ImageCacheManager::GetInstance().UnloadAllInMultiRes(STOPWATCH_IMAGE);\r
     if (ret == false) {\r
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "UnloadStopwatchImage fail");\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "StopwatchPage UnloadStopwatchImage fail");\r
     }\r
     if (sweepClock_ != nullptr) {\r
         sweepClock_->RemoveAll();\r
@@ -194,10 +222,6 @@ StopwatchPage::~StopwatchPage()
         delete recordsList_;\r
         recordsList_ = nullptr;\r
     }\r
-    if (listAdapter_ != nullptr) {\r
-        delete listAdapter_;\r
-        listAdapter_ = nullptr;\r
-    }\r
     if (backGround_ != nullptr) {\r
         delete backGround_;\r
         backGround_ = nullptr;\r
@@ -210,13 +234,13 @@ StopwatchPage::~StopwatchPage()
         delete secondHand_;\r
         secondHand_ = nullptr;\r
     }\r
-    if (animator_ != nullptr) {\r
-        delete animator_;\r
-        animator_ = nullptr;\r
+    if (stopwatchAnimator_ != nullptr) {\r
+        delete stopwatchAnimator_;\r
+        stopwatchAnimator_ = nullptr;\r
     }\r
-    if (animatorCallback_ != nullptr) {\r
-        delete animatorCallback_;\r
-        animatorCallback_ = nullptr;\r
+    if (stopwatchAnimatorCallback_ != nullptr) {\r
+        delete stopwatchAnimatorCallback_;\r
+        stopwatchAnimatorCallback_ = nullptr;\r
     }\r
     if (timeAnimator_ != nullptr) {\r
         delete timeAnimator_;\r
@@ -226,39 +250,34 @@ StopwatchPage::~StopwatchPage()
         delete timeCallback_;\r
         timeCallback_ = nullptr;\r
     }\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "StopwatchPage::~StopwatchPage");\r
 }\r
 \r
 void StopwatchPage::OnStart(void *data)\r
 {\r
-    bool ret = ImageCacheManager::GetInstance().LoadAllInMultiRes(PNG_APPLIST_STOPWATCH_IMAGE);\r
+    bool ret = ImageCacheManager::GetInstance().LoadAllInMultiRes(STOPWATCH_IMAGE);\r
     if (ret == false) {\r
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "LoadStopwatchImage fail");\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "StopwatchPage LoadStopwatchImage fail");\r
         return;\r
     }\r
 \r
     sweepClock_ = new UISweepClock();\r
     if (sweepClock_ == nullptr) {\r
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "UISweepClock new fail");\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "StopwatchPage sweepClock_ new fail");\r
         return;\r
     }\r
-    sweepClock_->SetPosition(STOPWATCH_CONTAINER_XPOS, STOPWATCH_CONTAINER_YPOS);\r
+    sweepClock_->SetPosition(0, 0);\r
     sweepClock_->Resize(HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);\r
     sweepClock_->SetDraggable(true);\r
     sweepClock_->SetTouchable(true);\r
+    sweepClock_->SetOnDragListener(this);\r
 \r
     secondHand_ = new Image();\r
     if (secondHand_ == nullptr) {\r
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "secondHand new fail");\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "StopwatchPage secondHand_ new fail");\r
         return;\r
     }\r
-    ImageInfo *second =\r
-        ImageCacheManager::GetInstance().LoadOneInMultiRes(IMAGE_STOPWATCH_STOPWATCH02, PNG_APPLIST_STOPWATCH_IMAGE);\r
-\r
-    if (second == nullptr) {\r
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "StopwatchPage::OnStart source fail");\r
-        return;\r
-    }\r
-    secondHand_->SetSrc(second);\r
+    LOADIMG::LoadImageImg(secondHand_, STOPWATCH_IMAGE, IMAGE_STOPWATCH_HAND);\r
     sweepClock_->SetHandImage(UISweepClock::HandType::SECOND_HAND, *secondHand_,\r
                               {STOPWATCH_HAND_POSITION_XPOS, STOPWATCH_HAND_POSITION_YPOS},\r
                               {STOPWATCH_HAND_CENTER_XPOS, STOPWATCH_HAND_CENTER_YPOS});\r
@@ -270,7 +289,6 @@ void StopwatchPage::OnStart(void *data)
                              {STOPWATCH_HAND_POSITION_XPOS, STOPWATCH_HAND_POSITION_YPOS},\r
                              {STOPWATCH_HAND_CENTER_XPOS, STOPWATCH_HAND_CENTER_YPOS}, Color::White(),\r
                              STOPWATCH_HAND_WIDTH, STOPWATCH_HAND_HEIGHT, OPA_TRANSPARENT);\r
-\r
     sweepClock_->SetWorkMode(UISweepClock::WorkMode::NORMAL);\r
     uint64_t uiElapsedTime = StopwatchModel::GetInstance().GetElapsedTime();\r
     uint64_t millisecs = GetMilliSeconds(uiElapsedTime);\r
@@ -278,25 +296,25 @@ void StopwatchPage::OnStart(void *data)
 \r
     backGround_ = new UIImageView();\r
     if (backGround_ == nullptr) {\r
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "backGroundFirst new fail");\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "StopwatchPage backGround_ new fail");\r
         return;\r
     }\r
     backGround_->SetPosition(0, 0);\r
-    LOADIMG::LoadImageViewImg(backGround_, PNG_APPLIST_STOPWATCH_IMAGE, IMAGE_STOPWATCH_STOPWATCH06);\r
+    LOADIMG::LoadImageViewImg(backGround_, STOPWATCH_IMAGE, IMAGE_STOPWATCH_BG);\r
     sweepClock_->Add(backGround_);\r
 \r
     imgScale_ = new UIImageView();\r
     if (imgScale_ == nullptr) {\r
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "backGroundFirst new fail");\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "StopwatchPage imgScale_ new fail");\r
         return;\r
     }\r
-    imgScale_->SetPosition(OFFSET, OFFSET);\r
-    LOADIMG::LoadImageViewImg(imgScale_, PNG_APPLIST_STOPWATCH_IMAGE, IMAGE_STOPWATCH_STOPWATCH04);\r
+    imgScale_->SetPosition(STOPWATCH_IMAGE_SCALE_XPOS, STOPWATCH_IMAGE_SCALE_YPOS);\r
+    LOADIMG::LoadImageViewImg(imgScale_, STOPWATCH_IMAGE, IMAGE_STOPWATCH_SCALE);\r
     sweepClock_->Add(imgScale_);\r
 \r
     currentTime_ = new UILabel();\r
     if (currentTime_ == nullptr) {\r
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "StopwatchPage::SetupCurrentTime new Label currentTime_ fail");\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "StopwatchPage currentTime_ new fail");\r
         return;\r
     }\r
     currentTime_->SetPosition(STOPWATCH_LABEL_CURTIME_XPOS, STOPWATCH_LABEL_CURTIME_YPOS);\r
@@ -304,12 +322,11 @@ void StopwatchPage::OnStart(void *data)
     currentTime_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, STOPWATCH_LABEL_CURTIME_FONT_SIZE);\r
     currentTime_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
     currentTime_->SetLineBreakMode(UILabel::LINE_BREAK_ADAPT);\r
-    currentTime_->SetVisible(true);\r
     sweepClock_->Add(currentTime_);\r
 \r
     appName_ = new UILabel();\r
     if (appName_ == nullptr) {\r
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "StopwatchPage::SetupAppName new Label appName_ fail");\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "StopwatchPage appName_ new fail");\r
         return;\r
     }\r
     appName_->SetPosition(STOPWATCH_LABEL_APPNAME_XPOS, STOPWATCH_LABEL_APPNAME_YPOS);\r
@@ -317,34 +334,33 @@ void StopwatchPage::OnStart(void *data)
     appName_->SetText(STOPWATCH_APP_NAME);\r
     appName_->SetLineBreakMode(UILabel::LINE_BREAK_ADAPT);\r
     appName_->SetTextColor(Color::White());\r
-    appName_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, STOPWATCH_LABEL_APPNAME_FONT_SIZE);\r
+    appName_->SetFont(BOLD_VECTOR_FONT_FILENAME, STOPWATCH_LABEL_APPNAME_FONT_SIZE);\r
     appName_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
     appName_->SetVisible(true);\r
     sweepClock_->Add(appName_);\r
 \r
     elapsedTime_ = new UILabel();\r
     if (elapsedTime_ == nullptr) {\r
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "StopwatchPage::SetupElapsedTime new Label elapsedTime_ fail");\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "StopwatchPage elapsedTime_ new fail");\r
         return;\r
     }\r
     elapsedTime_->SetPosition(STOPWATCH_LABEL_ELSTIME_XPOS, STOPWATCH_LABEL_ELSTIME_YPOS1);\r
     elapsedTime_->Resize(STOPWATCH_LABEL_ELSTIME_WIDTH, STOPWATCH_LABEL_ELSTIME_HEIGHT);\r
     elapsedTime_->SetLineBreakMode(UILabel::LINE_BREAK_ADAPT);\r
-    elapsedTime_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, STOPWATCH_LABEL_ELSTIME_FONT_SIZE);\r
+    elapsedTime_->SetFont(BOLD_VECTOR_FONT_FILENAME, STOPWATCH_LABEL_ELSTIME_FONT_SIZE);\r
     elapsedTime_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
-    elapsedTime_->SetVisible(true);\r
     std::string strElapsedTime = FormatElapsedTime(uiElapsedTime);\r
     elapsedTime_->SetText(strElapsedTime.c_str());\r
     sweepClock_->Add(elapsedTime_);\r
 \r
     startButton_ = new UILabelButton();\r
     if (startButton_ == nullptr) {\r
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "StopwatchPage::SetupButton new UILabelButton startButton_ fail");\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "StopwatchPage startButton_ new fail");\r
         return;\r
     }\r
     startButton_->SetPosition(STOPWATCH_BUTTON_SRART_XPOS, STOPWATCH_BUTTON_SRART_YPOS);\r
     startButton_->Resize(STOPWATCH_BUTTON_WIDTH, STOPWATCH_BUTTON_HEIGHT);\r
-    startButton_->SetViewId(STOPWATCH_START);\r
+    startButton_->SetViewId(STOPWATCH_START_PAUSE);\r
     startButton_->SetStyleForState(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT, UIButton::RELEASED);\r
     startButton_->SetStyleForState(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT, UIButton::PRESSED);\r
     startButton_->SetStyleForState(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT, UIButton::INACTIVE);\r
@@ -353,85 +369,78 @@ void StopwatchPage::OnStart(void *data)
 \r
     resetButton_ = new UILabelButton();\r
     if (resetButton_ == nullptr) {\r
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "StopwatchPage::SetupButton new UILabelButton resetButton_ fail");\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "StopwatchPage resetButton_ new fail");\r
         return;\r
     }\r
     resetButton_->SetPosition(STOPWATCH_BUTTON_PAUSE_XPOS, STOPWATCH_BUTTON_PAUSE_YPOS);\r
     resetButton_->Resize(STOPWATCH_BUTTON_WIDTH, STOPWATCH_BUTTON_HEIGHT);\r
-    resetButton_->SetViewId(STOPWATCH_RESET);\r
+    resetButton_->SetViewId(STOPWATCH_RESET_RECORD);\r
     resetButton_->SetStyleForState(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT, UIButton::RELEASED);\r
     resetButton_->SetStyleForState(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT, UIButton::PRESSED);\r
     resetButton_->SetStyleForState(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT, UIButton::INACTIVE);\r
     resetButton_->SetOnClickListener(this);\r
     sweepClock_->Add(resetButton_);\r
 \r
-    listAdapter_ = new StopwatchAdapter();\r
-    if (listAdapter_ == nullptr) {\r
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,\r
-                      "StopwatchPage::SetupRecordsList new StopwatchAdapter listAdapter_ fail");\r
-        return;\r
-    }\r
-    recordsList_ = new UIList();\r
+    recordsList_ = new UISimpleList();\r
     if (recordsList_ == nullptr) {\r
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "StopwatchPage::SetupRecordsList new UIList recordsList_ fail");\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "StopwatchPage recordsList_ new fail");\r
         return;\r
     }\r
     recordsList_->SetPosition(STOPWATCH_LIST_RECORD_XPOS, STOPWATCH_LIST_RECORD_YPOS);\r
     recordsList_->Resize(STOPWATCH_LIST_RECORD_WIDTH, STOPWATCH_LIST_RECORD_HEIGHT);\r
+    recordsList_->SetViewId(STOPWATCH_RECORD_LIST);\r
     recordsList_->SetThrowDrag(true);\r
     recordsList_->SetDraggable(true);\r
-    recordsList_->SetReboundSize(STOPWATCH_LABEL_REBOUND_SIZE);\r
+    recordsList_->SetReboundSize(STOPWATCH_LIST_REBOUND_SIZE);\r
     recordsList_->EnableAutoAlign(true);\r
     recordsList_->SetElastic(true);\r
     recordsList_->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
-    recordsList_->SetAdapter(listAdapter_);\r
+    recordsList_->SetOnClickListener(this);\r
     recordsList_->SetVisible(false);\r
     sweepClock_->Add(recordsList_);\r
 \r
-    animatorCallback_ = new StopwatchAnimatorCallback(this);\r
-    if (animatorCallback_ == nullptr) {\r
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "callBack new fail\n");\r
+    AddViewToPageContainer(sweepClock_);\r
+\r
+    stopwatchAnimatorCallback_ = new StopwatchAnimatorCallback(this);\r
+    if (stopwatchAnimatorCallback_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "StopwatchPage stopwatchAnimatorCallback_ new fail");\r
         return;\r
     }\r
 \r
-    animator_ = new Animator(animatorCallback_, nullptr, 0, true);\r
-    if (animator_ == nullptr) {\r
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "StopwatchPage::InitView new Animator animator_ fail");\r
+    stopwatchAnimator_ = new Animator(stopwatchAnimatorCallback_, nullptr, 0, true);\r
+    if (stopwatchAnimator_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "StopwatchPage stopwatchAnimator_ new fail");\r
         return;\r
     }\r
 \r
     timeCallback_ = new TimeAnimatorCallback();\r
     if (timeCallback_ == nullptr) {\r
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "callBack new fail\n");\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "StopwatchPage timeCallback_ new fail");\r
         return;\r
     }\r
 \r
     timeAnimator_ = new Animator(timeCallback_, currentTime_, 0, true);\r
     if (timeAnimator_ == nullptr) {\r
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "StopwatchPage::InitView new Animator timeAnimator_ fail");\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "StopwatchPage timeAnimator_ new fail");\r
         return;\r
     }\r
-    timeAnimator_->Start();\r
 \r
-    sweepClock_->SetOnDragListener(this);\r
-    AddViewToPageContainer(sweepClock_);\r
-\r
-    bool isActive = StopwatchModel::GetInstance().GetActiveState();\r
-    DrawButtonStatusView(isActive);\r
-    bool state = StopwatchModel::GetInstance().IsInRecordView();\r
-    if (StopwatchModel::GetInstance().GetOverflowState()) {\r
-        state = false;\r
+    bool isRunning = StopwatchModel::GetInstance().GetRunningState();\r
+    DrawButtonStatusView(isRunning);\r
+    bool isVisible = StopwatchModel::GetInstance().GetRecordListVisible();\r
+    if (StopwatchModel::GetInstance().GetTimeOverRangeState()) {\r
+        isVisible = false;\r
     }\r
-    DrawContainRecordListView(state);\r
+    DrawRecordListVisibleView(isVisible);\r
 }\r
 \r
 void StopwatchPage::OnStop() {}\r
 \r
 void StopwatchPage::OnPause()\r
 {\r
-    if (animator_ != nullptr) {\r
-        if (animator_->GetState() != Animator::STOP) {\r
-            animator_->Stop();\r
+    if (stopwatchAnimator_ != nullptr) {\r
+        if (stopwatchAnimator_->GetState() != Animator::STOP) {\r
+            stopwatchAnimator_->Stop();\r
         }\r
     }\r
     if (timeAnimator_ != nullptr) {\r
@@ -443,10 +452,10 @@ void StopwatchPage::OnPause()
 \r
 void StopwatchPage::OnResume()\r
 {\r
-    if (animator_ != nullptr) {\r
-        bool isActive = StopwatchModel::GetInstance().GetActiveState();\r
-        if (isActive && animator_->GetState() == Animator::STOP) {\r
-            animator_->Start();\r
+    if (stopwatchAnimator_ != nullptr) {\r
+        bool isRunning = StopwatchModel::GetInstance().GetRunningState();\r
+        if (isRunning && stopwatchAnimator_->GetState() == Animator::STOP) {\r
+            stopwatchAnimator_->Start();\r
         }\r
     }\r
     if (timeAnimator_ != nullptr) {\r
@@ -456,45 +465,42 @@ void StopwatchPage::OnResume()
     }\r
 }\r
 \r
-void StopwatchPage::DrawButtonStatusView(bool isActive)\r
+void StopwatchPage::DrawButtonStatusView(bool isRunning)\r
 {\r
-    if (isActive) {\r
-        LOADIMG::LoadBtnImage(startButton_, PNG_APPLIST_STOPWATCH_IMAGE, IMAGE_STOPWATCH_STOPWATCH08,\r
-                              IMAGE_STOPWATCH_STOPWATCH08);\r
+    elapsedTime_->SetStyle(STYLE_TEXT_OPA, OPA_OPAQUE);\r
+    if (isRunning) {\r
+        LOADIMG::LoadBtnImage(startButton_, STOPWATCH_IMAGE, IMAGE_STOPWATCH_PAUSE, IMAGE_STOPWATCH_PAUSE);\r
         startButton_->Invalidate();\r
 \r
         resetButton_->Enable();\r
-        LOADIMG::LoadBtnImage(resetButton_, PNG_APPLIST_STOPWATCH_IMAGE, IMAGE_STOPWATCH_STOPWATCH14,\r
-                              IMAGE_STOPWATCH_STOPWATCH14);\r
+        LOADIMG::LoadBtnImage(resetButton_, STOPWATCH_IMAGE, IMAGE_STOPWATCH_RECORD, IMAGE_STOPWATCH_RECORD);\r
         auto &recordList = StopwatchModel::GetInstance().GetRecordsList();\r
         if (recordList.Size() >= MAX_RECORD_SIZE) {\r
             resetButton_->Disable();\r
-            LOADIMG::LoadBtnImage(resetButton_, PNG_APPLIST_STOPWATCH_IMAGE, IMAGE_STOPWATCH_STOPWATCH20,\r
-                                  IMAGE_STOPWATCH_STOPWATCH20);\r
+            LOADIMG::LoadBtnImage(resetButton_, STOPWATCH_IMAGE, IMAGE_STOPWATCH_RECORD_DISABLE,\r
+                                  IMAGE_STOPWATCH_RECORD_DISABLE);\r
         }\r
         resetButton_->Invalidate();\r
     } else {\r
-        LOADIMG::LoadBtnImage(startButton_, PNG_APPLIST_STOPWATCH_IMAGE, IMAGE_STOPWATCH_STOPWATCH12,\r
-                              IMAGE_STOPWATCH_STOPWATCH12);\r
+        LOADIMG::LoadBtnImage(startButton_, STOPWATCH_IMAGE, IMAGE_STOPWATCH_START, IMAGE_STOPWATCH_START);\r
         startButton_->Invalidate();\r
 \r
         resetButton_->Enable();\r
-        // 复位\r
-        LOADIMG::LoadBtnImage(resetButton_, PNG_APPLIST_STOPWATCH_IMAGE, IMAGE_STOPWATCH_STOPWATCH19,\r
-                              IMAGE_STOPWATCH_STOPWATCH19);\r
+        LOADIMG::LoadBtnImage(resetButton_, STOPWATCH_IMAGE, IMAGE_STOPWATCH_RESET, IMAGE_STOPWATCH_RESET);\r
         uint64_t elapsedTime = StopwatchModel::GetInstance().GetElapsedTime();\r
         if (elapsedTime == 0) {\r
             resetButton_->Disable();\r
-            LOADIMG::LoadBtnImage(resetButton_, PNG_APPLIST_STOPWATCH_IMAGE, IMAGE_STOPWATCH_STOPWATCH10,\r
-                                  IMAGE_STOPWATCH_STOPWATCH10);\r
+            LOADIMG::LoadBtnImage(resetButton_, STOPWATCH_IMAGE, IMAGE_STOPWATCH_RESET_DISABLE,\r
+                                  IMAGE_STOPWATCH_RESET_DISABLE);\r
+            elapsedTime_->SetStyle(STYLE_TEXT_OPA, STOPWATCH_LABEL_ELSTIME_FONT_OPA);\r
         }\r
         resetButton_->Invalidate();\r
     }\r
 }\r
 \r
-void StopwatchPage::DrawContainRecordListView(bool isContainRecordList)\r
+void StopwatchPage::DrawRecordListVisibleView(bool isRecordListVisible)\r
 {\r
-    if (isContainRecordList) {\r
+    if (isRecordListVisible) {\r
         appName_->SetVisible(false);\r
         recordsList_->SetVisible(true);\r
         elapsedTime_->SetPosition(STOPWATCH_LABEL_ELSTIME_XPOS, STOPWATCH_LABEL_ELSTIME_YPOS2);\r
@@ -509,80 +515,87 @@ void StopwatchPage::DrawContainRecordListView(bool isContainRecordList)
 void StopwatchPage::RefreshRecordsList()\r
 {\r
     auto &records = StopwatchModel::GetInstance().GetRecordsList();\r
-    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "StopwatchPage::RefreshRecordsList");\r
-    listAdapter_->SetData(records);\r
+    recordsList_->ClearAll();\r
+    ListNode<StopwatchItem> *node = records.Head();\r
+    while (node != records.End()) {\r
+        Contents content;\r
+        content.createFunc = CreateViewCb;\r
+        content.updateFunc = UpdateViewCb;\r
+        content.type = 0;\r
+        StopwatchItem &itemData = node->data_;\r
+        content.data = reinterpret_cast<void *>(&itemData);\r
+        recordsList_->AddContent(content);\r
+        node = node->next_;\r
+    }\r
     recordsList_->RefreshList();\r
 }\r
 \r
 bool StopwatchPage::OnClick(UIView &view, const ClickEvent &event)\r
 {\r
     UNUSED(event);\r
-    bool isActive = StopwatchModel::GetInstance().GetActiveState();\r
-    if (strcmp(view.GetViewId(), STOPWATCH_START) == 0) {\r
-        if (isActive) {\r
-            WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "StopwatchPresenter::OnClick activeState = %d, pause counting click",\r
-                          isActive);\r
-            StopwatchModel::GetInstance().SetInactiveState();\r
+    bool isRunning = StopwatchModel::GetInstance().GetRunningState();\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "StopwatchPage::OnClick RunningState = %d", isRunning);\r
+    if (strcmp(view.GetViewId(), STOPWATCH_START_PAUSE) == 0) {\r
+        if (isRunning) {\r
+            StopwatchModel::GetInstance().SetRunningState(false);\r
             DrawButtonStatusView(false);\r
-            animator_->Stop();\r
+            stopwatchAnimator_->Stop();\r
             StopwatchModel::GetInstance().SaveElapsedTime();\r
         } else {\r
-            WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "StopwatchPresenter::OnClick activeState = %d, start counting click",\r
-                          isActive);\r
-            StopwatchModel::GetInstance().SetActiveState();\r
-            if (StopwatchModel::GetInstance().GetOverflowState()) {\r
-                DrawContainRecordListView(false);\r
-                StopwatchModel::GetInstance().SetOverflowState(false);\r
+            StopwatchModel::GetInstance().SetRunningState(true);\r
+            if (StopwatchModel::GetInstance().GetTimeOverRangeState()) {\r
+                DrawRecordListVisibleView(false);\r
+                StopwatchModel::GetInstance().SetTimeOverRangeState(false);\r
             }\r
             DrawButtonStatusView(true);\r
             StopwatchModel::GetInstance().SetStartTime();\r
-            animator_->Start();\r
+            stopwatchAnimator_->Start();\r
         }\r
-    } else if (strcmp(view.GetViewId(), STOPWATCH_RESET) == 0) {\r
-        if (isActive) {\r
-            StopwatchModel::GetInstance().SetRecordViewState(true);\r
+    } else if (strcmp(view.GetViewId(), STOPWATCH_RESET_RECORD) == 0) {\r
+        if (isRunning) {\r
+            StopwatchModel::GetInstance().SetRecordListVisible(true);\r
             uint64_t uiElapsedTime = StopwatchModel::GetInstance().GetElapsedTime();\r
             std::string strElapsedTime = FormatElapsedTime(uiElapsedTime);\r
-            StopwatchItem item = {strElapsedTime, true};\r
+            auto &recordList = StopwatchModel::GetInstance().GetRecordsList();\r
+            StopwatchItem item = {recordList.Size() + 1, strElapsedTime, true};\r
             StopwatchModel::GetInstance().AddRecordToList(item);\r
-            DrawContainRecordListView(true);\r
+            DrawRecordListVisibleView(true);\r
             DrawButtonStatusView(true);\r
-            WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "StopwatchPresenter::OnClick save a record");\r
         } else {\r
-            StopwatchModel::GetInstance().SetRecordViewState(false);\r
+            StopwatchModel::GetInstance().SetRecordListVisible(false);\r
             StopwatchModel::GetInstance().ResetCounter();\r
             elapsedTime_->SetText("00:00.00");\r
             sweepClock_->SetInitTime24Hour(0, 0, 0);\r
             sweepClock_->Invalidate();\r
-            DrawContainRecordListView(false);\r
+            DrawRecordListVisibleView(false);\r
             DrawButtonStatusView(false);\r
-            WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "StopwatchPresenter::OnClick reset a record");\r
         }\r
+    } else if (strcmp(view.GetViewId(), STOPWATCH_RECORD_LIST) == 0) {\r
+        NativeAbility::GetInstance().SwitchPageInSlice(STOPWATCH_PAGES::STOPWATCH_RECORD_PAGE,\r
+            TransitionType::TRANSITION_INVALID, false);\r
     }\r
     return true;\r
 }\r
 \r
 bool StopwatchPage::OnDrag(UIView &view, const DragEvent &event)\r
 {\r
-    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "StopwatchOnDragListener::OnDrag");\r
     UNUSED(view);\r
     if ((event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT) && (event.GetDeltaX() > X_DRAG_OFFSET) &&\r
         (event.GetDeltaX() > (DOUBLES * MATH_ABS(event.GetDeltaY())))) {\r
-        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "StopwatchOnDragListener::OnDrag ChangeSlice(VIEW_APPLIST)");\r
-        NativeAbility::GetInstance().ChangeSlice(VIEW_APPLIST);\r
+        NativeAbility::GetInstance().ChangeSliceToApplist();\r
     }\r
     return true;\r
 }\r
 \r
-void StopwatchPage::Overflowing()\r
+void StopwatchPage::TimeOverRange()\r
 {\r
-    animator_->Stop();\r
+    stopwatchAnimator_->Stop();\r
     elapsedTime_->SetText("59:59.99");\r
     sweepClock_->SetSweepTime24Hour(0, 0, 0);\r
     sweepClock_->Invalidate();\r
-    StopwatchModel::GetInstance().SetInactiveState();\r
+    StopwatchModel::GetInstance().SetRunningState(false);\r
     DrawButtonStatusView(false);\r
     StopwatchModel::GetInstance().ResetCounter();\r
-    StopwatchModel::GetInstance().SetOverflowState(true);\r
+    StopwatchModel::GetInstance().SetTimeOverRangeState(true);\r
 }\r
 }\r
index 90fcfe2..b2a30de 100644 (file)
@@ -1,14 +1,14 @@
 /*\r
- * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
  * Description: StopwatchPresenter\r
  * Create: 2025-06-06\r
  */\r
+\r
+#include "NativeRegisterManager.h"\r
 #include "stopwatch/StopwatchView.h"\r
 #include "stopwatch/StopwatchPresenter.h"\r
-#include "NativeRegisterManager.h"\r
 \r
 namespace OHOS {\r
 \r
-REGIST_MENU(VIEW_STOPWATCH, StopwatchView, StopwatchPresenter, PNG_APPLIST_STOPWATCH_LOGO, PNG_APPLIST_DEFAULT_IMG,\r
-            "秒表");\r
+REGIST_MENU(VIEW_STOPWATCH, StopwatchView, StopwatchPresenter, STOPWATCH_ICON, STOPWATCH_ICON, "秒表");\r
 }
\ No newline at end of file
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/stopwatch/src/StopwatchRecordPage.cpp b/code/sdk/application/wearable/evb/nativeapp/nativeui/stopwatch/src/StopwatchRecordPage.cpp
new file mode 100644 (file)
index 0000000..1a4d428
--- /dev/null
@@ -0,0 +1,170 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: StopwatchRecordPage\r
+ * Create: 2025-06-06\r
+ */\r
+\r
+#include "UiConfig.h"\r
+#include "main/LoadImg.h"\r
+#include "wearable_log.h"\r
+#include "AppViewIDs.h"\r
+#include "NativeAbility.h"\r
+#include "SlicePageFactory.h"\r
+#include "stopwatch/StopwatchView.h"\r
+#include "stopwatch/StopwatchRecordPage.h"\r
+\r
+namespace OHOS {\r
+static constexpr uint16_t LABEL_X = 100;\r
+static constexpr uint16_t LABEL_Y = 38;\r
+static constexpr uint16_t LABEL_W = 253;\r
+static constexpr uint16_t LABEL_H = 53;\r
+static constexpr uint16_t LABEL_FONT = 38;\r
+static constexpr uint16_t LIST_X = 73;\r
+static constexpr uint16_t LIST_Y = 100;\r
+static constexpr uint16_t LIST_W = 312;\r
+static constexpr uint16_t LIST_H = 364;\r
+static constexpr uint16_t LIST_ITEM_WIDTH = 312;\r
+static constexpr uint16_t LIST_ITEM_HEIGHT = 60;\r
+static constexpr uint16_t LIST_REBOUND_SIZE = 60;\r
+static constexpr uint16_t LIST_BLANK_SIZE = 80;\r
+\r
+REGIST_SLICE_PAGE(VIEW_STOPWATCH, STOPWATCH_PAGES::STOPWATCH_RECORD_PAGE, StopwatchRecordPage, false);\r
+\r
+static UIView *CreateViewCb(uint8_t type)\r
+{\r
+    StopwatchItemView *item = new StopwatchItemView();\r
+    if (item == nullptr) {\r
+        return nullptr;\r
+    }\r
+    item->SetPosition(0, 0, LIST_ITEM_WIDTH, LIST_ITEM_HEIGHT);\r
+    item->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+    item->SetTouchable(true);\r
+    return item;\r
+}\r
+\r
+static void UpdateViewCb(UIView *view, void *data, uint8_t type)\r
+{\r
+    if (view == nullptr || data == nullptr) {\r
+        return;\r
+    }\r
+    StopwatchItemView *item = dynamic_cast<StopwatchItemView *>(view);\r
+    if (item == nullptr) {\r
+        return;\r
+    }\r
+    StopwatchItem *itemInfo = static_cast<StopwatchItem *>(data);\r
+    item->SetItemInfo(*itemInfo);\r
+}\r
+\r
+StopwatchRecordPage::~StopwatchRecordPage()\r
+{\r
+    if (group_ != nullptr) {\r
+        group_->RemoveAll();\r
+        delete group_;\r
+        group_ = nullptr;\r
+    }\r
+    if (background_ != nullptr) {\r
+        delete background_;\r
+        background_ = nullptr;\r
+    }\r
+    if (titleLabel_ != nullptr) {\r
+        delete titleLabel_;\r
+        titleLabel_ = nullptr;\r
+    }\r
+    if (recordList_ != nullptr) {\r
+        delete recordList_;\r
+        recordList_ = nullptr;\r
+    }\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "StopwatchRecordPage::~StopwatchRecordPage");\r
+}\r
+\r
+void StopwatchRecordPage::InitBackgroundView()\r
+{\r
+    background_ = new UIImageView();\r
+    if (background_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "StopwatchRecordPage background_ new fail");\r
+        return;\r
+    }\r
+    background_->SetPosition(0, 0);\r
+    LOADIMG::LoadImageViewImg(background_, STOPWATCH_IMAGE, IMAGE_STOPWATCH_BG);\r
+    group_->Add(background_);\r
+}\r
+\r
+void StopwatchRecordPage::CreateUILabel()\r
+{\r
+    titleLabel_ = new UILabel();\r
+    if (titleLabel_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "StopwatchRecordPage titleLabel_ new fail");\r
+        return;\r
+    }\r
+    titleLabel_->SetPosition(LABEL_X, LABEL_Y, LABEL_W, LABEL_H);\r
+    titleLabel_->SetText("分段详情");\r
+    titleLabel_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+    titleLabel_->SetFont(BOLD_VECTOR_FONT_FILENAME, LABEL_FONT);\r
+    group_->Add(titleLabel_);\r
+}\r
+\r
+void StopwatchRecordPage::CreateUIList()\r
+{\r
+    recordList_ = new UISimpleList();\r
+    if (recordList_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "StopwatchRecordPage recordList_ new fail");\r
+        return;\r
+    }\r
+    recordList_->SetPosition(LIST_X, LIST_Y, LIST_W, LIST_H);\r
+    recordList_->SetThrowDrag(true);\r
+    recordList_->SetDraggable(true);\r
+    recordList_->SetReboundSize(LIST_REBOUND_SIZE);\r
+    recordList_->EnableAutoAlign(true);\r
+    recordList_->SetElastic(true);\r
+    recordList_->SetScrollBlankSize(LIST_BLANK_SIZE, UIAbstractScroll::Direction::BOTTOM);\r
+    recordList_->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+\r
+    auto &records = StopwatchModel::GetInstance().GetRecordsList();\r
+    ListNode<StopwatchItem> *node = records.Head();\r
+    while (node != records.End()) {\r
+        Contents content;\r
+        content.createFunc = CreateViewCb;\r
+        content.updateFunc = UpdateViewCb;\r
+        content.type = 0;\r
+        StopwatchItem &itemData = node->data_;\r
+        content.data = reinterpret_cast<void *>(&itemData);\r
+        recordList_->AddContent(content);\r
+        node = node->next_;\r
+    }\r
+    recordList_->RefreshList();\r
+    group_->Add(recordList_);\r
+}\r
+\r
+void StopwatchRecordPage::OnStart(void *data)\r
+{\r
+    group_ = new UIViewGroup();\r
+    if (group_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "StopwatchRecordPage group_ new fail");\r
+        return;\r
+    }\r
+    group_->SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);\r
+    group_->SetOnDragListener(this);\r
+    group_->SetDraggable(true);\r
+    group_->SetTouchable(true);\r
+\r
+    InitBackgroundView();\r
+    CreateUILabel();\r
+    CreateUIList();\r
+    AddViewToPageContainer(group_);\r
+}\r
+\r
+bool StopwatchRecordPage::OnDrag(UIView &view, const DragEvent &event)\r
+{\r
+    if ((event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT) && (event.GetDeltaX() > X_DRAG_OFFSET) &&\r
+        (event.GetDeltaX() > (DOUBLES * MATH_ABS(event.GetDeltaY())))) {\r
+        NativeAbility::GetInstance().SwitchPageInSlice(STOPWATCH_PAGES::STOPWATCH_MAIN_PAGE,\r
+            TransitionType::TRANSITION_INVALID, false);\r
+    }\r
+    return true;\r
+}\r
+\r
+bool StopwatchRecordPage::OnClick(UIView &view, const ClickEvent &event)\r
+{\r
+    return false;\r
+}\r
+}
\ No newline at end of file
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/timers/src/TimerCountDown.cpp b/code/sdk/application/wearable/evb/nativeapp/nativeui/timers/src/TimerCountDown.cpp
new file mode 100644 (file)
index 0000000..d152629
--- /dev/null
@@ -0,0 +1,479 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: TimerCountDown\r
+ * Create: 2025-06-09\r
+ */\r
+\r
+#include <cmath>\r
+#include <string>\r
+#include "wearable_log.h"\r
+#include "SlicePageFactory.h"\r
+#include "common/image_cache_manager.h"\r
+#include "pwm.h"\r
+#include "main/LoadImg.h"\r
+#ifdef BUILD_IN_LINUX\r
+#include "localtime.h"\r
+#endif\r
+#include "timers/TimerView.h"\r
+#include "timers/TimerPresenter.h"\r
+#include "timers/TimerMainPage.h"\r
+#include "timers/TimerCountDown.h"\r
+\r
+namespace OHOS {\r
+static constexpr uint16_t NUM_TEN = 10;\r
+static constexpr uint16_t TIMING_TITLE_POSITION_X = 170;\r
+static constexpr uint16_t TIMING_TITLE_POSITION_Y = 110;\r
+static constexpr uint16_t TIMING_TITLE_SIZE_WIDTH = 114;\r
+static constexpr uint16_t TIMING_TITLE_SIZE_HEIGHT = 38;\r
+static constexpr uint16_t TIMING_TITLE_FONT = 38;\r
+static constexpr uint16_t TIMING_LABEL_CURTIME_XPOS = 177;\r
+static constexpr uint16_t TIMING_LABEL_CURTIME_YPOS = 54;\r
+static constexpr uint16_t TIMING_LABEL_CURTIME_WIDTH = 100;\r
+static constexpr uint16_t TIMING_LABEL_CURTIME_HEIGHT = 30;\r
+static constexpr uint16_t TIMING_LABEL_CURTIME_FONT_SIZE = 28;\r
+static constexpr uint16_t TIMING_START_IMAGE_XPOS = 251;\r
+static constexpr uint16_t TIMING_START_IMAGE_YPOS = 306;\r
+static constexpr uint16_t TIMING_START_IMAGE_SIZE = 96;\r
+static constexpr uint16_t TIMING_RESET_IMAGE_XPOS = 107;\r
+static constexpr uint16_t TIMING_RESET_IMAGE_YPOS = 306;\r
+static constexpr uint16_t TIMING_RESET_IMAGE_SIZE = 96;\r
+static constexpr uint16_t TIMING_TIMER_TIME_XPOS = 85;\r
+static constexpr uint16_t TIMING_TIMER_TIME_YPOS = 182;\r
+static constexpr uint16_t TIMING_TIMER_TIME_WIDTH = 322;\r
+static constexpr uint16_t TIMING_TIMER_TIME_HEIGHT = 90;\r
+static constexpr uint16_t TIMING_TIMER_TIME_FONT_SIZE = 72;\r
+static constexpr uint16_t HOUR_TIME = 3600;\r
+static constexpr uint16_t MIN_TIME = 60;\r
+static constexpr uint16_t TIMING_CIRCLE_LINE_WIDTH = 10;\r
+static constexpr uint16_t TIMING_CIRCLE = 227;\r
+static constexpr uint16_t CIRCLE_RADIUS = 222;\r
+static constexpr uint16_t TIMING_CIRCLE_END = 360;\r
+static constexpr uint32_t TIMING_CIRCLE_RANGE = 100000;\r
+static constexpr uint16_t MS_ONE_SECONDS = 1000;\r
+static constexpr uint16_t REMIND_MIN_MS = 16;\r
+static constexpr char *RESET_OR_EXIT_BUTTON  = "resetOrExitButton";\r
+static constexpr char *START_OR_PAUSE_BUTTON  = "startOrPauseButton";\r
+\r
+static std::string GetCurrentTimeStr()\r
+{\r
+    struct tm localTime;\r
+    time_t seconds = time(nullptr);\r
+    localtime_r(&seconds, &localTime);\r
+    std::string currTime;\r
+    if (localTime.tm_hour < NUM_TEN) {\r
+        currTime += "0";\r
+    }\r
+    currTime += std::to_string(localTime.tm_hour) + ":";\r
+    if (localTime.tm_min < NUM_TEN) {\r
+        currTime += "0";\r
+    }\r
+    currTime += std::to_string(localTime.tm_min);\r
+    return currTime;\r
+}\r
+\r
+void TimerCountDown::OnCreateView(void *data)\r
+{\r
+    fragmentView_.SetTouchable(true);\r
+    fragmentView_.SetDraggable(true);\r
+    fragmentView_.SetOnDragListener(this);\r
+    bgImg_ = new UIImageView();\r
+    if (bgImg_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "bgImg_ fail");\r
+        return;\r
+    }\r
+    LOADIMG::LoadImageViewImg(bgImg_, TIMER_IMAGE, IMAGE_TIMER_BG);\r
+    bgImg_->SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);\r
+\r
+    // 标题\r
+    labelTitle_ = new UILabel();\r
+    if (labelTitle_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "labelTitle_ fail");\r
+        return;\r
+    }\r
+    labelTitle_->SetPosition(TIMING_TITLE_POSITION_X, TIMING_TITLE_POSITION_Y);\r
+    labelTitle_->Resize(TIMING_TITLE_SIZE_WIDTH, TIMING_TITLE_SIZE_HEIGHT);\r
+    labelTitle_->SetText("计时器");\r
+    labelTitle_->SetFont(BOLD_VECTOR_FONT_FILENAME, TIMING_TITLE_FONT);\r
+    labelTitle_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+    labelTitle_->SetStyle(STYLE_TEXT_OPA, OPA_OPAQUE);\r
+    labelTitle_->SetStyle(STYLE_TEXT_COLOR, Color::White().full);\r
+    labelTitle_->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+\r
+    currentTime_ = new UILabel();\r
+    if (currentTime_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "currentTime_ fail");\r
+        return;\r
+    }\r
+    currentTime_->SetPosition(TIMING_LABEL_CURTIME_XPOS, TIMING_LABEL_CURTIME_YPOS);\r
+    currentTime_->Resize(TIMING_LABEL_CURTIME_WIDTH, TIMING_LABEL_CURTIME_HEIGHT);\r
+    currentTime_->SetFont(BOLD_VECTOR_FONT_FILENAME, TIMING_LABEL_CURTIME_FONT_SIZE);\r
+    currentTime_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+    currentTime_->SetVisible(true);\r
+    \r
+    fragmentView_.Add(bgImg_);\r
+    fragmentView_.Add(labelTitle_);\r
+    fragmentView_.Add(currentTime_);\r
+\r
+    CircleProgress();\r
+    CreateButton();\r
+    CreateTimerTime();\r
+    InitAnimator();\r
+\r
+    currentTimeCallback_ = new TimeAnimatorCallback();\r
+    if (currentTimeCallback_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "currentTimeCallback_ fail");\r
+        return;\r
+    }\r
+    currentTimeAnimator_ = new Animator(currentTimeCallback_, currentTime_, 0, true);\r
+    if (currentTimeAnimator_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "currentTimeAnimator_ fail");\r
+        return;\r
+    }\r
+    currentTimeAnimator_->Start();\r
+}\r
+\r
+void TimerCountDown::OnDestroyView()\r
+{\r
+    fragmentView_.RemoveAll();\r
+    if (labelTitle_ != nullptr) {\r
+        delete labelTitle_;\r
+        labelTitle_ = nullptr;\r
+    }\r
+\r
+    if (timerClock_ != nullptr) {\r
+        delete timerClock_;\r
+        timerClock_ = nullptr;\r
+    }\r
+\r
+    if (resetOrExitImg_ != nullptr) {\r
+        delete resetOrExitImg_;\r
+        resetOrExitImg_ = nullptr;\r
+    }\r
+\r
+    if (startOrPauseImg_ != nullptr) {\r
+        delete startOrPauseImg_;\r
+        startOrPauseImg_ = nullptr;\r
+    }\r
+\r
+    if (circleProgress_ != nullptr) {\r
+        delete circleProgress_;\r
+        circleProgress_ = nullptr;\r
+    }\r
+\r
+    if (currentTime_ != nullptr) {\r
+        delete currentTime_;\r
+        currentTime_ = nullptr;\r
+    }\r
+\r
+    if (currentTimeCallback_ != nullptr) {\r
+        delete currentTimeCallback_;\r
+        currentTimeCallback_ = nullptr;\r
+    }\r
+\r
+    if (currentTimeAnimator_ != nullptr) {\r
+        delete currentTimeAnimator_;\r
+        currentTimeAnimator_ = nullptr;\r
+    }\r
+\r
+    if (countDownTimecallBack_ != nullptr) {\r
+        delete countDownTimecallBack_;\r
+        countDownTimecallBack_ = nullptr;\r
+    }\r
+\r
+    if (countDownTimeanimator_ != nullptr) {\r
+        delete countDownTimeanimator_;\r
+        countDownTimeanimator_ = nullptr;\r
+    }\r
+\r
+    if (bgImg_ != nullptr) {\r
+        delete bgImg_;\r
+        bgImg_ = nullptr;\r
+    }\r
+    ImageCacheManager::GetInstance().UnloadAllInMultiRes(TIMER_IMAGE);\r
+}\r
+\r
+void TimerCountDown::OnResume()\r
+{\r
+    if (TimerModel::GetInstance().GetExistTimer()) {\r
+        SetAnimatorStatus(true);\r
+        TimerModel::GetInstance().SetExistTimer(false);\r
+    }\r
+    if (currentTimeAnimator_ != nullptr) {\r
+        if (currentTimeAnimator_->GetState() == Animator::STOP) {\r
+            currentTimeAnimator_->Start();\r
+        }\r
+    }\r
+    if (!startOrPauseImg_->IsTouchable()) {\r
+        LOADIMG::LoadImageViewImg(startOrPauseImg_, TIMER_IMAGE, IMAGE_TIMER_PAUSE);\r
+    }\r
+}\r
+\r
+void TimerCountDown::OnPause()\r
+{\r
+    if (TimerModel::GetInstance().GetIsCountDown()) {\r
+        TimerModel::GetInstance().SetExistTimer(true);\r
+    }\r
+    if (currentTimeAnimator_ != nullptr) {\r
+        if (currentTimeAnimator_->GetState() != Animator::STOP) {\r
+            currentTimeAnimator_->Stop();\r
+        }\r
+    }\r
+    SetAnimatorStatus(false);\r
+}\r
+\r
+void TimerCountDown::CreateButton()\r
+{\r
+    // 开始/暂停按钮\r
+    startOrPauseImg_ = new UIImageView();\r
+    if (startOrPauseImg_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "startOrPauseImg_ fail");\r
+        return;\r
+    }\r
+    startOrPauseImg_->SetPosition(TIMING_START_IMAGE_XPOS, TIMING_START_IMAGE_YPOS);\r
+    startOrPauseImg_->Resize(TIMING_START_IMAGE_SIZE, TIMING_START_IMAGE_SIZE);\r
+    startOrPauseImg_->SetViewId(START_OR_PAUSE_BUTTON);\r
+    startOrPauseImg_->SetTouchable(true);\r
+    startOrPauseImg_->SetOnClickListener(this);\r
+    LOADIMG::LoadImageViewImg(startOrPauseImg_, TIMER_IMAGE, IMAGE_TIMER_PLAY);\r
+\r
+    fragmentView_.Add(startOrPauseImg_);\r
+\r
+    // 复位/退出按钮\r
+    ImageInfo *image2 = ImageCacheManager::GetInstance().LoadOneInMultiRes(IMAGE_TIMER_EXIT, TIMER_IMAGE);\r
+    resetOrExitImg_ = new UIImageView();\r
+    if (resetOrExitImg_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "resetOrExitImg_ fail");\r
+        return;\r
+    }\r
+    resetOrExitImg_->SetPosition(TIMING_RESET_IMAGE_XPOS, TIMING_RESET_IMAGE_YPOS);\r
+    resetOrExitImg_->Resize(TIMING_RESET_IMAGE_SIZE, TIMING_RESET_IMAGE_SIZE);\r
+    resetOrExitImg_->SetViewId(RESET_OR_EXIT_BUTTON);\r
+    resetOrExitImg_->SetTouchable(true);\r
+    resetOrExitImg_->SetOnClickListener(this);\r
+    resetOrExitImg_->SetSrc(image2);\r
+    fragmentView_.Add(resetOrExitImg_);\r
+}\r
+\r
+void TimerCountDown::CreateTimerTime()\r
+{\r
+    timerClock_ = new UIDigitalClock();\r
+    if (timerClock_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "timerClock_ fail");\r
+        return;\r
+    }\r
+    timerClock_->SetPosition(TIMING_TIMER_TIME_XPOS, TIMING_TIMER_TIME_YPOS);\r
+    timerClock_->Resize(TIMING_TIMER_TIME_WIDTH, TIMING_TIMER_TIME_HEIGHT);\r
+    timerClock_->SetFont(BOLD_VECTOR_FONT_FILENAME, TIMING_TIMER_TIME_FONT_SIZE);\r
+    timerClock_->SetDisplayMode(UIDigitalClock::DISPLAY_24_HOUR);\r
+    timerClock_->SetStyle(STYLE_BACKGROUND_COLOR, Color::Blue().full);\r
+\r
+    fragmentView_.Add(timerClock_);\r
+}\r
+\r
+void TimerCountDown::RefreshFragment()\r
+{\r
+    uint64_t totalTime = TimerModel::GetInstance().GetTotalTime();\r
+    uint8_t hour = totalTime / HOUR_TIME;\r
+    uint8_t minute = totalTime % HOUR_TIME / MIN_TIME;\r
+    uint8_t second = totalTime % MIN_TIME;\r
+    timerClock_->SetTime24Hour(hour, minute, second);\r
+    TimerModel::GetInstance().SetEclipseTime(true, 0);\r
+    LOADIMG::LoadImageViewImg(resetOrExitImg_, TIMER_IMAGE, IMAGE_TIMER_EXIT);\r
+    circleProgress_->SetValue(TIMING_CIRCLE_RANGE);\r
+\r
+}\r
+\r
+void TimerCountDown::CircleProgress()\r
+{\r
+    circleProgress_ = new UICircleProgress();\r
+    if (circleProgress_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "circleProgress_ fail");\r
+        return;\r
+    }\r
+    circleProgress_->SetPosition(0, 0);\r
+    circleProgress_->Resize(RESOLUTION_WIDTH, RESOLUTION_HEIGHT);\r
+    circleProgress_->EnableBackground(true);\r
+    circleProgress_->SetForegroundStyle(STYLE_LINE_COLOR, 0XFFFFBF00);\r
+    circleProgress_->SetBackgroundStyle(STYLE_LINE_COLOR, 0XFF473D20);\r
+    circleProgress_->SetForegroundStyle(STYLE_LINE_WIDTH, TIMING_CIRCLE_LINE_WIDTH);\r
+    circleProgress_->SetBackgroundStyle(STYLE_LINE_WIDTH, TIMING_CIRCLE_LINE_WIDTH);\r
+    circleProgress_->EnableBackground(true);\r
+    circleProgress_->SetCenterPosition(TIMING_CIRCLE, TIMING_CIRCLE);\r
+    circleProgress_->SetRadius(CIRCLE_RADIUS);\r
+    circleProgress_->SetStartAngle(0);\r
+    circleProgress_->SetEndAngle(TIMING_CIRCLE_END);\r
+    circleProgress_->SetRange(TIMING_CIRCLE_RANGE, 0);\r
+    circleProgress_->SetValue(TIMING_CIRCLE_RANGE);\r
+    fragmentView_.Add(circleProgress_);\r
+}\r
+\r
+// 单位为毫秒计算\r
+void TimerCountDown::SetTimerTime(int64_t onTime)\r
+{\r
+    uint64_t time = onTime / MS_ONE_SECONDS;\r
+    uint16_t reminMs = onTime % MS_ONE_SECONDS;\r
+    if (reminMs > REMIND_MIN_MS) {\r
+        time++;\r
+    }\r
+    uint8_t hour = time / HOUR_TIME;\r
+    uint8_t minute = time % HOUR_TIME / MIN_TIME;\r
+    uint8_t second = time % MIN_TIME;\r
+    timerClock_->SetTime24Hour(hour, minute, second);\r
+    uint64_t totalTime = TimerModel::GetInstance().GetTotalTime();\r
+    double percentage = static_cast<double>(onTime) / ((uint64_t)totalTime * MS_ONE_SECONDS);\r
+    double value = round(percentage * TIMING_CIRCLE_RANGE);\r
+    circleProgress_->SetValue(static_cast<int32_t>(value));\r
+    circleProgress_->Invalidate();\r
+    timerClock_->Invalidate();\r
+}\r
+\r
+void TimerCountDown::InitAnimator()\r
+{\r
+    countDownTimecallBack_ = new TimerCountDownCallback(this);\r
+    if (countDownTimecallBack_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "countDownTimecallBack_ fail");\r
+        return;\r
+    }\r
+    countDownTimeanimator_ = new Animator(countDownTimecallBack_, nullptr, 0, true);\r
+    if (countDownTimeanimator_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "countDownTimeanimator_ fail");\r
+        return;\r
+    }\r
+}\r
+\r
+void TimerCountDown::TimerCountDownCallback::Callback(UIView *view)\r
+{\r
+    (void)view;\r
+    struct timeval current_time;\r
+    gettimeofday(&current_time, nullptr);\r
+\r
+    uint64_t totalTime = TimerModel::GetInstance().GetTotalTime();\r
+    uint64_t eclipseTime = TimerModel::GetInstance().GetEclipseTime();\r
+    uint64_t s_time = TimerModel::GetInstance().GetStartTime();\r
+    uint64_t c_time = (uint64_t)current_time.tv_sec * MS_ONE_SECONDS + current_time.tv_usec / MS_ONE_SECONDS;\r
+    int64_t remainTime = (uint64_t)totalTime * MS_ONE_SECONDS  - eclipseTime - (c_time - s_time);\r
+    if (remainTime < 0) {\r
+        // 计时到设定时间,复位图标修改为退出图标,暂停图标修改为播放图标,并设置成不可点击态\r
+        page_->startOrPauseImg_->SetTouchable(false);\r
+        LOADIMG::LoadImageViewImg(page_->startOrPauseImg_, TIMER_IMAGE, IMAGE_TIMER_PAUSE);\r
+        LOADIMG::LoadImageViewImg(page_->resetOrExitImg_, TIMER_IMAGE, IMAGE_TIMER_EXIT);\r
+        TimerModel::GetInstance().SetIsPause(false);\r
+        TimerModel::GetInstance().SetIsCountDown(false);\r
+        page_->startOrPauseImg_->Invalidate();\r
+        page_->resetOrExitImg_->Invalidate();\r
+        page_->countDownTimeanimator_->Stop();\r
+        page_->SetTimerTime(0);\r
+        // 调用pwm接口实现马达震动,客户自实现\r
+    } else {\r
+        page_->SetTimerTime(remainTime);\r
+    }\r
+}\r
+\r
+void TimerCountDown::SetAnimatorStatus(bool status)\r
+{\r
+    if (status) {\r
+        LOADIMG::LoadImageViewImg(startOrPauseImg_, TIMER_IMAGE, IMAGE_TIMER_PAUSE_ORANGE);\r
+        LOADIMG::LoadImageViewImg(resetOrExitImg_, TIMER_IMAGE, IMAGE_TIMER_RESTART);\r
+        countDownTimeanimator_->Start();\r
+        TimerModel::GetInstance().InitTimer();\r
+    } else {\r
+        countDownTimeanimator_->Stop();\r
+        LOADIMG::LoadImageViewImg(startOrPauseImg_, TIMER_IMAGE, IMAGE_TIMER_PLAY);\r
+        TimerModel::GetInstance().DisableTimer();\r
+    }\r
+}\r
+\r
+bool TimerCountDown::OnDragStart(UIView& view, const DragEvent& event)\r
+{\r
+    return true;\r
+}\r
+\r
+bool TimerCountDown::OnDrag(UIView &view, const DragEvent &event)\r
+{\r
+    UNUSED(view);\r
+    if ((event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT) && (event.GetDeltaX() > X_DRAG_OFFSET) &&\r
+        (event.GetDeltaX() > (DOUBLES * MATH_ABS(event.GetDeltaY())))) {\r
+        if (TimerModel::GetInstance().GetIsCountDown()) {\r
+            NativeAbility::GetInstance().ChangeSliceToApplist();\r
+        } else {\r
+            fragmentView_.SetVisible(false);\r
+            TimerMainPage::GetInstance()->ShowMainPage();\r
+        }\r
+    }\r
+    return true;\r
+}\r
+\r
+bool TimerCountDown::OnDragEnd(UIView& view, const DragEvent& event)\r
+{\r
+    return true;\r
+}\r
+\r
+bool TimerCountDown::OnClick(UIView &view, const ClickEvent &event)\r
+{\r
+    UNUSED(event);\r
+    if (strcmp(view.GetViewId(), RESET_OR_EXIT_BUTTON) == 0) {\r
+        if (TimerModel::GetInstance().GetIsCountDown()) {\r
+            // 此时计时器处于计时状态,点击按钮,重置timerClock_时间为倒计时初始选择时间,修改复位图标为退出图标,暂停图标变为开始图标,\r
+            SetAnimatorStatus(false);\r
+            TimerModel::GetInstance().SetIsCountDown(false);\r
+            uint64_t totalTime = TimerModel::GetInstance().GetTotalTime();\r
+            uint8_t hour = totalTime / HOUR_TIME;\r
+            uint8_t minute = totalTime % HOUR_TIME / MIN_TIME;\r
+            uint8_t second = totalTime % MIN_TIME;\r
+            timerClock_->SetTime24Hour(hour, minute, second);\r
+            TimerModel::GetInstance().SetEclipseTime(true, 0);\r
+            LOADIMG::LoadImageViewImg(resetOrExitImg_, TIMER_IMAGE, IMAGE_TIMER_EXIT);\r
+            circleProgress_->SetValue(TIMING_CIRCLE_RANGE);\r
+        } else if (!TimerModel::GetInstance().GetIsCountDown() && TimerModel::GetInstance().GetIsPause()) {\r
+            // 此时计时器处于暂停状态,点击复位按钮,重置timerClock_时间为倒计时初始选择时间,将复位图标变为退出图标,\r
+            TimerModel::GetInstance().SetIsCountDown(false);\r
+            uint64_t totalTime = TimerModel::GetInstance().GetTotalTime();\r
+            uint8_t hour = totalTime / HOUR_TIME;\r
+            uint8_t minute = totalTime % HOUR_TIME / MIN_TIME;\r
+            uint8_t second = totalTime % MIN_TIME;\r
+            timerClock_->SetTime24Hour(hour, minute, second);\r
+            TimerModel::GetInstance().SetEclipseTime(true, 0);\r
+            LOADIMG::LoadImageViewImg(resetOrExitImg_, TIMER_IMAGE, IMAGE_TIMER_EXIT);\r
+            circleProgress_->SetValue(TIMING_CIRCLE_RANGE);\r
+            TimerModel::GetInstance().SetIsPause(false);\r
+        } else {\r
+            NativeAbility::GetInstance().SwitchPageInSlice(TIMER_PAGES::TIMER_MAIN_PAGE,\r
+                TransitionType::TRANSITION_INVALID, false);\r
+        }\r
+    } else if (strcmp(view.GetViewId(), START_OR_PAUSE_BUTTON) == 0) {\r
+        if (TimerModel::GetInstance().GetIsCountDown()) {\r
+            // 计时器此时处于运行状态,点击暂停按钮,暂停图标变为开始图标\r
+            SetAnimatorStatus(false);\r
+            TimerModel::GetInstance().SetIsCountDown(false);\r
+            struct timeval current_time;\r
+            gettimeofday(&current_time, nullptr);\r
+            uint64_t time = ((uint64_t)current_time.tv_sec * MS_ONE_SECONDS + current_time.tv_usec / MS_ONE_SECONDS) -\r
+                            TimerModel::GetInstance().GetStartTime();\r
+            TimerModel::GetInstance().SetEclipseTime(false, time);\r
+            TimerModel::GetInstance().SetIsPause(true);\r
+        } else {\r
+            // 计时器此时处于停止/暂停状态,点击开始按钮,开始图标变为暂停图标,并获取点击时的时间,用作开始时间\r
+            SetAnimatorStatus(true);\r
+            struct timeval current_time;\r
+            gettimeofday(&current_time, nullptr);\r
+            uint64_t s_time =\r
+                (uint64_t)current_time.tv_sec * MS_ONE_SECONDS + current_time.tv_usec / MS_ONE_SECONDS;  // 转换成ms\r
+            TimerModel::GetInstance().SetStartTime(s_time);\r
+            TimerModel::GetInstance().SetIsCountDown(true);\r
+            TimerModel::GetInstance().SetIsPause(false);\r
+        }\r
+    }\r
+    return true;\r
+}\r
+\r
+void TimerCountDown::TimeAnimatorCallback::Callback(UIView *view)\r
+{\r
+    UILabel *timeLabel = dynamic_cast<UILabel *>(view);\r
+    if (timeLabel == nullptr) {\r
+        return;\r
+    }\r
+    std::string currTime = GetCurrentTimeStr();\r
+    timeLabel->SetText(currTime.c_str());\r
+    timeLabel->Invalidate();\r
+}\r
+}
\ No newline at end of file
index 35f8c4b..8129471 100644 (file)
@@ -1,25 +1,24 @@
 /*\r
- * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
  * Description: TimerMainPage\r
  * Create: 2025-06-09\r
  */\r
 \r
 #include <string>\r
-#include "timers/TimerMainPage.h"\r
-#include "timers/TimerSettingPage.h"\r
-#include "timers/TimerTimingPage.h"\r
-#include "timers/TimerPresenter.h"\r
 #include "SlicePageFactory.h"\r
-#include "timers/TimerView.h"\r
 #include "components/ui_scroll_view_nested.h"\r
 #include "components/ui_arc_label.h"\r
 #include "graphic_timer.h"\r
 #include "ohos_timer.h"\r
 #include "wearable_log.h"\r
 #include "main/LoadImg.h"\r
+#include "timers/TimerView.h"\r
+#include "timers/TimerSettingPage.h"\r
+#include "timers/TimerCountDown.h"\r
+#include "timers/TimerPresenter.h"\r
+#include "timers/TimerMainPage.h"\r
 \r
 namespace OHOS {\r
-static constexpr int16_t ADDBUTTON_MAX = 4;\r
 static constexpr uint8_t MAIN_TITLE_FONT_SIZE = 40;\r
 static constexpr int16_t MAIN_TITLE_SIZE_WIDTH = 160;\r
 static constexpr int16_t MAIN_TITLE_SIZE_HEIGHT = 50;\r
@@ -34,165 +33,219 @@ static constexpr int16_t SELECTMIN_POXS = 252;
 static constexpr int16_t SELECTMIN_POY = 89;\r
 static constexpr int16_t SELECTMIN_POYS = 220;\r
 static constexpr int16_t SELECTMIN_SIZE = 100;\r
-static constexpr int16_t MAX_SCR_DIS = 1000;\r
+static constexpr uint16_t MS_ONE_SECONDS = 1000;\r
 static constexpr uint8_t MIN = 60;\r
+static constexpr char *SET_TIME_BUTTON  = "setTimeButton";\r
+static constexpr char *ONE_MINUTE  = "1";\r
+static constexpr char *THREE_MINUTE  = "3";\r
+static constexpr char *FIFTEEN_MINUTE  = "15";\r
+static constexpr char *THIRTY_MINUTE  = "30";\r
+static TimerMainPage *g_pTimerMainPage{nullptr};\r
 \r
 REGIST_SLICE_PAGE(VIEW_TIMER, TIMER_PAGES::TIMER_MAIN_PAGE, TimerMainPage, true);\r
 \r
+TimerMainPage::TimerMainPage()\r
+{\r
+    g_pTimerMainPage = this;\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "TimerMainPage::TimerMainPage()");\r
+}\r
+\r
 TimerMainPage::~TimerMainPage()\r
 {\r
-    bool ret = ImageCacheManager::GetInstance().UnloadAllInMultiRes(TIMER_IMAGE);\r
-    if (ret == false) {\r
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "UnloadTimerImage fail");\r
+    if (group_ != nullptr) {\r
+        group_->RemoveAll();\r
+        delete group_;\r
+        group_ = nullptr;\r
     }\r
 \r
-    if (group != nullptr) {\r
-        group->RemoveAll();\r
-        delete group;\r
-        group = nullptr;\r
+    if (countDownFragment_ != nullptr) {\r
+        countDownFragment_->DestroyView();\r
+        delete countDownFragment_;\r
+        countDownFragment_ = nullptr;\r
     }\r
 \r
-    if (title != nullptr) {\r
-        delete title;\r
-        title = nullptr;\r
+    if (labelTitle_ != nullptr) {\r
+        delete labelTitle_;\r
+        labelTitle_ = nullptr;\r
     }\r
 \r
-    if (addButton != nullptr) {\r
-        delete addButton;\r
-        addButton = nullptr;\r
+    if (addButton_ != nullptr) {\r
+        delete addButton_;\r
+        addButton_ = nullptr;\r
     }\r
 \r
-    for (int i = 0; i < ADDBUTTON_MAX; i++) {\r
-        if (selectMin[i] != nullptr) {\r
-            delete selectMin[i];\r
-            selectMin[i] = nullptr;\r
+    for (int i = 0; i < SELECT_IMAGE_COUNT; i++) {\r
+        if (selectMin_[i] != nullptr) {\r
+            delete selectMin_[i];\r
+            selectMin_[i] = nullptr;\r
         }\r
     }\r
 \r
-    if (backround != nullptr) {\r
-        delete backround;\r
-        backround = nullptr;\r
+    if (bgImg_ != nullptr) {\r
+        delete bgImg_;\r
+        bgImg_ = nullptr;\r
     }\r
+    ImageCacheManager::GetInstance().UnloadAllInMultiRes(TIMER_IMAGE);\r
+    TimerModel::GetInstance().SetIsShowFragment(false);\r
+    g_pTimerMainPage = nullptr;\r
     WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "TimerMainPage::~TimerMainPage()");\r
 }\r
 \r
-void TimerMainPage::OnStart(void* data)\r
+void TimerMainPage::OnResume()\r
+{\r
+    if (countDownFragment_->GetFragmentView()->IsVisible()) {\r
+        countDownFragment_->OnResume();\r
+    }\r
+}\r
+\r
+void TimerMainPage::OnPause()\r
+{\r
+    if (countDownFragment_->GetFragmentView()->IsVisible()) {\r
+        countDownFragment_->OnPause();\r
+    }\r
+}\r
+\r
+TimerMainPage* TimerMainPage::GetInstance()\r
 {\r
-    bool ret = ImageCacheManager::GetInstance().LoadAllInMultiRes(TIMER_IMAGE);\r
-    if (ret == false) {\r
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "LoadTimerImage fail");\r
+    return g_pTimerMainPage;\r
+}\r
+\r
+void TimerMainPage::OnStart(void *data)\r
+{\r
+    group_ = new UIScrollView();\r
+    if (group_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "group_ fail");\r
         return;\r
     }\r
-    // 主界面\r
-    if (group == nullptr) {\r
-        group = new UIScrollView();\r
-        group->SetPosition(0, 0, VERTICAL_RESOLUTION, HORIZONTAL_RESOLUTION);\r
-        group->SetViewId("mainview");\r
+    group_->SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);\r
+    group_->SetOnDragListener(this);\r
+    group_->SetVisible(false);\r
+\r
+    bgImg_ = new UIImageView();\r
+    if (bgImg_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "bgImg_ fail");\r
+        return;\r
     }\r
-    if (backround == nullptr) {\r
-        backround = new UIImageView();\r
-        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "TimerMainPage::OnStart new backround");\r
+    LOADIMG::LoadImageViewImg(bgImg_, TIMER_IMAGE, IMAGE_TIMER_BG);\r
+    bgImg_->SetPosition(0, 0, RESOLUTION_WIDTH, RESOLUTION_WIDTH);\r
+    group_->Add(bgImg_);\r
+\r
+    countDownFragment_ = new TimerCountDown();\r
+    if (countDownFragment_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "countDownFragment_ fail");\r
+        return;\r
     }\r
-    LOADIMG::LoadImageViewImg(backround, TIMER_IMAGE, IMAGE_CONVERTER_TOOL_TIMER_BG);\r
-    backround->SetPosition(0, 0, RESOLUTION_WIDTH, RESOLUTION_WIDTH);\r
-    group->Add(backround);\r
+    countDownFragment_->GetFragmentView()->SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);\r
+    countDownFragment_->CreateView();\r
+    countDownFragment_->GetFragmentView()->SetVisible(false);\r
+\r
     InitView();\r
     LabelTitle();\r
-    group->SetOnDragListener(this);\r
-    group->SetVisible(false);\r
-    AddViewToPageContainer(group);\r
+\r
+    AddViewToPageContainer(group_);\r
+    AddViewToPageContainer(countDownFragment_->GetFragmentView());\r
+    // 定时器存在,不展示主页面,直接进入计时页面\r
     if (TimerModel::GetInstance().GetExistTimer()) {\r
-        // 定时器存在,进入计时页面\r
-        NativeAbility::GetInstance().SwitchSlice(VIEW_TIMER, TIMER_PAGES::TIMER_TIMING_PAGE);\r
+        countDownFragment_->GetFragmentView()->SetVisible(true);\r
+    } else if (TimerModel::GetInstance().GetIsShowFragment()) {\r
+        TimerModel::GetInstance().SetIsShowFragment(false);\r
+        countDownFragment_->RefreshFragment();\r
+        countDownFragment_->GetFragmentView()->SetVisible(true);\r
     } else {\r
-        group->SetVisible(true);\r
+        group_->SetVisible(true);\r
     }\r
 }\r
 \r
 void TimerMainPage::LabelTitle()\r
 {\r
-    // 标题\r
-    if (title == nullptr) {\r
-        title = new UILabel();\r
-        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "TimerMainPage::LabelTitle new title");\r
-    }\r
-    title->SetPosition(MAIN_TITLE_POSITION_X, MAIN_TITLE_POSITION_Y);\r
-    title->SetText("计时器");\r
-    title->Resize(MAIN_TITLE_SIZE_WIDTH, MAIN_TITLE_SIZE_HEIGHT);\r
-    title->SetFont(DEFAULT_VECTOR_FONT_FILENAME, MAIN_TITLE_FONT_SIZE);\r
-    title->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
-    title->SetStyle(STYLE_TEXT_OPA, OPA_OPAQUE);\r
-    title->SetStyle(STYLE_TEXT_COLOR, Color::White().full);\r
-    title->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
-    title->SetVisible(true);\r
-    group->Add(title);\r
+    labelTitle_ = new UILabel();\r
+    if (labelTitle_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "labelTitle_ fail");\r
+        return;\r
+    }\r
+    labelTitle_->SetPosition(MAIN_TITLE_POSITION_X, MAIN_TITLE_POSITION_Y);\r
+    labelTitle_->SetText("计时器");\r
+    labelTitle_->Resize(MAIN_TITLE_SIZE_WIDTH, MAIN_TITLE_SIZE_HEIGHT);\r
+    labelTitle_->SetFont(BOLD_VECTOR_FONT_FILENAME, MAIN_TITLE_FONT_SIZE);\r
+    labelTitle_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+    labelTitle_->SetStyle(STYLE_TEXT_OPA, OPA_OPAQUE);\r
+    labelTitle_->SetStyle(STYLE_TEXT_COLOR, Color::White().full);\r
+    labelTitle_->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+    labelTitle_->SetVisible(true);\r
+    group_->Add(labelTitle_);\r
 }\r
 \r
 void TimerMainPage::InitView()\r
 {\r
-    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "TimerMainPage::InitView() Start!");\r
-    if (addButton == nullptr) {\r
-        addButton = new UIImageView();\r
-        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "TimerMainPage::InitView new addButton");\r
-    }\r
-    LOADIMG::LoadImageViewImg(addButton, TIMER_IMAGE, IMAGE_CONVERTER_TOOL_TIMER_USER);\r
-    addButton->SetPosition(MAIN_ADDBUTTON_POSITION_X, MAIN_ADDBUTTON_POSITION_Y);\r
-    addButton->Resize(MAIN_ADDBUTTON_SIZE_WIDTH, MAIN_ADDBUTTON_SIZE_HEIGHT);\r
-    addButton->SetViewId(SETTING_TIMER);\r
-    addButton->SetTouchable(true);\r
-    addButton->SetOnClickListener(this);\r
-    group->Add(addButton);\r
-\r
-    int posX[ADDBUTTON_MAX] = {SELECTMIN_POX, SELECTMIN_POXS, SELECTMIN_POX, SELECTMIN_POXS};\r
-    int posY[ADDBUTTON_MAX] = {SELECTMIN_POY, SELECTMIN_POY, SELECTMIN_POYS, SELECTMIN_POYS};\r
-    const char* buttonViewId[ADDBUTTON_MAX] = {"1", "3", "15", "30"};\r
-    ImageInfo *image1 = ImageCacheManager::GetInstance().LoadOneInMultiRes(IMAGE_CONVERTER_TOOL_TIMER_1, TIMER_IMAGE);\r
-    ImageInfo *image3 = ImageCacheManager::GetInstance().LoadOneInMultiRes(IMAGE_CONVERTER_TOOL_TIMER_3, TIMER_IMAGE);\r
-    ImageInfo *image15 = ImageCacheManager::GetInstance().LoadOneInMultiRes(IMAGE_CONVERTER_TOOL_TIMER_15, TIMER_IMAGE);\r
-    ImageInfo *image30 = ImageCacheManager::GetInstance().LoadOneInMultiRes(IMAGE_CONVERTER_TOOL_TIMER_30, TIMER_IMAGE);\r
-    ImageInfo* buttonSrc[ADDBUTTON_MAX] = {image1, image3, image15, image30};\r
-    // 一分钟按钮\r
-    for (int i = 0;i < ADDBUTTON_MAX;i++) {\r
-        if (selectMin[i] == nullptr) {\r
-            selectMin[i] = new UIImageView();\r
+    addButton_ = new UIImageView();\r
+    if (addButton_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "addButton_ fail");\r
+        return;\r
+    }\r
+    LOADIMG::LoadImageViewImg(addButton_, TIMER_IMAGE, IMAGE_TIMER_USER);\r
+    addButton_->SetPosition(MAIN_ADDBUTTON_POSITION_X, MAIN_ADDBUTTON_POSITION_Y);\r
+    addButton_->Resize(MAIN_ADDBUTTON_SIZE_WIDTH, MAIN_ADDBUTTON_SIZE_HEIGHT);\r
+    addButton_->SetViewId(SET_TIME_BUTTON);\r
+    addButton_->SetTouchable(true);\r
+    addButton_->SetOnClickListener(this);\r
+    group_->Add(addButton_);\r
+\r
+    int posX[SELECT_IMAGE_COUNT] = {SELECTMIN_POX, SELECTMIN_POXS, SELECTMIN_POX, SELECTMIN_POXS};\r
+    int posY[SELECT_IMAGE_COUNT] = {SELECTMIN_POY, SELECTMIN_POY, SELECTMIN_POYS, SELECTMIN_POYS};\r
+    const char *buttonViewId[SELECT_IMAGE_COUNT] = {ONE_MINUTE, THREE_MINUTE, FIFTEEN_MINUTE, THIRTY_MINUTE};\r
+    int buttonImg[SELECT_IMAGE_COUNT] = {IMAGE_TIMER_1, IMAGE_TIMER_3, IMAGE_TIMER_15, IMAGE_TIMER_30};\r
+    // 计时选择时间按钮\r
+    for (int i = 0; i < SELECT_IMAGE_COUNT; i++) {\r
+        selectMin_[i] = new UIImageView();\r
+        if (selectMin_[i] == nullptr) {\r
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "selectMin_[%d] fail", i);\r
+            return;\r
         }\r
-        selectMin[i]->SetPosition(posX[i], posY[i]);\r
-        selectMin[i]->Resize(SELECTMIN_SIZE, SELECTMIN_SIZE);\r
-        selectMin[i]->SetTouchable(true);\r
-        selectMin[i]->SetOnClickListener(this);\r
-        selectMin[i]->SetViewId(buttonViewId[i]);\r
-        selectMin[i]->SetSrc(buttonSrc[i]);\r
-        group->Add(selectMin[i]);\r
+        selectMin_[i]->SetPosition(posX[i], posY[i]);\r
+        selectMin_[i]->Resize(SELECTMIN_SIZE, SELECTMIN_SIZE);\r
+        selectMin_[i]->SetTouchable(true);\r
+        selectMin_[i]->SetOnClickListener(this);\r
+        selectMin_[i]->SetViewId(buttonViewId[i]);\r
+        LOADIMG::LoadImageViewImg(selectMin_[i], TIMER_IMAGE, buttonImg[i]);\r
+        group_->Add(selectMin_[i]);\r
     }\r
 }\r
 \r
+void TimerMainPage::ShowMainPage()\r
+{\r
+    group_->SetVisible(true);\r
+}\r
+\r
 bool TimerMainPage::OnClick(UIView &view, const ClickEvent &event)\r
 {\r
     UNUSED(event);\r
-    std::string viewId = view.GetViewId();\r
-    if (viewId == SETTING_TIMER) {\r
-        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "TimerMainPage::OnClick viewId == SETTING_TIMER");\r
-        NativeAbility::GetInstance().SwitchSlice(VIEW_TIMER, TIMER_PAGES::TIMER_SETTING_PAGE);\r
-    } else if (viewId == "1"|| viewId == "3" || viewId == "15" || viewId == "30") {\r
-        int num = std::stoi(viewId);\r
+    if (strcmp(view.GetViewId(), SET_TIME_BUTTON) == 0) {\r
+        NativeAbility::GetInstance().SwitchPageInSlice(TIMER_PAGES::TIMER_SETTING_PAGE,\r
+            TransitionType::TRANSITION_INVALID, false);\r
+    } else if ((strcmp(view.GetViewId(), ONE_MINUTE) == 0) ||\r
+               (strcmp(view.GetViewId(), THREE_MINUTE) == 0) ||\r
+               (strcmp(view.GetViewId(), FIFTEEN_MINUTE) == 0) ||\r
+               (strcmp(view.GetViewId(), THIRTY_MINUTE) == 0)) {\r
+        int num = std::stoi(std::string(view.GetViewId()));\r
         struct timeval start_time;\r
         gettimeofday(&start_time, nullptr);\r
-        uint32_t s_time = start_time.tv_sec * MAX_SCR_DIS + start_time.tv_usec / MAX_SCR_DIS; // 转换成ms\r
+        uint64_t s_time =\r
+            (uint64_t)start_time.tv_sec * MS_ONE_SECONDS + start_time.tv_usec / MS_ONE_SECONDS;  // 转换成ms\r
         TimerModel::GetInstance().SetStartTime(s_time);\r
-        TimerModel::GetInstance().SetSaveTime(true, 0);\r
-        TimerModel::GetInstance().SetDurationTime(num * MIN);\r
-        NativeAbility::GetInstance().SwitchSlice(VIEW_TIMER, TIMER_PAGES::TIMER_TIMING_PAGE);\r
+        TimerModel::GetInstance().SetEclipseTime(true, 0);\r
+        TimerModel::GetInstance().SetTotalTime(num * MIN);\r
+        countDownFragment_->RefreshFragment();\r
+        countDownFragment_->GetFragmentView()->SetVisible(true);\r
     }\r
     return true;\r
 }\r
 \r
-bool TimerMainPage::OnDrag(UIView& view, const DragEvent& event)\r
+bool TimerMainPage::OnDrag(UIView &view, const DragEvent &event)\r
 {\r
     UNUSED(view);\r
-    if ((event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT) &&\r
-    (event.GetDeltaX() > X_DRAG_OFFSET) && (event.GetDeltaX() > (DOUBLES * MATH_ABS(event.GetDeltaY())))) {\r
-        NativeAbility::GetInstance().ChangeSlice(VIEW_APPLIST);\r
-        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "TimerMainPage::OnDrag ChangeSlice(VIEW_APPLIST)");\r
+    if ((event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT) && (event.GetDeltaX() > X_DRAG_OFFSET) &&\r
+        (event.GetDeltaX() > (DOUBLES * MATH_ABS(event.GetDeltaY())))) {\r
+        NativeAbility::GetInstance().ChangeSliceToApplist();\r
     }\r
     return true;\r
 }\r
index 83c3b84..ea4bf93 100644 (file)
@@ -1,24 +1,17 @@
 /*\r
- * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
  * Description: TimerModel\r
  * Create: 2025-06-09\r
  */\r
 \r
-#include "timers/TimerModel.h"\r
-#include "main/HealthModel.h"\r
-#include "uiservice/ui_service.h"\r
 #include "wearable_log.h"\r
+#include "timers/TimerModel.h"\r
 \r
 namespace OHOS {\r
-static int g_motionTimes{0};\r
-static constexpr uint64_t MS_ONE_SECONDS = 1000;\r
-TimerModel::TimerModel()\r
-{\r
-}\r
+static constexpr uint16_t MS_ONE_SECONDS = 1000;\r
+TimerModel::TimerModel() {}\r
 \r
-TimerModel::~TimerModel()\r
-{\r
-}\r
+TimerModel::~TimerModel() {}\r
 \r
 TimerModel &TimerModel::GetInstance()\r
 {\r
@@ -26,42 +19,42 @@ TimerModel &TimerModel::GetInstance()
     return instance;\r
 }\r
 \r
-uint32_t TimerModel::GetSaveTime()\r
+uint64_t TimerModel::GetEclipseTime()\r
 {\r
-    return save_time;\r
+    return eclipseTime_;\r
 }\r
 \r
-void TimerModel::SetSaveTime(bool falg, uint32_t value)\r
+void TimerModel::SetEclipseTime(bool flag, uint64_t value)\r
 {\r
-    if (falg) {\r
-        save_time = 0;\r
+    if (flag) {\r
+        eclipseTime_ = 0;\r
     } else {\r
-        save_time += value;\r
+        eclipseTime_ += value;\r
     }\r
 }\r
 \r
-void TimerModel::SetDurationTime(uint32_t time)\r
+void TimerModel::SetTotalTime(uint64_t time)\r
 {\r
-    durationTime = time;\r
+    totalTime_ = time;\r
 }\r
 \r
-uint32_t TimerModel::GetDurationTime()\r
+uint64_t TimerModel::GetTotalTime()\r
 {\r
-    return durationTime;\r
+    return totalTime_;\r
 }\r
 \r
 /* 定时器回调函数 */\r
 void TimerTimerCallback(void *data)\r
 {\r
     (void)data;\r
-    uint32_t dura_time = TimerModel::GetInstance().GetDurationTime();\r
-    uint32_t start_time = TimerModel::GetInstance().GetStartTime();\r
-    uint32_t save_time = TimerModel::GetInstance().GetSaveTime();\r
+    uint64_t total_time = TimerModel::GetInstance().GetTotalTime();\r
+    uint64_t start_time = TimerModel::GetInstance().GetStartTime();\r
+    uint64_t eclipse_time = TimerModel::GetInstance().GetEclipseTime();\r
     struct timeval current_time;\r
     gettimeofday(&current_time, nullptr);\r
-    uint32_t remTime = dura_time * 1000 - (current_time.tv_usec - start_time) - save_time;\r
-    if (remTime == 0) {\r
-        WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "TimerTimerCallback:  end :%d", time);\r
+    uint64_t curr_time_ms = (uint64_t)current_time.tv_sec * MS_ONE_SECONDS + current_time.tv_usec / MS_ONE_SECONDS;\r
+    int64_t remTime = (uint64_t)total_time * MS_ONE_SECONDS - (curr_time_ms - start_time) - eclipse_time;\r
+    if (remTime <= 0) {\r
         TimerModel::GetInstance().SetExistTimer(false);\r
         TimerModel::GetInstance().DisableTimer();\r
     }\r
@@ -70,22 +63,22 @@ void TimerTimerCallback(void *data)
 /* 开启定时器 */\r
 void TimerModel::InitTimer()\r
 {\r
-    if (g_startCounting != nullptr) {\r
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "TimerModel::InitTimer g_startCounting != nullptr!!");\r
+    if (startCounting_ != nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "InitTimer startCounting_ != nullptr!!");\r
         return;\r
     }\r
     uint32_t tick = GetOSTick(MS_ONE_SECONDS);\r
-    g_startCounting = new GraphicTimer(tick, TimerTimerCallback, nullptr, true);\r
-    if (g_startCounting == nullptr) {\r
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "TimerModel::InitTimer new GraphicTimer failed!!");\r
+    startCounting_ = new GraphicTimer(tick, TimerTimerCallback, nullptr, true);\r
+    if (startCounting_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "InitTimer new GraphicTimer failed!!");\r
         return;\r
     }\r
-    bool retTimer = g_startCounting->Start();\r
+    bool retTimer = startCounting_->Start();\r
     if (!retTimer) {\r
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "TimerModel::InitTimer Start failed!!");\r
-        if (g_startCounting != nullptr) {\r
-            delete g_startCounting;\r
-            g_startCounting = nullptr;\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "InitTimer Start failed!!");\r
+        if (startCounting_ != nullptr) {\r
+            delete startCounting_;\r
+            startCounting_ = nullptr;\r
         }\r
         return;\r
     }\r
@@ -94,10 +87,10 @@ void TimerModel::InitTimer()
 /* 关闭定时器 */\r
 void TimerModel::DisableTimer()\r
 {\r
-    if (g_startCounting != nullptr) {\r
-        delete g_startCounting;\r
-        g_startCounting = nullptr;\r
-        g_motionTimes = 0;\r
+    if (startCounting_ != nullptr) {\r
+        startCounting_->Stop();\r
+        delete startCounting_;\r
+        startCounting_ = nullptr;\r
     }\r
 }\r
 }
\ No newline at end of file
index b739064..2498e3c 100644 (file)
@@ -1,15 +1,15 @@
 /*\r
- * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
  * Description: TimerPresenter\r
  * Create: 2025-06-09\r
  */\r
 \r
+#include "ohos_timer.h"\r
+#include "NativeRegisterManager.h"\r
 #include "timers/TimerView.h"\r
 #include "timers/TimerModel.h"\r
 #include "timers/TimerPresenter.h"\r
-#include "NativeRegisterManager.h"\r
-#include "ohos_timer.h"\r
 \r
 namespace OHOS {\r
-    REGIST_MENU(VIEW_TIMER, TimerView, TimerPresenter, TIMER_MAIN_ICON, PNG_APPLIST_DEFAULT_IMG, "计时器");\r
+REGIST_MENU(VIEW_TIMER, TimerView, TimerPresenter, TIMER_ICON, TIMER_ICON, "计时器");\r
 }
\ No newline at end of file
index 0f01e93..2ab02db 100644 (file)
@@ -1,23 +1,22 @@
 /*\r
- * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
  * Description: TimerSettingPage\r
  * Create: 2025-06-09\r
  */\r
 \r
 #include <unistd.h>\r
 #include <string>\r
-#include "timers/TimerSettingPage.h"\r
-#include "timers/TimerPresenter.h"\r
 #include "components/ui_arc_label.h"\r
 #include "wearable_log.h"\r
-#include "timers/TimerView.h"\r
 #include "SlicePageFactory.h"\r
 #include "common/image_cache_manager.h"\r
+#include "timers/TimerView.h"\r
+#include "timers/TimerPresenter.h"\r
+#include "timers/TimerSettingPage.h"\r
 \r
 namespace OHOS {\r
 static constexpr uint8_t BACKGROUND_FONT = 40;\r
 static constexpr uint8_t HIGHTLIGHT_FONT = 50;\r
-static constexpr uint8_t TIMERPICKER_MAX = 3;\r
 static constexpr uint16_t PADDING = 3;\r
 static constexpr uint16_t BORDER_RADIUS = 5;\r
 static constexpr uint16_t TEXT_FONT = 24;\r
@@ -35,352 +34,324 @@ static constexpr uint16_t SETTING_START_POSITION_X = 112;
 static constexpr uint16_t SETTING_START_POSITION_Y = 347;\r
 static constexpr uint16_t SETTING_START_SIZE_WIDTH = 232;\r
 static constexpr uint16_t SETTING_START_SIZE_HEIGHT = 76;\r
-static constexpr uint16_t SETTING_START_FONT = 40;\r
 static constexpr uint16_t TIMERPICKER_POSX1 = 61;\r
 static constexpr uint16_t TIMERPICKER_POSX2 = 183;\r
 static constexpr uint16_t TIMERPICKER_POSX3 = 305;\r
 static constexpr uint16_t TIMERPICKER_POSY = 119;\r
-static constexpr uint16_t SETTING_TIMERPICKER_SIZE_WIDTH = 88;\r
-static constexpr uint16_t SETTING_TIMERPICKER_SIZE_HEIGHT = 189;\r
+static constexpr uint16_t SETTING_TIMERPICKER_WIDTH = 88;\r
+static constexpr uint16_t SETTING_TIMERPICKER_HEIGHT = 189;\r
 static constexpr uint16_t TIMERPICKER_RADIUS = 11;\r
 static constexpr uint16_t SETTING_TIMERPICKER_ITEM_HEIGHT = 70;\r
 static constexpr uint16_t SETTING_TIMERPICKER_HOUR = 24;\r
-static constexpr uint16_t SETTING_TIMERPICKER_HOURS = 23;\r
+static constexpr uint16_t SETTING_TIMERPICKER_HOUR_END = 23;\r
 static constexpr uint16_t SETTING_TIMERPICKER_MIN = 60;\r
-static constexpr uint16_t SETTING_TIMERPICKER_MINS = 59;\r
-static constexpr uint16_t SETTING_PICKERGROUP_POSX = 70;\r
-static constexpr uint16_t SETTING_PICKERGROUP_POSY = 132;\r
-static constexpr uint16_t SETTING_PICKERGROUP_SIZE_WIDTH = 80;\r
-static constexpr uint16_t SETTING_PICKERGROUP_SIZE_HEIGHT = 208;\r
+static constexpr uint16_t SETTING_TIMERPICKER_MIN_END = 59;\r
 static constexpr uint16_t HOUR_TIME = 3600;\r
 static constexpr uint16_t MIN_TIME = 60;\r
 static constexpr uint16_t POX1_MIN = 86;\r
-static constexpr uint16_t POX1_MAX = 174;\r
 static constexpr uint16_t POX2_MIN = 206;\r
-static constexpr uint16_t POX2_MAX = 294;\r
 static constexpr uint16_t POX3_MIN = 332;\r
-static constexpr uint16_t POX3_MAX = 420;\r
-static constexpr uint16_t POY_MIN = 119;\r
-static constexpr uint16_t POY_MAX = 308;\r
-static constexpr uint16_t SLEEP = 500;\r
-static constexpr uint16_t SUM_2 = 2;\r
+static constexpr uint16_t INDEX_2 = 2;\r
+static constexpr char *START_TIMING_BUTTON  = "startCountDownButton";\r
+static constexpr char *HOUR_PICKER = "hourPicker";\r
+static constexpr char *MIN_PICKER = "minPicker";\r
+static constexpr char *SEC_PICKER = "secPicker";\r
+// 时间选择器分钟与秒钟列\r
+static const char *g_uiPickerMinAndSecData[] = {"01", "02", "03", "04", "05", "06", "07", "08", "09", "10",\r
+                                                "11", "12", "13", "14", "15", "16", "17", "18", "19", "20",\r
+                                                "21", "22", "23", "24", "25", "26", "27", "28", "29", "30",\r
+                                                "31", "32", "33", "34", "35", "36", "37", "38", "39", "40",\r
+                                                "41", "42", "43", "44", "45", "46", "47", "48", "49", "50",\r
+                                                "51", "52", "53", "54", "55", "56", "57", "58", "59", "00"};\r
+\r
+// 时间选择器小时列\r
+static const char *g_uiPickerHourData[] = {"01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11", "12",\r
+                                           "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "00"};\r
 \r
 REGIST_SLICE_PAGE(VIEW_TIMER, TIMER_PAGES::TIMER_SETTING_PAGE, TimerSettingPage, false);\r
 \r
-TimerSettingPage::~TimerSettingPage()\r
+TimerSettingPage::TimerSettingPage()\r
 {\r
-    bool ret = ImageCacheManager::GetInstance().UnloadAllInMultiRes(TIMER_IMAGE);\r
-    if (ret == false) {\r
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "UnloadTimerImage fail");\r
-    }\r
-\r
-    if (group != nullptr) {\r
-        group->RemoveAll();\r
-        delete group;\r
-        group = nullptr;\r
-    }\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "TimerSettingPage::TimerSettingPage");\r
+}\r
 \r
-    if (title != nullptr) {\r
-        delete title;\r
-        title = nullptr;\r
+TimerSettingPage::~TimerSettingPage()\r
+{\r
+    if (group_ != nullptr) {\r
+        group_->RemoveAll();\r
+        delete group_;\r
+        group_ = nullptr;\r
     }\r
 \r
-    if (back != nullptr) {\r
-        delete back;\r
-        back = nullptr;\r
+    if (labelTitle_ != nullptr) {\r
+        delete labelTitle_;\r
+        labelTitle_ = nullptr;\r
     }\r
 \r
-    for (int i = 0; i < TIMERPICKER_MAX; i++) {\r
-        if (timerPicker[i] != nullptr) {\r
-            delete timerPicker[i];\r
-            timerPicker[i] = nullptr;\r
+    for (int i = 0; i < PICKER_COUNT; i++) {\r
+        if (timerPicker_[i] != nullptr) {\r
+            delete timerPicker_[i];\r
+            timerPicker_[i] = nullptr;\r
         }\r
     }\r
 \r
-    if (start != nullptr) {\r
-        delete start;\r
-        start = nullptr;\r
+    if (startImg_ != nullptr) {\r
+        delete startImg_;\r
+        startImg_ = nullptr;\r
     }\r
 \r
-    if (timerLabel != nullptr) {\r
-        delete timerLabel;\r
-        timerLabel = nullptr;\r
+    if (labelUnit_ != nullptr) {\r
+        delete labelUnit_;\r
+        labelUnit_ = nullptr;\r
     }\r
+    ImageCacheManager::GetInstance().UnloadAllInMultiRes(TIMER_IMAGE);\r
     WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "TimerSettingPage::~TimerSettingPage");\r
 }\r
 \r
 void TimerSettingPage::OnStart(void *data)\r
 {\r
-    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "TimerSettingPage::OnStart() Start");\r
-    bool ret = ImageCacheManager::GetInstance().LoadAllInMultiRes(TIMER_IMAGE);\r
-    if (ret == false) {\r
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "LoadTimerImage fail");\r
+    labelTitle_ = new UILabel();\r
+    if (labelTitle_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new labelTitle_ fail");\r
         return;\r
     }\r
-    image1 = ImageCacheManager::GetInstance().LoadOneInMultiRes(\r
-        IMAGE_CONVERTER_TOOL_TIMER_BEGIN_GRAY, TIMER_IMAGE);\r
-    if (image1 == nullptr) {\r
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "LoadTimerImage image1 fail");\r
-        return;\r
+    labelTitle_->SetPosition(SETTING_TITLE_POSITION_X, SETTING_TITLE_POSITION_Y);\r
+    labelTitle_->Resize(SETTING_TITLE_SIZE_WIDTH, SETTING_TITLE_SIZE_HEIGHT);\r
+    labelTitle_->SetText("设置时间");\r
+    labelTitle_->SetFont(BOLD_VECTOR_FONT_FILENAME, SETTING_TITLE_TEXT_SIZE);\r
+    labelTitle_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+    labelTitle_->SetStyle(STYLE_TEXT_OPA, OPA_OPAQUE);\r
+    labelTitle_->SetStyle(STYLE_TEXT_COLOR, Color::White().full);\r
+    labelTitle_->SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
+    labelTitle_->SetStyle(STYLE_BACKGROUND_OPA, OPA_OPAQUE);\r
+\r
+    if (group_ == nullptr) {\r
     }\r
-    image2 = ImageCacheManager::GetInstance().LoadOneInMultiRes(\r
-        IMAGE_CONVERTER_TOOL_TIMER_BEGIN_ORANGE, TIMER_IMAGE);\r
-    if (image2 == nullptr) {\r
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "LoadTimerImage image2 fail");\r
+    group_ = new UIScrollView();\r
+    if (group_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new group_ fail");\r
         return;\r
     }\r
-    // 标题\r
-    if (title == nullptr) {\r
-        title = new UILabel();\r
-    }\r
-    title->SetPosition(SETTING_TITLE_POSITION_X, SETTING_TITLE_POSITION_Y);\r
-    title->Resize(SETTING_TITLE_SIZE_WIDTH, SETTING_TITLE_SIZE_HEIGHT);\r
-    title->SetText("设置时间");\r
-    title->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SETTING_TITLE_TEXT_SIZE);\r
-    title->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
-    title->SetStyle(STYLE_TEXT_OPA, OPA_OPAQUE);\r
-    title->SetStyle(STYLE_TEXT_COLOR, Color::White().full);\r
-    title->SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
-    title->SetStyle(STYLE_BACKGROUND_OPA, OPA_OPAQUE);\r
-\r
-    if (group == nullptr) {\r
-        group = new UIScrollView();\r
-    }\r
-    group->Resize(HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);\r
-    group->SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
-    group->SetStyle(STYLE_BACKGROUND_OPA, UN_OPACITY);\r
-    group->SetThrowDrag(true);\r
+    group_->Resize(HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);\r
+    group_->SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
+    group_->SetStyle(STYLE_BACKGROUND_OPA, UN_OPACITY);\r
+    group_->SetThrowDrag(true);\r
     CreateLabel();\r
     CreateStartButton();\r
     CreatePicker();\r
-    group->Add(title);\r
-    group->SetOnDragListener(this);\r
-    AddViewToPageContainer(group);\r
+    group_->Add(labelTitle_);\r
+    group_->SetOnDragListener(this);\r
+    AddViewToPageContainer(group_);\r
 }\r
 \r
 void TimerSettingPage::CreateLabel(void)\r
 {\r
-    // Add Label to App\r
-    if (timerLabel == nullptr) {\r
-        timerLabel = new UILabel();\r
+    // 用来显示picker的类型单位:小时、分、秒 同一时间只显示一个picker的类型单位\r
+    labelUnit_ = new UILabel();\r
+    if (labelUnit_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new labelUnit_ fail");\r
+        return;\r
     }\r
-    timerLabel->SetPosition(SETTING_TIMERLABEL_POSITION_X,\r
-        SETTING_TIMERLABEL_POSITION_Y); // widget's left position and top position\r
-    timerLabel->Resize(SETTING_TIMERLABEL_SIZE_WIDTH,\r
-        SETTING_TIMERLABEL_SIZE_HEIGHT);      // widget's width and height\r
-    timerLabel->SetStyle(STYLE_BACKGROUND_COLOR, 0xFFFFBF00);\r
-    timerLabel->SetStyle(STYLE_BACKGROUND_OPA, 0xef);\r
-    timerLabel->SetStyle(STYLE_BORDER_RADIUS, BORDER_RADIUS);\r
-    timerLabel->SetStyle(STYLE_PADDING_TOP, PADDING);\r
-    timerLabel->SetStyle(STYLE_PADDING_BOTTOM, PADDING);\r
-    timerLabel->SetStyle(STYLE_TEXT_FONT, TEXT_FONT);\r
-\r
-    // Set additional property\r
-    timerLabel->SetText("小时");\r
-    timerLabel->SetLineBreakMode(UILabel::LINE_BREAK_WRAP);\r
-    timerLabel->SetTextColor(Color::GetColorFromRGBA(0x00, 0x00, 0x00, 0xff));\r
-    timerLabel->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
-    timerLabel->SetDirect(TEXT_DIRECT_MIXED);\r
-    timerLabel->SetRollSpeed(0);\r
-    timerLabel->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SETTING_TIMERLABEL_FONT);\r
-    timerLabel->SetVisible(false);\r
-    // Add to rootView\r
-    group->Add(timerLabel);\r
+    labelUnit_->SetPosition(SETTING_TIMERLABEL_POSITION_X, SETTING_TIMERLABEL_POSITION_Y);\r
+    labelUnit_->Resize(SETTING_TIMERLABEL_SIZE_WIDTH, SETTING_TIMERLABEL_SIZE_HEIGHT);\r
+    labelUnit_->SetStyle(STYLE_BACKGROUND_COLOR, 0xFFFFBF00);\r
+    labelUnit_->SetStyle(STYLE_BACKGROUND_OPA, 0xef);\r
+    labelUnit_->SetStyle(STYLE_BORDER_RADIUS, BORDER_RADIUS);\r
+    labelUnit_->SetStyle(STYLE_PADDING_TOP, PADDING);\r
+    labelUnit_->SetStyle(STYLE_PADDING_BOTTOM, PADDING);\r
+    labelUnit_->SetStyle(STYLE_TEXT_FONT, TEXT_FONT);\r
+    labelUnit_->SetLineBreakMode(UILabel::LINE_BREAK_WRAP);\r
+    labelUnit_->SetTextColor(Color::GetColorFromRGBA(0x00, 0x00, 0x00, 0xff));\r
+    labelUnit_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+    labelUnit_->SetDirect(TEXT_DIRECT_MIXED);\r
+    labelUnit_->SetRollSpeed(0);\r
+    labelUnit_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SETTING_TIMERLABEL_FONT);\r
+    labelUnit_->SetVisible(false);\r
+    group_->Add(labelUnit_);\r
 }\r
 \r
 void TimerSettingPage::CreateStartButton(void)\r
 {\r
     // 开始按钮\r
-    if (start == nullptr) {\r
-        start = new UIImageView();\r
-        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "TimerTimingPage:: new start UIImageView");\r
+    startImg_ = new UIImageView();\r
+    if (startImg_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new startImg_ fail");\r
+        return;\r
     }\r
-    start->SetPosition(SETTING_START_POSITION_X, SETTING_START_POSITION_Y);\r
-    start->Resize(SETTING_START_SIZE_WIDTH, SETTING_START_SIZE_HEIGHT);\r
-    start->SetViewId(START_TIMING);\r
-    start->SetTouchable(false);\r
-    start->SetOnClickListener(this);\r
-    start->SetSrc(image1);\r
-    group->Add(start);\r
+    startImg_->SetPosition(SETTING_START_POSITION_X, SETTING_START_POSITION_Y);\r
+    startImg_->Resize(SETTING_START_SIZE_WIDTH, SETTING_START_SIZE_HEIGHT);\r
+    startImg_->SetViewId(START_TIMING_BUTTON);\r
+    startImg_->SetTouchable(false);\r
+    startImg_->SetOnClickListener(this);\r
+    LOADIMG::LoadImageViewImg(startImg_, TIMER_IMAGE, IMAGE_TIMER_BEGIN_GRAY);\r
+    group_->Add(startImg_);\r
 }\r
 \r
-// 时间选择器分钟与秒钟列\r
-const char *uiPickerData[] = {"01", "02", "03", "04", "05", "06", "07", "08", "09", "10",\r
-    "11", "12", "13", "14", "15", "16", "17", "18", "19", "20",\r
-    "21", "22", "23", "24", "25", "26", "27", "28", "29", "30",\r
-    "31", "32", "33", "34", "35", "36", "37", "38", "39", "40",\r
-    "41", "42", "43", "44", "45", "46", "47", "48", "49", "50",\r
-    "51", "52", "53", "54", "55", "56", "57", "58", "59", "00"};\r
-\r
-// 时间选择器小时列\r
-const char *uiPicker5Data[] = {"01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11", "12", "13", "14",\r
-    "15", "16", "17", "18", "19", "20", "21", "22", "23", "00"};\r
-\r
 void TimerSettingPage::CreatePicker()\r
 {\r
-    // Add Picker to App\r
-    int posX[TIMERPICKER_MAX] = {TIMERPICKER_POSX1, TIMERPICKER_POSX2, TIMERPICKER_POSX3};\r
+    int posX[PICKER_COUNT] = {TIMERPICKER_POSX1, TIMERPICKER_POSX2, TIMERPICKER_POSX3};\r
     int posY = TIMERPICKER_POSY;\r
-    for (int i = 0; i < TIMERPICKER_MAX; i++) {\r
-        if (timerPicker[i] == nullptr) {\r
-            timerPicker[i] = new UIPicker();\r
+    for (int i = 0; i < PICKER_COUNT; i++) {\r
+        timerPicker_[i] = new UIPicker();\r
+        if (timerPicker_[i] == nullptr) {\r
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new timerPicker_[%d] fail", i);\r
+            return;\r
         }\r
-        timerPicker[i]->SetPosition(posX[i], posY); // widget's left position and top position\r
-        timerPicker[i]->Resize(SETTING_TIMERPICKER_SIZE_WIDTH, SETTING_TIMERPICKER_SIZE_HEIGHT);\r
-        timerPicker[i]->SetViewId("hourPicker");    // Set style\r
-        timerPicker[i]->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
-        timerPicker[i]->SetStyle(STYLE_BORDER_WIDTH, TIMERPICKER_MAX);\r
-        timerPicker[i]->SetStyle(STYLE_BORDER_RADIUS, TIMERPICKER_RADIUS);\r
-        timerPicker[i]->SetStyle(STYLE_BORDER_COLOR, 0xffb9b9b9);\r
-        timerPicker[i]->SetItemHeight(SETTING_TIMERPICKER_ITEM_HEIGHT);\r
-        timerPicker[i]->SetLoopState(true);\r
-        timerPicker[i]->SetBackgroundFont(DEFAULT_VECTOR_FONT_FILENAME, BACKGROUND_FONT);\r
-        timerPicker[i]->SetHighlightFont(DEFAULT_VECTOR_FONT_FILENAME, HIGHTLIGHT_FONT);\r
-        timerPicker[i]->SetTextColor(Color::GetColorFromRGBA(0x64, 0x69, 0x6e, 0xff),\r
-            Color::GetColorFromRGBA(0xff, 0xff, 0xff, 0xff));\r
+        timerPicker_[i]->SetPosition(posX[i], posY);\r
+        timerPicker_[i]->Resize(SETTING_TIMERPICKER_WIDTH, SETTING_TIMERPICKER_HEIGHT);\r
+        timerPicker_[i]->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+        timerPicker_[i]->SetStyle(STYLE_BORDER_WIDTH, PADDING);\r
+        timerPicker_[i]->SetStyle(STYLE_BORDER_RADIUS, TIMERPICKER_RADIUS);\r
+        timerPicker_[i]->SetStyle(STYLE_BORDER_COLOR, 0xffb9b9b9);\r
+        timerPicker_[i]->SetItemHeight(SETTING_TIMERPICKER_ITEM_HEIGHT);\r
+        timerPicker_[i]->SetLoopState(true);\r
+        timerPicker_[i]->SetBackgroundFont(DEFAULT_VECTOR_FONT_FILENAME, BACKGROUND_FONT);\r
+        timerPicker_[i]->SetHighlightFont(DEFAULT_VECTOR_FONT_FILENAME, HIGHTLIGHT_FONT);\r
+        timerPicker_[i]->SetTextColor(Color::GetColorFromRGBA(0x64, 0x69, 0x6e, 0xff),\r
+                                      Color::GetColorFromRGBA(0xff, 0xff, 0xff, 0xff));\r
         if (i == 0) {\r
-            timerPicker[i]->SetValues(uiPicker5Data, SETTING_TIMERPICKER_HOUR);\r
-            timerPicker[i]->SetSelected(SETTING_TIMERPICKER_HOURS);\r
+            timerPicker_[i]->SetValues(g_uiPickerHourData, SETTING_TIMERPICKER_HOUR);\r
+            timerPicker_[i]->SetSelected(SETTING_TIMERPICKER_HOUR_END);\r
         } else {\r
-            timerPicker[i]->SetValues(uiPickerData, SETTING_TIMERPICKER_MIN);\r
-            timerPicker[i]->SetSelected(SETTING_TIMERPICKER_MINS);\r
+            timerPicker_[i]->SetValues(g_uiPickerMinAndSecData, SETTING_TIMERPICKER_MIN);\r
+            timerPicker_[i]->SetSelected(SETTING_TIMERPICKER_MIN_END);\r
         }\r
-        timerPicker[i]->SetOnClickListener(this);\r
-        timerPicker[i]->SetDraggable(true);\r
-        timerPicker[i]->SetOnDragListener(this);\r
-        timerPicker[i]->RegisterSelectedListener(this);\r
-        group->Add(timerPicker[i]);\r
+        timerPicker_[i]->SetOnClickListener(this);\r
+        timerPicker_[i]->SetDraggable(true);\r
+        timerPicker_[i]->SetOnDragListener(this);\r
+        timerPicker_[i]->RegisterSelectedListener(this);\r
+        group_->Add(timerPicker_[i]);\r
     }\r
 \r
-    timerPicker[0]->SetViewId("hourPicker"); // Set style\r
-    timerPicker[1]->SetViewId("minPicker");  // Set style\r
-    timerPicker[SUM_2]->SetViewId("secPicker");  // Set style\r
+    timerPicker_[0]->SetViewId(HOUR_PICKER);\r
+    timerPicker_[1]->SetViewId(MIN_PICKER);\r
+    timerPicker_[INDEX_2]->SetViewId(SEC_PICKER);\r
 }\r
 \r
 bool TimerSettingPage::OnClick(UIView &view, const ClickEvent &event)\r
 {\r
     UNUSED(event);\r
-    std::string viewId = view.GetViewId();\r
-    if (viewId == START_TIMING) {\r
-        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "TimerSettingPage::OnClick viewId == START_TIMING");\r
-        TimerModel::GetInstance().SetSaveTime(true, 0);\r
-        uint8_t hour = std::stoi(uiPicker5Data[timerPicker[0]->GetSelected()]);\r
-        uint8_t minute = std::stoi(uiPickerData[timerPicker[1]->GetSelected()]);\r
-        uint8_t second = std::stoi(uiPickerData[timerPicker[SUM_2]->GetSelected()]);\r
-        uint32_t durationTime = (hour * HOUR_TIME) + (minute * MIN_TIME) + (second);\r
-        TimerModel::GetInstance().SetDurationTime(durationTime);\r
-        NativeAbility::GetInstance().SwitchSlice(VIEW_TIMER, TIMER_PAGES::TIMER_TIMING_PAGE);\r
+    if (strcmp(view.GetViewId(), START_TIMING_BUTTON) == 0) {\r
+        TimerModel::GetInstance().SetEclipseTime(true, 0);\r
+        uint8_t hour = std::stoi(g_uiPickerHourData[timerPicker_[0]->GetSelected()]);\r
+        uint8_t minute = std::stoi(g_uiPickerMinAndSecData[timerPicker_[1]->GetSelected()]);\r
+        uint8_t second = std::stoi(g_uiPickerMinAndSecData[timerPicker_[INDEX_2]->GetSelected()]);\r
+        uint64_t totalTime = (hour * HOUR_TIME) + (minute * MIN_TIME) + (second);\r
+        TimerModel::GetInstance().SetTotalTime(totalTime);\r
+        TimerModel::GetInstance().SetIsShowFragment(true);\r
+        NativeAbility::GetInstance().SwitchPageInSlice(TIMER_PAGES::TIMER_MAIN_PAGE,\r
+            TransitionType::TRANSITION_INVALID, false);\r
     }\r
-    timerLabel->Invalidate();\r
+    labelUnit_->Invalidate();\r
     return true;\r
 }\r
 \r
 bool TimerSettingPage::OnDrag(UIView &view, const DragEvent &event)\r
 {\r
-    if ((event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT) &&\r
-        (event.GetDeltaX() > X_DRAG_OFFSET) && (event.GetDeltaX() > (DOUBLES * MATH_ABS(event.GetDeltaY())))) {\r
-        NativeAbility::GetInstance().SwitchSlice(VIEW_TIMER, TIMER_PAGES::TIMER_MAIN_PAGE);\r
-        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "TimerSettingPage::OnDrag SwitchSlice(TIMER_MAIN_PAGE)");\r
+    if ((event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT) && (event.GetDeltaX() > X_DRAG_OFFSET) &&\r
+        (event.GetDeltaX() > (DOUBLES * MATH_ABS(event.GetDeltaY())))) {\r
+        NativeAbility::GetInstance().SwitchPageInSlice(TIMER_PAGES::TIMER_MAIN_PAGE,\r
+            TransitionType::TRANSITION_INVALID, false);\r
     }\r
-    if (view.GetViewId() == "hourPicker") {\r
-        timerPicker[0]->SetStyle(STYLE_BORDER_COLOR, Color::Orange().full);\r
-        timerPicker[1]->SetStyle(STYLE_BORDER_COLOR, Color::Gray().full);\r
-        timerPicker[SUM_2]->SetStyle(STYLE_BORDER_COLOR, Color::Gray().full);\r
-        timerPicker[0]->Invalidate();\r
-        timerPicker[1]->Invalidate();\r
-        timerPicker[SUM_2]->Invalidate();\r
-        timerLabel->SetVisible(true);\r
-        timerLabel->SetPosition(POX1_MIN, SETTING_TIMERLABEL_POSITION_Y);\r
-        timerLabel->SetText("小时");\r
-        timerLabel->Invalidate();\r
-    } else if (view.GetViewId() == "minPicker") {\r
-        timerPicker[0]->SetStyle(STYLE_BORDER_COLOR, Color::Gray().full);\r
-        timerPicker[1]->SetStyle(STYLE_BORDER_COLOR, Color::Orange().full);\r
-        timerPicker[SUM_2]->SetStyle(STYLE_BORDER_COLOR, Color::Gray().full);\r
-        timerPicker[0]->Invalidate();\r
-        timerPicker[1]->Invalidate();\r
-        timerPicker[SUM_2]->Invalidate();\r
-        timerLabel->SetVisible(true);\r
-        timerLabel->SetPosition(POX2_MIN, SETTING_TIMERLABEL_POSITION_Y);\r
-        timerLabel->SetText("分钟");\r
-        timerLabel->Invalidate();\r
-    }  else if (view.GetViewId() == "secPicker") {\r
-        timerPicker[1]->SetStyle(STYLE_BORDER_COLOR, Color::Gray().full);\r
-        timerPicker[0]->SetStyle(STYLE_BORDER_COLOR, Color::Gray().full);\r
-        timerPicker[SUM_2]->SetStyle(STYLE_BORDER_COLOR, Color::Orange().full);\r
-        timerPicker[0]->Invalidate();\r
-        timerPicker[1]->Invalidate();\r
-        timerPicker[SUM_2]->Invalidate();\r
-        timerLabel->SetVisible(true);\r
-        timerLabel->SetPosition(POX3_MIN, SETTING_TIMERLABEL_POSITION_Y);\r
-        timerLabel->SetText("秒");\r
-        timerLabel->Invalidate();\r
+    if (strcmp(view.GetViewId(), HOUR_PICKER) == 0) {\r
+        timerPicker_[0]->SetStyle(STYLE_BORDER_COLOR, Color::Orange().full);\r
+        timerPicker_[1]->SetStyle(STYLE_BORDER_COLOR, Color::Gray().full);\r
+        timerPicker_[INDEX_2]->SetStyle(STYLE_BORDER_COLOR, Color::Gray().full);\r
+        timerPicker_[0]->Invalidate();\r
+        timerPicker_[1]->Invalidate();\r
+        timerPicker_[INDEX_2]->Invalidate();\r
+        labelUnit_->SetVisible(true);\r
+        labelUnit_->SetPosition(POX1_MIN, SETTING_TIMERLABEL_POSITION_Y);\r
+        labelUnit_->SetText("小时");\r
+        labelUnit_->Invalidate();\r
+    } else if (strcmp(view.GetViewId(), MIN_PICKER) == 0) {\r
+        timerPicker_[0]->SetStyle(STYLE_BORDER_COLOR, Color::Gray().full);\r
+        timerPicker_[1]->SetStyle(STYLE_BORDER_COLOR, Color::Orange().full);\r
+        timerPicker_[INDEX_2]->SetStyle(STYLE_BORDER_COLOR, Color::Gray().full);\r
+        timerPicker_[0]->Invalidate();\r
+        timerPicker_[1]->Invalidate();\r
+        timerPicker_[INDEX_2]->Invalidate();\r
+        labelUnit_->SetVisible(true);\r
+        labelUnit_->SetPosition(POX2_MIN, SETTING_TIMERLABEL_POSITION_Y);\r
+        labelUnit_->SetText("分钟");\r
+        labelUnit_->Invalidate();\r
+    } else if (strcmp(view.GetViewId(), SEC_PICKER) == 0) {\r
+        timerPicker_[1]->SetStyle(STYLE_BORDER_COLOR, Color::Gray().full);\r
+        timerPicker_[0]->SetStyle(STYLE_BORDER_COLOR, Color::Gray().full);\r
+        timerPicker_[INDEX_2]->SetStyle(STYLE_BORDER_COLOR, Color::Orange().full);\r
+        timerPicker_[0]->Invalidate();\r
+        timerPicker_[1]->Invalidate();\r
+        timerPicker_[INDEX_2]->Invalidate();\r
+        labelUnit_->SetVisible(true);\r
+        labelUnit_->SetPosition(POX3_MIN, SETTING_TIMERLABEL_POSITION_Y);\r
+        labelUnit_->SetText("秒");\r
+        labelUnit_->Invalidate();\r
     }\r
     return true;\r
 }\r
 \r
-void TimerSettingPage::OnPickerStoped(UIPicker& picker)\r
+void TimerSettingPage::OnPickerStoped(UIPicker &picker)\r
 {\r
-    if (picker.GetViewId() == "hourPicker") {\r
+    if (strcmp(picker.GetViewId(), HOUR_PICKER) == 0) {\r
         uint16_t hour = picker.GetSelected();\r
-        timerPicker[0]->SetStyle(STYLE_BORDER_COLOR, Color::Orange().full);\r
-        timerPicker[1]->SetStyle(STYLE_BORDER_COLOR, Color::Gray().full);\r
-        timerPicker[SUM_2]->SetStyle(STYLE_BORDER_COLOR, Color::Gray().full);\r
-        timerPicker[0]->Invalidate();\r
-        timerPicker[1]->Invalidate();\r
-        timerPicker[SUM_2]->Invalidate();\r
-        if ((hour == SETTING_TIMERPICKER_HOURS) && (timerPicker[1]->GetSelected() == SETTING_TIMERPICKER_MINS) &&\r
-            (timerPicker[SUM_2]->GetSelected() == SETTING_TIMERPICKER_MINS)) {\r
-            start->SetTouchable(false);\r
-            start->SetSrc(image1);\r
+        timerPicker_[0]->SetStyle(STYLE_BORDER_COLOR, Color::Orange().full);\r
+        timerPicker_[1]->SetStyle(STYLE_BORDER_COLOR, Color::Gray().full);\r
+        timerPicker_[INDEX_2]->SetStyle(STYLE_BORDER_COLOR, Color::Gray().full);\r
+        timerPicker_[0]->Invalidate();\r
+        timerPicker_[1]->Invalidate();\r
+        timerPicker_[INDEX_2]->Invalidate();\r
+        if ((hour == SETTING_TIMERPICKER_HOUR_END) && (timerPicker_[1]->GetSelected() == SETTING_TIMERPICKER_MIN_END) &&\r
+            (timerPicker_[INDEX_2]->GetSelected() == SETTING_TIMERPICKER_MIN_END)) {\r
+            startImg_->SetTouchable(false);\r
+            LOADIMG::LoadImageViewImg(startImg_, TIMER_IMAGE, IMAGE_TIMER_BEGIN_GRAY);\r
         } else {\r
-            start->SetTouchable(true);\r
-            start->SetSrc(image2);\r
+            startImg_->SetTouchable(true);\r
+            LOADIMG::LoadImageViewImg(startImg_, TIMER_IMAGE, IMAGE_TIMER_BEGIN_ORANGE);\r
         }\r
-        timerLabel->SetVisible(true);\r
-        timerLabel->SetPosition(POX1_MIN, SETTING_TIMERLABEL_POSITION_Y);\r
-        timerLabel->SetText("小时");\r
-        timerLabel->Invalidate();\r
-    } else if (picker.GetViewId() == "minPicker") {\r
+        labelUnit_->SetVisible(true);\r
+        labelUnit_->SetPosition(POX1_MIN, SETTING_TIMERLABEL_POSITION_Y);\r
+        labelUnit_->SetText("小时");\r
+        labelUnit_->Invalidate();\r
+    } else if (strcmp(picker.GetViewId(), MIN_PICKER) == 0) {\r
         uint16_t minute = picker.GetSelected();\r
-        timerPicker[0]->SetStyle(STYLE_BORDER_COLOR, Color::Gray().full);\r
-        timerPicker[1]->SetStyle(STYLE_BORDER_COLOR, Color::Orange().full);\r
-        timerPicker[SUM_2]->SetStyle(STYLE_BORDER_COLOR, Color::Gray().full);\r
-        timerPicker[0]->Invalidate();\r
-        timerPicker[1]->Invalidate();\r
-        timerPicker[SUM_2]->Invalidate();\r
-        if ((timerPicker[0]->GetSelected() == SETTING_TIMERPICKER_HOURS) && (minute == SETTING_TIMERPICKER_MINS) &&\r
-        (timerPicker[SUM_2]->GetSelected() == SETTING_TIMERPICKER_MINS)) {\r
-            start->SetTouchable(false);\r
-            start->SetSrc(image1);\r
+        timerPicker_[0]->SetStyle(STYLE_BORDER_COLOR, Color::Gray().full);\r
+        timerPicker_[1]->SetStyle(STYLE_BORDER_COLOR, Color::Orange().full);\r
+        timerPicker_[INDEX_2]->SetStyle(STYLE_BORDER_COLOR, Color::Gray().full);\r
+        timerPicker_[0]->Invalidate();\r
+        timerPicker_[1]->Invalidate();\r
+        timerPicker_[INDEX_2]->Invalidate();\r
+        if ((timerPicker_[0]->GetSelected() == SETTING_TIMERPICKER_HOUR_END) && (minute == SETTING_TIMERPICKER_MIN_END) &&\r
+            (timerPicker_[INDEX_2]->GetSelected() == SETTING_TIMERPICKER_MIN_END)) {\r
+            startImg_->SetTouchable(false);\r
+            LOADIMG::LoadImageViewImg(startImg_, TIMER_IMAGE, IMAGE_TIMER_BEGIN_GRAY);\r
         } else {\r
-            start->SetTouchable(true);\r
-            start->SetSrc(image2);\r
+            startImg_->SetTouchable(true);\r
+            LOADIMG::LoadImageViewImg(startImg_, TIMER_IMAGE, IMAGE_TIMER_BEGIN_ORANGE);\r
         }\r
-        timerLabel->SetVisible(true);\r
-        timerLabel->SetPosition(POX2_MIN, SETTING_TIMERLABEL_POSITION_Y);\r
-        timerLabel->SetText("分钟");\r
-        timerLabel->Invalidate();\r
-    } else {\r
+        labelUnit_->SetVisible(true);\r
+        labelUnit_->SetPosition(POX2_MIN, SETTING_TIMERLABEL_POSITION_Y);\r
+        labelUnit_->SetText("分钟");\r
+        labelUnit_->Invalidate();\r
+    } else if (strcmp(picker.GetViewId(), SEC_PICKER) == 0) {\r
         uint16_t sec = picker.GetSelected();\r
-        timerPicker[0]->SetStyle(STYLE_BORDER_COLOR, Color::Gray().full);\r
-        timerPicker[1]->SetStyle(STYLE_BORDER_COLOR, Color::Gray().full);\r
-        timerPicker[SUM_2]->SetStyle(STYLE_BORDER_COLOR, Color::Orange().full);\r
-        timerPicker[0]->Invalidate();\r
-        timerPicker[1]->Invalidate();\r
-        timerPicker[SUM_2]->Invalidate();\r
-        if ((timerPicker[0]->GetSelected() == SETTING_TIMERPICKER_HOURS) &&\r
-        (timerPicker[1]->GetSelected() == SETTING_TIMERPICKER_MINS) && (sec == SETTING_TIMERPICKER_MINS)) {\r
-            start->SetTouchable(false);\r
-            start->SetSrc(image1);\r
+        timerPicker_[0]->SetStyle(STYLE_BORDER_COLOR, Color::Gray().full);\r
+        timerPicker_[1]->SetStyle(STYLE_BORDER_COLOR, Color::Gray().full);\r
+        timerPicker_[INDEX_2]->SetStyle(STYLE_BORDER_COLOR, Color::Orange().full);\r
+        timerPicker_[0]->Invalidate();\r
+        timerPicker_[1]->Invalidate();\r
+        timerPicker_[INDEX_2]->Invalidate();\r
+        if ((timerPicker_[0]->GetSelected() == SETTING_TIMERPICKER_HOUR_END) &&\r
+            (timerPicker_[1]->GetSelected() == SETTING_TIMERPICKER_MIN_END) && (sec == SETTING_TIMERPICKER_MIN_END)) {\r
+            startImg_->SetTouchable(false);\r
+            LOADIMG::LoadImageViewImg(startImg_, TIMER_IMAGE, IMAGE_TIMER_BEGIN_GRAY);\r
         } else {\r
-            start->SetTouchable(true);\r
-            start->SetSrc(image2);\r
+            startImg_->SetTouchable(true);\r
+            LOADIMG::LoadImageViewImg(startImg_, TIMER_IMAGE, IMAGE_TIMER_BEGIN_ORANGE);\r
         }\r
-        timerLabel->SetVisible(true);\r
-        timerLabel->SetPosition(POX3_MIN, SETTING_TIMERLABEL_POSITION_Y);\r
-        timerLabel->SetText("秒");\r
-        timerLabel->Invalidate();\r
+        labelUnit_->SetVisible(true);\r
+        labelUnit_->SetPosition(POX3_MIN, SETTING_TIMERLABEL_POSITION_Y);\r
+        labelUnit_->SetText("秒");\r
+        labelUnit_->Invalidate();\r
     }\r
 }\r
 }
\ No newline at end of file
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/uisample/src/UISampleMainPage.cpp b/code/sdk/application/wearable/evb/nativeapp/nativeui/uisample/src/UISampleMainPage.cpp
new file mode 100644 (file)
index 0000000..bda8d01
--- /dev/null
@@ -0,0 +1,195 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025. All rights reserved.\r
+ * Description: TestCase\r
+ * Author: Hisi Graphic Team\r
+ * Created: 2025-7\r
+ */\r
+\r
+#include "uisample/UISampleMainPage.h"\r
+#include "uisample/UISampleModel.h"\r
+#include "uisample/UISampleView.h"\r
+#include "NativeAbility.h"\r
+#include "SlicePageFactory.h"\r
+#include "PageTransitionMgr.h"\r
+#include "common/image_cache_manager.h"\r
+#include "ui_resource_date.h"\r
+#include "main/LoadImg.h"\r
+#include "components/ui_label_button.h"\r
+#include "components/ui_list_nested.h"\r
+#include "components/ui_scroll_view_nested.h"\r
+#include "ui_test.h"\r
+\r
+namespace OHOS {\r
+namespace {\r
+const uint16_t TESTCASE_BUTTON_HEIGHT = 100;\r
+const uint16_t STYLE_BORDER_WIDTH_VALUE = 4;\r
+static int16_t SAMPLE_TITLE_TEXT_SIZE = 38;\r
+} // namespace\r
+REGIST_SLICE_PAGE(VIEW_UISAMPLE, SAMPLE_PAGES::SAMPLE_MAIN_PAGE, UISampleMainPage, true);\r
+static UISampleMainPage* g_instance = nullptr;\r
+\r
+UISampleMainPage::UISampleMainPage()\r
+{\r
+    g_instance = this;\r
+}\r
+\r
+UISampleMainPage* UISampleMainPage::GetInstance()\r
+{\r
+    return g_instance;\r
+}\r
+\r
+UISampleMainPage::~UISampleMainPage()\r
+{\r
+    if (container_ != nullptr) {\r
+        container_->RemoveAll();\r
+        delete container_;\r
+        container_ = nullptr;\r
+    }\r
+\r
+    if (title_ != nullptr) {\r
+        delete title_;\r
+        title_ = nullptr;\r
+    }\r
+\r
+    if (mainList_ != nullptr) {\r
+        delete mainList_;\r
+        mainList_ = nullptr;\r
+    }\r
+    g_instance = nullptr;\r
+}\r
+\r
+static void UpdateViewCb(UIView* view, void* data, uint8_t type)\r
+{\r
+    UNUSED(type);\r
+    UILabelButton* item = dynamic_cast<UILabelButton*>(view);\r
+    if (item != nullptr) {\r
+        TestCaseInfo* info = static_cast<TestCaseInfo *>(data);\r
+        if (info != nullptr) {\r
+            item->SetText(info->sliceId);\r
+            item->SetViewId(info->sliceId);\r
+        }\r
+    }\r
+}\r
+\r
+static UIView* CreateViewCb(uint8_t type)\r
+{\r
+    UILabelButton* item = new UILabelButton();\r
+    if (item == nullptr) {\r
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Create item faild!");\r
+        return nullptr;\r
+    }\r
+\r
+    item->SetPosition(0, 0);\r
+    item->SetStyleForState(STYLE_BORDER_WIDTH, STYLE_BORDER_WIDTH_VALUE, UIButton::RELEASED);\r
+    item->SetStyleForState(STYLE_BORDER_WIDTH, STYLE_BORDER_WIDTH_VALUE, UIButton::PRESSED);\r
+    item->SetStyleForState(STYLE_BORDER_WIDTH, STYLE_BORDER_WIDTH_VALUE, UIButton::INACTIVE);\r
+    item->SetStyleForState(STYLE_BORDER_OPA, 0, UIButton::RELEASED);\r
+    item->SetStyleForState(STYLE_BORDER_OPA, 0, UIButton::PRESSED);\r
+    item->SetStyleForState(STYLE_BORDER_OPA, 0, UIButton::INACTIVE);\r
+    item->SetStyleForState(STYLE_BORDER_RADIUS, 0, UIButton::RELEASED);\r
+    item->SetStyleForState(STYLE_BORDER_RADIUS, 0, UIButton::PRESSED);\r
+    item->SetStyleForState(STYLE_BORDER_RADIUS, 0, UIButton::INACTIVE);\r
+    item->SetStyleForState(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT, UIButton::RELEASED);\r
+    item->SetStyleForState(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT, UIButton::PRESSED);\r
+    item->SetStyleForState(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT, UIButton::INACTIVE);\r
+    item->Resize(HORIZONTAL_RESOLUTION - TEXT_DISTANCE_TO_LEFT_SIDE, TESTCASE_BUTTON_HEIGHT);\r
+    item->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 40); // 40: means font size\r
+    item->SetAlign(TEXT_ALIGNMENT_LEFT);\r
+    item->SetLabelPosition(150, 0); // 150: label x-coordinate\r
+    item->SetOnClickListener(UISampleMainPage::GetInstance());\r
+    return item;\r
+}\r
+\r
+void UISampleMainPage::OnStart(void *data)\r
+{\r
+    if (container_ == nullptr) {\r
+        container_ = new UIScrollViewNested();\r
+        if (container_ == nullptr) {\r
+            WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, " UISampleMainPage::OnStart::container_ is nullptr");\r
+            return;\r
+        }\r
+    }\r
+    container_->Resize(HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);\r
+    container_->SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
+    container_->SetStyle(STYLE_BACKGROUND_OPA, UN_OPACITY);\r
+    container_->SetVisible(true);\r
+\r
+    CreateTitle();\r
+    CreateMainList();\r
+    AddViewToPageContainer(container_);\r
+    container_->Invalidate();\r
+}\r
+\r
+void UISampleMainPage::CreateTitle()\r
+{\r
+    if (title_ == nullptr) {\r
+        title_ = new UILabel();\r
+        if (title_ == nullptr) {\r
+            WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, " UISampleMainPage::OnStart::title_ is nullptr");\r
+            return;\r
+        }\r
+    }\r
+\r
+    title_->SetPosition(130, 0, 185, 80); // tile position x:130 size w: 185 h: 80\r
+    title_->SetText("用例");\r
+    title_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SAMPLE_TITLE_TEXT_SIZE);\r
+    title_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+    title_->SetStyle(STYLE_TEXT_OPA, OPA_OPAQUE);\r
+    title_->SetStyle(STYLE_TEXT_COLOR, Color::White().full);\r
+    title_->SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
+    title_->SetStyle(STYLE_BACKGROUND_OPA, OPA_OPAQUE);\r
+    container_->Add(title_);\r
+}\r
+\r
+void UISampleMainPage::CreateMainList()\r
+{\r
+    if (mainList_ == nullptr) {\r
+        mainList_ = new UISimpleList();\r
+        if (mainList_ == nullptr) {\r
+            WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, " UISampleMainPage::OnStart::mainList_ is nullptr");\r
+            return;\r
+        }\r
+    }\r
+    mainList_->SetPosition(0, 100, 600, 600); // position: y: 100 w: 600 h:600\r
+    mainList_->SetThrowDrag(true);\r
+    mainList_->SetReboundSize(100); // 100: reboind size\r
+    mainList_->SetElastic(true);\r
+    container_->Add(mainList_);\r
+\r
+    if (PageTransitionMgr::GetInstance().GetTopSlideBackImage() == nullptr) {\r
+        mainList_->SetOnDragListener(this);\r
+    }\r
+    UITestGroup::GetInstance()->SetUpTestCase();\r
+    List<TestCaseInfo>* testCaseList = UITestGroup::GetInstance()->GetTestCase();\r
+    Contents content = {};\r
+    for (auto node = testCaseList->Begin(); node != testCaseList->End(); node = node->next_) {\r
+        content.createFunc = CreateViewCb;\r
+        content.updateFunc = UpdateViewCb;\r
+        content.type = 1;\r
+        content.data = reinterpret_cast<void *>(&(node->data_));\r
+        mainList_->AddContent(content);\r
+    }\r
+    mainList_->RefreshList();\r
+}\r
+\r
+bool UISampleMainPage::OnClick(UIView& view, const ClickEvent& event)\r
+{\r
+    if (strcmp(view.GetViewId(), "自研用例") == 0) {\r
+        NativeAbility::GetInstance().SwitchPageInSlice(SAMPLE_PAGES::SAMPLE_PROPRIETARY_TESTCASE_PAGE);\r
+    } else if (strcmp(view.GetViewId(), "开源用例") == 0) {\r
+        NativeAbility::GetInstance().SwitchPageInSlice(SAMPLE_PAGES::SAMPLE_NATIVE_TESTCASE_PAGE);\r
+    }\r
+    return true;\r
+}\r
+\r
+bool UISampleMainPage::OnDrag(UIView& view, const DragEvent& event)\r
+{\r
+    UNUSED(view);\r
+    if ((event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT) &&\r
+        (event.GetDeltaX() > X_DRAG_OFFSET) && (event.GetDeltaX() > (DOUBLES * MATH_ABS(event.GetDeltaY())))) {\r
+        NativeAbility::GetInstance().ChangeSliceToApplist();\r
+    }\r
+    return true;\r
+}\r
+}\r
+\r
index 68a7572..142ee48 100644 (file)
@@ -1,21 +1,21 @@
-/*
- * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved.
- * Description: SettingModel.cpp
- * Author:
- * Create: 2021-11-23
- */
-
-#include "uisample/UISampleModel.h"
-
-namespace OHOS {
-    UISampleModel::UISampleModel() {}
-
-    UISampleModel::~UISampleModel() {}
-
-    UISampleModel &UISampleModel::GetInstance()
-    {
-        static UISampleModel instance;
-        return instance;
-    }
-
-}
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025. All rights reserved.\r
+ * Description: TestCase\r
+ * Author: Hisi Graphic Team\r
+ * Created: 2025-7\r
+ */\r
+\r
+#include "uisample/UISampleModel.h"\r
+\r
+namespace OHOS {\r
+    UISampleModel::UISampleModel() {}\r
+\r
+    UISampleModel::~UISampleModel() {}\r
+\r
+    UISampleModel &UISampleModel::GetInstance()\r
+    {\r
+        static UISampleModel instance;\r
+        return instance;\r
+    }\r
+\r
+}\r
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/uisample/src/UISampleNativeTestCasePage.cpp b/code/sdk/application/wearable/evb/nativeapp/nativeui/uisample/src/UISampleNativeTestCasePage.cpp
new file mode 100644 (file)
index 0000000..d978413
--- /dev/null
@@ -0,0 +1,254 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025. All rights reserved.\r
+ * Description: TestCase\r
+ * Author: Hisi Graphic Team\r
+ * Created: 2025-7\r
+ */\r
+#include "uisample/UISampleNativeTestCasePage.h"\r
+#include "uisample/UISampleModel.h"\r
+#include "uisample/UISampleView.h"\r
+#include "NativeAbility.h"\r
+#include "SlicePageFactory.h"\r
+#include "PageTransitionMgr.h"\r
+#include "UiConfig.h"\r
+#include "common/image_cache_manager.h"\r
+#include "ui_resource_date.h"\r
+#include "main/LoadImg.h"\r
+#include "components/root_view.h"\r
+#include "components/ui_label.h"\r
+#include "components/ui_list_nested.h"\r
+#include "components/ui_scroll_view_nested.h"\r
+#include "View.h"\r
+#include "ui_test.h"\r
+\r
+namespace OHOS {\r
+namespace {\r
+const uint16_t TESTCASE_BUTTON_HEIGHT = 100;\r
+static int16_t SAMPLE_TITLE_TEXT_SIZE = 38;\r
+} // namespace\r
+\r
+REGIST_SLICE_PAGE(VIEW_UISAMPLE, SAMPLE_PAGES::SAMPLE_NATIVE_TESTCASE_PAGE, UISampleNativeTestCasePage, false);\r
+static UISampleNativeTestCasePage* g_instance = nullptr;\r
+static RootView::OnKeyActListener *g_keyListener = nullptr;\r
+\r
+UISampleNativeTestCasePage::UISampleNativeTestCasePage()\r
+{\r
+    g_instance = this;\r
+}\r
+\r
+UISampleNativeTestCasePage* UISampleNativeTestCasePage::GetInstance()\r
+{\r
+    return g_instance;\r
+}\r
+\r
+UISampleNativeTestCasePage::~UISampleNativeTestCasePage()\r
+{\r
+    if (container_ != nullptr) {\r
+        container_->RemoveAll();\r
+        delete container_;\r
+        container_ = nullptr;\r
+    }\r
+\r
+    if (title_ != nullptr) {\r
+        delete title_;\r
+        title_ = nullptr;\r
+    }\r
+\r
+    if (mainList_ != nullptr) {\r
+        delete mainList_;\r
+        mainList_ = nullptr;\r
+    }\r
+\r
+    if (backBtn_ != nullptr) {\r
+        delete backBtn_;\r
+        backBtn_ = nullptr;\r
+    }\r
+    g_instance = nullptr;\r
+    isInTestCase_ = false;\r
+}\r
+\r
+static UIView* CreateViewCb(uint8_t type)\r
+{\r
+    UILabel* item = new UILabel();\r
+    if (item == nullptr) {\r
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Create item faild!");\r
+        return nullptr;\r
+    }\r
+\r
+    item->SetPosition(0, 0, Screen::GetInstance().GetWidth(), TESTCASE_BUTTON_HEIGHT);\r
+    item->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+    item->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 40); // 40: means font size\r
+    item->SetLineBreakMode(UILabel::LINE_BREAK_MARQUEE);\r
+    item->SetTouchable(true);\r
+    item->SetOnClickListener(UISampleNativeTestCasePage::GetInstance());\r
+    return item;\r
+}\r
+\r
+static void UpdateViewCb(UIView* view, void* data, uint8_t type)\r
+{\r
+    UNUSED(type);\r
+    UILabel* item = dynamic_cast<UILabel*>(view);\r
+    if (item != nullptr) {\r
+        TestCaseInfo* info = static_cast<TestCaseInfo *>(data);\r
+        if (info != nullptr) {\r
+            item->SetText(info->sliceId);\r
+            item->SetViewId(info->sliceId);\r
+        }\r
+    }\r
+}\r
+\r
+bool UISampleNativeTestCasePage::BackMenuPage(UIView& view)\r
+{\r
+    if (container_ != nullptr) {\r
+        container_->RemoveAll();\r
+\r
+        UITest* uiTest = UITestGroup::GetInstance()->GetTestCase(view.GetViewId());\r
+        if (uiTest != nullptr) {\r
+            uiTest->TearDown();\r
+        }\r
+\r
+        RootView::GetInstance()->SetOnKeyActListener(g_keyListener);\r
+        g_keyListener = nullptr;\r
+        isInTestCase_ = false;\r
+\r
+        container_->Add(title_);\r
+        container_->Add(mainList_);\r
+        container_->Invalidate();\r
+    }\r
+    return true;\r
+}\r
+\r
+void UISampleNativeTestCasePage::OnStart(void *data)\r
+{\r
+    if (container_ == nullptr) {\r
+        container_ = new UIScrollViewNested();\r
+        if (container_ == nullptr) {\r
+            WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, " UISampleNativeTestCasePage::OnStart::container_ is nullptr");\r
+            return;\r
+        }\r
+    }\r
+    container_->Resize(HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);\r
+    container_->SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
+    container_->SetStyle(STYLE_BACKGROUND_OPA, UN_OPACITY);\r
+    container_->SetVisible(true);\r
+\r
+    CreateTitle();\r
+    CreateMainList();\r
+    CreateBackButton();\r
+    AddViewToPageContainer(container_);\r
+    container_->Invalidate();\r
+}\r
+\r
+void UISampleNativeTestCasePage::CreateTitle()\r
+{\r
+    if (title_ == nullptr) {\r
+        title_ = new UILabel();\r
+        if (title_ == nullptr) {\r
+            WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, " UISampleNativeTestCasePage::OnStart::title_ is nullptr");\r
+            return;\r
+        }\r
+    }\r
+    title_->SetPosition(130, 0, 185, 80); // tile position x:130 size w: 185 h: 80\r
+    title_->SetText("开源用例");\r
+    title_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SAMPLE_TITLE_TEXT_SIZE);\r
+    title_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+    title_->SetStyle(STYLE_TEXT_OPA, OPA_OPAQUE);\r
+    title_->SetStyle(STYLE_TEXT_COLOR, Color::White().full);\r
+    title_->SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
+    title_->SetStyle(STYLE_BACKGROUND_OPA, OPA_OPAQUE);\r
+    container_->Add(title_);\r
+}\r
+\r
+void UISampleNativeTestCasePage::CreateMainList()\r
+{\r
+    if (mainList_ == nullptr) {\r
+        mainList_ = new UISimpleList();\r
+    }\r
+    if (mainList_ == nullptr) {\r
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, " UISampleNativeTestCasePage::OnStart::mainList_ is nullptr");\r
+        return;\r
+    }\r
+    mainList_->SetPosition(0, 100, Screen::GetInstance().GetWidth(), 366); // position: y: 100 w: 600 h:600\r
+    mainList_->SetViewId("sample");\r
+    mainList_->SetThrowDrag(true);\r
+    mainList_->SetReboundSize(100); // 100: reboind size\r
+    mainList_->SetElastic(true);\r
+    container_->Add(mainList_);\r
+    mainList_->SetOnDragListener(this);\r
+\r
+    UITestGroup::GetInstance()->SetUpOHTestCase();\r
+    mainList_->ClearAll();\r
+    List<TestCaseInfo>* testCaseList = UITestGroup::GetInstance()->GetTestCase();\r
+    Contents content = {};\r
+    for (auto node = testCaseList->Begin(); node != testCaseList->End(); node = node->next_) {\r
+        content.createFunc = CreateViewCb;\r
+        content.updateFunc = UpdateViewCb;\r
+        content.type = 1;\r
+        content.data = reinterpret_cast<void *>(&(node->data_));\r
+        mainList_->AddContent(content);\r
+    }\r
+    mainList_->RefreshList();\r
+}\r
+\r
+void UISampleNativeTestCasePage::CreateBackButton()\r
+{\r
+    if (backBtn_ == nullptr) {\r
+        backBtn_ = new UIButton();\r
+    }\r
+    if (backBtn_ != nullptr) {\r
+        backBtn_->SetPosition(0, 202, 50, 50); // 0: x position, 202: y position, 50: width and height\r
+        backBtn_->SetStyleForState(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT, UIButton::RELEASED);\r
+        backBtn_->SetStyleForState(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT, UIButton::PRESSED);\r
+        backBtn_->SetStyleForState(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT, UIButton::INACTIVE);\r
+        backBtn_->SetOnClickListener(this);\r
+    }\r
+}\r
+\r
+bool UISampleNativeTestCasePage::OnClick(UIView& view, const ClickEvent& event)\r
+{\r
+    if (isInTestCase_) {\r
+       return BackMenuPage(view);\r
+    }\r
+\r
+    if (container_ == nullptr) {\r
+        return false;\r
+    }\r
+\r
+    UITest* uiTest = UITestGroup::GetInstance()->GetTestCase(view.GetViewId());\r
+    if (uiTest == nullptr) {\r
+        return false;\r
+    }\r
+    uiTest->SetUp();\r
+    container_->RemoveAll();\r
+\r
+    UIView* tempView = const_cast<UIView*>(uiTest->GetTestView());\r
+    if (tempView != nullptr) {\r
+        tempView->SetTouchable(true);\r
+        tempView->SetViewId(view.GetViewId());\r
+        tempView->SetPosition(tempView->GetX(), tempView->GetY());\r
+        container_->Add(tempView);\r
+\r
+        g_keyListener = RootView::GetInstance()->GetOnKeyActListener();\r
+        RootView::GetInstance()->SetOnKeyActListener(nullptr);\r
+    }\r
+\r
+    if (backBtn_ != nullptr) {\r
+        backBtn_->SetViewId(view.GetViewId());\r
+        container_->Add(backBtn_);\r
+    }\r
+\r
+    isInTestCase_ = true;\r
+    container_->Invalidate();\r
+    return true;\r
+}\r
+\r
+bool UISampleNativeTestCasePage::OnDrag(UIView& view, const DragEvent& event)\r
+{\r
+    UNUSED(view);\r
+    if ((event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT) &&\r
+        (event.GetDeltaX() > X_DRAG_OFFSET) && (event.GetDeltaX() > (DOUBLES * MATH_ABS(event.GetDeltaY())))) {\r
+        NativeAbility::GetInstance().SwitchPageInSlice(SAMPLE_MAIN_PAGE);\r
+    }\r
+    return true;\r
+}\r
+}
\ No newline at end of file
index 7d42911..26d5026 100644 (file)
@@ -1,36 +1,36 @@
-/*
- * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved.
- * Description: SettingPresenter.cpp
- * Author:
- * Create: 2021-11-23
- */
-
-#include "uisample/UISampleView.h"
-#include "uisample/UISampleModel.h"
-#include "uisample/UISamplePresenter.h"
-#include "uiservice/ui_service.h"
-#include "NativeRegisterManager.h"
-
-namespace OHOS {
-
-REGIST_MENU(VIEW_UISAMPLE, UISampleView, UISamplePresenter, PNG_APPLIST_UI_SAMPLE_IMAGE, PNG_APPLIST_DEFAULT_IMG, "示例");
-
-    UISamplePresenter::UISamplePresenter()
-    {
-        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "UISamplePresenter::UISamplePresenter");
-        uisampleModel = &UISampleModel::GetInstance();
-    }
-
-    UISamplePresenter::~UISamplePresenter() {}
-
-    void UISamplePresenter::OnResume(void)
-    {
-        SendMsgToUIService(UI_ADD_SLEEP_VETO, 0, nullptr, 0);
-    }
-
-    void UISamplePresenter::OnPause(void)
-    {
-        SendMsgToUIService(UI_RM_SLEEP_VETO, 0, nullptr, 0);
-        return;
-    }
-}
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025. All rights reserved.\r
+ * Description: TestCase\r
+ * Author: Hisi Graphic Team\r
+ * Created: 2025-7\r
+ */\r
+\r
+#include "uisample/UISamplePresenter.h"\r
+#include "uisample/UISampleView.h"\r
+#include "uisample/UISampleModel.h"\r
+#include "uiservice/ui_service.h"\r
+#include "NativeRegisterManager.h"\r
+\r
+namespace OHOS {\r
+\r
+REGIST_MENU(VIEW_UISAMPLE, UISampleView, UISamplePresenter, PNG_APPLIST_UI_SAMPLE_IMAGE, PNG_APPLIST_DEFAULT_IMG, "示例");\r
+\r
+    UISamplePresenter::UISamplePresenter()\r
+    {\r
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "UISamplePresenter::UISamplePresenter");\r
+        uisampleModel_ = &UISampleModel::GetInstance();\r
+    }\r
+\r
+    UISamplePresenter::~UISamplePresenter() {}\r
+\r
+    void UISamplePresenter::OnResume(void)\r
+    {\r
+        SendMsgToUIService(UI_ADD_SLEEP_VETO, 0, nullptr, 0);\r
+    }\r
+\r
+    void UISamplePresenter::OnPause(void)\r
+    {\r
+        SendMsgToUIService(UI_RM_SLEEP_VETO, 0, nullptr, 0);\r
+        return;\r
+    }\r
+}\r
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/uisample/src/UISampleProprietaryTestCasePage.cpp b/code/sdk/application/wearable/evb/nativeapp/nativeui/uisample/src/UISampleProprietaryTestCasePage.cpp
new file mode 100644 (file)
index 0000000..139af11
--- /dev/null
@@ -0,0 +1,256 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025. All rights reserved.\r
+ * Description: TestCase\r
+ * Author: Hisi Graphic Team\r
+ * Created: 2025-7\r
+ */\r
+\r
+#include "uisample/UISampleModel.h"\r
+#include "uisample/UISampleProprietaryTestCasePage.h"\r
+#include "uisample/UISampleView.h"\r
+#include "NativeAbility.h"\r
+#include "SlicePageFactory.h"\r
+#include "PageTransitionMgr.h"\r
+#include "UiConfig.h"\r
+#include "common/image_cache_manager.h"\r
+#include "ui_resource_date.h"\r
+#include "main/LoadImg.h"\r
+#include "components/root_view.h"\r
+#include "components/ui_label.h"\r
+#include "components/ui_list_nested.h"\r
+#include "components/ui_scroll_view_nested.h"\r
+#include "View.h"\r
+#include "ui_test.h"\r
+\r
+namespace OHOS {\r
+namespace {\r
+const uint16_t TESTCASE_BUTTON_HEIGHT = 100;\r
+static int16_t SAMPLE_TITLE_TEXT_SIZE = 38;\r
+} // namespace\r
+\r
+REGIST_SLICE_PAGE(VIEW_UISAMPLE, SAMPLE_PAGES::SAMPLE_PROPRIETARY_TESTCASE_PAGE,\r
+    UISampleProprietaryTestCasePage, false);\r
+static UISampleProprietaryTestCasePage* g_instance = nullptr;\r
+static RootView::OnKeyActListener *g_keyListener = nullptr;\r
+\r
+UISampleProprietaryTestCasePage::UISampleProprietaryTestCasePage()\r
+{\r
+    g_instance = this;\r
+}\r
+\r
+UISampleProprietaryTestCasePage* UISampleProprietaryTestCasePage::GetInstance()\r
+{\r
+    return g_instance;\r
+}\r
+\r
+UISampleProprietaryTestCasePage::~UISampleProprietaryTestCasePage()\r
+{\r
+    if (container_ != nullptr) {\r
+        container_->RemoveAll();\r
+        delete container_;\r
+        container_ = nullptr;\r
+    }\r
+\r
+    if (title_ != nullptr) {\r
+        delete title_;\r
+        title_ = nullptr;\r
+    }\r
+\r
+    if (mainList_ != nullptr) {\r
+        delete mainList_;\r
+        mainList_ = nullptr;\r
+    }\r
+\r
+    if (backBtn_ != nullptr) {\r
+        delete backBtn_;\r
+        backBtn_ = nullptr;\r
+    }\r
+    g_instance = nullptr;\r
+    isInTestCase_ = false;\r
+}\r
+\r
+static UIView* CreateViewCb(uint8_t type)\r
+{\r
+    UILabel* item = new UILabel();\r
+    if (item == nullptr) {\r
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Create item faild!");\r
+        return nullptr;\r
+    }\r
+\r
+    item->SetPosition(0, 0, Screen::GetInstance().GetWidth(), TESTCASE_BUTTON_HEIGHT);\r
+    item->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+    item->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 40); // 40: means font size\r
+    item->SetLineBreakMode(UILabel::LINE_BREAK_MARQUEE);\r
+    item->SetTouchable(true);\r
+    item->SetOnClickListener(UISampleProprietaryTestCasePage::GetInstance());\r
+    return item;\r
+}\r
+\r
+static void UpdateViewCb(UIView* view, void* data, uint8_t type)\r
+{\r
+    UNUSED(type);\r
+    UILabel* item = dynamic_cast<UILabel*>(view);\r
+    if (item != nullptr) {\r
+        TestCaseInfo* info = static_cast<TestCaseInfo *>(data);\r
+        if (info != nullptr) {\r
+            item->SetText(info->sliceId);\r
+            item->SetViewId(info->sliceId);\r
+        }\r
+    }\r
+}\r
+\r
+bool UISampleProprietaryTestCasePage::BackMenuPage(UIView& view)\r
+{\r
+    if (container_ != nullptr) {\r
+        container_->RemoveAll();\r
+        UITest* uiTest = UITestGroup::GetInstance()->GetTestCase(view.GetViewId());\r
+        if (uiTest != nullptr) {\r
+            uiTest->TearDown();\r
+        }\r
+        RootView::GetInstance()->SetOnKeyActListener(g_keyListener);\r
+        g_keyListener = nullptr;\r
+        isInTestCase_ = false;\r
+\r
+        container_->Add(title_);\r
+        container_->Add(mainList_);\r
+        container_->Invalidate();\r
+    }\r
+    return true;\r
+}\r
+\r
+void UISampleProprietaryTestCasePage::OnStart(void *data)\r
+{\r
+    if (container_ == nullptr) {\r
+        container_ = new UIScrollViewNested();\r
+        if (container_ == nullptr) {\r
+            WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, " UISampleProprietaryTestCasePage::OnStart::container_ is nullptr");\r
+            return;\r
+        }\r
+    }\r
+    container_->Resize(HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);\r
+    container_->SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
+    container_->SetStyle(STYLE_BACKGROUND_OPA, UN_OPACITY);\r
+    container_->SetVisible(true);\r
+\r
+    CreateTitle();\r
+    CreateMainList();\r
+    CreateBackButton();\r
+    AddViewToPageContainer(container_);\r
+    container_->Invalidate();\r
+}\r
+\r
+void UISampleProprietaryTestCasePage::CreateTitle()\r
+{\r
+    if (title_ == nullptr) {\r
+        title_ = new UILabel();\r
+        if (title_ == nullptr) {\r
+            WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, " UISampleProprietaryTestCasePage::OnStart::title_ is nullptr");\r
+            return;\r
+        }\r
+    }\r
+\r
+    title_->SetPosition(130, 0, 185, 80); // tile position x:130 size w: 185 h: 80\r
+    title_->SetText("自研用例");\r
+    title_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SAMPLE_TITLE_TEXT_SIZE);\r
+    title_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+    title_->SetStyle(STYLE_TEXT_OPA, OPA_OPAQUE);\r
+    title_->SetStyle(STYLE_TEXT_COLOR, Color::White().full);\r
+    title_->SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
+    title_->SetStyle(STYLE_BACKGROUND_OPA, OPA_OPAQUE);\r
+    container_->Add(title_);\r
+}\r
+\r
+void UISampleProprietaryTestCasePage::CreateMainList()\r
+{\r
+    if (mainList_ == nullptr) {\r
+        mainList_ = new UISimpleList();\r
+        if (mainList_ == nullptr) {\r
+            WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, " UISampleProprietaryTestCasePage::OnStart::mainList_ is nullptr");\r
+            return;\r
+        }\r
+    }\r
+    mainList_->SetPosition(0, 100, Screen::GetInstance().GetWidth(), 366); // position: y: 100 w: 600 h:600\r
+    mainList_->SetViewId("sample");\r
+    mainList_->SetThrowDrag(true);\r
+    mainList_->SetReboundSize(100); // 100: reboind size\r
+    mainList_->SetElastic(true);\r
+    mainList_->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+    container_->Add(mainList_);\r
+    mainList_->SetOnDragListener(this);\r
+\r
+    UITestGroup::GetInstance()->SetUpHSTestCase();\r
+    mainList_->ClearAll();\r
+    List<TestCaseInfo>* testCaseList = UITestGroup::GetInstance()->GetTestCase();\r
+    Contents content = {};\r
+    for (auto node = testCaseList->Begin(); node != testCaseList->End(); node = node->next_) {\r
+        content.createFunc = CreateViewCb;\r
+        content.updateFunc = UpdateViewCb;\r
+        content.type = 1;\r
+        content.data = reinterpret_cast<void *>(&(node->data_));\r
+        mainList_->AddContent(content);\r
+    }\r
+    mainList_->RefreshList();\r
+}\r
+\r
+void UISampleProprietaryTestCasePage::CreateBackButton()\r
+{\r
+    if (backBtn_ == nullptr) {\r
+        backBtn_ = new UIButton();\r
+    }\r
+    if (backBtn_ != nullptr) {\r
+        backBtn_->SetPosition(0, 202, 50, 50); // 0: x position, 202: y position, 50: width and height\r
+        backBtn_->SetStyleForState(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT, UIButton::RELEASED);\r
+        backBtn_->SetStyleForState(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT, UIButton::PRESSED);\r
+        backBtn_->SetStyleForState(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT, UIButton::INACTIVE);\r
+        backBtn_->SetOnClickListener(this);\r
+    }\r
+}\r
+\r
+bool UISampleProprietaryTestCasePage::OnClick(UIView& view, const ClickEvent& event)\r
+{\r
+    if (isInTestCase_) {\r
+       return BackMenuPage(view);\r
+    }\r
+\r
+    if (container_ == nullptr) {\r
+        return false;\r
+    }\r
+\r
+    UITest* uiTest = UITestGroup::GetInstance()->GetTestCase(view.GetViewId());\r
+    if (uiTest == nullptr) {\r
+        return false;\r
+    }\r
+    uiTest->SetUp();\r
+    container_->RemoveAll();\r
+\r
+    UIView* tempView = const_cast<UIView*>(uiTest->GetTestView());\r
+    if (tempView != nullptr) {\r
+        tempView->SetTouchable(true);\r
+        tempView->SetViewId(view.GetViewId());\r
+        tempView->SetPosition(tempView->GetX(), tempView->GetY());\r
+        container_->Add(tempView);\r
+\r
+        g_keyListener = RootView::GetInstance()->GetOnKeyActListener();\r
+        RootView::GetInstance()->SetOnKeyActListener(nullptr);\r
+    }\r
+\r
+    if (backBtn_ != nullptr) {\r
+        backBtn_->SetViewId(view.GetViewId());\r
+        container_->Add(backBtn_);\r
+    }\r
+\r
+    isInTestCase_ =true;\r
+    container_->Invalidate();\r
+    return true;\r
+}\r
+\r
+bool UISampleProprietaryTestCasePage::OnDrag(UIView& view, const DragEvent& event)\r
+{\r
+    UNUSED(view);\r
+    if ((event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT) &&\r
+        (event.GetDeltaX() > X_DRAG_OFFSET) && (event.GetDeltaX() > (DOUBLES * MATH_ABS(event.GetDeltaY())))) {\r
+        NativeAbility::GetInstance().SwitchPageInSlice(SAMPLE_MAIN_PAGE);\r
+    }\r
+    return true;\r
+}\r
+}
\ No newline at end of file
index eeaddcb..22f65f6 100644 (file)
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-
+ 
 #ifndef TEST_CASE_LIST_ADAPTER_H
 #define TEST_CASE_LIST_ADAPTER_H
 
-#include "components/abstract_adapter.h"
-#include "components/root_view.h"
-#include "components/ui_label.h"
 #include "components/ui_label_button.h"
 
-namespace OHOS {
-class TestCaseListAdapter : public AbstractAdapter {
-public:
-    TestCaseListAdapter() {}
-    ~TestCaseListAdapter()
-    {
-        if (listener_ != nullptr) {
-            delete listener_;
-            listener_ = nullptr;
-        }
-    }
-    UIView* GetView(UIView* inView, int16_t index) override;
-    int16_t GetItemWidthWithMargin(int16_t index) override;
-    int16_t GetItemHeightWithMargin(int16_t index) override;
-    uint16_t GetCount() override;
-private:
-    UIView::OnClickListener* listener_{nullptr};
-};
-} // namespace OHOS
 #endif // TEST_CASE_LIST_ADAPTER_H
\ No newline at end of file
index bcebab0..69b14fa 100644 (file)
@@ -26,20 +26,25 @@ struct TestCaseInfo {
     UITest* testObj;
 };
 
-class UITestGroup {
+class UITestGroup : public HeapBase {
 public:
     static UITestGroup* GetInstance()
     {
         static UITestGroup instance;
         return &instance;
     }
+
     void SetUpTestCase();
-    List<TestCaseInfo>& GetTestCase();
-    UITest* GetTestCase(const char* id);
-    void TearDownTestCase();
-    void AddTestCase(TestCaseInfo testCaseInfo);
+    void SetUpHSTestCase();
+    void SetUpOHTestCase();
 
+    List<TestCaseInfo>*& GetTestCase();
+    UITest* GetTestCase(const char* id);
 private:
+    UITestGroup() {}
+    ~UITestGroup();
+    void UpdataContents();
+    void TearDownTestCase();
     List<TestCaseInfo> *testCaseList_ = nullptr;
 };
 } // namespace OHOS
index c2188a4..1d96870 100644 (file)
 #include "ui_test_group.h"
 #include "graphic_config.h"
 
+#include "ui_test_analog_clock/ui_test_analog_clock.h"
+#include "ui_test_animator/ui_test_animator.h"
 #include "ui_test_breath/ui_test_breath.h"
+#include "ui_test_border_margin_padding/ui_test_border_margin_padding.h"
+#include "ui_test_button/ui_test_button.h"
+#include "ui_test_capture/ui_test_capture.h"
+#include "ui_test_canvas/ui_test_canvas.h"
 #include "ui_test_card_switch/ui_test_card_switch.h"
+#include "ui_test_clock_dial/ui_test_clock_dial.h"
+#include "ui_test_chart/ui_test_chart_polyline.h"
+#include "ui_test_chart/ui_test_chart_pillar.h"
+#include "ui_test_countdown/ui_test_countdown.h"
+#include "ui_test_coverflow/ui_test_coverflow.h"
+#include "ui_test_coverflow/ui_test_coverflow2.h"
+#include "ui_test_cross/ui_test_cross.h"
 #include "ui_test_cube_rotate/ui_test_cube_rotate.h"
+#include "ui_test_digital_clock/ui_test_digital_clock.h"
+#include "ui_test_draw/ui_test_canvas_ext.h"
+#include "ui_test_draw/ui_test_draw.h"
+#include "ui_test_draw_rect/ui_test_draw_rect.h"
+#include "ui_test_draw_line/ui_test_draw_line.h"
+#include "ui_test_emoji/ui_test_emoji.h"
+#include "ui_test_event_injector/ui_test_event_injector.h"
+#include "ui_test_focus_manager/ui_test_focus_manager.h"
+#if ENABLE_VECTOR_FONT
+#include "ui_test_font/ui_test_font.h"
+#endif
+#if (ENABLE_FONT_VECTOR_GLOBAL && ENABLE_FONT_GLOBAL_TEST)
+#include "ui_test_font/ui_test_font_global.h"
+#endif
+#if ENABLE_ICU && ENABLE_MULTI_FONT && ENABLE_SHAPING
+#include "ui_test_font/ui_test_multi_font.h"
+#endif
+#include "ui_test_hexagons_list/ui_test_hexagons_list.h"
+#include "ui_test_icosahedron/ui_test_icosahedron.h"
+#include "ui_test_image/ui_test_image.h"
+#if CAPABILITY_HW_JPEG_DECODE
+#include "ui_test_image/ui_test_jpeg.h"
+#endif
+#if ENABLE_JPEG_AND_PNG
+#include "ui_test_image/ui_test_png.h"
+#endif
+#if (ENABLE_IMAGE_PACKER && ENABLE_IMAGE_PACKER_TEST)
+#include "ui_test_image/ui_test_image_packer.h"
+#endif
+#include "ui_test_image_animator/ui_test_image_animator.h"
+#include "ui_test_image_fps/ui_test_image_fps.h"
+#include "ui_test_input_event/ui_test_input_event.h"
+#include "ui_test_kaleidoscope/ui_test_kaleidoscope.h"
+#include "ui_test_key/ui_test_key.h"
+#if ENABLE_SOFT_KEYBOARD
+#include "ui_test_keyboard/ui_test_keyboard.h"
+#endif
+#include "ui_test_label/ui_test_arc_label.h"
+#include "ui_test_list_fps/ui_test_list_fps.h"
 #include "ui_test_list_fps/ui_test_list_fps.h"
+#include "ui_test_list/ui_test_list.h"
+#include "ui_test_list_ext/ui_test_list_ext.h"
+#include "ui_test_lottie/ui_test_lottie.h"
+#include "ui_test_lottie/ui_test_trim_path.h"
+#include "ui_test_map/ui_test_map.h"
+#include "ui_test_message/ui_test_message.h"
 #include "ui_test_message/ui_test_message.h"
+#include "ui_test_nested/ui_test_nested.h"
+#include "ui_test_opacity/ui_test_opacity.h"
+#include "ui_test_particle/ui_test_particle.h"
+#include "ui_test_particle/ui_test_particle.h"
+#include "ui_test_picker/ui_test_ui_picker.h"
+#include "ui_test_progress_bar/ui_test_box_progress.h"
+#include "ui_test_progress_bar/ui_test_circle_progress.h"
+#include "ui_test_qrcode/ui_test_qrcode.h"
 #if ENABLE_VGU_ENGINE && CAPABILITY_HWDRAW_PATH
-#include "ui_test_countdown/ui_test_countdown.h"
 #include "ui_test_running_ball/ui_test_running_ball.h"
 #endif
-#if ENABLE_SOFT_KEYBOARD
-#include "ui_test_keyboard/ui_test_keyboard.h"
+#include "ui_test_roller_view/ui_test_roller_view.h"
+#if ENABLE_DEBUG && ENABLE_ROTATE_INPUT
+#include "ui_test_rotate_injector/ui_test_rotate_injector.h"
 #endif
-#include "ui_test_icosahedron/ui_test_icosahedron.h"
-#include "ui_test_tiger/ui_test_tiger.h"
-#include "ui_test_hexagons_list/ui_test_hexagons_list.h"
-#include "ui_test_waterfall_list/ui_test_waterfall_list.h"
-#include "ui_test_video_play/ui_test_video_play.h"
-#include "ui_test_coverflow/ui_test_coverflow.h"
+#include "ui_test_render/ui_test_render.h"
+#include "ui_test_rotate_input/ui_test_rotate_input.h"
 #include "ui_test_slipflow/ui_test_slipflow.h"
-#include "ui_test_kaleidoscope/ui_test_kaleidoscope.h"
-#include "ui_test_roller_view/ui_test_roller_view.h"
-#include "ui_test_emoji/ui_test_emoji.h"
+#include "ui_test_foldable/ui_test_foldable.h"
 #include "ui_test_sphere_view/ui_test_sphere_view.h"
-#include "ui_test_nested/ui_test_nested.h"
-#include "ui_test_particle/ui_test_particle.h"
-#include "ui_test_lottie/ui_test_lottie.h"
+#include "ui_test_scroll_bar/ui_test_scroll_bar.h"
+#include "ui_test_slider/ui_test_slider.h"
+#include "ui_test_simple_list/ui_test_simple_list.h"
+#include "ui_test_simple_list/ui_test_simple_transform_list.h"
+#include "ui_test_svg/ui_test_svg.h"
+#include "ui_test_text_fps/ui_test_text_fps.h"
+#include "ui_test_texture_mapper/ui_test_texture_mapper.h"
+#include "ui_test_tiger/ui_test_tiger.h"
+#include "ui_test_transition/ui_test_transition_view.h"
+#include "ui_test_ui_list/ui_test_ui_list.h"
+#include "ui_test_ui_list_view/ui_test_list_layout.h"
+#include "ui_test_ui_scroll_view/ui_test_ui_scroll_view.h"
+#include "ui_test_ui_swipe_view/ui_test_ui_swipe_view.h"
+#if ENABLE_VECTOR_FONT
+#include "ui_test_vector_font/ui_test_vector_font.h"
+#endif
+#include "ui_test_video_play/ui_test_video_play.h"
+#include "ui_test_view_group/ui_test_view_group.h"
+#include "ui_test_view_bounds/ui_test_view_bounds.h"
+#include "ui_test_view_percent/ui_test_view_percent.h"
+#include "ui_test_view_scale_rotate/ui_test_view_scale_rotate.h"
+#include "ui_test_view_bitmap/ui_test_view_bitmap.h"
+#include "ui_test_view_alignment/ui_test_alignment_external.h"
+#include "ui_test_view_alignment/ui_test_alignment_internal.h"
+#include "ui_test_view_alignment/ui_test_alignment_dynamic.h"
+#include "ui_test_waterfall_list/ui_test_waterfall_list.h"
+#include "ui_test_float_box/ui_test_float_box.h"
+#include "ui_test_chart/ui_test_scatter_plot.h"
+
 namespace OHOS {
-void UITestGroup::AddTestCase(TestCaseInfo testCaseInfo)
+UITestGroup::~UITestGroup()
+{
+    TearDownTestCase();
+    if (testCaseList_ != nullptr) {
+        delete testCaseList_;
+        testCaseList_ = nullptr;
+    }
+}
+
+void UITestGroup::SetUpTestCase()
 {
+    if (testCaseList_ == nullptr) {
+        testCaseList_ = new List<TestCaseInfo>();
+    }
     if (testCaseList_ == nullptr) {
         return;
     }
-    testCaseList_->PushBack(testCaseInfo);
+
+    TearDownTestCase();
+    testCaseList_->PushBack(TestCaseInfo{"自研用例", nullptr});
+    testCaseList_->PushBack(TestCaseInfo{"开源用例", nullptr});
 }
 
-void UITestGroup::SetUpTestCase()
+void UITestGroup::SetUpHSTestCase()
 {
-    testCaseList_ = new List<TestCaseInfo>();
+    if (testCaseList_ == nullptr) {
+        testCaseList_ = new List<TestCaseInfo>();
+    }
+
     if (testCaseList_ == nullptr) {
         return;
     }
-    testCaseList_->Clear();
+    TearDownTestCase();
     testCaseList_->PushBack(TestCaseInfo{"老虎头", new UITestTiger()});
     testCaseList_->PushBack(TestCaseInfo{"蜂窝表盘", new UITestHexagonsList()});
+    testCaseList_->PushBack(TestCaseInfo{"无变换滑动列表", new UITestListFPS()});
+    testCaseList_->PushBack(TestCaseInfo{"带缩放滑动列表", new UITestListExt()});
+    testCaseList_->PushBack(TestCaseInfo{"简易列表", new UITestSimpleList()});
+    testCaseList_->PushBack(TestCaseInfo{"简易变换列表", new UITestSimpleTransformList()});
+    testCaseList_->PushBack(TestCaseInfo{"全屏文字", new UITestTextFPS()});
     testCaseList_->PushBack(TestCaseInfo{"瀑布列表", new UITestWaterfallList()});
     testCaseList_->PushBack(TestCaseInfo{"滑动列表", new UITestListFPS()});
     testCaseList_->PushBack(TestCaseInfo{"卡片切换", new UITestCardSwitch()});
     testCaseList_->PushBack(TestCaseInfo{"立方体旋转", new UITestCubeRotate()});
     testCaseList_->PushBack(TestCaseInfo{"消息", new UITestMessage()});
     testCaseList_->PushBack(TestCaseInfo{"呼吸效果", new UITestBreath()});
+    testCaseList_->PushBack(TestCaseInfo{"折叠控件", new UITestFoldable()});
     testCaseList_->PushBack(TestCaseInfo{"覆盖流", new UITestCoverflow()});
     testCaseList_->PushBack(TestCaseInfo{"滑动流", new UITestSlipflow()});
     testCaseList_->PushBack(TestCaseInfo{"万花筒", new UITestKaleidoscope()});
     testCaseList_->PushBack(TestCaseInfo{"滚筒", new UITestRollerView()});
-
+    testCaseList_->PushBack(TestCaseInfo{"地图", new UITestMap()});
 #if ENABLE_VGU_ENGINE && CAPABILITY_HWDRAW_PATH
     testCaseList_->PushBack(TestCaseInfo{"倒计时", new UITestCountdown()});
     testCaseList_->PushBack(TestCaseInfo{"动画曲线", new UITestRunningBall()});
+    testCaseList_->PushBack(TestCaseInfo{"扩展画布", new UITestCanvasExt()});
 #endif
 #if ENABLE_SOFT_KEYBOARD
     testCaseList_->PushBack(TestCaseInfo{"软键盘", new UITestKeyboard()});
 #endif
+    testCaseList_->PushBack(TestCaseInfo{"绘制SVG", new UITestSVG()});
+    testCaseList_->PushBack(TestCaseInfo{"容器覆盖流", new UITestCoverflow2()});
+    testCaseList_->PushBack(TestCaseInfo{"覆盖流", new UITestCoverflow()});
     testCaseList_->PushBack(TestCaseInfo{"视频播放", new UITestVideoPlay()});
     testCaseList_->PushBack(TestCaseInfo{"球型菜单", new UITestSphereView()});
     testCaseList_->PushBack(TestCaseInfo{"足球效果", new UITestIcosahedron()});
+#if CAPABILITY_HW_JPEG_DECODE
+    testCaseList_->PushBack(TestCaseInfo{"JPEG显示", new UITestJPEG()});
+#endif
+#if ENABLE_JPEG_AND_PNG
+    testCaseList_->PushBack(TestCaseInfo{"PNG显示", new UITestPNG()});
+#endif
+    testCaseList_->PushBack(TestCaseInfo{"图片旋转缩放动画", new UITestTextureMapper()});
+#if ENABLE_DEBUG && ENABLE_ROTATE_INPUT
+    testCaseList_->PushBack(TestCaseInfo{"模拟表冠", new UITestRotateInjector()});
+#endif
+    testCaseList_->PushBack(TestCaseInfo{"二维码", new UITestQrcode()});
+    testCaseList_->PushBack(TestCaseInfo{"折线图", new UITestChartPolyline()});
+    testCaseList_->PushBack(TestCaseInfo{"柱状图", new UITestChartPillar()});
+    testCaseList_->PushBack(TestCaseInfo{"弧形文字", new UITestArcLabel()});
+#if ENABLE_ICU && ENABLE_MULTI_FONT && ENABLE_SHAPING
+    testCaseList_->PushBack(TestCaseInfo{"多语言混排", new UITestMultiFont()});
+#endif
+#if ENABLE_VECTOR_FONT
+    testCaseList_->PushBack(TestCaseInfo{"矢量文字", new UITestFont()});
+#endif
+#if (ENABLE_FONT_VECTOR_GLOBAL && ENABLE_FONT_GLOBAL_TEST)
+    testCaseList_->PushBack(TestCaseInfo{"多语言切换", new UITestFontGlobal()});
+#endif
+    testCaseList_->PushBack(TestCaseInfo{"全屏高斯模糊", new UITestKey()});
+    testCaseList_->PushBack(TestCaseInfo{"截图", new UITestCapture()});
     testCaseList_->PushBack(TestCaseInfo{"滑动冲突", new UITestNested()});
-    testCaseList_->PushBack(TestCaseInfo{"粒子效果", new UITestParticle()});
+    testCaseList_->PushBack(TestCaseInfo{"悬浮框", new UITestFloatBox()});
+    testCaseList_->PushBack(TestCaseInfo{"散点图", new UITestScatterPlot()});
     testCaseList_->PushBack(TestCaseInfo{"Lottie", new UITestLottie()});
+    testCaseList_->PushBack(TestCaseInfo{"路径裁剪", new UITestTrimPath()});
+    testCaseList_->PushBack(TestCaseInfo{"粒子效果", new UITestParticle()});
+    testCaseList_->PushBack(TestCaseInfo{"页面动效", new UITestTransitionView()});
+    testCaseList_->PushBack(TestCaseInfo{"画布", new UITestDraw()});
+    testCaseList_->PushBack(TestCaseInfo{"图片显示", new UITestImage()});
+    testCaseList_->PushBack(TestCaseInfo{"矩形绘制", new UITestDrawRect()});
+#if (ENABLE_IMAGE_PACKER && ENABLE_IMAGE_PACKER_TEST)
+    testCaseList_->PushBack(TestCaseInfo{"图片打包", new UITestImageBin()});
+#endif
+}
+
+void UITestGroup::SetUpOHTestCase()
+{
+    if (testCaseList_ == nullptr) {
+        testCaseList_ = new List<TestCaseInfo>();
+    }
+
+    if (testCaseList_ == nullptr) {
+        return;
+    }
+    TearDownTestCase();
+    testCaseList_->PushBack(TestCaseInfo{"滑动条", new UITestSlider()});
+    testCaseList_->PushBack(TestCaseInfo{"图片动画", new UITestImageFPS()});
+    testCaseList_->PushBack(TestCaseInfo{"透明度", new UITestOpacity()});
+    testCaseList_->PushBack(TestCaseInfo{"播放图片动画", new UITestImageAnimator()});
+    testCaseList_->PushBack(TestCaseInfo{"焦点管理", new UITestFocusManager()});
+    testCaseList_->PushBack(TestCaseInfo{"绘制线条", new UITestDrawLine()});
+    testCaseList_->PushBack(TestCaseInfo{"数字时钟", new UITestDigitalClock()});
+    testCaseList_->PushBack(TestCaseInfo{"边界间隔", new UITestBorderMarginPadding()});
+    testCaseList_->PushBack(TestCaseInfo{"动效", new UITestAnimator()});
+    testCaseList_->PushBack(TestCaseInfo{"视图组", new UITestViewGroup()});
+    testCaseList_->PushBack(TestCaseInfo{"事件测试", new UITestInputEvent()});
+    testCaseList_->PushBack(TestCaseInfo{"滚动条", new UITestScrollBar()});
+    testCaseList_->PushBack(TestCaseInfo{"画布", new UITestCanvas()});
+    testCaseList_->PushBack(TestCaseInfo{"Swipe视图", new UITestUISwipeView()});
+    testCaseList_->PushBack(TestCaseInfo{"滑动视图", new UITestUIScrollView()});
+    testCaseList_->PushBack(TestCaseInfo{"列表布局", new UITestListLayout()});
+    testCaseList_->PushBack(TestCaseInfo{"列表", new UITestUIList()});
+    testCaseList_->PushBack(TestCaseInfo{"按钮", new UITestButton()});
+    testCaseList_->PushBack(TestCaseInfo{"选择", new UITestUIPicker()});
+    testCaseList_->PushBack(TestCaseInfo{"圆形进度条", new UITestCircleProgress()});
+    testCaseList_->PushBack(TestCaseInfo{"盒状进度条", new UITestBoxProgress()});
+    testCaseList_->PushBack(TestCaseInfo{"事件模拟", new UITestEventInjector()});
+    testCaseList_->PushBack(TestCaseInfo{"位图", new UITestViewBitmap()});
+    testCaseList_->PushBack(TestCaseInfo{"旋转", new UITestViewScaleRotate()});
+    testCaseList_->PushBack(TestCaseInfo{"视图比例", new UITestViewPercent()});
+    testCaseList_->PushBack(TestCaseInfo{"视图边界", new UITestViewBounds()});
+#if ENABLE_VECTOR_FONT
+    testCaseList_->PushBack(TestCaseInfo{"矢量文字", new UITestVectorFont()});
+#endif
+    testCaseList_->PushBack(TestCaseInfo{"模拟时钟", new UITestAnalogClock()});
+    testCaseList_->PushBack(TestCaseInfo{"旋转输入", new UITestRotateInput()});
+    testCaseList_->PushBack(TestCaseInfo{"渲染", new UITestRender()});
 }
 
-List<TestCaseInfo>& UITestGroup::GetTestCase()
+List<TestCaseInfo>*& UITestGroup::GetTestCase()
 {
-    return *testCaseList_;
+    return testCaseList_;
 }
 
 UITest* UITestGroup::GetTestCase(const char* id)
 {
-    if (id == nullptr) {
+    if (id == nullptr || testCaseList_ == nullptr) {
         return nullptr;
     }
+
     ListNode<TestCaseInfo>* node = testCaseList_->Begin();
     while (node != testCaseList_->End()) {
-        if (!strcmp(id, node->data_.sliceId)) {
+        if (strcmp(id, node->data_.sliceId) == 0) {
             return node->data_.testObj;
         }
         node = node->next_;
@@ -107,11 +301,17 @@ UITest* UITestGroup::GetTestCase(const char* id)
 
 void UITestGroup::TearDownTestCase()
 {
+    if (testCaseList_ == nullptr) {
+        return;
+    }
+
     ListNode<TestCaseInfo>* node = testCaseList_->Begin();
     while (node != testCaseList_->End()) {
-        delete node->data_.testObj;
-        node->data_.testObj = nullptr;
-        node = node->next_;
+        if (node->data_.testObj != nullptr) {
+            delete node->data_.testObj;
+            node->data_.testObj = nullptr;
+        }
+        node = testCaseList_->Remove(node);
     }
     testCaseList_->Clear();
 }
index ef81ce7..5ed9078 100644 (file)
@@ -16,7 +16,7 @@
 #include "uiservice/ui_service.h"
 #include "wearable_log.h"
 #include "samgr_lite.h"
-#include "settings/SettingModel.h"
+#include "settings/model/SettingBluetoothModel.h"
 #include "main/UiServersMsg.h"
 #include "ohos_init.h"
 #include "memory_adapter.h"
 #include "NativeAbility.h"
 #include "TransitionType.h"
 
+#if defined(SUPPORT_LWIP) && defined(SUPPORT_BREDR)
+#include "lwip_driver_adapter.h"
+#endif
+
 extern "C" errcode_t uapi_pm_add_sleep_veto(pm_id_t veto_id);
 extern "C" errcode_t uapi_pm_remove_sleep_veto(pm_id_t veto_id);
 
@@ -113,8 +117,10 @@ void ScreenOffEnable(int32_t enable)
 
 void ConnectNewPhone(void)
 {
+#if defined(SUPPORT_LWIP) && defined(SUPPORT_BREDR)
+    lwip_close_bt_pan();
+#endif
     unsigned int connedDevicesNum = 0;
-
     bool ret = gap_get_paired_devices_num(&connedDevicesNum);
     WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Setup GapGetPariedDevicesNum ret = %d, num = %d", ret, connedDevicesNum);
 
@@ -184,11 +190,13 @@ void ServiceMsgProcess(Request *request)
             break;
         case BT_CONNECTED_TO_UI:
             GraphicService::GetInstance()->PostGraphicEvent(
-                std::bind(&OHOS::SettingModel::UpdateBlueToothConnectStatus, &OHOS::SettingModel::GetInstance(), true));
+                std::bind(&OHOS::SettingBluetoothModel::UpdateAclConnectStatus,
+                    OHOS::SettingBluetoothModel::GetInstance(), true));
             break;
         case BT_DISCONNECTED_TO_UI:
             GraphicService::GetInstance()->PostGraphicEvent(
-                std::bind(&OHOS::SettingModel::UpdateBlueToothConnectStatus, &OHOS::SettingModel::GetInstance(), false));
+                std::bind(&OHOS::SettingBluetoothModel::UpdateAclConnectStatus,
+                    OHOS::SettingBluetoothModel::GetInstance(), false));
             break;
         case UI_ADD_SLEEP_VETO:
             uapi_pm_add_sleep_veto(PM_ID_SCREEN);
@@ -204,8 +212,8 @@ void ServiceMsgProcess(Request *request)
             break;
         case UI_OTA_UPDATE:
             power_display_svr_get_api()->turn_on_screen();
-            OHOS::NativeAbility::GetInstance().ChangeSlice(VIEW_SET_OTA,
-                OHOS::TransitionType::TRANSITION_INVALID, OHOS::gSliceDefaultPriority, true);
+            OHOS::NativeAbility::GetInstance().SwitchSlice(VIEW_SETTING, OHOS::SettingPageId::SYSTEM_OTA_PAGE,
+                OHOS::TransitionType::TRANSITION_INVALID, true);
             break;
     }
 }
index e417f9f..785037f 100644 (file)
@@ -1,12 +1,12 @@
 /*\r
- * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
  * Description: WeatherItemView\r
  * Create: 2025-03-23\r
  */\r
 \r
 #include "wearable_log.h"\r
-#include "weather/WeatherItemView.h"\r
 #include "weather/WeatherModel.h"\r
+#include "weather/WeatherItemView.h"\r
 \r
 namespace OHOS {\r
 static constexpr int16_t WEATHER_ICON_X = 155;\r
@@ -16,8 +16,6 @@ static constexpr int16_t WEATHER_CHARTLINE_X = 20;
 static constexpr int16_t WEATHER_CHARTLINE_Y = 78;\r
 static constexpr int16_t WEATHER_CHARTLINE_WIDTH = 450;\r
 static constexpr int16_t WEATHER_CHARTLINE_HEIGHT = 2;\r
-static constexpr int16_t WEATHER_ITEM_BUTTON_WIDTH = 390;\r
-static constexpr int16_t WEATHER_ITEM_BUTTON_HEIGHT = 83;\r
 static constexpr int16_t WEATHER_ITEM_LABEL_WIDTH = 155;\r
 static constexpr int16_t WEATHER_ITEM_LABEL_HEIGHT = 80;\r
 static constexpr int16_t WEATHER_ITEM_FONT_SIZE = 35;\r
@@ -27,72 +25,52 @@ static constexpr int16_t NUMS_50 = 50;
 \r
 WeatherItemView::WeatherItemView()\r
 {\r
-    SetPosition(0, 0, WEATHER_ITEM_BUTTON_WIDTH, WEATHER_ITEM_BUTTON_HEIGHT);\r
-    SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
-    SetTouchable(true);\r
-    SetUpChild();\r
+    bgImg_.SetPosition(0, 0);\r
+    bgImg_.Resize(WEATHER_IMAGE_SIZE, WEATHER_IMAGE_SIZE);\r
+    WeatherModel::GetInstance().LoadImageOfDayNight(&bgImg_, IMAGE_WEATHER_ITEM1, IMAGE_WEATHER_ITEM2);\r
+    labelDay_.SetPosition(WEATHER_LABEL_X, 0);\r
+    labelDay_.Resize(WEATHER_ITEM_LABEL_WIDTH, WEATHER_ITEM_LABEL_HEIGHT);\r
+    labelDay_.SetFont(DEFAULT_VECTOR_FONT_FILENAME, WEATHER_ITEM_FONT_SIZE);\r
+    labelDay_.SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+    labelDay_.SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+    labelDay_.SetStyle(STYLE_TEXT_OPA, OPA_OPAQUE);\r
+    labelDay_.SetStyle(STYLE_TEXT_COLOR, Color::White().full);\r
+\r
+    icon_.SetPosition(WEATHER_ICON_X, WEATHER_ICON_Y);\r
+    icon_.SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
 \r
-    Add(&sNextImage);\r
-    Add(&sLabel_1);\r
-    Add(&sIcon);\r
-    Add(&sLabel_2);\r
-    Add(&chartLine);\r
+    labelTmp_.SetPosition(WEATHER_LABEL2_X, 0);\r
+    labelTmp_.Resize(WEATHER_ITEM_LABEL_WIDTH, WEATHER_ITEM_LABEL_HEIGHT);\r
+    labelTmp_.SetFont(DEFAULT_VECTOR_FONT_FILENAME, WEATHER_ITEM_FONT_SIZE);\r
+    labelTmp_.SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+    labelTmp_.SetStyle(STYLE_TEXT_OPA, OPA_OPAQUE);\r
+    labelTmp_.SetStyle(STYLE_TEXT_COLOR, Color::White().full);\r
+    labelTmp_.SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+\r
+    chartLine_.SetPosition(WEATHER_CHARTLINE_X, WEATHER_CHARTLINE_Y, WEATHER_CHARTLINE_WIDTH, WEATHER_CHARTLINE_HEIGHT);\r
+    chartLine_.SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+\r
+    Add(&bgImg_);\r
+    Add(&labelDay_);\r
+    Add(&icon_);\r
+    Add(&labelTmp_);\r
+    Add(&chartLine_);\r
 }\r
 \r
 WeatherItemView::~WeatherItemView()\r
 {\r
-    Remove(&sIcon);\r
-    Remove(&sLabel_1);\r
-    Remove(&sLabel_2);\r
-    Remove(&chartLine);\r
+    Remove(&bgImg_);\r
+    Remove(&icon_);\r
+    Remove(&labelDay_);\r
+    Remove(&labelTmp_);\r
+    Remove(&chartLine_);\r
 }\r
 \r
 void WeatherItemView::SetItemInfo(const WeatherItem itemInfo)\r
 {\r
-    sItemInfo = itemInfo;\r
-    sLabel_1.SetText(itemInfo.label_1);\r
-    sIcon.SetSrc(itemInfo.icon);\r
-    sLabel_2.SetText(itemInfo.label_2);\r
-    chartLine.SetVisible(itemInfo.hasSecondMenu);\r
+    labelDay_.SetText(itemInfo.weatherWeek);\r
+    LOADIMG::LoadImageViewImg(&icon_, WEATHER_IMAGE, itemInfo.image);\r
+    labelTmp_.SetText(itemInfo.weatherTemp);\r
+    chartLine_.SetVisible(itemInfo.hasSecondMenu);\r
 }\r
-\r
-void WeatherItemView::SetUpChild()\r
-{\r
-    sNextImage.SetPosition(0, 0);\r
-    sNextImage.Resize(WEATHER_IMAGE_SIZE, WEATHER_IMAGE_SIZE);\r
-    bool index = WeatherModel::GetInstance().GetDayStatus();\r
-    ImageInfo *img = nullptr;\r
-    if (index) {\r
-        img = ImageCacheManager::GetInstance().LoadOneInMultiRes(IMAGE_CONVERTER_TOOL_WEATHER71, WEATHER_IMAGE);\r
-    } else {\r
-        img = ImageCacheManager::GetInstance().LoadOneInMultiRes(IMAGE_CONVERTER_TOOL_WEATHER72, WEATHER_IMAGE);\r
-    }\r
-    if (img == nullptr) {\r
-        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "WeatherMainPage::LoadOneInMultiRes fail");\r
-    }\r
-    sNextImage.SetSrc(img);\r
-\r
-    sLabel_1.SetPosition(WEATHER_LABEL_X, 0);\r
-    sLabel_1.Resize(WEATHER_ITEM_LABEL_WIDTH, WEATHER_ITEM_LABEL_HEIGHT);\r
-    sLabel_1.SetFont(DEFAULT_VECTOR_FONT_FILENAME, WEATHER_ITEM_FONT_SIZE);\r
-    sLabel_1.SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
-    sLabel_1.SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
-    sLabel_1.SetStyle(STYLE_TEXT_OPA, OPA_OPAQUE);\r
-    sLabel_1.SetStyle(STYLE_TEXT_COLOR, Color::White().full);\r
-\r
-    sIcon.SetPosition(WEATHER_ICON_X, WEATHER_ICON_Y);\r
-    sIcon.SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
-\r
-    sLabel_2.SetPosition(WEATHER_LABEL2_X, 0);\r
-    sLabel_2.Resize(WEATHER_ITEM_LABEL_WIDTH, WEATHER_ITEM_LABEL_HEIGHT);\r
-    sLabel_2.SetFont(DEFAULT_VECTOR_FONT_FILENAME, WEATHER_ITEM_FONT_SIZE);\r
-    sLabel_2.SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
-    sLabel_2.SetStyle(STYLE_TEXT_OPA, OPA_OPAQUE);\r
-    sLabel_2.SetStyle(STYLE_TEXT_COLOR, Color::White().full);\r
-    sLabel_2.SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
-\r
-    chartLine.SetPosition(WEATHER_CHARTLINE_X, WEATHER_CHARTLINE_Y, WEATHER_CHARTLINE_WIDTH, WEATHER_CHARTLINE_HEIGHT);\r
-    chartLine.SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
 }\r
-\r
-}
\ No newline at end of file
index e1d9630..44c8929 100644 (file)
@@ -1,22 +1,25 @@
 /*\r
- * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
  * Description: WeatherMainPage\r
  * Create: 2025-03-23\r
  */\r
 \r
+#include <iomanip>\r
+#include <sstream>\r
 #include <string>\r
-#include "weather/WeatherMainPage.h"\r
-#include "components/ui_list_nested.h"\r
-#include "components/ui_scroll_view_nested.h"\r
 #include "NativeAbility.h"\r
 #include "SlicePageFactory.h"\r
-#include "weather/WeatherPresenter.h"\r
-#include "weather/WeatherModel.h"\r
-#include "ui_resource_weather.h"\r
 #include "common/image_cache_manager.h"\r
+#include "bts_br_gap.h"\r
+#include "bts_spp.h"\r
+#include "msg_center_device.h"\r
+#include "components/ui_list_nested.h"\r
+#include "components/ui_scroll_view_nested.h"\r
+#include "ui_resource_weather.h"\r
 #include "wearable_log.h"\r
-#include <sstream>\r
-#include <iomanip>\r
+#include "weather/WeatherModel.h"\r
+#include "weather/WeatherPresenter.h"\r
+#include "weather/WeatherMainPage.h"\r
 \r
 static constexpr int16_t WEATHER_LABEL_SIZE_WIDTH_ONE = 250;\r
 static constexpr int16_t WEATHER_LABEL_SIZE_HEIGHT_ONE = 60;\r
@@ -31,7 +34,7 @@ static constexpr int16_t WEATHER_LABEL_FRONT_TWO = 24;
 static constexpr int16_t WEATHER_LABEL_FRONT_THREE = 36;\r
 static constexpr int16_t WEATHER_LABEL_FRONT_FOUR = 120;\r
 static constexpr int16_t WEATHER_LABEL_FRONT = 22;\r
-static constexpr int16_t WEATHER_AROUND_X = 74;\r
+static constexpr int16_t WEATHER_AROUND_X = 49;\r
 static constexpr int16_t WEATHER_AROUND_Y = 323;\r
 static constexpr int16_t WEATHER_AROUND_WIDTH = 198;\r
 static constexpr int16_t WEATHER_AROUND_HEIGHT = 40;\r
@@ -45,11 +48,11 @@ static constexpr int16_t WEATHER_TEMP_WIDTH = 190;
 static constexpr int16_t WEATHER_TEMP_HEIGHT = 120;\r
 static constexpr int16_t WEATHER_IMAGE_WIDTH = 78;\r
 static constexpr int16_t WEATHER_IMAGE_HEIGHT = 115;\r
-static constexpr int16_t WEATHER_IMAGEAIR_X = 78;\r
-static constexpr int16_t WEATHER_IMAGEAIR_Y = 327;\r
+static constexpr int16_t WEATHER_IMAGEAIR_X = 49;\r
+static constexpr int16_t WEATHER_IMAGEAIR_Y = 323;\r
 static constexpr int16_t WEATHER_IMAGEAIR_DATA = 40;\r
-static constexpr int16_t WEATHER_IMAGEHUMIDITY_X = 336;\r
-static constexpr int16_t WEATHER_IMAGEHUMIDITY_Y = 327;\r
+static constexpr int16_t WEATHER_IMAGEHUMIDITY_X = 357;\r
+static constexpr int16_t WEATHER_IMAGEHUMIDITY_Y = 323;\r
 static constexpr int16_t WEATHER_LABLEAIR_DATA = 79;\r
 static constexpr int16_t WEATHER_LABLEAIR_HEIGHT = 30;\r
 static constexpr int16_t WEATHER_IMAGEHUMIDITY_DATA = 120;\r
@@ -63,238 +66,349 @@ static constexpr int16_t WEATHER_LABELTITLE_POSITION_Y = 100;
 static constexpr int16_t WEATHER_LABELTITLE_WIDTH = 400;\r
 static constexpr int16_t WEATHER_ADDRESS_X = 143;\r
 static constexpr int16_t WEATHER_ADDRESS_Y = 49;\r
+static constexpr int16_t WEATHER_TYPE = 32;\r
+static constexpr int16_t BUFFER_SIZE = 6;\r
 \r
-const char *weatherNames[] = {"晴", "多云", "阴", "阵雨", "雷阵雨", "雷阵雨伴有冰雹", "雨夹雪",\r
-                              "小雨", "中雨", "大雨", "暴雨", "大暴雨", "特大暴雨", "阵雪",\r
-                              "小雪", "中雪", "大雪", "暴雪", "雾", "冻雨", "沙尘暴",\r
-                              "小到中雨", "中到大雨", "大到暴雨", "小到中雪", "中到大雪", "大到暴雪", "浮尘",\r
-                              "扬沙", "强沙尘暴", "霾", "无天气数据"};\r
+const char *g_weatherNames[] = {"晴", "多云", "阴", "阵雨", "雷阵雨", "雷阵雨伴有冰雹", "雨夹雪",\r
+                                "小雨", "中雨", "大雨", "暴雨", "大暴雨", "特大暴雨", "阵雪",\r
+                                "小雪", "中雪", "大雪", "暴雪", "雾", "冻雨", "沙尘暴",\r
+                                "小到中雨", "中到大雨", "大到暴雨", "小到中雪", "中到大雪",\r
+                                "大到暴雪", "浮尘", "扬沙", "强沙尘暴", "霾", "无天气数据"};\r
 \r
 namespace OHOS {\r
 REGIST_SLICE_PAGE(VIEW_WEATHER, WEATHER_PAGES::WEATHER_MAIN_PAGE, WeatherMainPage, true);\r
+static WeatherMainPage *g_pWeatherMainPage = nullptr;\r
 \r
 WeatherMainPage::WeatherMainPage()\r
 {\r
-    weatherModel = &WeatherModel::GetInstance();\r
+    g_pWeatherMainPage = this;\r
     WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "WeatherMainPage::WeatherMainPage");\r
 }\r
 \r
 WeatherMainPage::~WeatherMainPage()\r
 {\r
     WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "WeatherMainPage::~WeatherMainPage");\r
-    if (group != nullptr) {\r
-        group->RemoveAll();\r
-        delete group;\r
-        group = nullptr;\r
+    g_pWeatherMainPage = nullptr;\r
+    if (group_ != nullptr) {\r
+        group_->RemoveAll();\r
+        delete group_;\r
+        group_ = nullptr;\r
+    }\r
+\r
+    for (int i = 0; i < LABEL_COUNT; i++) {\r
+        if (title_[i] != nullptr) {\r
+            delete title_[i];\r
+            title_[i] = nullptr;\r
+        }\r
     }\r
 \r
-    if (weatherImg != nullptr) {\r
-        delete weatherImg;\r
-        weatherImg = nullptr;\r
+    if (labelTitle_ != nullptr) {\r
+        delete labelTitle_;\r
+        labelTitle_ = nullptr;\r
     }\r
 \r
-    if (mainImg != nullptr) {\r
-        delete mainImg;\r
-        mainImg = nullptr;\r
+    if (addressImg_ != nullptr) {\r
+        delete addressImg_;\r
+        addressImg_ = nullptr;\r
     }\r
 \r
-    if (aroundImg != nullptr) {\r
-        delete aroundImg;\r
-        aroundImg = nullptr;\r
+    if (weatherImg_ != nullptr) {\r
+        delete weatherImg_;\r
+        weatherImg_ = nullptr;\r
     }\r
 \r
-    if (ImageAir != nullptr) {\r
-        delete ImageAir;\r
-        ImageAir = nullptr;\r
+    if (bgImg_ != nullptr) {\r
+        delete bgImg_;\r
+        bgImg_ = nullptr;\r
     }\r
 \r
-    if (ImageHumidity != nullptr) {\r
-        delete ImageHumidity;\r
-        ImageHumidity = nullptr;\r
+    if (airQualityAndHumidityBgImg_ != nullptr) {\r
+        delete airQualityAndHumidityBgImg_;\r
+        airQualityAndHumidityBgImg_ = nullptr;\r
     }\r
 \r
-    if (ImagePageKey != nullptr) {\r
-        delete ImagePageKey;\r
-        ImagePageKey = nullptr;\r
+    if (airQulityImgIcon_ != nullptr) {\r
+        delete airQulityImgIcon_;\r
+        airQulityImgIcon_ = nullptr;\r
+    }\r
+\r
+    if (humidityImgIcon_ != nullptr) {\r
+        delete humidityImgIcon_;\r
+        humidityImgIcon_ = nullptr;\r
+    }\r
+\r
+    if (pageIdxImg_ != nullptr) {\r
+        delete pageIdxImg_;\r
+        pageIdxImg_ = nullptr;\r
     }\r
     ImageCacheManager::GetInstance().UnloadAllInMultiRes(WEATHER_IMAGE);\r
 }\r
 \r
+WeatherMainPage *WeatherMainPage::GetInstance()\r
+{\r
+    return g_pWeatherMainPage;\r
+}\r
+\r
 void WeatherMainPage::OnStart(void *data)\r
 {\r
-    group = new UIViewGroup();\r
-    if (group == nullptr) {\r
+    group_ = new UIViewGroup();\r
+    if (group_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "WeatherMainPage::group_ fail");\r
         return;\r
     }\r
-    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "WeatherPageFirst::InitPageFirst successful");\r
-    group->SetPosition(0, 0);\r
-    group->Resize(VERTICAL_RESOLUTION, HORIZONTAL_RESOLUTION);\r
-    group->SetOnDragListener(this);\r
-    group->SetViewId("weather");\r
-    group->SetDraggable(true);\r
-    group->SetTouchable(true);\r
-    flag = weatherModel->InitWeatherItem();\r
-    cur = weatherModel->GetCurWeather();\r
-    mainImg = new UIImageView();\r
-    if (mainImg == nullptr) {\r
-        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "WeatherPageFirst::mainImg new image fail");\r
+    group_->SetPosition(0, 0);\r
+    group_->Resize(HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);\r
+    group_->SetOnDragListener(this);\r
+    group_->SetViewId("weather");\r
+    group_->SetDraggable(true);\r
+    group_->SetTouchable(true);\r
+    flag_ = WeatherModel::GetInstance().InitWeatherItem();\r
+    cur_ = WeatherModel::GetInstance().GetCurWeather();\r
+    bgImg_ = new UIImageView();\r
+    if (bgImg_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "WeatherMainPage::bgImg_ new image fail");\r
         return;\r
     }\r
-    mainImg->SetPosition(0, 0);\r
-    mainImg->SetStyle(STYLE_BACKGROUND_OPA, OPA_OPAQUE);\r
-    group->Add(mainImg);\r
-    InitWeatherImage();\r
-    InitImage();\r
-    InitLabel();\r
-    if (!flag) {\r
-        labelTitle = new UILabel();\r
-        if (labelTitle == nullptr) {\r
-            WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "WeatherPageFirst::labelTitle new label fail");\r
-            return;\r
-        }\r
-        labelTitle->SetText("天气未更新,请连接手机更新数据");\r
-        labelTitle->SetPosition(WEATHER_LABELTITLE_POSITION_X, WEATHER_LABELTITLE_POSITION_Y, WEATHER_LABELTITLE_WIDTH,\r
-                                WEATHER_LABEL_SIZE_HEIGHT_ONE);\r
-        labelTitle->SetFont(DEFAULT_VECTOR_FONT_FILENAME, WEATHER_LABEL_FRONT);\r
-        group->Add(labelTitle);\r
-        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "WeatherPageFirst::InitWeatherItem fail");\r
+    bgImg_->SetPosition(0, 0);\r
+    bgImg_->SetStyle(STYLE_BACKGROUND_OPA, OPA_OPAQUE);\r
+    WeatherModel::GetInstance().LoadImageOfDayNight(bgImg_, IMAGE_WEATHER_BG1, IMAGE_WEATHER_BG2);\r
+\r
+    group_->Add(bgImg_);\r
+    InitWeatherImage1();\r
+    InitWeatherImage2();\r
+    InitWeatherLabel1();\r
+    InitWeatherLabel2();\r
+\r
+    labelTitle_ = new UILabel();\r
+    if (labelTitle_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "WeatherMainPage::labelTitle_ new label fail");\r
+        return;\r
+    }\r
+    if (!flag_) {\r
+        labelTitle_->SetPosition(WEATHER_LABELTITLE_POSITION_X, WEATHER_LABELTITLE_POSITION_Y, WEATHER_LABELTITLE_WIDTH,\r
+                                 WEATHER_LABEL_SIZE_HEIGHT_ONE);\r
+        labelTitle_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, WEATHER_LABEL_FRONT);\r
+        labelTitle_->SetText("天气未更新,请连接手机更新数据");\r
+        labelTitle_->SetVisible(true);\r
+        group_->Add(labelTitle_);\r
+    }\r
+    AddViewToPageContainer(group_);\r
+    if (GetConnectStatus()) {\r
+        errcode_t result;\r
+        uint8_t value = 1; // 更新数据实际不需要使用value 手机侧不关心该字段\r
+#ifdef _WIN32\r
+        result = 0;\r
+#else\r
+        result = msg_center_send_data(MSGCENTER_CMD_DEVICE, MSGCENTER_TYPE_ID_SYNC_WEATHER_REQ, &value, sizeof(value));\r
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "WeatherMainPage msg_center_send_data result:%d ", result);\r
+#endif\r
     }\r
-    AddViewToPageContainer(group);\r
 }\r
 \r
-void WeatherMainPage::InitImage()\r
+void WeatherMainPage::ReloadPage()\r
 {\r
-    aroundImg = new UIImageView();\r
-    if (aroundImg == nullptr) {\r
-        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "WeatherPageFirst::aroundImage new image fail");\r
-        return;\r
-    }\r
-    aroundImg->SetPosition(WEATHER_AROUND_X, WEATHER_AROUND_Y);\r
-    if (weatherModel->GetDayStatus()) {\r
-        LOADIMG::LoadImageViewImg(mainImg, WEATHER_IMAGE, IMAGE_CONVERTER_TOOL_WEATHER64);\r
-        LOADIMG::LoadImageViewImg(aroundImg, WEATHER_IMAGE, IMAGE_CONVERTER_TOOL_WEATHER75);\r
+    flag_ = WeatherModel::GetInstance().InitWeatherItem();\r
+    cur_ = WeatherModel::GetInstance().GetCurWeather();\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "WeatherMainPage::flag_:%d", flag_);\r
+    if (!flag_) {\r
+        labelTitle_->SetVisible(true);\r
     } else {\r
-        LOADIMG::LoadImageViewImg(mainImg, WEATHER_IMAGE, IMAGE_CONVERTER_TOOL_WEATHER65);\r
-        LOADIMG::LoadImageViewImg(aroundImg, WEATHER_IMAGE, IMAGE_CONVERTER_TOOL_WEATHER76);\r
+        labelTitle_->SetVisible(false);\r
     }\r
-    ImageAir = new UIImageView();\r
-    if (ImageAir == nullptr) {\r
-        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "WeatherPageFirst::ImageAir new image fail");\r
-        return;\r
+    WeatherModel::GetInstance().LoadImageOfDayNight(bgImg_, IMAGE_WEATHER_BG1, IMAGE_WEATHER_BG2);\r
+    WeatherModel::GetInstance().LoadImageOfDayNight(airQualityAndHumidityBgImg_,\r
+                                                  IMAGE_WEATHER_ITEM5, IMAGE_WEATHER_ITEM6);\r
+\r
+    curWeatherCode_ = std::atoi(cur_.weather_code);\r
+    LOADIMG::LoadImageViewImg(weatherImg_, WEATHER_IMAGE, bigWeatherImage[curWeatherCode_]);\r
+\r
+    for (int i = 0; i < LABEL_COUNT; i++) {\r
+        std::ostringstream oss;\r
+        if (i == LABEL_ADDRESS) {\r
+            title_[i]->SetText(cur_.address);\r
+            int controlOffset = 10;\r
+            int cut = 2;\r
+            int posX = (VERTICAL_RESOLUTION - addressImg_->GetWidth() -\r
+                        title_[i]->GetTextWidth() - controlOffset) / cut;\r
+            addressImg_->SetX(posX);\r
+            posX = posX + addressImg_->GetWidth() + controlOffset;\r
+            title_[i]->SetX(posX);\r
+        } else if (i == LABEL_TEMP) {\r
+            oss << cur_.max_temp << "° / " << cur_.min_temp << "°  " << g_weatherNames[curWeatherCode_];\r
+            std::string weatherTemp = oss.str();\r
+            title_[i]->SetText(weatherTemp.c_str());\r
+        } else if (i == LABEL_AIR) {\r
+            oss << "空气   --";\r
+            std::string weatherAir = oss.str();\r
+            title_[i]->SetText(weatherAir.c_str());\r
+        } else if (i == LABEL_HUMIDITY) {\r
+            oss << "湿度 " << cur_.humidity << "%";\r
+            std::string weatherHumidity = oss.str();\r
+            title_[i]->SetText(weatherHumidity.c_str());\r
+        } else if (i == LABEL_UPDATETIME) {\r
+            std::string updateTime = FormatTime(cur_.updateTime);\r
+            oss << "上次更新时间 " << updateTime;\r
+            updateTime = oss.str();\r
+            title_[i]->SetText(updateTime.c_str());\r
+        } else if (i == LABEL_CURRENT_TEMP) {\r
+            oss << cur_.temp << "°";\r
+            std::string weatherTemp = oss.str();\r
+            title_[i]->SetText(weatherTemp.c_str());\r
+        }\r
     }\r
-    ImageAir->SetPosition(WEATHER_IMAGEAIR_X, WEATHER_IMAGEAIR_Y);\r
-    ImageAir->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
-    LOADIMG::LoadImageViewImg(ImageAir, WEATHER_IMAGE, IMAGE_CONVERTER_TOOL_WEATHER69);\r
-    ImageHumidity = new UIImageView();\r
-    if (ImageHumidity == nullptr) {\r
-        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "WeatherPageFirst::ImageHumidity new image fail");\r
+}\r
+\r
+void WeatherMainPage::InitWeatherImage1()\r
+{\r
+    addressImg_ = new UIImageView();\r
+    if (addressImg_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "WeatherMainPage::addressImg_ new image fail");\r
         return;\r
     }\r
-    ImageHumidity->SetPosition(WEATHER_IMAGEHUMIDITY_X, WEATHER_IMAGEHUMIDITY_Y);\r
-    ImageHumidity->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
-    LOADIMG::LoadImageViewImg(ImageHumidity, WEATHER_IMAGE, IMAGE_CONVERTER_TOOL_WEATHER70);\r
-    ImagePageKey = new UIImageView();\r
-    if (ImagePageKey == nullptr) {\r
-        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "WeatherPageFirst::ImagePageKey new image fail");\r
+    addressImg_->SetPosition(WEATHER_ADDRESS_X, WEATHER_ADDRESS_Y);\r
+    addressImg_->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+    curWeatherCode_ = std::atoi(cur_.weather_code);\r
+    LOADIMG::LoadImageViewImg(addressImg_, WEATHER_IMAGE, IMAGE_WEATHER_LOCATE);\r
+\r
+    weatherImg_ = new UIImageView();\r
+    if (weatherImg_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "WeatherMainPage::weatherImg_ new image fail");\r
         return;\r
     }\r
-    ImagePageKey->SetPosition(WEATHER_IMAGEPAGEKEY_X, WEATHER_IMAGEPAGEKEY_Y);\r
-    ImagePageKey->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
-    LOADIMG::LoadImageViewImg(ImagePageKey, WEATHER_IMAGE, IMAGE_CONVERTER_TOOL_WEATHER66);\r
-    group->Add(aroundImg);\r
-    group->Add(ImageAir);\r
-    group->Add(ImageHumidity);\r
-    group->Add(ImagePageKey);\r
+    weatherImg_->SetPosition(WEATHER_IMG_X, WEATHER_TEMP_POSITION_Y);\r
+    weatherImg_->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+    curWeatherCode_ = std::atoi(cur_.weather_code);\r
+    if (curWeatherCode_ < 0 || curWeatherCode_ > WEATHER_TYPE) {\r
+        curWeatherCode_ = 0;\r
+    }\r
+    LOADIMG::LoadImageViewImg(weatherImg_, WEATHER_IMAGE, bigWeatherImage[curWeatherCode_]);\r
+    group_->Add(addressImg_);\r
+    group_->Add(weatherImg_);\r
 }\r
 \r
-void WeatherMainPage::InitWeatherImage()\r
+void WeatherMainPage::InitWeatherImage2()\r
 {\r
-    addressImg = new UIImageView();\r
-    if (addressImg == nullptr) {\r
-        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "WeatherPageFirst::img new image fail");\r
+    airQualityAndHumidityBgImg_ = new UIImageView();\r
+    if (airQualityAndHumidityBgImg_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "WeatherMainPage::aroundImage new image fail");\r
         return;\r
     }\r
-    addressImg->SetPosition(WEATHER_ADDRESS_X, WEATHER_ADDRESS_Y);\r
-    addressImg->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
-    curWeather_code = std::atoi(cur.weather_code);\r
-    LOADIMG::LoadImageViewImg(addressImg, WEATHER_IMAGE, IMAGE_CONVERTER_TOOL_WEATHER77);\r
-\r
-    weatherImg = new UIImageView();\r
-    if (weatherImg == nullptr) {\r
-        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "WeatherPageFirst::img new image fail");\r
+    airQualityAndHumidityBgImg_->SetPosition(WEATHER_AROUND_X, WEATHER_AROUND_Y);\r
+    WeatherModel::GetInstance().LoadImageOfDayNight(airQualityAndHumidityBgImg_,\r
+                                                  IMAGE_WEATHER_ITEM5, IMAGE_WEATHER_ITEM6);\r
+    airQulityImgIcon_ = new UIImageView();\r
+    if (airQulityImgIcon_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "WeatherMainPage::airQulityImgIcon_ new image fail");\r
+        return;\r
+    }\r
+    airQulityImgIcon_->SetPosition(WEATHER_IMAGEAIR_X, WEATHER_IMAGEAIR_Y);\r
+    airQulityImgIcon_->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+    LOADIMG::LoadImageViewImg(airQulityImgIcon_, WEATHER_IMAGE, IMAGE_WEATHER_AIR);\r
+    humidityImgIcon_ = new UIImageView(); // humidityImgIcon_->humidityImgIconIcon\r
+    if (humidityImgIcon_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "WeatherMainPage::humidityImgIcon_ new image fail");\r
         return;\r
     }\r
-    weatherImg->SetPosition(WEATHER_IMG_X, WEATHER_TEMP_POSITION_Y);\r
-    weatherImg->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
-    curWeather_code = std::atoi(cur.weather_code);\r
-    LOADIMG::LoadImageViewImg(weatherImg, WEATHER_IMAGE, bigWeatherImage[curWeather_code]);\r
-    group->Add(addressImg);\r
-    group->Add(weatherImg);\r
+    humidityImgIcon_->SetPosition(WEATHER_IMAGEHUMIDITY_X, WEATHER_IMAGEHUMIDITY_Y);\r
+    humidityImgIcon_->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+    LOADIMG::LoadImageViewImg(humidityImgIcon_, WEATHER_IMAGE, IMAGE_WEATHER_WET);\r
+    pageIdxImg_ = new UIImageView();\r
+    if (pageIdxImg_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "WeatherMainPage::pageIdxImg_ new image fail");\r
+        return;\r
+    }\r
+    pageIdxImg_->SetPosition(WEATHER_IMAGEPAGEKEY_X, WEATHER_IMAGEPAGEKEY_Y);\r
+    pageIdxImg_->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+    LOADIMG::LoadImageViewImg(pageIdxImg_, WEATHER_IMAGE, IMAGE_WEATHER_PAGE1);\r
+    group_->Add(airQualityAndHumidityBgImg_);\r
+    group_->Add(airQulityImgIcon_);\r
+    group_->Add(humidityImgIcon_);\r
+    group_->Add(pageIdxImg_);\r
 }\r
 \r
-\r
-void WeatherMainPage::InitLabel()\r
+void WeatherMainPage::InitWeatherLabel1()\r
 {\r
-    int posX[LABEL_COUNT] = {140, 113, 120, 222, 100, 210};\r
+    int posX[LABEL_COUNT] = {140, 113, 119, 232, 100, 210};\r
     int posY[LABEL_COUNT] = {34, 274, 332, 332, 376, 130};\r
-    for (int i = 0; i < LABEL_COUNT; i++) {\r
-        title[i] = new UILabel();\r
-        if (title[i] == nullptr) {\r
-            WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "WeatherPageFirst::InitPageFirst new label:%d fail", i);\r
+    for (int i = 0; i < LABEL_HUMIDITY; i++) { // 从adress控件加载到humidity控件\r
+        std::ostringstream oss;\r
+        title_[i] = new UILabel();\r
+        if (title_[i] == nullptr) {\r
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "WeatherMainPage new label:%d fail", i);\r
             return;\r
         }\r
-        if (i == SET_ZERO) {\r
-            title[i]->SetText(cur.address);\r
-            title[i]->SetPosition(posX[i], posY[i], WEATHER_LABEL_SIZE_WIDTH_ONE, WEATHER_LABEL_SIZE_HEIGHT_ONE);\r
-            title[i]->SetAlign(TEXT_ALIGNMENT_LEFT);\r
-            title[i]->SetFont(DEFAULT_VECTOR_FONT_FILENAME, WEATHER_LABEL_FRONT_ONE);\r
-        } else if (i == SET_ONE) {\r
-            std::ostringstream oss;\r
-            oss << cur.max_degree << "° / " << cur.min_degree << "°  " << weatherNames[curWeather_code];\r
+        if (i == LABEL_ADDRESS) {\r
+            title_[i]->SetText(cur_.address);\r
+            title_[i]->SetPosition(posX[i], posY[i], WEATHER_LABEL_SIZE_WIDTH_ONE, WEATHER_LABEL_SIZE_HEIGHT_ONE);\r
+            title_[i]->SetLineBreakMode(UILabel::LINE_BREAK_ADAPT);\r
+            title_[i]->SetFont(BOLD_VECTOR_FONT_FILENAME, WEATHER_LABEL_FRONT_ONE);\r
+            int controlOffset = 10;\r
+            int cut = 2;\r
+            int posX = (VERTICAL_RESOLUTION - addressImg_->GetWidth() - title_[i]->GetTextWidth()\r
+                        - controlOffset) / cut;\r
+            addressImg_->SetX(posX);\r
+            posX = posX + addressImg_->GetWidth() + controlOffset;\r
+            title_[i]->SetX(posX);\r
+        } else if (i == LABEL_TEMP) {\r
+            oss << cur_.max_temp << "° / " << cur_.min_temp << "°  " << g_weatherNames[curWeatherCode_];\r
             std::string weatherTemp = oss.str();\r
-            title[i]->SetText(weatherTemp.c_str());\r
-            title[i]->SetPosition(posX[i], posY[i], WEATHER_LABEL_SIZE_WIDTH_FIVE, WEATHER_LABEL_SIZE_HEIGHT_FIVE);\r
-            title[i]->SetFont(DEFAULT_VECTOR_FONT_FILENAME, WEATHER_LABEL_FRONT_THREE);\r
-        } else if (i == SET_TWO) {\r
-            std::ostringstream oss;\r
-            oss << "空气   -";\r
-            std::string weatherHumidity = oss.str();\r
-            title[i]->SetText(weatherHumidity.c_str());\r
-            title[i]->SetStyle(STYLE_TEXT_OPA, OPA_OPAQUE);\r
-            title[i]->SetPosition(posX[i], posY[i], WEATHER_LABLEAIR_DATA, WEATHER_LABLEAIR_HEIGHT);\r
-            title[i]->SetFont(DEFAULT_VECTOR_FONT_FILENAME, WEATHER_LABEL_FRONT_TWO);\r
-        } else if (i == SET_THREE) {\r
-            std::ostringstream oss;\r
-            oss << "湿度" << cur.humidity <<"%";\r
+            title_[i]->SetText(weatherTemp.c_str());\r
+            title_[i]->SetPosition(posX[i], posY[i], WEATHER_LABEL_SIZE_WIDTH_FIVE, WEATHER_LABEL_SIZE_HEIGHT_FIVE);\r
+            title_[i]->SetFont(DEFAULT_VECTOR_FONT_FILENAME, WEATHER_LABEL_FRONT_THREE);\r
+        } else if (i == LABEL_AIR) {\r
+            oss << "空气   --";\r
+            std::string weatherAir = oss.str();\r
+            title_[i]->SetText(weatherAir.c_str());\r
+            title_[i]->SetLineBreakMode(UILabel::LINE_BREAK_ADAPT);\r
+            title_[i]->SetStyle(STYLE_TEXT_OPA, OPA_OPAQUE);\r
+            title_[i]->SetPosition(posX[i], posY[i], WEATHER_LABLEAIR_DATA, WEATHER_LABLEAIR_HEIGHT);\r
+            title_[i]->SetFont(DEFAULT_VECTOR_FONT_FILENAME, WEATHER_LABEL_FRONT_TWO);\r
+        }\r
+        title_[i]->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+        group_->Add(title_[i]);\r
+    }\r
+}\r
+\r
+void WeatherMainPage::InitWeatherLabel2()\r
+{\r
+    int posX[LABEL_COUNT] = {140, 113, 119, 232, 100, 210};\r
+    int posY[LABEL_COUNT] = {34, 274, 332, 332, 376, 130};\r
+    for (int i = LABEL_HUMIDITY; i < LABEL_COUNT; i++) { // 从HUMIDITY控件开始到加载剩余label\r
+        std::ostringstream oss;\r
+        title_[i] = new UILabel();\r
+        if (title_[i] == nullptr) {\r
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "WeatherMainPage new label:%d fail", i);\r
+            return;\r
+        }\r
+        if (i == LABEL_HUMIDITY) {\r
+            title_[i]->SetStyle(STYLE_TEXT_OPA, OPA_OPAQUE);\r
+            title_[i]->SetPosition(posX[i], posY[i], WEATHER_IMAGEHUMIDITY_DATA, WEATHER_LABLEAIR_HEIGHT);\r
+            title_[i]->SetFont(DEFAULT_VECTOR_FONT_FILENAME, WEATHER_LABEL_FRONT_TWO);\r
+            oss << "湿度 " << cur_.humidity << "%";\r
             std::string weatherHumidity = oss.str();\r
-            title[i]->SetText(weatherHumidity.c_str());\r
-            title[i]->SetStyle(STYLE_TEXT_OPA, OPA_OPAQUE);\r
-            title[i]->SetPosition(posX[i], posY[i], WEATHER_IMAGEHUMIDITY_DATA, WEATHER_LABLEAIR_HEIGHT);\r
-            title[i]->SetFont(DEFAULT_VECTOR_FONT_FILENAME, WEATHER_LABEL_FRONT_TWO);\r
-        } else if (i == SET_FOUR) {\r
-            std::ostringstream oss;\r
-            std::string updateTime = FormatTime(flag, cur.updateTime);\r
+            title_[i]->SetText(weatherHumidity.c_str());\r
+        } else if (i == LABEL_UPDATETIME) {\r
+            std::string updateTime = FormatTime(cur_.updateTime);\r
             oss << "上次更新时间 " << updateTime;\r
             updateTime = oss.str();\r
-            title[i]->SetText(updateTime.c_str());\r
-            title[i]->SetPosition(posX[i], posY[i], WEATHER_LABEL_SIZE_WIDTH_ONE, WEATHER_LABEL_SIZE_HEIGHT_FOUR);\r
-            title[i]->SetFont(DEFAULT_VECTOR_FONT_FILENAME, WEATHER_LABEL_FRONT_TWO);\r
-        } else if (i == SET_FIVE) {\r
-            std::ostringstream oss;\r
-            oss << cur.degree << "°";\r
+            title_[i]->SetText(updateTime.c_str());\r
+            title_[i]->SetPosition(posX[i], posY[i], WEATHER_LABEL_SIZE_WIDTH_ONE, WEATHER_LABEL_SIZE_HEIGHT_FOUR);\r
+            title_[i]->SetFont(DEFAULT_VECTOR_FONT_FILENAME, WEATHER_LABEL_FRONT_TWO);\r
+        } else if (i == LABEL_CURRENT_TEMP) {\r
+            oss << cur_.temp << "°";\r
             std::string weatherTemp = oss.str();\r
-            title[i]->SetText(weatherTemp.c_str());\r
-            title[i]->SetPosition(posX[i], posY[i], WEATHER_TEMP_WIDTH, WEATHER_TEMP_HEIGHT);\r
-            title[i]->SetFont(DEFAULT_VECTOR_FONT_FILENAME, WEATHER_LABEL_FRONT_FOUR);\r
+            title_[i]->SetText(weatherTemp.c_str());\r
+            title_[i]->SetPosition(posX[i], posY[i], WEATHER_TEMP_WIDTH, WEATHER_TEMP_HEIGHT);\r
+            title_[i]->SetFont(DEFAULT_VECTOR_FONT_FILENAME, WEATHER_LABEL_FRONT_FOUR);\r
         }\r
-        title[i]->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
-        group->Add(title[i]);\r
+        title_[i]->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+        group_->Add(title_[i]);\r
     }\r
 }\r
 \r
-std::string WeatherMainPage::FormatTime(bool falg, const std::string &inputStr)\r
+std::string WeatherMainPage::FormatTime(const std::string &inputStr)\r
 {\r
-    if (!flag) {\r
+    if (!flag_) {\r
         return "--";\r
     }\r
     tm inputTm = {};\r
@@ -304,11 +418,11 @@ std::string WeatherMainPage::FormatTime(bool falg, const std::string &inputStr)
     time_t now = time(nullptr);\r
     tm *nowTm = localtime(&now);\r
     if (inputTm.tm_year == nowTm->tm_year && inputTm.tm_mon == nowTm->tm_mon && inputTm.tm_mday == nowTm->tm_mday) {\r
-        char buffer[6];\r
+        char buffer[BUFFER_SIZE];\r
         strftime(buffer, sizeof(buffer), "%H:%M", &inputTm);\r
         return std::string(buffer);\r
     } else {\r
-        char buffer[6];\r
+        char buffer[BUFFER_SIZE];\r
         strftime(buffer, sizeof(buffer), "%m/%d", &inputTm);\r
         return std::string(buffer);\r
     }\r
@@ -319,13 +433,15 @@ bool WeatherMainPage::OnDrag(UIView &view, const DragEvent &event)
     UNUSED(view);\r
     if ((event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT) && (event.GetDeltaX() > X_DRAG_OFFSET) &&\r
         (event.GetDeltaX() > (DOUBLES * MATH_ABS(event.GetDeltaY())))) {\r
-        NativeAbility::GetInstance().ChangeSlice(VIEW_APPLIST);\r
-        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "WeatherPresenter::OnDrag ChangeSlice(VIEW_APPLIST)");\r
+        NativeAbility::GetInstance().ChangeSliceToApplist();\r
     } else if (event.GetDragDirection() == DragEvent::DIRECTION_RIGHT_TO_LEFT) {\r
-        NativeAbility::GetInstance().SwitchPageInSlice(WEATHER_PAGES::WEATHER_SECOND_PAGE, nullptr,\r
-                                                       TransitionType::TRANSITION_INVALID, true);\r
+        NativeAbility::GetInstance().SwitchPageInSlice(WEATHER_PAGES::WEATHER_HOURS_PAGE,\r
+            TransitionType::TRANSITION_INVALID, false);\r
+    } else if (event.GetDragDirection() == DragEvent::DIRECTION_BOTTOM_TO_TOP) {\r
+        NativeAbility::GetInstance().SwitchPageInSlice(WEATHER_PAGES::WEATHER_SUNRISE_PAGE,\r
+            TransitionType::TRANSITION_INVALID, false);\r
     }\r
-    return false;\r
+    return true;\r
 }\r
 \r
 bool WeatherMainPage::OnClick(UIView &view, const ClickEvent &event)\r
@@ -333,4 +449,19 @@ bool WeatherMainPage::OnClick(UIView &view, const ClickEvent &event)
     UNUSED(event);\r
     return true;\r
 }\r
+\r
+uint8_t WeatherMainPage::GetConnectStatus()\r
+{\r
+    uint8_t conn_status = 0;\r
+#ifdef _WIN32\r
+    conn_status = 1;\r
+#else\r
+    if (msg_center_get_trans_channel() == DIAG_FRAME_FID_PHONE) {\r
+        conn_status = is_spp_connected(0) == true ? 1 : 0;\r
+    } else if (msg_center_get_trans_channel() == DIAG_FRAME_FID_BT) {\r
+        conn_status = msg_center_get_ble_conn_state();\r
+    }\r
+#endif\r
+    return conn_status;\r
+}\r
 }\r
index 6b77b95..5735fa7 100644 (file)
@@ -1,18 +1,24 @@
 /*\r
- * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
  * Description: WeatherModel\r
  * Create: 2025-03-23\r
  */\r
 \r
-#include "weather/WeatherModel.h"\r
-#include "weather/WeatherPresenter.h"\r
-#include "wearable_log.h"\r
 #include "ui_resource_weather.h"\r
+#include "wearable_log.h"\r
 #ifdef BUILD_IN_LINUX\r
 #include "localtime.h"\r
 #endif\r
+#include "weather/WeatherPresenter.h"\r
+#include "weather/WeatherModel.h"\r
 \r
 namespace OHOS {\r
+static constexpr uint16_t IMAGEANIMATOERVIEW_SIZE = 28;\r
+static const char *WEATHER_FILE = WEATHER_PATH "weather.json";\r
+const int g_imageInfo[IMAGEANIMATOERVIEW_SIZE] = {\r
+    IMAGE_WEATHER_MOON1, IMAGE_WEATHER_MOON2, IMAGE_WEATHER_MOON3, IMAGE_WEATHER_MOON4,\r
+    IMAGE_WEATHER_MOON5, IMAGE_WEATHER_MOON6, IMAGE_WEATHER_MOON7, IMAGE_WEATHER_MOON8,\r
+};\r
 \r
 WeatherModel::WeatherModel() {}\r
 \r
@@ -26,45 +32,93 @@ WeatherModel &WeatherModel::GetInstance()
 \r
 uint8_t WeatherModel::GetWeatherListNum()\r
 {\r
-    return usedLen;\r
+    return usedLen_;\r
 }\r
 \r
 WeatherItem *WeatherModel::GetWeatherlistItems()\r
 {\r
-    if (weather[0].label_1 == nullptr) {\r
-        ImageInfo *imgSrc =\r
-            ImageCacheManager::GetInstance().LoadOneInMultiRes(IMAGE_CONVERTER_TOOL_WEATHER47, WEATHER_IMAGE);\r
-        weather[SET_ZERO] = {"今天", imgSrc, "16°/26°", true};\r
-        weather[SET_ONE] = {"明天", imgSrc, "18°/28°", false};\r
-        weather[SET_TWO] = {"后天", imgSrc, "17°/27°", false};\r
-        weather[SET_THREE] = {"周四", imgSrc, "15°/24°", false};\r
-        weather[SET_FOUR] = {"周五", imgSrc, "14°/22°", false};\r
-        weather[SET_FIVE] = {"周六", imgSrc, "16°/25°", false};\r
-        weather[SET_SIX] = {"周日", imgSrc, "19°/29°", false};\r
-        usedLen = SET_SEVEN;\r
-    }\r
-    return weather;\r
+    if (weather_[0].weatherWeek == nullptr) {\r
+        weather_[INDEX_0] = {"今天", smallWeatherImage[0], "16°/26°", true};\r
+        weather_[INDEX_1] = {"明天", smallWeatherImage[0], "18°/28°", false};\r
+        weather_[INDEX_2] = {"周三", smallWeatherImage[0], "17°/27°", false};\r
+        weather_[INDEX_3] = {"周四", smallWeatherImage[0], "15°/24°", false};\r
+        weather_[INDEX_4] = {"周五", smallWeatherImage[0], "14°/22°", false};\r
+        weather_[INDEX_5] = {"周六", smallWeatherImage[0], "16°/25°", false};\r
+        weather_[INDEX_6] = {"周日", smallWeatherImage[0], "19°/29°", false};\r
+        usedLen_ = ONE_WEEK_DYAS;\r
+    }\r
+    return weather_;\r
 }\r
 \r
 CurWeather WeatherModel::GetCurWeather()\r
 {\r
-    if (curWeather.min_degree == nullptr) {\r
-        curWeather.min_degree = "10";\r
-        curWeather.max_degree = "25";\r
-        curWeather.address = "北京市";\r
-        curWeather.weather_code = "02";\r
-        curWeather.degree = "18";\r
-        curWeather.updateTime = "2023-11-15 14:30:00 20";\r
-        curWeather.humidity = "90";\r
-        curWeather.sunSet = "17:30";\r
-        curWeather.sunRise = "06:45";\r
-    }\r
-    return curWeather;\r
+    if (curWeather_.min_temp == nullptr) { // 如果更新天气失败则输出打桩数据\r
+        curWeather_.min_temp = "10";\r
+        curWeather_.max_temp = "25";\r
+        curWeather_.address = "北京市";\r
+        curWeather_.weather_code = "02";\r
+        curWeather_.temp = "18";\r
+        curWeather_.updateTime = "2023-11-15 14:30:00 20";\r
+        curWeather_.humidity = "90";\r
+        curWeather_.sunSet = "17:30";\r
+        curWeather_.sunRise = "06:45";\r
+    }\r
+    return curWeather_;\r
+}\r
+\r
+SunStruct *WeatherModel::GetSunData()\r
+{\r
+    if (sunData_[0].sunRise == nullptr) { // 如果更新天气失败则输出打桩数据\r
+        sunData_[INDEX_0] = {"05:20", "17:43", "今天"};\r
+        sunData_[INDEX_1] = {"06:30", "17:47", "明天"};\r
+        sunData_[INDEX_2] = {"05:20", "17:21", "周三"};\r
+        sunData_[INDEX_3] = {"05:02", "17:24", "周四"};\r
+        sunData_[INDEX_4] = {"06:25", "17:44", "周五"};\r
+        sunData_[INDEX_5] = {"05:21", "17:33", "周六"};\r
+        sunData_[INDEX_6] = {"06:20", "17:12", "周日"};\r
+    }\r
+    return sunData_;\r
+}\r
+\r
+MonthStruct *WeatherModel::GetMonthData()\r
+{\r
+    // 无月出数据 打桩数据输出\r
+    monthData_[INDEX_0] = {"月出 18:42", "月落 06:43", "今天"};\r
+    monthData_[INDEX_1] = {"月出 18:32", "月落 05:47", "明天"};\r
+    monthData_[INDEX_2] = {"月出 19:42", "月落 05:21", "周三"};\r
+    monthData_[INDEX_3] = {"月出 18:42", "月落 06:24", "周四"};\r
+    monthData_[INDEX_4] = {"月出 18:45", "月落 05:44", "周五"};\r
+    monthData_[INDEX_5] = {"月出 18:22", "月落 05:33", "周六"};\r
+    monthData_[INDEX_6] = {"月出 18:52", "月落 05:12", "周日"};\r
+    if (!currentWeek_[0].empty()) {\r
+        for (int i = 0; i < ONE_WEEK_DYAS; i++) {\r
+            monthData_[i].weekTime = currentWeek_[i].c_str();\r
+        }\r
+    }\r
+    return monthData_;\r
+}\r
+\r
+LunarPhaseStruct *WeatherModel::GetLunarPhaseData()\r
+{\r
+    // 无月出数据 打桩数据输出\r
+    parseData_[INDEX_0] = {"残月", g_imageInfo[INDEX_0], "月亮照亮66%", "月龄23天", "今天"};\r
+    parseData_[INDEX_1] = {"亏凸月", g_imageInfo[INDEX_1], "月亮照亮23%", "月龄21天", "明天"};\r
+    parseData_[INDEX_2] = {"盈凸月", g_imageInfo[INDEX_2], "月亮照亮51%", "月龄23天", "周三"};\r
+    parseData_[INDEX_3] = {"娥眉月", g_imageInfo[INDEX_3], "月亮照亮11%", "月龄13天", "周四"};\r
+    parseData_[INDEX_4] = {"下弦月", g_imageInfo[INDEX_4], "月亮照亮51%", "月龄25天", "周五"};\r
+    parseData_[INDEX_5] = {"上弦月", g_imageInfo[INDEX_5], "月亮照亮80%", "月龄15天", "周六"};\r
+    parseData_[INDEX_6] = {"新月", g_imageInfo[INDEX_6], "月亮照亮23%", "月龄18天", "周日"};\r
+    if (!currentWeek_[0].empty()) {\r
+        for (int i = 0; i < ONE_WEEK_DYAS; i++) {\r
+            parseData_[i].weekTime = currentWeek_[i].c_str();\r
+        }\r
+    }\r
+    return parseData_;\r
 }\r
 \r
 std::vector<HourWeather> WeatherModel::GetHourWeather()\r
 {\r
-    if (houWeather.size() < WEATHER_COUNT) {\r
+    if (houWeather_.size() < ALL_HOURS_WEATHER_COUNT) { // 无天气文件或手机下发数据异常不够24个 输出打桩数据\r
         HourWeather weatherData[] = {\r
             {"00:00", "18", "04"}, {"01:00", "17", "06"}, {"02:00", "17", "06"}, {"03:00", "16", "06"},\r
             {"04:00", "16", "07"}, {"05:00", "15", "07"}, {"06:00", "16", "08"}, {"07:00", "17", "08"},\r
@@ -73,17 +127,17 @@ std::vector<HourWeather> WeatherModel::GetHourWeather()
             {"16:00", "24", "06"}, {"17:00", "23", "06"}, {"18:00", "22", "06"}, {"19:00", "21", "07"},\r
             {"20:00", "20", "07"}, {"21:00", "19", "10"}, {"22:00", "18", "10"}, {"23:00", "18", "10"}};\r
         for (const auto &item : weatherData) {\r
-            houWeather.push_back(item);\r
+            houWeather_.push_back(item);\r
         }\r
     }\r
-    return houWeather;\r
+    return houWeather_;\r
 }\r
 \r
 bool WeatherModel::InitWeatherItem()\r
 {\r
-    std::ifstream file("/user/app/user/ace/data/com.vendor.Weather/weather.json");\r
+    std::ifstream file(WEATHER_FILE);\r
     if (!file.is_open()) {\r
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "no file");\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "open fail");\r
         return false;\r
     }\r
     std::stringstream buffer;\r
@@ -101,222 +155,237 @@ bool WeatherModel::InitWeatherItem()
         return false;\r
     }\r
     // 访问JSON数据\r
-    bool updateMsg = InitVecObserve(root);\r
-    if (updateMsg) {\r
-        InitVecForecast(root);\r
-        InitVecRise(root);\r
-        InitVecWeek(root);\r
-        InitVecAddress(root);\r
-        InitFirstPageData();\r
-        InitSecondPageData();\r
-        InitThirdPageData();\r
-    } else {\r
-        cJSON_Delete(root);\r
+    bool result = false;\r
+    result = InitVecObserve(root);\r
+    if (!result) {\r
+        return false;\r
+    }\r
+    result = InitVecForecast(root);\r
+    if (!result) {\r
+        return false;\r
+    }\r
+    result = InitVecWeek(root);\r
+    if (!result) {\r
+        return false;\r
+    }\r
+    result = InitVecAddress(root);\r
+    if (!result) {\r
         return false;\r
     }\r
+    InitStringData();\r
+    result = InitVecRise(root);\r
+    if (!result) {\r
+        return false;\r
+    }\r
+    // 暂无月出、月相文件数据,后续增加相关字段后,需要自行加解析\r
     cJSON_Delete(root);\r
+\r
+    InitMainPageData();\r
+    InitHoursPageData();\r
+    InitDaysPageData();\r
     return true;\r
 }\r
 \r
-void WeatherModel::InitFirstPageData()\r
+void WeatherModel::InitMainPageData()\r
 {\r
-    curWeather = {0};\r
+    curWeather_ = {0};\r
     static std::string sunset;\r
     static std::string sunrise;\r
-    if (map_observe.find("min_degree") != map_observe.end()) {\r
-        curWeather.min_degree = map_observe["min_degree"].c_str();\r
+    if (map_observe_.find("min_temp") != map_observe_.end()) {\r
+        curWeather_.min_temp = map_observe_["min_temp"].c_str();\r
     }\r
-    if (map_observe.find("max_degree") != map_observe.end()) {\r
-        curWeather.max_degree = map_observe["max_degree"].c_str();\r
+    if (map_observe_.find("max_temp") != map_observe_.end()) {\r
+        curWeather_.max_temp = map_observe_["max_temp"].c_str();\r
     }\r
-    if (map_observe.find("degree") != map_observe.end()) {\r
-        curWeather.degree = map_observe["degree"].c_str();\r
+    if (map_observe_.find("temp") != map_observe_.end()) {\r
+        curWeather_.temp = map_observe_["temp"].c_str();\r
     }\r
-    if (map_observe.find("weather_code") != map_observe.end()) {\r
-        curWeather.weather_code = map_observe["weather_code"].c_str();\r
+    if (map_observe_.find("weather_code") != map_observe_.end()) {\r
+        curWeather_.weather_code = map_observe_["weather_code"].c_str();\r
     }\r
-    if (map_observe.find("update_time") != map_observe.end()) {\r
-        curWeather.updateTime = map_observe["update_time"].c_str();\r
+    if (map_observe_.find("update_time") != map_observe_.end()) {\r
+        curWeather_.updateTime = map_observe_["update_time"].c_str();\r
     }\r
-    if (map_observe.find("humidity") != map_observe.end()) {\r
-        curWeather.humidity = map_observe["humidity"].c_str();\r
+    if (map_observe_.find("humidity") != map_observe_.end()) {\r
+        curWeather_.humidity = map_observe_["humidity"].c_str();\r
     }\r
-    if (map_address.find("city") != map_address.end()) {\r
-        curWeather.address = map_address["city"].c_str();\r
+    if (map_address_.find("city") != map_address_.end()) {\r
+        curWeather_.address = map_address_["city"].c_str();\r
     }\r
-    if (map_address.find("address") != map_address.end()) {\r
-        curWeather.address = map_address["address"].c_str();\r
+    if (map_address_.find("address") != map_address_.end()) {\r
+        curWeather_.address = map_address_["address"].c_str();\r
     }\r
 }\r
 \r
-void WeatherModel::InitSecondPageData()\r
+void WeatherModel::InitHoursPageData()\r
 {\r
-    houWeather.clear();\r
-    static std::string dayTime[WEATHER_COUNT];\r
-    static std::string dayTemp[WEATHER_COUNT];\r
-    static std::string dayWeather[WEATHER_COUNT];\r
+    houWeather_.clear();\r
+    static std::string dayTime[ALL_HOURS_WEATHER_COUNT];\r
+    static std::string dayTemp[ALL_HOURS_WEATHER_COUNT];\r
+    static std::string dayWeather[ALL_HOURS_WEATHER_COUNT];\r
 \r
-    for (const auto &item : vec_forecast_1h) {\r
+    for (const auto &item : vec_forecast_1h_) {\r
         const std::string name = std::get<0>(item);\r
         const std::string category = std::get<1>(item);\r
-        const int id = std::get<SET_TWO>(item);\r
+        const int id = std::get<INDEX_2>(item);\r
         HourWeather sample = {nullptr};\r
         if (name == "update_time") {\r
             dayTime[id] = category;\r
-        } else if (name == "degree") {\r
+        } else if (name == "temp") {\r
             dayTemp[id] = category;\r
         } else if (name == "weather_code") {\r
             dayWeather[id] = category;\r
         }\r
     }\r
-    for (int i = 0; i < WEATHER_COUNT; i++) {\r
+    for (int i = 0; i < ALL_HOURS_WEATHER_COUNT; i++) {\r
         HourWeather sample = {nullptr};\r
         sample.hour = dayTime[i].c_str();\r
-        sample.degree = dayTemp[i].c_str();\r
+        sample.temp = dayTemp[i].c_str();\r
         sample.weather = dayWeather[i].c_str();\r
-        houWeather.push_back(sample);\r
+        houWeather_.push_back(sample);\r
+    }\r
+}\r
+\r
+void WeatherModel::InitDaysPageData()\r
+{\r
+    for (int i = 0; i < ONE_WEEK_DYAS; i++) {\r
+        strTmp_[i] = maxTemp_[i] + "° / " + minTemp_[i] + "°";\r
+    }\r
+    for (int i = 0; i < ONE_WEEK_DYAS; i++) {\r
+        int weatherIndex = weatherValue_[i];\r
+        weather_[i] = {currentWeek_[i].c_str(), smallWeatherImage[weatherIndex], strTmp_[i].c_str(), true};\r
     }\r
+    usedLen_ = ONE_WEEK_DYAS;\r
 }\r
 \r
-void WeatherModel::InitThirdPageData()\r
+void WeatherModel::InitStringData()\r
 {\r
-    static std::string strTmp[SET_EIGHT];\r
-    static std::string minTemp[SET_EIGHT];\r
-    static std::string maxTemp[SET_EIGHT];\r
-    static std::string currentWeek[SET_EIGHT];\r
-    static int weatherValue[SET_EIGHT];\r
-    for (const auto &item : vec_forecast_24h) {\r
+    for (const auto &item : vec_forecast_24h_) {\r
         const std::string name = std::get<0>(item);\r
-        const std::string category = std::get<1>(item);\r
-        const int id = std::get<SET_TWO>(item);\r
+        const std::string value = std::get<1>(item);\r
+        const int id = std::get<INDEX_2>(item);\r
         if (name == "current_week") {\r
-            if (id == SET_ZERO) {\r
-                currentWeek[id] = "今天";\r
-            } else if (id == SET_ONE) {\r
-                currentWeek[id] = "明天";\r
-            } else if (id == SET_TWO) {\r
-                currentWeek[id] = "后天";\r
+            if (id == INDEX_0) {\r
+                currentWeek_[id] = "今天";\r
+            } else if (id == INDEX_1) {\r
+                currentWeek_[id] = "明天";\r
             } else {\r
-                currentWeek[id] = category;\r
+                currentWeek_[id] = value;\r
             }\r
-        } else if (name == "min_degree") {\r
-            minTemp[id] = category;\r
-        } else if (name == "max_degree") {\r
-            maxTemp[id] = category;\r
+        } else if (name == "min_temp") {\r
+            minTemp_[id] = value;\r
+        } else if (name == "max_temp") {\r
+            maxTemp_[id] = value;\r
         } else if (name == "day_weather_code") {\r
-            weatherValue[id] = std::atoi(category.c_str());\r
+            weatherValue_[id] = std::atoi(value.c_str());\r
         }\r
     }\r
-    for (int i = 0; i < SET_SEVEN; i++) {\r
-        strTmp[i] = maxTemp[i] + "°/" + minTemp[i] + "°";\r
-        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "WeatherModel::InitWeatherItem:%s", strTmp[i].c_str());\r
-    }\r
-    // 只显示七天的天气\r
-    for (int i = 0; i < SET_SEVEN; i++) {\r
-        int weatherIndex = weatherValue[i];\r
-        ImageInfo *imgSrc =\r
-            ImageCacheManager::GetInstance().LoadOneInMultiRes(smallWeatherImage[weatherIndex], WEATHER_IMAGE);\r
-        weather[i] = {currentWeek[i].c_str(), imgSrc, strTmp[i].c_str(), true};\r
-    }\r
-    usedLen = SET_SEVEN;\r
 }\r
 \r
 bool WeatherModel::InitVecForecast(cJSON *root)\r
 {\r
-    vec_forecast_1h.clear();\r
-    // 获取 forecast_1h 对象\r
+    vec_forecast_1h_.clear();\r
     cJSON *forecast_1h = cJSON_GetObjectItemCaseSensitive(root, "forecast_1h");\r
     if (!cJSON_IsObject(forecast_1h)) {\r
         WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Error forecast_1h:");\r
         cJSON_Delete(root);\r
         return false;\r
     }\r
-    for (int i = 0; i < WEATHER_COUNT; i++) {\r
+    for (int i = 0; i < ALL_HOURS_WEATHER_COUNT; i++) {\r
         cJSON *forecast_1h_num = cJSON_GetObjectItemCaseSensitive(forecast_1h, std::to_string(i).c_str());\r
         if (!cJSON_IsObject(forecast_1h_num)) {\r
             WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Error forecast_1h_num:%d", i);\r
-            continue;  // 跳过当前循环,继续处理下一个\r
+            continue;\r
         }\r
         std::string str = cJSON_GetObjectItemCaseSensitive(forecast_1h_num, "update_time")->valuestring;\r
-        std::string hour = str.substr(SET_TWELVE, SET_TWO);\r
-        // 确保字符串长度至少为12\r
+        std::string hour = str.substr(INDEX_12, INDEX_2);\r
         if (str.length() >= WEATHER_HOUR) {\r
-            // 提取小时部分\r
-            hour = str.substr(SET_EIGHT, SET_TWO) + ":00";\r
+            hour = str.substr(INDEX_8, INDEX_2) + ":00";\r
         } else {\r
-            WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Error forecast_1h:");\r
-            WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Error forecast_1h hour size error");\r
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Error forecast_1h hour size error");\r
             hour = "00:00";\r
         }\r
-        vec_forecast_1h.push_back(std::make_tuple("update_time", hour, i));\r
-        vec_forecast_1h.push_back(\r
-            std::make_tuple("degree", cJSON_GetObjectItemCaseSensitive(forecast_1h_num, "degree")->valuestring, i));\r
-        vec_forecast_1h.push_back(std::make_tuple(\r
+        vec_forecast_1h_.push_back(std::make_tuple("update_time", hour, i));\r
+        vec_forecast_1h_.push_back(\r
+            std::make_tuple("temp", cJSON_GetObjectItemCaseSensitive(forecast_1h_num, "degree")->valuestring, i));\r
+        vec_forecast_1h_.push_back(std::make_tuple(\r
             "weather_code", cJSON_GetObjectItemCaseSensitive(forecast_1h_num, "weather_code")->valuestring, i));\r
     }\r
+    // 由外层函数释放cjson嵌套结构体内存\r
     return true;\r
 }\r
 \r
 bool WeatherModel::InitVecObserve(cJSON *root)\r
 {\r
-    map_observe.clear();\r
+    map_observe_.clear();\r
     // 获取 observe 对象\r
     cJSON *observe = cJSON_GetObjectItemCaseSensitive(root, "observe");\r
     if (!cJSON_IsObject(observe)) {\r
-        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Error observe:");\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Error observe:");\r
         cJSON_Delete(root);\r
         return false;\r
     }\r
-    map_observe.insert(std::make_pair("weather", cJSON_GetObjectItemCaseSensitive(observe, "weather")->valuestring));\r
-    map_observe.insert(std::make_pair("degree", cJSON_GetObjectItemCaseSensitive(observe, "degree")->valuestring));\r
-    map_observe.insert(std::make_pair("humidity", cJSON_GetObjectItemCaseSensitive(observe, "humidity")->valuestring));\r
-    map_observe.insert(\r
-        std::make_pair("min_degree", cJSON_GetObjectItemCaseSensitive(observe, "min_degree")->valuestring));\r
-    map_observe.insert(\r
-        std::make_pair("max_degree", cJSON_GetObjectItemCaseSensitive(observe, "max_degree")->valuestring));\r
-    map_observe.insert(\r
+    map_observe_.insert(std::make_pair("weather", cJSON_GetObjectItemCaseSensitive(observe, "weather")->valuestring));\r
+    map_observe_.insert(std::make_pair("temp", cJSON_GetObjectItemCaseSensitive(observe, "degree")->valuestring));\r
+    map_observe_.insert(std::make_pair("humidity", cJSON_GetObjectItemCaseSensitive(observe, "humidity")->valuestring));\r
+    map_observe_.insert(\r
+        std::make_pair("min_temp", cJSON_GetObjectItemCaseSensitive(observe, "min_degree")->valuestring));\r
+    map_observe_.insert(\r
+        std::make_pair("max_temp", cJSON_GetObjectItemCaseSensitive(observe, "max_degree")->valuestring));\r
+    map_observe_.insert(\r
         std::make_pair("update_time", cJSON_GetObjectItemCaseSensitive(observe, "update_time")->valuestring));\r
-    map_observe.insert(\r
+    map_observe_.insert(\r
         std::make_pair("weather_code", cJSON_GetObjectItemCaseSensitive(observe, "weather_code")->valuestring));\r
+    // 由外层函数释放cjson嵌套结构体内存\r
     return true;\r
 }\r
 \r
 bool WeatherModel::InitVecRise(cJSON *root)\r
 {\r
     // 获取 rise 对象\r
-    vec_rise.clear();\r
     cJSON *rise = cJSON_GetObjectItemCaseSensitive(root, "rise");\r
     if (!cJSON_IsObject(rise)) {\r
-        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Error rise:");\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Error rise:");\r
         cJSON_Delete(root);\r
         return false;\r
     }\r
-    for (int i = 0; i < SET_FOURTEEN; i++) {\r
+    for (int i = 0; i < ONE_WEEK_DYAS; i++) {\r
         cJSON *rise_num = cJSON_GetObjectItemCaseSensitive(rise, std::to_string(i).c_str());\r
         if (!cJSON_IsObject(rise_num)) {\r
-            WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Error rise:%d", i);\r
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Error rise:%d", i);\r
             continue;  // 跳过当前循环,继续处理下一个\r
         }\r
-        std::string sunSet = cJSON_GetObjectItemCaseSensitive(rise_num, "sunset")->valuestring;\r
-        std::string sunRise = cJSON_GetObjectItemCaseSensitive(rise_num, "sunrise")->valuestring;\r
-        SetDayStatus(sunRise, sunSet);\r
+        strRise_[i] = cJSON_GetObjectItemCaseSensitive(rise_num, "sunrise")->valuestring;\r
+        strSet_[i] = cJSON_GetObjectItemCaseSensitive(rise_num, "sunset")->valuestring;\r
+        sunData_[i].sunRise = strRise_[i].c_str();\r
+        sunData_[i].sunSet = strSet_[i].c_str();\r
+        sunData_[i].weekTime = currentWeek_[i].c_str();\r
     }\r
+    if (sunData_[0].sunRise != nullptr) {\r
+        SetDayStatus(sunData_[0].sunRise, sunData_[0].sunSet);\r
+    } else {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "sunData_ is empty");\r
+        cJSON_Delete(root);\r
+        return false;\r
+    }\r
+    // 由外层函数释放cjson嵌套结构体内存\r
     return true;\r
 }\r
 \r
 bool WeatherModel::InitVecWeek(cJSON *root)\r
 {\r
-    vec_forecast_24h.clear();\r
+    vec_forecast_24h_.clear();\r
     cJSON *forecast_24h = cJSON_GetObjectItemCaseSensitive(root, "forecast_24h");\r
     if (!cJSON_IsObject(forecast_24h)) {\r
-        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Error forecast_24h:");\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Error forecast_24h:");\r
         cJSON_Delete(root);\r
         return false;\r
     }\r
-    for (int i = 0; i < SET_TEN; i++) {\r
+    // app写的数据包含了昨天,跳过第一个数据\r
+    for (int i = 1; i <= ONE_WEEK_DYAS; i++) {\r
         cJSON *forecast_24h_num = cJSON_GetObjectItemCaseSensitive(forecast_24h, std::to_string(i).c_str());\r
         if (!cJSON_IsObject(forecast_24h_num)) {\r
-            WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Error forecast_24h_num:%d", i);\r
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Error forecast_24h_num:%d", i);\r
             continue;\r
         }\r
         std::istringstream iss(cJSON_GetObjectItemCaseSensitive(forecast_24h_num, "time")->valuestring);\r
@@ -337,75 +406,83 @@ bool WeatherModel::InitVecWeek(cJSON *root)
             timeinfo.tm_isdst = -1;\r
             std::time_t timestamp = mktime(&timeinfo);\r
             if (timestamp == -1) {\r
+                cJSON_Delete(root);\r
                 return false;\r
             }\r
             std::tm localTimeInfo;\r
-#ifdef _WIN32\r
-            if (localtime_s(&localTimeInfo, &timestamp) != 0) {\r
-#else\r
             if (localtime_r(&timestamp, &localTimeInfo) == nullptr) {\r
-#endif\r
+                cJSON_Delete(root);\r
                 return false;\r
             }\r
             const char *current_weeks[] = {"周日", "周一", "周二", "周三", "周四", "周五", "周六"};\r
-            vec_forecast_24h.push_back(std::make_tuple("current_week", current_weeks[localTimeInfo.tm_wday], i));\r
-            vec_forecast_24h.push_back(std::make_tuple(\r
-                "min_degree", cJSON_GetObjectItemCaseSensitive(forecast_24h_num, "min_degree")->valuestring, i));\r
-            vec_forecast_24h.push_back(std::make_tuple(\r
-                "max_degree", cJSON_GetObjectItemCaseSensitive(forecast_24h_num, "max_degree")->valuestring, i));\r
-            vec_forecast_24h.push_back(std::make_tuple(\r
+            vec_forecast_24h_.push_back(std::make_tuple("current_week", current_weeks[localTimeInfo.tm_wday], i - 1));\r
+            vec_forecast_24h_.push_back(std::make_tuple(\r
+                "min_temp", cJSON_GetObjectItemCaseSensitive(forecast_24h_num, "min_degree")->valuestring, i - 1));\r
+            vec_forecast_24h_.push_back(std::make_tuple(\r
+                "max_temp", cJSON_GetObjectItemCaseSensitive(forecast_24h_num, "max_degree")->valuestring, i - 1));\r
+            vec_forecast_24h_.push_back(std::make_tuple(\r
                 "day_weather_code", cJSON_GetObjectItemCaseSensitive(forecast_24h_num, "day_weather_code")->valuestring,\r
-                i));\r
-            WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "day_weather_code:%s ",\r
-                          cJSON_GetObjectItemCaseSensitive(forecast_24h_num, "day_weather_code")->valuestring);\r
+                i - 1));\r
         } else {\r
-            WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Error Date");\r
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Error Date");\r
         }\r
     }\r
+    // 由外层函数释放cjson嵌套结构体内存\r
     return true;\r
 }\r
 \r
 bool WeatherModel::InitVecAddress(cJSON *root)\r
 {\r
-    map_address.clear();\r
+    map_address_.clear();\r
     cJSON *address = cJSON_GetObjectItemCaseSensitive(root, "address");\r
     if (!cJSON_IsObject(address)) {\r
-        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Error address:");\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Error address:");\r
         cJSON_Delete(root);\r
         return false;\r
     }\r
-    map_address.insert(std::make_pair("province", cJSON_GetObjectItemCaseSensitive(address, "province")->valuestring));\r
-    map_address.insert(std::make_pair("city", cJSON_GetObjectItemCaseSensitive(address, "city")->valuestring));\r
-    map_address.insert(std::make_pair("county", cJSON_GetObjectItemCaseSensitive(address, "county")->valuestring));\r
+    map_address_.insert(std::make_pair("province", cJSON_GetObjectItemCaseSensitive(address, "province")->valuestring));\r
+    map_address_.insert(std::make_pair("city", cJSON_GetObjectItemCaseSensitive(address, "city")->valuestring));\r
+    map_address_.insert(std::make_pair("county", cJSON_GetObjectItemCaseSensitive(address, "county")->valuestring));\r
+    // 由外层函数释放cjson嵌套结构体内存\r
     return true;\r
 }\r
 \r
 void WeatherModel::SetDayStatus(const std::string &timeRise, const std::string &timeSet)\r
 {\r
-#ifdef _WIN32\r
-    struct timeval tv;\r
-    gettimeofday(&tv, NULL);\r
-#else\r
-    struct timeval64 tv;\r
-    gettimeofday64(&tv, NULL);\r
-#endif\r
-    uint64_t second = tv.tv_sec;\r
-    uint64_t minute = second / MIN_TO_HOUR;\r
-    uint64_t hour = minute / MIN_TO_HOUR;\r
-    uint8_t realHour = static_cast<uint8_t>(hour % HOURLY_SYSTEM);\r
-    uint8_t realMinute = static_cast<uint8_t>(minute % MIN_TO_HOUR);\r
+    std::time_t now = std::time(nullptr);\r
+    std::tm *local = std::localtime(&now);\r
+    uint8_t realHour = static_cast<uint8_t>(local->tm_hour);\r
+    uint8_t realMinute = static_cast<uint8_t>(local->tm_min);\r
     int currentTime = realHour * MIN_TO_HOUR + realMinute;\r
-    int hours = (timeRise[SET_ZERO] - '0') * SET_TEN + (timeRise[SET_ONE] - '0');\r
-    int minutes = (timeRise[SET_THREE] - '0') * SET_TEN + (timeRise[SET_FOUR] - '0');\r
+    int hours = (timeRise[INDEX_0] - '0') * NUMBER_10 + (timeRise[INDEX_1] - '0');\r
+    int minutes = (timeRise[INDEX_3] - '0') * NUMBER_10 + (timeRise[INDEX_4] - '0');\r
     int rise = hours * MIN_TO_HOUR + minutes;\r
-    hours = (timeSet[SET_ZERO] - '0') * SET_TEN + (timeSet[SET_ONE] - '0');\r
-    minutes = (timeSet[SET_THREE] - '0') * SET_TEN + (timeSet[SET_FOUR] - '0');\r
+    hours = (timeSet[INDEX_0] - '0') * NUMBER_10 + (timeSet[INDEX_1] - '0');\r
+    minutes = (timeSet[INDEX_3] - '0') * NUMBER_10 + (timeSet[INDEX_4] - '0');\r
     int set = hours * MIN_TO_HOUR + minutes;\r
-    isDay = (currentTime >= rise && currentTime < set) ? true : false;\r
+    isDay_ = (currentTime >= rise && currentTime < set) ? true : false;\r
+}\r
+\r
+void WeatherModel::LoadImageOfDayNight(UIImageView *view, uint32_t resDayId, uint32_t resNightId)\r
+{\r
+    if (isDay_) {\r
+        LOADIMG::LoadImageViewImg(view, WEATHER_IMAGE, resDayId);\r
+    } else {\r
+        LOADIMG::LoadImageViewImg(view, WEATHER_IMAGE, resNightId);\r
+    }\r
+}\r
+\r
+void WeatherModel::LoadTextColorOfDayNight(UILabel *view, uint32_t colorDay, uint32_t colorNight)\r
+{\r
+    if (isDay_) {\r
+        view->SetStyle(STYLE_TEXT_COLOR, colorDay);\r
+    } else {\r
+        view->SetStyle(STYLE_TEXT_COLOR, colorNight);\r
+    }\r
 }\r
 \r
-bool WeatherModel::GetDayStatus()\r
+void WeatherModel::ClearData()\r
 {\r
-    return isDay;\r
+    std::remove(WEATHER_FILE);\r
 }\r
 }\r
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/weather/src/WeatherPageDays.cpp b/code/sdk/application/wearable/evb/nativeapp/nativeui/weather/src/WeatherPageDays.cpp
new file mode 100644 (file)
index 0000000..5df217d
--- /dev/null
@@ -0,0 +1,224 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: WeatherPageDays\r
+ * Create: 2025-03-23\r
+ */\r
+\r
+#include "NativeAbility.h"\r
+#include "SlicePageFactory.h"\r
+#include "common/image_cache_manager.h"\r
+#include "components/ui_list_nested.h"\r
+#include "components/ui_scroll_view_nested.h"\r
+#include "ui_resource_weather.h"\r
+#include "wearable_log.h"\r
+#include "weather/WeatherModel.h"\r
+#include "weather/WeatherPresenter.h"\r
+#include "weather/WeatherView.h"\r
+#include "weather/WeatherPageDays.h"\r
+\r
+namespace OHOS {\r
+static constexpr uint8_t WEATHER_ITEM_FONT_SIZE = 25;\r
+static constexpr int16_t WEATHER_RESIZE_SIZE_WIDTH = 200;\r
+static constexpr int16_t WEATHER_RESIZE_SIZE_HEIGHT = 50;\r
+static constexpr int16_t WEATHER_TITLE_POSITION_X = 130;\r
+static constexpr int16_t WEATHER_LIST_POSITION_X = 32;\r
+static constexpr int16_t WEATHER_LIST_POSITION_Y = 70;\r
+static constexpr int16_t WEATHER_LIST_WIDTH = 390;\r
+static constexpr int16_t WEATHER_LIST_HEIGHT = 318;\r
+static constexpr int16_t WEATHER_LIST_SELECT_POSITION = 80;\r
+static constexpr int16_t LIST_POS = 20;\r
+static constexpr int16_t WEATHER_LABEL_FRONT_ONE = 20;\r
+static constexpr int16_t WEATHER_LABEL_FRONT = 40;\r
+static constexpr int16_t WEATHER_IMAGEPAGEKEY_X = 199;\r
+static constexpr int16_t WEATHER_IMAGEPAGEKEY_Y = 429;\r
+static constexpr int16_t WEATHER_IMAGEPAGEKEY_WIDTH = 56;\r
+static constexpr int16_t WEATHER_IMAGEPAGEKEY_HEIGHT = 10;\r
+static constexpr int16_t WEATHER_ITEM_BUTTON_WIDTH = 390;\r
+static constexpr int16_t WEATHER_ITEM_BUTTON_HEIGHT = 83;\r
+\r
+REGIST_SLICE_PAGE(VIEW_WEATHER, WEATHER_PAGES::WEATHER_DAYS_PAGE, WeatherPageDays, false);\r
+\r
+WeatherPageDays::WeatherPageDays()\r
+{\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "WeatherPageDays::WeatherPageDays");\r
+}\r
+\r
+WeatherPageDays::~WeatherPageDays()\r
+{\r
+    if (group_ != nullptr) {\r
+        group_->RemoveAll();\r
+        delete group_;\r
+        group_ = nullptr;\r
+    }\r
+\r
+    if (contentList_ != nullptr) {\r
+        contentList_->ClearAll();\r
+        delete contentList_;\r
+        contentList_ = nullptr;\r
+    }\r
+\r
+    if (title_ != nullptr) {\r
+        delete title_;\r
+        title_ = nullptr;\r
+    }\r
+\r
+    if (bgImg_ != nullptr) {\r
+        delete bgImg_;\r
+        bgImg_ = nullptr;\r
+    }\r
+\r
+    if (pageIdxImg_ != nullptr) {\r
+        delete pageIdxImg_;\r
+        pageIdxImg_ = nullptr;\r
+    }\r
+    ImageCacheManager::GetInstance().UnloadAllInMultiRes(WEATHER_IMAGE);\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "WeatherPageDays::~WeatherPageDays");\r
+}\r
+\r
+void WeatherPageDays::OnStart(void *data)\r
+{\r
+    group_ = new UIViewGroup();\r
+    if (group_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "WeatherPageDays::group_ is nullptr");\r
+        return;\r
+    }\r
+    group_->Resize(HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);\r
+    group_->SetStyle(STYLE_BACKGROUND_OPA, OPA_OPAQUE);\r
+    group_->SetOnDragListener(this);\r
+\r
+    title_ = new UILabel();\r
+    if (title_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "WeatherPageDays::title_ is nullptr");\r
+        return;\r
+    }\r
+    title_->SetPosition(WEATHER_TITLE_POSITION_X, WEATHER_LABEL_FRONT_ONE);\r
+    title_->SetText("7日天气预报");\r
+    title_->Resize(WEATHER_RESIZE_SIZE_WIDTH, WEATHER_RESIZE_SIZE_HEIGHT);\r
+    title_->SetFont(BOLD_VECTOR_FONT_FILENAME, WEATHER_ITEM_FONT_SIZE);\r
+    title_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+    title_->SetStyle(STYLE_TEXT_OPA, OPA_OPAQUE);\r
+    title_->SetStyle(STYLE_TEXT_COLOR, Color::White().full);\r
+    title_->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+    title_->SetWidth(title_->GetTextWidth());\r
+    int pageWidth = 454;\r
+    int half = 2;\r
+    title_->SetX((pageWidth - title_->GetTextWidth()) / half);\r
+\r
+    bgImg_ = new UIImageView();\r
+    if (bgImg_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "OnStart bgImg_ new fail");\r
+        return;\r
+    }\r
+    bgImg_->SetPosition(0, 0);\r
+    bgImg_->SetStyle(STYLE_BACKGROUND_OPA, OPA_OPAQUE);\r
+    WeatherModel::GetInstance().LoadImageOfDayNight(bgImg_, IMAGE_WEATHER_BG1, IMAGE_WEATHER_BG2);\r
+    InitScrollView();\r
+    InitScrollData();\r
+    AddViewToPageContainer(group_);\r
+}\r
+\r
+void WeatherPageDays::InitScrollView()\r
+{\r
+    contentList_ = new UISimpleList();\r
+    if (contentList_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "WeatherPageDays::contentList_ is nullptr");\r
+        return;\r
+    }\r
+\r
+    contentList_->SetPosition(WEATHER_LIST_POSITION_X, WEATHER_LIST_POSITION_Y);\r
+    contentList_->Resize(WEATHER_LIST_WIDTH, WEATHER_LIST_HEIGHT);\r
+    contentList_->SetSelectPosition(WEATHER_LIST_SELECT_POSITION);\r
+    contentList_->SetDraggable(true);\r
+    contentList_->SetThrowDrag(true);\r
+    contentList_->EnableAutoAlign(true);\r
+    contentList_->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+    contentList_->SetElastic(true);\r
+    pageIdxImg_ = new UIImageView();\r
+    if (pageIdxImg_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "WeatherPageDays::pageIdxImg_ new image fail");\r
+        return;\r
+    }\r
+    pageIdxImg_->SetPosition(WEATHER_IMAGEPAGEKEY_X, WEATHER_IMAGEPAGEKEY_Y, WEATHER_IMAGEPAGEKEY_WIDTH,\r
+                             WEATHER_IMAGEPAGEKEY_HEIGHT);\r
+    pageIdxImg_->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+    LOADIMG::LoadImageViewImg(pageIdxImg_, WEATHER_IMAGE, IMAGE_WEATHER_PAGE3);\r
+    group_->Add(bgImg_);\r
+    group_->Add(title_);\r
+    group_->Add(contentList_);\r
+    group_->Add(pageIdxImg_);\r
+}\r
+\r
+bool WeatherPageDays::InitScrollData()\r
+{\r
+    WeatherItem *itemInfo = WeatherModel::GetInstance().GetWeatherlistItems();\r
+    RefreshWeathersList(itemInfo, WeatherModel::GetInstance().GetWeatherListNum());\r
+    return true;\r
+}\r
+\r
+static UIView* CreateViewCb(uint8_t type)\r
+{\r
+    WeatherItemView* item = new WeatherItemView();\r
+    if (item == nullptr) {\r
+        return nullptr;\r
+    }\r
+\r
+    item->SetPosition(0, 0, WEATHER_ITEM_BUTTON_WIDTH, WEATHER_ITEM_BUTTON_HEIGHT);\r
+    item->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+    item->SetTouchable(true);\r
+    return item;\r
+}\r
+\r
+static void UpdateViewCb(UIView* view, void* data, uint8_t type)\r
+{\r
+    WeatherItemView* item = dynamic_cast<WeatherItemView*>(view);\r
+    if (view == nullptr || data == nullptr || item == nullptr) {\r
+        return;\r
+    }\r
+    WeatherItem* content = static_cast<WeatherItem *>(data);\r
+    item->SetItemInfo(*content);\r
+}\r
+\r
+\r
+void WeatherPageDays::RefreshWeathersList(WeatherItem *item, uint8_t count)\r
+{\r
+    if (item == nullptr) {\r
+        return;\r
+    }\r
+    if (contentList_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "WeatherPageDays::contentList_ fail");\r
+        return;\r
+    }\r
+    contentList_->ScrollTo(0);\r
+    for (uint8_t i = 0; i < count; ++i) {\r
+        Contents content;\r
+        content.createFunc = CreateViewCb;\r
+        content.updateFunc = UpdateViewCb;\r
+        content.data = reinterpret_cast<void *>(&item[i]);\r
+        contentList_->AddContent(content);\r
+    }\r
+    contentList_->RefreshList();\r
+}\r
+\r
+bool WeatherPageDays::OnDrag(UIView &view, const DragEvent &event)\r
+{\r
+    UNUSED(view);\r
+    if ((event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT) && (event.GetDeltaX() > X_DRAG_OFFSET) &&\r
+        (event.GetDeltaX() > (DOUBLES * MATH_ABS(event.GetDeltaY())))) {\r
+        NativeAbility::GetInstance().SwitchPageInSlice(WEATHER_PAGES::WEATHER_HOURS_PAGE,\r
+            TransitionType::TRANSITION_INVALID, false);\r
+    }\r
+    return true;\r
+}\r
+\r
+void WeatherPageDays::OnSwipe(UISwipeView &view)\r
+{\r
+    UNUSED(view);\r
+    return;\r
+}\r
+\r
+bool WeatherPageDays::OnClick(UIView &view, const ClickEvent &event)\r
+{\r
+    UNUSED(event);\r
+    return true;\r
+}\r
+}
\ No newline at end of file
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/weather/src/WeatherPageHours.cpp b/code/sdk/application/wearable/evb/nativeapp/nativeui/weather/src/WeatherPageHours.cpp
new file mode 100644 (file)
index 0000000..09a635c
--- /dev/null
@@ -0,0 +1,99 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: WeatherPageHours\r
+ * Create: 2025-03-15\r
+ */\r
+\r
+#include "NativeAbility.h"\r
+#include "SlicePageFactory.h"\r
+#include "common/image_cache_manager.h"\r
+#include "components/ui_scroll_view_nested.h"\r
+#include "ui_resource_weather.h"\r
+#include "wearable_log.h"\r
+#include "weather/WeatherPresenter.h"\r
+#include "weather/WeatherView.h"\r
+#include "weather/WeatherPageHours.h"\r
+\r
+namespace OHOS {\r
+static constexpr uint16_t ANIMATOR_TIME = 50;\r
+\r
+REGIST_SLICE_PAGE(VIEW_WEATHER, WEATHER_PAGES::WEATHER_HOURS_PAGE, WeatherPageHours, false);\r
+\r
+WeatherPageHours::WeatherPageHours()\r
+{\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "WeatherPageHours::WeatherPageHours");\r
+}\r
+\r
+WeatherPageHours::~WeatherPageHours()\r
+{\r
+    if (weatherSwipeGroup_ != nullptr) {\r
+        weatherSwipeGroup_->RemoveAll();\r
+        delete weatherSwipeGroup_;\r
+        weatherSwipeGroup_ = nullptr;\r
+    }\r
+\r
+    for (int i = 0; i < GROUP_24H_COUNT; ++i) {\r
+        if (hoursGroup_[i] != nullptr) {\r
+            hoursGroup_[i]->RemoveAll();\r
+            delete hoursGroup_[i];\r
+            hoursGroup_[i] = nullptr;\r
+        }\r
+    }\r
+    WeatherModel::GetInstance().index_ = 0;\r
+    ImageCacheManager::GetInstance().UnloadAllInMultiRes(WEATHER_IMAGE);\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "WeatherPageHours::~WeatherPageHours");\r
+}\r
+\r
+void WeatherPageHours::OnStart(void *data)\r
+{\r
+    weatherSwipeGroup_ = new UISwipeView(UISwipeView::VERTICAL);\r
+    if (weatherSwipeGroup_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "weatherSwipeGroup_ new fail");\r
+        return;\r
+    }\r
+    weatherSwipeGroup_->SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);\r
+    weatherSwipeGroup_->SetViewId("weatherSwipeGroup_");\r
+    weatherSwipeGroup_->SetOnDragListener(this);\r
+    weatherSwipeGroup_->SetOnSwipeListener(this);\r
+    weatherSwipeGroup_->SetDraggable(true);\r
+    weatherSwipeGroup_->SetTouchable(true);\r
+    weatherSwipeGroup_->SetAnimatorTime(ANIMATOR_TIME);\r
+    \r
+    for (int i = 0; i < GROUP_24H_COUNT; i++) {\r
+        hoursGroup_[i] = new WeatherPageHoursGroup();\r
+        if (hoursGroup_[i] == nullptr) {\r
+            return;\r
+        }\r
+        WeatherModel::GetInstance().index_++;\r
+        weatherSwipeGroup_->Add(hoursGroup_[i]);\r
+    }\r
+\r
+    AddViewToPageContainer(weatherSwipeGroup_);\r
+}\r
+\r
+bool WeatherPageHours::OnDrag(UIView &view, const DragEvent &event)\r
+{\r
+    UNUSED(view);\r
+    if ((event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT) && (event.GetDeltaX() > X_DRAG_OFFSET) &&\r
+        (event.GetDeltaX() > (DOUBLES * MATH_ABS(event.GetDeltaY())))) {\r
+        NativeAbility::GetInstance().SwitchPageInSlice(WEATHER_PAGES::WEATHER_MAIN_PAGE,\r
+            TransitionType::TRANSITION_INVALID, false);\r
+    } else if (event.GetDragDirection() == DragEvent::DIRECTION_RIGHT_TO_LEFT) {\r
+        NativeAbility::GetInstance().SwitchPageInSlice(WEATHER_PAGES::WEATHER_DAYS_PAGE,\r
+            TransitionType::TRANSITION_INVALID, false);\r
+    }\r
+    return true;\r
+}\r
+\r
+void WeatherPageHours::OnSwipe(UISwipeView &view)\r
+{\r
+    UNUSED(view);\r
+    return;\r
+}\r
+\r
+bool WeatherPageHours::OnClick(UIView &view, const ClickEvent &event)\r
+{\r
+    UNUSED(event);\r
+    return true;\r
+}\r
+}
\ No newline at end of file
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/weather/src/WeatherPageHoursGroup.cpp b/code/sdk/application/wearable/evb/nativeapp/nativeui/weather/src/WeatherPageHoursGroup.cpp
new file mode 100644 (file)
index 0000000..5c4ce93
--- /dev/null
@@ -0,0 +1,193 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: WeatherPageHoursGroup\r
+ * Create: 2025-03-15\r
+ */\r
+\r
+#include "NativeAbility.h"\r
+#include "SlicePageFactory.h"\r
+#include "common/image_cache_manager.h"\r
+#include "components/ui_list_nested.h"\r
+#include "components/ui_scroll_view_nested.h"\r
+#include "ui_resource_weather.h"\r
+#include "wearable_log.h"\r
+#include "weather/WeatherModel.h"\r
+#include "weather/WeatherPresenter.h"\r
+#include "weather/WeatherView.h"\r
+#include "weather/WeatherPageHoursGroup.h"\r
+\r
+namespace OHOS {\r
+static constexpr uint16_t WEATHER_TITLE_WIDTH = 51;\r
+static constexpr uint16_t WEATHER_TITLE_HEIGHT = 26;\r
+static constexpr uint16_t WEATHER_TOPLABEL_X = 156;\r
+static constexpr uint16_t WEATHER_TOPLABEL_Y = 22;\r
+static constexpr uint16_t WEATHER_TOPLABEL_WIDTH = 150;\r
+static constexpr uint16_t WEATHER_TOPLABEL_HEIGHT = 60;\r
+static constexpr uint16_t WEATHER_TOPLABEL_FRONT = 26;\r
+static constexpr uint16_t WEATHER_LABELTIME_FRONT = 20;\r
+static constexpr uint16_t WEATHER_LABELTIME_FRONT_TWO = 24;\r
+static constexpr int16_t WEATHER_IMAGEPAGEKEY_X = 199;\r
+static constexpr int16_t WEATHER_IMAGEPAGEKEY_Y = 429;\r
+static constexpr int16_t WEATHER_IMAGEPAGEKEY_WIDTH = 56;\r
+static constexpr int16_t WEATHER_IMAGEPAGEKEY_HEIGHT = 10;\r
+\r
+WeatherPageHoursGroup::WeatherPageHoursGroup()\r
+{\r
+    WeatherInit(WeatherModel::GetInstance().index_);\r
+}\r
+\r
+WeatherPageHoursGroup::~WeatherPageHoursGroup()\r
+{\r
+    for (int i = 0; i < WEATHER_24H_PER_8H; ++i) {\r
+        if (imgBack_[i] != nullptr) {\r
+            delete imgBack_[i];\r
+            imgBack_[i] = nullptr;\r
+        }\r
+    }\r
+\r
+    for (int i = 0; i < WEATHER_24H_PER_8H; ++i) {\r
+        if (labelTime_[i] != nullptr) {\r
+            delete labelTime_[i];\r
+            labelTime_[i] = nullptr;\r
+        }\r
+    }\r
+\r
+    for (int i = 0; i < WEATHER_24H_PER_8H; ++i) {\r
+        if (labelTemp_[i] != nullptr) {\r
+            delete labelTemp_[i];\r
+            labelTemp_[i] = nullptr;\r
+        }\r
+    }\r
+\r
+    for (int i = 0; i < WEATHER_24H_PER_8H; ++i) {\r
+        if (imgWeather_[i] != nullptr) {\r
+            delete imgWeather_[i];\r
+            imgWeather_[i] = nullptr;\r
+        }\r
+    }\r
+\r
+    if (bgImg_ != nullptr) {\r
+        delete bgImg_;\r
+        bgImg_ = nullptr;\r
+    }\r
+\r
+    if (pageIdxImg_ != nullptr) {\r
+        delete pageIdxImg_;\r
+        pageIdxImg_ = nullptr;\r
+    }\r
+\r
+    if (topLabel_ != nullptr) {\r
+        delete topLabel_;\r
+        topLabel_ = nullptr;\r
+    }\r
+    ImageCacheManager::GetInstance().UnloadAllInMultiRes(WEATHER_IMAGE);\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "~WeatherPageHoursGroup");\r
+}\r
+\r
+void WeatherPageHoursGroup::WeatherInit(int index)\r
+{\r
+    SetPosition(0, 0);\r
+    Resize(HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);\r
+    SetViewId("weather");\r
+    SetDraggable(true);\r
+    SetTouchable(true);\r
+    houWeather_ = WeatherModel::GetInstance().GetHourWeather();\r
+\r
+    bgImg_ = new UIImageView();\r
+    if (bgImg_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "WeatherInit bgImg_ new fail");\r
+        return;\r
+    }\r
+    bgImg_->SetPosition(0, 0);\r
+    bgImg_->SetStyle(STYLE_BACKGROUND_OPA, OPA_OPAQUE);\r
+    WeatherModel::GetInstance().LoadImageOfDayNight(bgImg_, IMAGE_WEATHER_BG1, IMAGE_WEATHER_BG2);\r
+    Add(bgImg_);\r
+\r
+    pageIdxImg_ = new UIImageView();\r
+    if (pageIdxImg_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "pageIdxImg_ new fail");\r
+        return;\r
+    }\r
+    pageIdxImg_->SetPosition(WEATHER_IMAGEPAGEKEY_X, WEATHER_IMAGEPAGEKEY_Y, WEATHER_IMAGEPAGEKEY_WIDTH,\r
+                             WEATHER_IMAGEPAGEKEY_HEIGHT);\r
+    pageIdxImg_->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+    LOADIMG::LoadImageViewImg(pageIdxImg_, WEATHER_IMAGE, IMAGE_WEATHER_PAGE2);\r
+    Add(pageIdxImg_);\r
+\r
+    topLabel_ = new UILabel();\r
+    if (topLabel_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "WeatherInit new topLabel_ fail");\r
+        return;\r
+    }\r
+    topLabel_->SetText("24小时预报");\r
+    topLabel_->SetFont(BOLD_VECTOR_FONT_FILENAME, WEATHER_TOPLABEL_FRONT);\r
+    topLabel_->SetPosition(WEATHER_TOPLABEL_X, WEATHER_TOPLABEL_Y, WEATHER_TOPLABEL_WIDTH, WEATHER_TOPLABEL_HEIGHT);\r
+    Add(topLabel_);\r
+\r
+    InitImage(index * WEATHER_24H_PER_8H);\r
+    InitLabel(index * WEATHER_24H_PER_8H);\r
+    return;\r
+}\r
+\r
+void WeatherPageHoursGroup::InitImage(int index)\r
+{\r
+    int weatherPosX[WEATHER_24H_PER_8H] = {67, 161, 257, 351, 67, 161, 257, 351};\r
+    int weatherPosY[WEATHER_24H_PER_8H] = {125, 125, 125, 125, 289, 289, 289, 289};\r
+    int backPosX[WEATHER_24H_PER_8H] = {47, 141, 235, 329, 47, 141, 235, 329};\r
+    int backPosY[WEATHER_24H_PER_8H] = {71, 71, 71, 71, 235, 235, 235, 235};\r
+    for (int i = 0; i < WEATHER_24H_PER_8H; i++) {\r
+        imgBack_[i] = new UIImageView();\r
+        if (imgBack_[i] == nullptr) {\r
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "InitImage new imgBack_ fail");\r
+            return;\r
+        }\r
+        imgBack_[i]->SetPosition(backPosX[i], backPosY[i]);\r
+        WeatherModel::GetInstance().LoadImageOfDayNight(imgBack_[i], IMAGE_WEATHER_ITEM3, IMAGE_WEATHER_ITEM4);\r
+\r
+        imgWeather_[i] = new UIImageView();\r
+        if (imgWeather_[i] == nullptr) {\r
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "InitImage new labelTime_ fail");\r
+            return;\r
+        }\r
+        imgWeather_[i]->SetPosition(weatherPosX[i], weatherPosY[i]);\r
+        int curWeatherCode_ = std::atoi(houWeather_[index + i].weather);\r
+        LOADIMG::LoadImageViewImg(imgWeather_[i], WEATHER_IMAGE, smallWeatherImage[curWeatherCode_]);\r
+        Add(imgBack_[i]);\r
+        Add(imgWeather_[i]);\r
+    }\r
+}\r
+\r
+void WeatherPageHoursGroup::InitLabel(int index)\r
+{\r
+    int timePosX[WEATHER_24H_PER_8H] = {67, 161, 255, 349, 67, 161, 255, 349};\r
+    int timePosY[WEATHER_24H_PER_8H] = {91, 91, 91, 91, 255, 255, 255, 255};\r
+    int tempPosX[WEATHER_24H_PER_8H] = {75, 169, 263, 356, 75, 169, 263, 356};\r
+    int tempPosY[WEATHER_24H_PER_8H] = {175, 175, 175, 175, 339, 339, 339, 339};\r
+\r
+    for (int i = 0; i < WEATHER_24H_PER_8H; i++) {\r
+        labelTime_[i] = new UILabel();\r
+        if (labelTime_[i] == nullptr) {\r
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "InitLabel new labelTime_ fail");\r
+            return;\r
+        }\r
+        std::string strHour = houWeather_[index + i].hour;\r
+        labelTime_[i]->SetText(strHour.c_str());\r
+        labelTime_[i]->SetFont(DEFAULT_VECTOR_FONT_FILENAME, WEATHER_LABELTIME_FRONT);\r
+        labelTime_[i]->SetPosition(timePosX[i], timePosY[i], WEATHER_TITLE_WIDTH, WEATHER_TITLE_HEIGHT);\r
+        Add(labelTime_[i]);\r
+\r
+        labelTemp_[i] = new UILabel();\r
+        if (labelTemp_[i] == nullptr) {\r
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "InitLabel new labelTemp_ fail");\r
+            return;\r
+        }\r
+        std::ostringstream oss;\r
+        oss << houWeather_[index + i].temp << "°";\r
+        std::string temp = oss.str();\r
+        labelTemp_[i]->SetText(temp.c_str());\r
+        labelTemp_[i]->SetFont(DEFAULT_VECTOR_FONT_FILENAME, WEATHER_LABELTIME_FRONT_TWO);\r
+        labelTemp_[i]->SetPosition(tempPosX[i], tempPosY[i], WEATHER_TITLE_WIDTH, WEATHER_TITLE_HEIGHT);\r
+        Add(labelTemp_[i]);\r
+    }\r
+}\r
+}
\ No newline at end of file
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/weather/src/WeatherPageLunarPhase.cpp b/code/sdk/application/wearable/evb/nativeapp/nativeui/weather/src/WeatherPageLunarPhase.cpp
new file mode 100644 (file)
index 0000000..aef75f1
--- /dev/null
@@ -0,0 +1,328 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: WeatherPageLunarPhase\r
+ * Create: 2025-03-15\r
+ */\r
+\r
+#include "NativeAbility.h"\r
+#include "SlicePageFactory.h"\r
+#include "common/image_cache_manager.h"\r
+#include "components/ui_list_nested.h"\r
+#include "components/ui_scroll_view_nested.h"\r
+#include "ui_resource_weather.h"\r
+#include "wearable_log.h"\r
+#include "weather/WeatherModel.h"\r
+#include "weather/WeatherPresenter.h"\r
+#include "weather/WeatherView.h"\r
+#include "weather/WeatherPageLunarPhase.h"\r
+\r
+namespace OHOS {\r
+static constexpr uint8_t WEATHER_ITEM_FONT_SIZE = 24;\r
+static constexpr uint8_t WEATHER_ITEM_FONT_SIZE_TWO = 30;\r
+static constexpr int16_t WEATHER_TITLE_POSITION_X = 198;\r
+static constexpr int16_t WEATHER_TITLE_POSITION_Y = 41;\r
+static constexpr int16_t WEATHER_TITLE_SIZE_WIDTH = 454;\r
+static constexpr int16_t WEATHER_TITLE_SIZE_HEIGHT = 49;\r
+static constexpr int16_t WEATHER_LUNAR_POSITION_X = 169;\r
+static constexpr int16_t WEATHER_LUNAR_POSITION_Y = 290;\r
+static constexpr int16_t WEATHER_BUTTON_LEFT_POSITION_X = 76;\r
+static constexpr int16_t WEATHER_BUTTON_RIGHT_POSITION_X = 306;\r
+static constexpr int16_t WEATHER_BUTTON_POSITION_Y = 50;\r
+static constexpr int16_t WEATHER_BUTTON_SIZE = 69;\r
+static constexpr int16_t WEATHER_IMAGE_POSITION_X = 166;\r
+static constexpr int16_t WEATHER_IMAGE_POSITION_Y = 160;\r
+static constexpr int16_t WEATHER_LABEL_DAY_POSITION_X = 184;\r
+static constexpr int16_t WEATHER_LABEL_DAY_SIZE_WIDTH = 89;\r
+static constexpr int16_t WEATHER_LABEL_DAY_SIZE_HEIGHT = 30;\r
+static constexpr int16_t WEATHER_PHASE_SIZE_WIDTH = 117;\r
+static constexpr int16_t WEATHER_PHASE_SIZE_HEIGHT = 49;\r
+static constexpr int16_t WEATHER_LIGHT_SIZE_WIDTH = 173;\r
+static constexpr int16_t WEATHER_LIGHT_SIZE_HEIGHT = 39;\r
+static constexpr int16_t WEATHER_LIGHT_POSITION_X = 141;\r
+\r
+REGIST_SLICE_PAGE(VIEW_WEATHER, WEATHER_PAGES::WEATHER_LUNARPHASE_PAGE, WeatherPageLunarPhase, false);\r
+\r
+WeatherPageLunarPhase::WeatherPageLunarPhase()\r
+{\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "WeatherPageLunarPhase::WeatherPageLunarPhase");\r
+}\r
+\r
+WeatherPageLunarPhase::~WeatherPageLunarPhase()\r
+{\r
+    if (group_ != nullptr) {\r
+        group_->RemoveAll();\r
+        delete group_;\r
+        group_ = nullptr;\r
+    }\r
+\r
+    if (bgImg_ != nullptr) {\r
+        delete bgImg_;\r
+        bgImg_ = nullptr;\r
+    }\r
+\r
+    if (drawImg_ != nullptr) {\r
+        delete drawImg_;\r
+        drawImg_ = nullptr;\r
+    }\r
+\r
+    if (labelTitle_ != nullptr) {\r
+        delete labelTitle_;\r
+        labelTitle_ = nullptr;\r
+    }\r
+\r
+    if (labelDay_ != nullptr) {\r
+        delete labelDay_;\r
+        labelDay_ = nullptr;\r
+    }\r
+\r
+    if (labelLunarPhase_ != nullptr) {\r
+        delete labelLunarPhase_;\r
+        labelLunarPhase_ = nullptr;\r
+    }\r
+\r
+    if (labelMonthLight_ != nullptr) {\r
+        delete labelMonthLight_;\r
+        labelMonthLight_ = nullptr;\r
+    }\r
+\r
+    if (labelMonthDay_ != nullptr) {\r
+        delete labelMonthDay_;\r
+        labelMonthDay_ = nullptr;\r
+    }\r
+\r
+    if (buttonChangeLeft_ != nullptr) {\r
+        delete buttonChangeLeft_;\r
+        buttonChangeLeft_ = nullptr;\r
+    }\r
+\r
+    if (buttonChangeRight_ != nullptr) {\r
+        delete buttonChangeRight_;\r
+        buttonChangeRight_ = nullptr;\r
+    }\r
+\r
+    ImageCacheManager::GetInstance().UnloadAllInMultiRes(WEATHER_IMAGE);\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "WeatherPageLunarPhase::~WeatherPageLunarPhase");\r
+}\r
+\r
+void WeatherPageLunarPhase::OnStart(void *data)\r
+{\r
+    group_ = new UIViewGroup();\r
+    if (group_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "group_ new fail");\r
+        return;\r
+    }\r
+    group_->SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);\r
+    group_->SetViewId("phaseGroup");\r
+    group_->SetOnDragListener(this);\r
+    group_->SetDraggable(true);\r
+    group_->SetTouchable(true);\r
+    phase_ = WeatherModel::GetInstance().GetLunarPhaseData();\r
+    InitImage();\r
+    InitLabel();\r
+    InitButton();\r
+    InitMonthLabel();\r
+    AddViewToPageContainer(group_);\r
+}\r
+\r
+void WeatherPageLunarPhase::InitImage()\r
+{\r
+    bgImg_ = new UIImageView();\r
+    if (bgImg_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "bgImg_ new image fail");\r
+        return;\r
+    }\r
+    bgImg_->SetPosition(0, 0);\r
+    bgImg_->SetStyle(STYLE_BACKGROUND_OPA, OPA_OPAQUE);\r
+    WeatherModel::GetInstance().LoadImageOfDayNight(bgImg_, IMAGE_WEATHER_BG1, IMAGE_WEATHER_BG2);\r
+    drawImg_ = new UIImageView();\r
+    if (drawImg_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "drawImg_ new image fail");\r
+        return;\r
+    }\r
+    drawImg_->SetPosition(WEATHER_IMAGE_POSITION_X, WEATHER_IMAGE_POSITION_Y);\r
+    drawImg_->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+    LOADIMG::LoadImageViewImg(drawImg_, WEATHER_IMAGE, IMAGE_WEATHER_MOON1);\r
+    group_->Add(bgImg_);\r
+    group_->Add(drawImg_);\r
+}\r
+\r
+void WeatherPageLunarPhase::InitLabel()\r
+{\r
+    labelTitle_ = new UILabel();\r
+    if (labelTitle_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "labelTitle_ is nullptr");\r
+        return;\r
+    }\r
+    labelTitle_->SetPosition(WEATHER_TITLE_POSITION_X, WEATHER_TITLE_POSITION_Y);\r
+    labelTitle_->SetText("月相");\r
+    labelTitle_->Resize(WEATHER_TITLE_SIZE_WIDTH, WEATHER_TITLE_SIZE_HEIGHT);\r
+    labelTitle_->SetLineBreakMode(UILabel::LINE_BREAK_ADAPT);\r
+    labelTitle_->SetFont(BOLD_VECTOR_FONT_FILENAME, WEATHER_ITEM_FONT_SIZE_TWO);\r
+    labelTitle_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+    labelTitle_->SetStyle(STYLE_TEXT_OPA, OPA_OPAQUE);\r
+    labelTitle_->SetStyle(STYLE_TEXT_COLOR, Color::White().full);\r
+    labelTitle_->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+\r
+    labelDay_ = new UILabel();\r
+    if (labelDay_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "labelDay_ is nullptr");\r
+        return;\r
+    }\r
+    labelDay_->SetPosition(WEATHER_LABEL_DAY_POSITION_X, WEATHER_TITLE_POSITION_Y + labelTitle_->GetTextHeight());\r
+    labelDay_->SetText("今天");\r
+    labelDay_->Resize(WEATHER_LABEL_DAY_SIZE_WIDTH, WEATHER_LABEL_DAY_SIZE_HEIGHT);\r
+    labelDay_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, WEATHER_ITEM_FONT_SIZE);\r
+    labelDay_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+    WeatherModel::GetInstance().LoadTextColorOfDayNight(labelDay_, Color::White().full, Color::Gray().full);\r
+    labelDay_->SetStyle(STYLE_TEXT_OPA, OPA_OPAQUE);\r
+    labelDay_->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+\r
+    group_->Add(labelTitle_);\r
+    group_->Add(labelDay_);\r
+}\r
+\r
+void WeatherPageLunarPhase::InitMonthLabel()\r
+{\r
+    labelLunarPhase_ = new UILabel();\r
+    if (labelLunarPhase_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "labelLunarPhase_ is nullptr");\r
+        return;\r
+    }\r
+    labelLunarPhase_->SetPosition(WEATHER_LUNAR_POSITION_X, WEATHER_LUNAR_POSITION_Y);\r
+    labelLunarPhase_->Resize(WEATHER_PHASE_SIZE_WIDTH, WEATHER_PHASE_SIZE_HEIGHT);\r
+    labelLunarPhase_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, WEATHER_ITEM_FONT_SIZE_TWO);\r
+    labelLunarPhase_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+    labelLunarPhase_->SetStyle(STYLE_TEXT_OPA, OPA_OPAQUE);\r
+    labelLunarPhase_->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+    labelLunarPhase_->SetLineBreakMode(UILabel::LINE_BREAK_ELLIPSIS);\r
+    labelLunarPhase_->SetText(phase_[0].phase);\r
+\r
+    labelMonthLight_ = new UILabel();\r
+    if (labelMonthLight_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "labelMonthLight_ is nullptr");\r
+        return;\r
+    }\r
+    labelMonthLight_->SetPosition(WEATHER_LIGHT_POSITION_X, labelLunarPhase_->GetY()\r
+                                    + labelLunarPhase_->GetTextHeight());\r
+    labelMonthLight_->Resize(WEATHER_LIGHT_SIZE_WIDTH, WEATHER_LIGHT_SIZE_HEIGHT);\r
+    labelMonthLight_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, WEATHER_ITEM_FONT_SIZE);\r
+    labelMonthLight_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+    labelMonthLight_->SetStyle(STYLE_TEXT_OPA, OPA_OPAQUE);\r
+    WeatherModel::GetInstance().LoadTextColorOfDayNight(labelMonthLight_, Color::White().full, Color::Gray().full);\r
+    labelMonthLight_->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+    labelMonthLight_->SetLineBreakMode(UILabel::LINE_BREAK_ELLIPSIS);\r
+    labelMonthLight_->SetText(phase_[0].lightTime);\r
+\r
+    labelMonthDay_ = new UILabel();\r
+    if (labelMonthDay_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "labelMonthDay_ is nullptr");\r
+        return;\r
+    }\r
+    labelMonthDay_->SetPosition(WEATHER_LIGHT_POSITION_X, labelMonthLight_->GetY() + labelMonthLight_->GetTextHeight());\r
+    labelMonthDay_->Resize(WEATHER_LIGHT_SIZE_WIDTH, WEATHER_LIGHT_SIZE_HEIGHT);\r
+    labelMonthDay_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, WEATHER_ITEM_FONT_SIZE);\r
+    labelMonthDay_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+    labelMonthDay_->SetStyle(STYLE_TEXT_OPA, OPA_OPAQUE);\r
+    WeatherModel::GetInstance().LoadTextColorOfDayNight(labelMonthDay_, Color::White().full, Color::Gray().full);\r
+    labelMonthDay_->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+    labelMonthDay_->SetLineBreakMode(UILabel::LINE_BREAK_ELLIPSIS);\r
+    labelMonthDay_->SetText(phase_[0].monthDay);\r
+    group_->Add(labelLunarPhase_);\r
+    group_->Add(labelMonthLight_);\r
+    group_->Add(labelMonthDay_);\r
+}\r
+\r
+void WeatherPageLunarPhase::InitButton()\r
+{\r
+    buttonChangeLeft_ = new UIButton();\r
+    if (buttonChangeLeft_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "buttonChangeLeft_ is nullptr");\r
+        return;\r
+    }\r
+    buttonChangeLeft_->SetPosition(WEATHER_BUTTON_LEFT_POSITION_X, WEATHER_BUTTON_POSITION_Y);\r
+    buttonChangeLeft_->Resize(WEATHER_BUTTON_SIZE, WEATHER_BUTTON_SIZE);\r
+    buttonChangeLeft_->SetViewId("buttonLeft");\r
+    buttonChangeLeft_->SetOnClickListener(this);\r
+    buttonChangeLeft_->SetStyleForState(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT, UIButton::RELEASED);\r
+    buttonChangeLeft_->SetStyleForState(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT, UIButton::PRESSED);\r
+    buttonChangeLeft_->SetStyleForState(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT, UIButton::INACTIVE);\r
+    buttonChangeLeft_->SetVisible(true);\r
+    LOADIMG::LoadBtnImage(buttonChangeLeft_, WEATHER_IMAGE, IMAGE_WEATHER_PREV_GRAY, IMAGE_WEATHER_PREV_GRAY);\r
+    buttonChangeRight_ = new UIButton();\r
+\r
+    if (buttonChangeRight_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "buttonChangeRight_ new fail");\r
+        return;\r
+    }\r
+    buttonChangeRight_->SetPosition(WEATHER_BUTTON_RIGHT_POSITION_X, WEATHER_BUTTON_POSITION_Y);\r
+    buttonChangeRight_->Resize(WEATHER_BUTTON_SIZE, WEATHER_BUTTON_SIZE);\r
+    buttonChangeRight_->SetViewId("buttonRight");\r
+    buttonChangeRight_->SetOnClickListener(this);\r
+    buttonChangeRight_->SetStyleForState(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT, UIButton::RELEASED);\r
+    buttonChangeRight_->SetStyleForState(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT, UIButton::PRESSED);\r
+    buttonChangeRight_->SetStyleForState(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT, UIButton::INACTIVE);\r
+    buttonChangeRight_->SetVisible(true);\r
+    LOADIMG::LoadBtnImage(buttonChangeRight_, WEATHER_IMAGE, IMAGE_WEATHER_NEXT, IMAGE_WEATHER_NEXT);\r
+    buttonChangeLeft_->Disable();\r
+    group_->Add(buttonChangeLeft_);\r
+    group_->Add(buttonChangeRight_);\r
+}\r
+\r
+bool WeatherPageLunarPhase::OnDrag(UIView &view, const DragEvent &event)\r
+{\r
+    UNUSED(view);\r
+    if ((event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT) && (event.GetDeltaX() > X_DRAG_OFFSET) &&\r
+        (event.GetDeltaX() > (DOUBLES * MATH_ABS(event.GetDeltaY())))) {\r
+        NativeAbility::GetInstance().SwitchPageInSlice(WEATHER_PAGES::WEATHER_MONTHRISE_PAGE,\r
+            TransitionType::TRANSITION_INVALID, false);\r
+    } else if (event.GetDragDirection() == DragEvent::DIRECTION_TOP_TO_BOTTOM) {\r
+        NativeAbility::GetInstance().SwitchPageInSlice(WEATHER_PAGES::WEATHER_MAIN_PAGE,\r
+            TransitionType::TRANSITION_INVALID, false);\r
+    }\r
+    return true;\r
+}\r
+\r
+bool WeatherPageLunarPhase::OnClick(UIView &view, const ClickEvent &event)\r
+{\r
+    UNUSED(event);\r
+\r
+    if (strcmp(view.GetViewId(), "buttonLeft") == 0) {\r
+        if (index_ > 0) {\r
+            labelDay_->SetText(phase_[--index_].weekTime);\r
+            labelLunarPhase_->SetText(phase_[index_].phase);\r
+            labelMonthLight_->SetText(phase_[index_].lightTime);\r
+            labelMonthDay_->SetText(phase_[index_].monthDay);\r
+            LOADIMG::LoadImageViewImg(drawImg_, WEATHER_IMAGE, phase_[index_].image);\r
+            if (index_ == 0) {\r
+                LOADIMG::LoadBtnImage(buttonChangeLeft_, WEATHER_IMAGE, IMAGE_WEATHER_PREV_GRAY,\r
+                                      IMAGE_WEATHER_PREV_GRAY);\r
+                buttonChangeLeft_->Disable();\r
+            } else {\r
+                LOADIMG::LoadBtnImage(buttonChangeLeft_, WEATHER_IMAGE, IMAGE_WEATHER_PREV, IMAGE_WEATHER_PREV);\r
+                LOADIMG::LoadBtnImage(buttonChangeRight_, WEATHER_IMAGE, IMAGE_WEATHER_NEXT, IMAGE_WEATHER_NEXT);\r
+                buttonChangeLeft_->Enable();\r
+                buttonChangeRight_->Enable();\r
+            }\r
+        }\r
+    } else if (strcmp(view.GetViewId(), "buttonRight") == 0) {\r
+        if (index_ < BUTTON_CHANGE_END) {\r
+            labelDay_->SetText(phase_[++index_].weekTime);\r
+            labelLunarPhase_->SetText(phase_[index_].phase);\r
+            labelMonthLight_->SetText(phase_[index_].lightTime);\r
+            labelMonthDay_->SetText(phase_[index_].monthDay);\r
+            LOADIMG::LoadImageViewImg(drawImg_, WEATHER_IMAGE, phase_[index_].image);\r
+            if (index_ == BUTTON_CHANGE_END) {\r
+                LOADIMG::LoadBtnImage(buttonChangeRight_, WEATHER_IMAGE, IMAGE_WEATHER_NEXT_GRAY,\r
+                                      IMAGE_WEATHER_NEXT_GRAY);\r
+                buttonChangeRight_->Disable();\r
+            } else {\r
+                LOADIMG::LoadBtnImage(buttonChangeLeft_, WEATHER_IMAGE, IMAGE_WEATHER_PREV, IMAGE_WEATHER_PREV);\r
+                LOADIMG::LoadBtnImage(buttonChangeRight_, WEATHER_IMAGE, IMAGE_WEATHER_NEXT, IMAGE_WEATHER_NEXT);\r
+                buttonChangeLeft_->Enable();\r
+                buttonChangeRight_->Enable();\r
+            }\r
+        }\r
+    }\r
+    return true;\r
+}\r
+}
\ No newline at end of file
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/weather/src/WeatherPageMonthRise.cpp b/code/sdk/application/wearable/evb/nativeapp/nativeui/weather/src/WeatherPageMonthRise.cpp
new file mode 100644 (file)
index 0000000..6727035
--- /dev/null
@@ -0,0 +1,310 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: WeatherPageMonthRise\r
+ * Create: 2025-03-15\r
+ */\r
+\r
+#include "NativeAbility.h"\r
+#include "SlicePageFactory.h"\r
+#include "common/image_cache_manager.h"\r
+#include "components/ui_list_nested.h"\r
+#include "components/ui_scroll_view_nested.h"\r
+#include "ui_resource_weather.h"\r
+#include "wearable_log.h"\r
+#include "weather/WeatherModel.h"\r
+#include "weather/WeatherPresenter.h"\r
+#include "weather/WeatherView.h"\r
+#include "weather/WeatherPageMonthRise.h"\r
+\r
+namespace OHOS {\r
+static constexpr uint8_t WEATHER_TITLE_FONT_SIZE = 30;\r
+static constexpr uint8_t WEATHER_ITEM_FONT_SIZE = 24;\r
+static constexpr int16_t WEATHER_RESIZE_SIZE_WIDTH = 117;\r
+static constexpr int16_t WEATHER_RESIZE_SIZE_HEIGHT = 38;\r
+static constexpr int16_t WEATHER_TITLE_POSITION_X = 167;\r
+static constexpr int16_t WEATHER_TITLE_POSITION_Y = 41;\r
+static constexpr int16_t WEATHER_TITLE_DAY_POSITION_X = 49;\r
+static constexpr int16_t WEATHER_TITLE_DAY_POSITION_Y = 318;\r
+static constexpr int16_t WEATHER_BUTTON_LEFT_POSITION_X = 76;\r
+static constexpr int16_t WEATHER_BUTTON_RIGHT_POSITION_X = 306;\r
+static constexpr int16_t WEATHER_BUTTON_POSITION_Y = 50;\r
+static constexpr int16_t WEATHER_BUTTON_SIZE = 69;\r
+static constexpr int16_t WEATHER_IMAGE_POSITION_X = 0;\r
+static constexpr int16_t WEATHER_IMAGE_POSITION_Y = 214;\r
+static constexpr int16_t WEATHER_IMAGE_MONTH_POSITION_X = 280;\r
+static constexpr int16_t WEATHER_IMAGE_MONTH_POSITION_Y = 264;\r
+static constexpr int16_t WEATHER_LABEL_DAY_POSITION_X = 184;\r
+static constexpr int16_t WEATHER_LABEL_DAY_SIZE_WIDTH = 89;\r
+static constexpr int16_t WEATHER_LABEL_DAY_SIZE_HEIGHT = 30;\r
+static constexpr int16_t WEATHER_LABEL_MOHTH_SIZE_WIDTH = 113;\r
+static constexpr int16_t WEATHER_LABEL_MONTH_SIZE_HEIGHT = 30;\r
+\r
+REGIST_SLICE_PAGE(VIEW_WEATHER, WEATHER_PAGES::WEATHER_MONTHRISE_PAGE, WeatherPageMonthRise, false);\r
+\r
+WeatherPageMonthRise::WeatherPageMonthRise()\r
+{\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "WeatherPageMonthRise::WeatherPageMonthRise");\r
+}\r
+\r
+WeatherPageMonthRise::~WeatherPageMonthRise()\r
+{\r
+    if (group_ != nullptr) {\r
+        group_->RemoveAll();\r
+        delete group_;\r
+        group_ = nullptr;\r
+    }\r
+\r
+    if (bgImg_ != nullptr) {\r
+        delete bgImg_;\r
+        bgImg_ = nullptr;\r
+    }\r
+\r
+    if (drawImg_ != nullptr) {\r
+        delete drawImg_;\r
+        drawImg_ = nullptr;\r
+    }\r
+\r
+    if (monthImg_ != nullptr) {\r
+        delete monthImg_;\r
+        monthImg_ = nullptr;\r
+    }\r
+\r
+    if (labelTitle_ != nullptr) {\r
+        delete labelTitle_;\r
+        labelTitle_ = nullptr;\r
+    }\r
+\r
+    if (labelDay_ != nullptr) {\r
+        delete labelDay_;\r
+        labelDay_ = nullptr;\r
+    }\r
+\r
+    for (int i = 0; i < MONTHRISE_TIME_LABEL_COUNT; i++) {\r
+        if (labelMonth_[i] != nullptr) {\r
+            delete labelMonth_[i];\r
+            labelMonth_[i] = nullptr;\r
+        }\r
+    }\r
+\r
+    if (buttonChangeLeft_ != nullptr) {\r
+        delete buttonChangeLeft_;\r
+        buttonChangeLeft_ = nullptr;\r
+    }\r
+\r
+    if (buttonChangeRight_ != nullptr) {\r
+        delete buttonChangeRight_;\r
+        buttonChangeRight_ = nullptr;\r
+    }\r
+    ImageCacheManager::GetInstance().UnloadAllInMultiRes(WEATHER_IMAGE);\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "WeatherPageMonthRise::~WeatherPageMonthRise");\r
+}\r
+\r
+void WeatherPageMonthRise::OnStart(void *data)\r
+{\r
+    group_ = new UIViewGroup();\r
+    if (group_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "group_ new fail");\r
+        return;\r
+    }\r
+    group_->SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);\r
+    group_->SetViewId("monthGroup");\r
+    group_->SetOnDragListener(this);\r
+    group_->SetDraggable(true);\r
+    group_->SetTouchable(true);\r
+    month_ = WeatherModel::GetInstance().GetMonthData();\r
+    InitImage();\r
+    InitLabel();\r
+    InitLabelMonth();\r
+    InitButton();\r
+    index_ = 0;\r
+    AddViewToPageContainer(group_);\r
+}\r
+\r
+void WeatherPageMonthRise::InitImage()\r
+{\r
+    bgImg_ = new UIImageView();\r
+    if (bgImg_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "bgImg_ new image fail");\r
+        return;\r
+    }\r
+    bgImg_->SetPosition(0, 0);\r
+    bgImg_->SetStyle(STYLE_BACKGROUND_OPA, OPA_OPAQUE);\r
+    WeatherModel::GetInstance().LoadImageOfDayNight(bgImg_, IMAGE_WEATHER_BG1, IMAGE_WEATHER_BG2);\r
+\r
+    drawImg_ = new UIImageView();\r
+    if (drawImg_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "drawImg_ new image fail");\r
+        return;\r
+    }\r
+    drawImg_->SetPosition(WEATHER_IMAGE_POSITION_X, WEATHER_IMAGE_POSITION_Y);\r
+    drawImg_->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+    LOADIMG::LoadImageViewImg(drawImg_, WEATHER_IMAGE, IMAGE_WEATHER_SUNSET);\r
+\r
+    monthImg_ = new UIImageView();\r
+    if (monthImg_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "monthImg_ new image fail");\r
+        return;\r
+    }\r
+    monthImg_->SetPosition(WEATHER_IMAGE_MONTH_POSITION_X, WEATHER_IMAGE_MONTH_POSITION_Y);\r
+    monthImg_->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+    LOADIMG::LoadImageViewImg(monthImg_, WEATHER_IMAGE, IMAGE_WEATHER_MOON);\r
+    group_->Add(bgImg_);\r
+    group_->Add(drawImg_);\r
+    group_->Add(monthImg_);\r
+}\r
+\r
+void WeatherPageMonthRise::InitLabel()\r
+{\r
+    labelTitle_ = new UILabel();\r
+    if (labelTitle_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "labelTitle_ is nullptr");\r
+        return;\r
+    }\r
+    labelTitle_->SetPosition(WEATHER_TITLE_POSITION_X, WEATHER_TITLE_POSITION_Y);\r
+    labelTitle_->SetLineBreakMode(UILabel::LINE_BREAK_ADAPT);\r
+    labelTitle_->SetText("月出月落");\r
+    labelTitle_->Resize(WEATHER_RESIZE_SIZE_WIDTH, WEATHER_RESIZE_SIZE_HEIGHT);\r
+    labelTitle_->SetFont(BOLD_VECTOR_FONT_FILENAME, WEATHER_TITLE_FONT_SIZE);\r
+    labelTitle_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+    labelTitle_->SetStyle(STYLE_TEXT_OPA, OPA_OPAQUE);\r
+    labelTitle_->SetStyle(STYLE_TEXT_COLOR, Color::White().full);\r
+    labelTitle_->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+\r
+    labelDay_ = new UILabel();\r
+    if (labelDay_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "labelDay_ is nullptr");\r
+        return;\r
+    }\r
+    labelDay_->SetPosition(WEATHER_LABEL_DAY_POSITION_X, WEATHER_TITLE_POSITION_Y + labelTitle_->GetTextHeight());\r
+    labelDay_->SetText("今天");\r
+    labelDay_->Resize(WEATHER_LABEL_DAY_SIZE_WIDTH, WEATHER_LABEL_DAY_SIZE_HEIGHT);\r
+    labelDay_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, WEATHER_ITEM_FONT_SIZE);\r
+    labelDay_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+    labelDay_->SetStyle(STYLE_TEXT_OPA, OPA_OPAQUE);\r
+    WeatherModel::GetInstance().LoadTextColorOfDayNight(labelDay_, Color::White().full, Color::Gray().full);\r
+    labelDay_->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+    std::string monthRise = std::string();\r
+    std::string monthSet = std::string();\r
+    labelDay_->SetText(month_[0].weekTime);\r
+    group_->Add(labelTitle_);\r
+    group_->Add(labelDay_);\r
+}\r
+\r
+void WeatherPageMonthRise::InitLabelMonth()\r
+{\r
+    for (int i = 0; i < MONTHRISE_TIME_LABEL_COUNT; i++) {\r
+        labelMonth_[i] = new UILabel();\r
+        if (labelMonth_[i] == nullptr) {\r
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "labelMonth_:[%d] is nullptr", i);\r
+            return;\r
+        }\r
+        int offsetX = 250;\r
+        labelMonth_[i]->SetLineBreakMode(UILabel::LINE_BREAK_ADAPT);\r
+        labelMonth_[i]->SetPosition(WEATHER_TITLE_DAY_POSITION_X + i * offsetX, WEATHER_TITLE_DAY_POSITION_Y);\r
+        labelMonth_[i]->Resize(WEATHER_LABEL_MOHTH_SIZE_WIDTH, WEATHER_LABEL_MONTH_SIZE_HEIGHT);\r
+        labelMonth_[i]->SetFont(BOLD_VECTOR_FONT_FILENAME, WEATHER_ITEM_FONT_SIZE);\r
+        labelMonth_[i]->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+        labelMonth_[i]->SetStyle(STYLE_TEXT_OPA, OPA_OPAQUE);\r
+        WeatherModel::GetInstance().LoadTextColorOfDayNight(labelMonth_[i], Color::White().full, Color::Gray().full);\r
+        labelMonth_[i]->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+        group_->Add(labelMonth_[i]);\r
+    }\r
+    labelMonth_[0]->SetText(month_[0].monthRise);\r
+    labelMonth_[1]->SetText(month_[0].monthSet);\r
+}\r
+\r
+void WeatherPageMonthRise::InitButton()\r
+{\r
+    buttonChangeLeft_ = new UIButton();\r
+    if (buttonChangeLeft_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "buttonChangeLeft_ new button fail");\r
+        return;\r
+    }\r
+    buttonChangeLeft_->SetPosition(WEATHER_BUTTON_LEFT_POSITION_X, WEATHER_BUTTON_POSITION_Y);\r
+    buttonChangeLeft_->Resize(WEATHER_BUTTON_SIZE, WEATHER_BUTTON_SIZE);\r
+    buttonChangeLeft_->SetViewId("buttonLeft");\r
+    buttonChangeLeft_->SetOnClickListener(this);\r
+    buttonChangeLeft_->SetStyleForState(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT, UIButton::RELEASED);\r
+    buttonChangeLeft_->SetStyleForState(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT, UIButton::PRESSED);\r
+    buttonChangeLeft_->SetStyleForState(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT, UIButton::INACTIVE);\r
+    buttonChangeLeft_->SetVisible(true);\r
+    LOADIMG::LoadBtnImage(buttonChangeLeft_, WEATHER_IMAGE, IMAGE_WEATHER_PREV_GRAY, IMAGE_WEATHER_PREV_GRAY);\r
+    buttonChangeRight_ = new UIButton();\r
+    if (buttonChangeRight_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "buttonChangeRight_ new button fail");\r
+        return;\r
+    }\r
+    buttonChangeRight_->SetPosition(WEATHER_BUTTON_RIGHT_POSITION_X, WEATHER_BUTTON_POSITION_Y);\r
+    buttonChangeRight_->Resize(WEATHER_BUTTON_SIZE, WEATHER_BUTTON_SIZE);\r
+    buttonChangeRight_->SetViewId("buttonRight");\r
+    buttonChangeRight_->SetOnClickListener(this);\r
+    buttonChangeRight_->SetStyleForState(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT, UIButton::RELEASED);\r
+    buttonChangeRight_->SetStyleForState(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT, UIButton::PRESSED);\r
+    buttonChangeRight_->SetStyleForState(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT, UIButton::INACTIVE);\r
+    buttonChangeRight_->SetVisible(true);\r
+    LOADIMG::LoadBtnImage(buttonChangeRight_, WEATHER_IMAGE, IMAGE_WEATHER_NEXT, IMAGE_WEATHER_NEXT);\r
+    buttonChangeLeft_->Disable();\r
+    group_->Add(buttonChangeLeft_);\r
+    group_->Add(buttonChangeRight_);\r
+}\r
+\r
+bool WeatherPageMonthRise::OnDrag(UIView &view, const DragEvent &event)\r
+{\r
+    UNUSED(view);\r
+    if ((event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT) && (event.GetDeltaX() > X_DRAG_OFFSET) &&\r
+        (event.GetDeltaX() > (DOUBLES * MATH_ABS(event.GetDeltaY())))) {\r
+        NativeAbility::GetInstance().SwitchPageInSlice(WEATHER_PAGES::WEATHER_SUNRISE_PAGE,\r
+            TransitionType::TRANSITION_INVALID, false);\r
+    } else if (event.GetDragDirection() == DragEvent::DIRECTION_RIGHT_TO_LEFT) {\r
+        NativeAbility::GetInstance().SwitchPageInSlice(WEATHER_PAGES::WEATHER_LUNARPHASE_PAGE,\r
+            TransitionType::TRANSITION_INVALID, false);\r
+    } else if (event.GetDragDirection() == DragEvent::DIRECTION_TOP_TO_BOTTOM) {\r
+        NativeAbility::GetInstance().SwitchPageInSlice(WEATHER_PAGES::WEATHER_MAIN_PAGE,\r
+            TransitionType::TRANSITION_INVALID, false);\r
+    }\r
+    return true;\r
+}\r
+\r
+bool WeatherPageMonthRise::OnClick(UIView &view, const ClickEvent &event)\r
+{\r
+    UNUSED(event);\r
+\r
+    if (strcmp(view.GetViewId(), "buttonLeft") == 0) {\r
+        if (index_ > 0) {\r
+            labelDay_->SetText(month_[--index_].weekTime);\r
+            labelMonth_[0]->SetText(month_[index_].monthRise);\r
+            labelMonth_[1]->SetText(month_[index_].monthSet);\r
+            if (index_ == 0) {\r
+                monthImg_->SetVisible(true);\r
+                LOADIMG::LoadBtnImage(buttonChangeLeft_, WEATHER_IMAGE, IMAGE_WEATHER_PREV_GRAY,\r
+                                      IMAGE_WEATHER_PREV_GRAY);\r
+                buttonChangeLeft_->Disable();\r
+            } else {\r
+                monthImg_->SetVisible(false);\r
+                LOADIMG::LoadBtnImage(buttonChangeLeft_, WEATHER_IMAGE, IMAGE_WEATHER_PREV, IMAGE_WEATHER_PREV);\r
+                LOADIMG::LoadBtnImage(buttonChangeRight_, WEATHER_IMAGE, IMAGE_WEATHER_NEXT, IMAGE_WEATHER_NEXT);\r
+                buttonChangeLeft_->Enable();\r
+                buttonChangeRight_->Enable();\r
+            }\r
+        }\r
+    } else if (strcmp(view.GetViewId(), "buttonRight") == 0) {\r
+        if (index_ < BUTTON_CHANGE_END) {\r
+            monthImg_->SetVisible(false);\r
+            labelDay_->SetText(month_[++index_].weekTime);\r
+            labelMonth_[0]->SetText(month_[index_].monthRise);\r
+            labelMonth_[1]->SetText(month_[index_].monthSet);\r
+            if (index_ == BUTTON_CHANGE_END) {\r
+                LOADIMG::LoadBtnImage(buttonChangeRight_, WEATHER_IMAGE, IMAGE_WEATHER_NEXT_GRAY,\r
+                                      IMAGE_WEATHER_NEXT_GRAY);\r
+                buttonChangeRight_->Disable();\r
+            } else {\r
+                LOADIMG::LoadBtnImage(buttonChangeLeft_, WEATHER_IMAGE, IMAGE_WEATHER_PREV, IMAGE_WEATHER_PREV);\r
+                LOADIMG::LoadBtnImage(buttonChangeRight_, WEATHER_IMAGE, IMAGE_WEATHER_NEXT, IMAGE_WEATHER_NEXT);\r
+                buttonChangeLeft_->Enable();\r
+                buttonChangeRight_->Enable();\r
+            }\r
+        }\r
+    }\r
+    return true;\r
+}\r
+}
\ No newline at end of file
diff --git a/code/sdk/application/wearable/evb/nativeapp/nativeui/weather/src/WeatherPageSunRise.cpp b/code/sdk/application/wearable/evb/nativeapp/nativeui/weather/src/WeatherPageSunRise.cpp
new file mode 100644 (file)
index 0000000..790e2b2
--- /dev/null
@@ -0,0 +1,315 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: WeatherPageSunRise\r
+ * Create: 2025-03-15\r
+ */\r
+\r
+#include "NativeAbility.h"\r
+#include "SlicePageFactory.h"\r
+#include "common/image_cache_manager.h"\r
+#include "components/ui_list_nested.h"\r
+#include "components/ui_scroll_view_nested.h"\r
+#include "ui_resource_weather.h"\r
+#include "wearable_log.h"\r
+#include "weather/WeatherModel.h"\r
+#include "weather/WeatherPresenter.h"\r
+#include "weather/WeatherView.h"\r
+#include "weather/WeatherPageSunRise.h"\r
+\r
+namespace OHOS {\r
+static constexpr uint8_t WEATHER_TITLE_FONT_SIZE = 30;\r
+static constexpr uint8_t WEATHER_ITEM_FONT_SIZE = 24;\r
+static constexpr int16_t WEATHER_RESIZE_SIZE_WIDTH = 117;\r
+static constexpr int16_t WEATHER_RESIZE_SIZE_HEIGHT = 38;\r
+static constexpr int16_t WEATHER_TITLE_POSITION_X = 167;\r
+static constexpr int16_t WEATHER_TITLE_POSITION_Y = 41;\r
+static constexpr int16_t WEATHER_TITLE_DAY_POSITION_X = 49;\r
+static constexpr int16_t WEATHER_TITLE_DAY_POSITION_Y = 318;\r
+static constexpr int16_t WEATHER_TITLE_OFFSET = 250;\r
+static constexpr int16_t WEATHER_BUTTON_LEFT_POSITION_X = 76;\r
+static constexpr int16_t WEATHER_BUTTON_RIGHT_POSITION_X = 306;\r
+static constexpr int16_t WEATHER_BUTTON_POSITION_Y = 50;\r
+static constexpr int16_t WEATHER_BUTTON_SIZE = 69;\r
+static constexpr int16_t WEATHER_IMAGE_POSITION_X = 0;\r
+static constexpr int16_t WEATHER_IMAGE_POSITION_Y = 168;\r
+static constexpr int16_t WEATHER_IMAGE_SUN_POSITION_X = 135;\r
+static constexpr int16_t WEATHER_LABEL_DAY_POSITION_X = 184;\r
+static constexpr int16_t WEATHER_LABEL_DAY_SIZE_WIDTH = 89;\r
+static constexpr int16_t WEATHER_LABEL_DAY_SIZE_HEIGHT = 30;\r
+static constexpr int16_t WEATHER_LABEL_SUN_SIZE_WIDTH = 113;\r
+static constexpr int16_t WEATHER_LABEL_SUN_SIZE_HEIGHT = 30;\r
+\r
+REGIST_SLICE_PAGE(VIEW_WEATHER, WEATHER_PAGES::WEATHER_SUNRISE_PAGE, WeatherPageSunRise, false);\r
+\r
+WeatherPageSunRise::WeatherPageSunRise()\r
+{\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "WeatherPageSunRise::WeatherPageSunRise");\r
+}\r
+\r
+WeatherPageSunRise::~WeatherPageSunRise()\r
+{\r
+    if (group_ != nullptr) {\r
+        group_->RemoveAll();\r
+        delete group_;\r
+        group_ = nullptr;\r
+    }\r
+\r
+    if (bgImg_ != nullptr) {\r
+        delete bgImg_;\r
+        bgImg_ = nullptr;\r
+    }\r
+\r
+    if (drawImg_ != nullptr) {\r
+        delete drawImg_;\r
+        drawImg_ = nullptr;\r
+    }\r
+\r
+    if (sunImg_ != nullptr) {\r
+        delete sunImg_;\r
+        sunImg_ = nullptr;\r
+    }\r
+\r
+    if (labelTitle_ != nullptr) {\r
+        delete labelTitle_;\r
+        labelTitle_ = nullptr;\r
+    }\r
+\r
+    if (labelDay_ != nullptr) {\r
+        delete labelDay_;\r
+        labelDay_ = nullptr;\r
+    }\r
+\r
+    for (int i = 0; i < SUNRISE_TIME_LABEL_COUNT; i++) {\r
+        if (labelSun_[i] != nullptr) {\r
+            delete labelSun_[i];\r
+            labelSun_[i] = nullptr;\r
+        }\r
+    }\r
+\r
+    if (buttonChangeLeft_ != nullptr) {\r
+        delete buttonChangeLeft_;\r
+        buttonChangeLeft_ = nullptr;\r
+    }\r
+\r
+    if (buttonChangeRight_ != nullptr) {\r
+        delete buttonChangeRight_;\r
+        buttonChangeRight_ = nullptr;\r
+    }\r
+\r
+    ImageCacheManager::GetInstance().UnloadAllInMultiRes(WEATHER_IMAGE);\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "WeatherPageSunRise::~WeatherPageSunRise");\r
+}\r
+\r
+void WeatherPageSunRise::OnStart(void *data)\r
+{\r
+    group_ = new UIViewGroup();\r
+    if (group_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Group new fail");\r
+        return;\r
+    }\r
+    group_->SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);\r
+    group_->SetViewId("weatherSwipeGroup_");\r
+    group_->SetOnDragListener(this);\r
+    group_->SetDraggable(true);\r
+    group_->SetTouchable(true);\r
+    sun_ = WeatherModel::GetInstance().GetSunData();\r
+    InitImage();\r
+    InitLabel();\r
+    InitLabelSun();\r
+    InitButton();\r
+    index_ = 0;\r
+    AddViewToPageContainer(group_);\r
+}\r
+\r
+void WeatherPageSunRise::InitImage()\r
+{\r
+    bgImg_ = new UIImageView();\r
+    if (bgImg_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "bgImg_ new image fail");\r
+        return;\r
+    }\r
+    bgImg_->SetPosition(0, 0);\r
+    bgImg_->SetStyle(STYLE_BACKGROUND_OPA, OPA_OPAQUE);\r
+    WeatherModel::GetInstance().LoadImageOfDayNight(bgImg_, IMAGE_WEATHER_BG1, IMAGE_WEATHER_BG2);\r
+\r
+    drawImg_ = new UIImageView();\r
+    if (drawImg_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "drawImg_ new image fail");\r
+        return;\r
+    }\r
+    drawImg_->SetPosition(WEATHER_IMAGE_POSITION_X, WEATHER_IMAGE_POSITION_Y);\r
+    drawImg_->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+    LOADIMG::LoadImageViewImg(drawImg_, WEATHER_IMAGE, IMAGE_WEATHER_SUNRISE);\r
+\r
+    sunImg_ = new UIImageView();\r
+    if (sunImg_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "sunImg_ new image fail");\r
+        return;\r
+    }\r
+    sunImg_->SetPosition(WEATHER_IMAGE_SUN_POSITION_X, WEATHER_IMAGE_POSITION_Y);\r
+    sunImg_->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+    LOADIMG::LoadImageViewImg(sunImg_, WEATHER_IMAGE, IMAGE_WEATHER_SUN);\r
+\r
+    group_->Add(bgImg_);\r
+    group_->Add(drawImg_);\r
+    group_->Add(sunImg_);\r
+}\r
+\r
+void WeatherPageSunRise::InitLabel()\r
+{\r
+    labelTitle_ = new UILabel();\r
+    if (labelTitle_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "labelTitle_ is nullptr");\r
+        return;\r
+    }\r
+    labelTitle_->SetPosition(WEATHER_TITLE_POSITION_X, WEATHER_TITLE_POSITION_Y);\r
+    labelTitle_->SetLineBreakMode(UILabel::LINE_BREAK_ADAPT);\r
+    labelTitle_->SetText("日出日落");\r
+    labelTitle_->Resize(WEATHER_RESIZE_SIZE_WIDTH, WEATHER_RESIZE_SIZE_HEIGHT);\r
+    labelTitle_->SetFont(BOLD_VECTOR_FONT_FILENAME, WEATHER_TITLE_FONT_SIZE);\r
+    labelTitle_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+    labelTitle_->SetStyle(STYLE_TEXT_OPA, OPA_OPAQUE);\r
+    labelTitle_->SetStyle(STYLE_TEXT_COLOR, Color::White().full);\r
+    labelTitle_->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+\r
+    labelDay_ = new UILabel();\r
+    if (labelDay_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "labelDay_ is nullptr");\r
+        return;\r
+    }\r
+    labelDay_->SetPosition(WEATHER_LABEL_DAY_POSITION_X, WEATHER_TITLE_POSITION_Y + labelTitle_->GetTextHeight());\r
+    labelDay_->SetText("今天");\r
+    labelDay_->Resize(WEATHER_LABEL_DAY_SIZE_WIDTH, WEATHER_LABEL_DAY_SIZE_HEIGHT);\r
+    labelDay_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, WEATHER_ITEM_FONT_SIZE);\r
+    labelDay_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+    labelDay_->SetStyle(STYLE_TEXT_OPA, OPA_OPAQUE);\r
+    WeatherModel::GetInstance().LoadTextColorOfDayNight(labelDay_, Color::White().full, Color::Gray().full);\r
+    labelDay_->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+    labelDay_->SetText(sun_[0].weekTime);\r
+    group_->Add(labelTitle_);\r
+    group_->Add(labelDay_);\r
+}\r
+\r
+void WeatherPageSunRise::InitLabelSun()\r
+{\r
+    for (int i = 0; i < SUNRISE_TIME_LABEL_COUNT; i++) {\r
+        labelSun_[i] = new UILabel();\r
+        if (labelSun_[i] == nullptr) {\r
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "labelSun_[%d] is nullptr", i);\r
+            return;\r
+        }\r
+        labelSun_[i]->SetLineBreakMode(UILabel::LINE_BREAK_ADAPT);\r
+        labelSun_[i]->SetPosition(WEATHER_TITLE_DAY_POSITION_X + i * WEATHER_TITLE_OFFSET,\r
+                                  WEATHER_TITLE_DAY_POSITION_Y);\r
+        labelSun_[i]->Resize(WEATHER_LABEL_SUN_SIZE_WIDTH, WEATHER_LABEL_SUN_SIZE_HEIGHT);\r
+        labelSun_[i]->SetFont(BOLD_VECTOR_FONT_FILENAME, WEATHER_ITEM_FONT_SIZE);\r
+        labelSun_[i]->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+        labelSun_[i]->SetStyle(STYLE_TEXT_OPA, OPA_OPAQUE);\r
+        WeatherModel::GetInstance().LoadTextColorOfDayNight(labelSun_[i], Color::White().full, Color::Gray().full);\r
+        labelSun_[i]->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+        group_->Add(labelSun_[i]);\r
+    }\r
+    std::string sunRise = "日出 " + std::string(sun_[0].sunRise);\r
+    std::string sunSet = "日落 " + std::string(sun_[0].sunSet);\r
+    labelSun_[0]->SetText(sunRise.c_str());\r
+    labelSun_[1]->SetText(sunSet.c_str());\r
+}\r
+\r
+void WeatherPageSunRise::InitButton()\r
+{\r
+    buttonChangeLeft_ = new UIButton();\r
+    if (buttonChangeLeft_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "buttonChangeLeft_ is nullptr");\r
+        return;\r
+    }\r
+    buttonChangeLeft_->SetPosition(WEATHER_BUTTON_LEFT_POSITION_X, WEATHER_BUTTON_POSITION_Y);\r
+    buttonChangeLeft_->Resize(WEATHER_BUTTON_SIZE, WEATHER_BUTTON_SIZE);\r
+    buttonChangeLeft_->SetViewId("buttonLeft");\r
+    buttonChangeLeft_->SetOnClickListener(this);\r
+    buttonChangeLeft_->SetStyleForState(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT, UIButton::RELEASED);\r
+    buttonChangeLeft_->SetStyleForState(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT, UIButton::PRESSED);\r
+    buttonChangeLeft_->SetStyleForState(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT, UIButton::INACTIVE);\r
+    buttonChangeLeft_->SetVisible(true);\r
+    LOADIMG::LoadBtnImage(buttonChangeLeft_, WEATHER_IMAGE, IMAGE_WEATHER_PREV_GRAY, IMAGE_WEATHER_PREV_GRAY);\r
+\r
+    buttonChangeRight_ = new UIButton();\r
+    if (buttonChangeRight_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "buttonChangeRight_ is nullptr");\r
+        return;\r
+    }\r
+    buttonChangeRight_->SetPosition(WEATHER_BUTTON_RIGHT_POSITION_X, WEATHER_BUTTON_POSITION_Y);\r
+    buttonChangeRight_->Resize(WEATHER_BUTTON_SIZE, WEATHER_BUTTON_SIZE);\r
+    buttonChangeRight_->SetViewId("buttonRight");\r
+    buttonChangeRight_->SetOnClickListener(this);\r
+    buttonChangeRight_->SetStyleForState(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT, UIButton::RELEASED);\r
+    buttonChangeRight_->SetStyleForState(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT, UIButton::PRESSED);\r
+    buttonChangeRight_->SetStyleForState(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT, UIButton::INACTIVE);\r
+    buttonChangeRight_->SetVisible(true);\r
+    LOADIMG::LoadBtnImage(buttonChangeRight_, WEATHER_IMAGE, IMAGE_WEATHER_NEXT, IMAGE_WEATHER_NEXT);\r
+    buttonChangeLeft_->Disable();\r
+    group_->Add(buttonChangeLeft_);\r
+    group_->Add(buttonChangeRight_);\r
+}\r
+\r
+bool WeatherPageSunRise::OnDrag(UIView &view, const DragEvent &event)\r
+{\r
+    UNUSED(view);\r
+    if ((event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT) && (event.GetDeltaX() > X_DRAG_OFFSET) &&\r
+        (event.GetDeltaX() > (DOUBLES * MATH_ABS(event.GetDeltaY())))) {\r
+        NativeAbility::GetInstance().ChangeSliceToApplist();\r
+    } else if (event.GetDragDirection() == DragEvent::DIRECTION_RIGHT_TO_LEFT) {\r
+        NativeAbility::GetInstance().SwitchPageInSlice(WEATHER_PAGES::WEATHER_MONTHRISE_PAGE,\r
+            TransitionType::TRANSITION_INVALID, false);\r
+    } else if (event.GetDragDirection() == DragEvent::DIRECTION_TOP_TO_BOTTOM) {\r
+        NativeAbility::GetInstance().SwitchPageInSlice(WEATHER_PAGES::WEATHER_MAIN_PAGE,\r
+            TransitionType::TRANSITION_INVALID, false);\r
+    }\r
+    return true;\r
+}\r
+\r
+bool WeatherPageSunRise::OnClick(UIView &view, const ClickEvent &event)\r
+{\r
+    UNUSED(event);\r
+    if (strcmp(view.GetViewId(), "buttonLeft") == 0) {\r
+        if (index_ > 0) {\r
+            labelDay_->SetText(sun_[--index_].weekTime);\r
+            std::string sunRise = "日出 " + std::string(sun_[index_].sunRise);\r
+            std::string sunSet = "日落 " + std::string(sun_[index_].sunSet);\r
+            labelSun_[0]->SetText(sunRise.c_str());\r
+            labelSun_[1]->SetText(sunSet.c_str());\r
+            if (index_ == 0) {\r
+                sunImg_->SetVisible(true);\r
+                LOADIMG::LoadBtnImage(buttonChangeLeft_, WEATHER_IMAGE, IMAGE_WEATHER_PREV_GRAY,\r
+                                      IMAGE_WEATHER_PREV_GRAY);\r
+                buttonChangeLeft_->Disable();\r
+            } else {\r
+                sunImg_->SetVisible(false);\r
+                LOADIMG::LoadBtnImage(buttonChangeLeft_, WEATHER_IMAGE, IMAGE_WEATHER_PREV, IMAGE_WEATHER_PREV);\r
+                LOADIMG::LoadBtnImage(buttonChangeRight_, WEATHER_IMAGE, IMAGE_WEATHER_NEXT, IMAGE_WEATHER_NEXT);\r
+                buttonChangeLeft_->Enable();\r
+                buttonChangeRight_->Enable();\r
+            }\r
+        }\r
+    } else if (strcmp(view.GetViewId(), "buttonRight") == 0) {\r
+        if (index_ < BUTTON_CHANGE_END) {\r
+            labelDay_->SetText(sun_[++index_].weekTime);\r
+            std::string sunRise = "日出 " + std::string(sun_[index_].sunRise);\r
+            std::string sunSet = "日落 " + std::string(sun_[index_].sunSet);\r
+            labelSun_[0]->SetText(sunRise.c_str());\r
+            labelSun_[1]->SetText(sunSet.c_str());\r
+            sunImg_->SetVisible(false);\r
+            if (index_ == BUTTON_CHANGE_END) {\r
+                LOADIMG::LoadBtnImage(buttonChangeRight_, WEATHER_IMAGE, IMAGE_WEATHER_NEXT_GRAY,\r
+                                      IMAGE_WEATHER_NEXT_GRAY);\r
+                buttonChangeRight_->Disable();\r
+            } else {\r
+                LOADIMG::LoadBtnImage(buttonChangeLeft_, WEATHER_IMAGE, IMAGE_WEATHER_PREV, IMAGE_WEATHER_PREV);\r
+                LOADIMG::LoadBtnImage(buttonChangeRight_, WEATHER_IMAGE, IMAGE_WEATHER_NEXT, IMAGE_WEATHER_NEXT);\r
+                buttonChangeLeft_->Enable();\r
+                buttonChangeRight_->Enable();\r
+            }\r
+        }\r
+    }\r
+    return true;\r
+}\r
+}
\ No newline at end of file
index c943842..2adafcd 100644 (file)
@@ -1,16 +1,13 @@
 /*\r
- * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
  * Description: WeatherPresenter\r
  * Create: 2025-03-23\r
  */\r
 \r
+#include "NativeRegisterManager.h"\r
 #include "weather/WeatherView.h"\r
-#include "weather/WeatherModel.h"\r
 #include "weather/WeatherPresenter.h"\r
-#include "uiservice/ui_service.h"\r
-#include "NativeRegisterManager.h"\r
-#include "wearable_log.h"\r
 \r
 namespace OHOS {\r
-    REGIST_MENU(VIEW_WEATHER, WeatherView, WeatherPresenter, WEATHER_MAIN_ICON, WEATHER_MAIN_ICON, "天气");\r
+REGIST_MENU(VIEW_WEATHER, WeatherView, WeatherPresenter, WEATHER_ICON, WEATHER_ICON, "天气");\r
 }\r
diff --git a/code/sdk/application/wearable/evb/ohos_deps/wearable_log.h b/code/sdk/application/wearable/evb/ohos_deps/wearable_log.h
new file mode 100644 (file)
index 0000000..c2945d2
--- /dev/null
@@ -0,0 +1,122 @@
+/*\r
+ * Copyright (c) CompanyNameMagicTag 2023-2023. All rights reserved.\r
+ * Description: Wearable log header file.\r
+ * Author:\r
+ * Create:\r
+ */\r
+\r
+#ifndef WEARABLE_LOG_H\r
+#define WEARABLE_LOG_H\r
+\r
+#if !defined(SW_UART_DEBUG) && !defined(SW_RTT_DEBUG)\r
+#include "soc_diag_util.h"\r
+#include "log_oam_logger.h"\r
+#include "log_def.h"\r
+#else\r
+#include "debug_print.h"\r
+#endif\r
+#include "wearable_onlinelog.h"\r
+\r
+#ifdef __cplusplus\r
+#if __cplusplus\r
+extern "C" {\r
+#endif\r
+#endif\r
+\r
+/**\r
+ * @brief Enumerates logging module types.\r
+ *\r
+ * The module type must be globally unique. A maximum of 64 module types can be defined.\r
+ *\r
+ * @since 1.0\r
+ * @version 1.0\r
+ */\r
+typedef enum {\r
+    /** applications */\r
+    WEARABLE_LOG_MODULE_APP = 0,\r
+    /** Launcher Framework */\r
+    WEARABLE_LOG_MODULE_LAUNCHER_FWK,\r
+    /** Main Service */\r
+    WEARABLE_LOG_MODULE_MAIN_SERVICE,\r
+    /** Broadcast Service */\r
+    WEARABLE_LOG_MODULE_BROADCASE_SERVICE,\r
+    /** Atomic Ability Framework */\r
+    WEARABLE_LOG_MODULE_AAFWK,\r
+    /** smart voice */\r
+    WEARABLE_LOG_MODULE_SMART_VOICE,\r
+    /* UI SERVICE */\r
+    WEARABLE_LOG_MODULE_UI_SERVICE,\r
+    /* msg_center */\r
+    WEARABLE_LOG_MODULE_MSG_CENTER,\r
+\r
+    WEARABLE_LOG_MODULE_MAX\r
+} WearableLogModuleType;\r
+\r
+#if !defined(SW_UART_DEBUG) && !defined(SW_RTT_DEBUG) && !defined(CONFIG_ONLINE_LOG)\r
+#define WEARABLE_LOGE(mod, fmt, arg...) uapi_diag_error_log(0, fmt, ##arg)\r
+#define WEARABLE_LOGW(mod, fmt, arg...) uapi_diag_warning_log(0, fmt, ##arg)\r
+#define WEARABLE_LOGI(mod, fmt, arg...) uapi_diag_info_log(0, fmt, ##arg)\r
+#ifdef WEARABLE_LOG_DEBUG\r
+#define WEARABLE_LOGD(mod, fmt, arg...) uapi_diag_debug_log(0, fmt, ##arg)\r
+#else\r
+#define WEARABLE_LOGD(mod, fmt, arg...)\r
+#endif\r
+#elif (CONFIG_ONLINE_LOG == 1) && !defined(_WIN32)\r
+#define WEARABLE_LOGE(mod, fmt, arg...) ONLINE_PRINT(ONLINE_ERROR, fmt "\n", ##arg)\r
+#define WEARABLE_LOGW(mod, fmt, arg...) ONLINE_PRINT(ONLINE_WARN, fmt "\n", ##arg)\r
+#define WEARABLE_LOGI(mod, fmt, arg...) ONLINE_PRINT(ONLINE_INFO, fmt "\n", ##arg)\r
+#ifdef WEARABLE_LOG_DEBUG\r
+#define WEARABLE_LOGD(mod, fmt, arg...) ONLINE_PRINT(ONLINE_DEBUG, fmt "\n", ##arg)\r
+#else\r
+#define WEARABLE_LOGD(mod, fmt, arg...)\r
+#endif\r
+#else\r
+#define WEARABLE_LOGE(mod, fmt, arg...) PRINT("[WEARABLE E/] " fmt "\n", ##arg)\r
+#define WEARABLE_LOGW(mod, fmt, arg...) PRINT("[WEARABLE W/] " fmt "\n", ##arg)\r
+#define WEARABLE_LOGI(mod, fmt, arg...) PRINT("[WEARABLE I/] " fmt "\n", ##arg)\r
+#ifdef WEARABLE_LOG_DEBUG\r
+#define WEARABLE_LOGD(mod, fmt, arg...) PRINT("[WEARABLE D/] " fmt "\n", ##arg)\r
+#else\r
+#define WEARABLE_LOGD(mod, fmt, arg...)\r
+#endif\r
+#endif\r
+\r
+#define CHECK_NULL_AND_RETURN(pointer, mod, fmt) \\r
+    do {                                         \\r
+        if ((pointer) == nullptr) {              \\r
+            WEARABLE_LOGE((mod), (fmt));         \\r
+            return;                              \\r
+        }                                        \\r
+    } while (0)\r
+\r
+#define CHECK_NULL_AND_RETURN_NULL(pointer, mod, fmt) \\r
+    do {                                              \\r
+        if ((pointer) == nullptr) {                   \\r
+            WEARABLE_LOGE((mod), (fmt));              \\r
+            return nullptr;                           \\r
+        }                                             \\r
+    } while (0)\r
+\r
+#define CHECK_NULL_AND_RETURN_CODE(pointer, mod, fmt, code) \\r
+    do {                                                    \\r
+        if ((pointer) == nullptr) {                         \\r
+            WEARABLE_LOGE((mod), (fmt));                    \\r
+            return (code);                                  \\r
+        }                                                   \\r
+    } while (0)\r
+\r
+#define DELETE_IF_NOT_NULL(pointer) \\r
+    do {                            \\r
+        if ((pointer) != nullptr) { \\r
+            delete (pointer);       \\r
+            (pointer) = nullptr;    \\r
+        }                           \\r
+    } while (0)\r
+\r
+#ifdef __cplusplus\r
+#if __cplusplus\r
+}\r
+#endif\r
+#endif\r
+\r
+#endif\r
index 8359e67..42e8d73 100644 (file)
@@ -45,7 +45,7 @@ typedef enum {
     TOPIC_EVENT_HFP_WATCH_TO_PHONE,\r
     TOPIC_EVENT_BLOODOXYGEN_UPDATA,\r
     TOPIC_EVENT_SPORT_DISTANCE,\r
-    TOPIC_EVENT_LOCATION,\r
+    TOPIC_EVENT_CALENDAR_NOTIFY,\r
     TOPIC_END_NUM = 20000,\r
 } TopicNum;\r
 \r
index 5fe38ef..9f4bb8b 100644 (file)
@@ -34,7 +34,6 @@ static const TopicToCore topicToCoreArray[] = {
     {TOPIC_EVENT_HFP_WATCH_TO_PHONE, A_CORE_MASK, 1},
     {TOPIC_EVENT_BLOODOXYGEN_UPDATA, A_CORE_MASK, 1},
     {TOPIC_EVENT_SPORT_DISTANCE, A_CORE_MASK, 1},
-    {TOPIC_EVENT_LOCATION, A_CORE_MASK, 1},
 };
 
 /* 所有的topic,其对应的位图 */
index 972f58f..0889ae2 100644 (file)
@@ -1,7 +1,6 @@
 set(COMPONENT_NAME "device_msg")\r
 \r
 set(PUBLIC_HEADER\r
-${CMAKE_CURRENT_SOURCE_DIR}\r
 )\r
 \r
 set(PRIVATE_HEADER\r
@@ -9,22 +8,26 @@ set(PRIVATE_HEADER
     ${ROOT_DIR}/middleware/services/gui/uikit/utils/interfaces/kits\r
     ${ROOT_DIR}/middleware/services/gui/uikit/proprietary/include\r
     ${ROOT_DIR}/middleware/services/gui/uikit/proprietary/src/ui/innerkits\r
+    ${ROOT_DIR}/middleware/services/gui/uikit/proprietary/src/ui/frameworks\r
     ${ROOT_DIR}/middleware/services/gui/uikit/ui/interfaces/innerkits\r
     ${ROOT_DIR}/middleware/services/media/foundation/audiomanager/interfaces/kits/audiomanager\r
     ${ROOT_DIR}/middleware/services/gui/uikit/ui/frameworks\r
     ${ROOT_DIR}/middleware/services/gui/uikit/surface/interfaces/kits\r
     ${ROOT_DIR}/middleware/chips/brandy/nv/include\r
     ${ROOT_DIR}/middleware/chips/brandy/nv/nv_config\r
+    ${ROOT_DIR}/application/wearable/nativeapp/nativeui/include\r
     ${ROOT_DIR}/open_source/openharmony/drivers/peripheral/display/interfaces/include\r
     ${ROOT_DIR}/open_source/openharmony/base/sensors/location/interfaces/kits/include\r
     ${ROOT_DIR}/middleware/utils/dfx/diag/\r
+    ${ROOT_DIR}/open_source/openharmony/third_party/cJSON\r
+    ${ROOT_DIR}/middleware/services/gui/uikit/proprietary/src/utils/innerkits\r
+    ${ROOT_DIR}/application/wearable/nativeapp/nativeui/\r
 )\r
 \r
 set(SOURCES\r
     ${CMAKE_CURRENT_SOURCE_DIR}/device_msg.cpp\r
     ${CMAKE_CURRENT_SOURCE_DIR}/device_proxy.cpp\r
     ${CMAKE_CURRENT_SOURCE_DIR}/msg_center_device.cpp\r
-    ${CMAKE_CURRENT_SOURCE_DIR}/device_location.cpp\r
 )\r
 \r
 set(COMPONENT_PUBLIC_CCFLAGS\r
index 3f54b45..79f0fc2 100644 (file)
@@ -1,9 +1,9 @@
 /*\r
- * Copyright (c) Huawei Technologies Co., Ltd. 2025. All rights reserved.\r
- * Description: Breath Ease\r
- * Author: wangle\r
- * Create: 2025-4-23\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: Device Msg\r
+ * Create: 2025-06-06\r
  */\r
+\r
 #include "msg_center_protocol.h"\r
 #include "msg_center_cmd.h"\r
 #include "ohos_init.h"\r
@@ -14,8 +14,6 @@
 #include "graphic_timer.h"\r
 #include "broadcast_feature.h"\r
 #include "ohos_timer.h"\r
-#include "heartrate/HeartModel.h"\r
-#include "device_location.h"\r
 #endif\r
 namespace OHOS {\r
 \r
@@ -31,14 +29,7 @@ extern "C" {
 #define HEARTRATE_RANGE 60\r
 static uint8_t g_rotation_publish = 0;\r
 static GraphicTimer *g_publishTestDataHandle = nullptr;\r
-enum publishDataType {\r
-    PUBLISH_SETP = 0,\r
-    PUBLISH_DISTANCE,\r
-    PUBLISH_HEARTRATE,\r
-    PUBLISH_BLOODOXYGEN,\r
-    PUBLISH_TYPE_MAX\r
-};\r
-\r
+enum publishDataType { PUBLISH_SETP = 0, PUBLISH_DISTANCE, PUBLISH_HEARTRATE, PUBLISH_BLOODOXYGEN, PUBLISH_TYPE_MAX };\r
 static void PublishTopicTestDataEvent(uint16_t topic, const void *data, size_t len)\r
 {\r
     int32_t ret;\r
@@ -115,7 +106,7 @@ static void PublishTestDataCallback(void *)
     }\r
 }\r
 \r
-void PublishTestData()\r
+static void PublishTestData()\r
 {\r
     uint32 tick = GetOSTick(5000);  // 5秒发布一次测试数据\r
     if (g_publishTestDataHandle == nullptr) {\r
@@ -141,28 +132,24 @@ static const msg_center_cmd_map_t g_msg_center_device_tbl[] = {
     {MSGCENTER_CMD_DEVICE, MSGCENTER_TYPE_ID_GET_STORAGE_INFO, msg_center_get_storage_info},\r
     {MSGCENTER_CMD_DEVICE, MSGCENTER_TYPE_ID_GET_PRODUCT_INFO, msg_center_get_product_info},\r
     {MSGCENTER_CMD_DEVICE, MSGCENTER_TYPE_ID_GET_LANGUAGE_ID, msg_center_get_language_id},\r
-    {MSGCENTER_CMD_DEVICE, MSGCENTER_TYPE_ID_GET_VOLUME_INFO, msg_center_get_volume_info},\r
     {MSGCENTER_CMD_DEVICE, MSGCENTER_TYPE_ID_SET_LANGUAGE_ID, msg_center_set_language_id},\r
-    {MSGCENTER_CMD_DEVICE, MSGCENTER_TYPE_ID_SET_VOLUME_INFO, msg_center_set_volume_info},\r
     {MSGCENTER_CMD_DEVICE, MSGCENTER_TYPE_ID_DEVICE_HEARTRATE, msg_center_device_heartrate},\r
     {MSGCENTER_CMD_DEVICE, MSGCENTER_TYPE_ID_DEVICE_STEPDATA, msg_center_device_stepdata},\r
     {MSGCENTER_CMD_DEVICE, MSGCENTER_TYPE_ID_DEVICE_BLOODOXYGEN, msg_center_device_bloodoxygen},\r
     {MSGCENTER_CMD_DEVICE, MSGCENTER_TYPE_ID_OFFLINE_LOG_SWITCH, msg_center_offline_log_switch},\r
-    {MSGCENTER_CMD_DEVICE, MSGCENTER_TYPE_ID_LOCATION_GET_INFO, msg_center_location_get_info},\r
-    {MSGCENTER_CMD_DEVICE, MSGCENTER_TYPE_ID_LOCATION_START, msg_center_location_start},\r
-    {MSGCENTER_CMD_DEVICE, MSGCENTER_TYPE_ID_LOCATION_STOP, msg_center_location_stop},\r
     {MSGCENTER_CMD_DEVICE, MSGCENTER_TYPE_ID_SPORT_ACTION, msg_center_sport_action},\r
-    {MSGCENTER_CMD_DEVICE, MSGCENTER_TYPE_ID_SPORT_GET_DATA, msg_center_sport_get_data},\r
-    {MSGCENTER_CMD_DEVICE, MSGCENTER_TYPE_ID_SPORT_REPORT_DATA, msg_center_sport_report_data},\r
+    {MSGCENTER_CMD_DEVICE, MSGCENTER_TYPE_ID_SPORT_GET_RECORD, msg_center_sport_get_record},\r
 #if (CONFIG_ONLINE_LOG == 1)\r
     {MSGCENTER_CMD_DEVICE, MSGCENTER_TYPE_ID_SET_ONLINELOG_CHANNEL, msg_center_set_online_log_channel},\r
     {MSGCENTER_CMD_DEVICE, MSGCENTER_TYPE_ID_SET_ONLINELOG_LEVEL, msg_center_set_online_log_level},\r
 #endif\r
     {MSGCENTER_CMD_DEVICE, MSGCENTER_TYPE_ID_OTA_INIT, msg_center_ota_init},\r
     {MSGCENTER_CMD_DEVICE, MSGCENTER_TYPE_ID_OTA_UPDATE, msg_center_ota_update},\r
-    {MSGCENTER_CMD_DEVICE, MSGCENTER_TYPE_ID_OFF_FIND_PHONE, msg_center_device_findphone},\r
-    {MSGCENTER_CMD_DEVICE, MSGCENTER_TYPE_ID_CAMERA_WATCH_EXIT, msg_center_camera_exit},\r
-    {MSGCENTER_CMD_DEVICE, MSGCENTER_TYPE_ID_CAMERA_CONNECT_PHONE_SUCCESS, msg_center_camera_online},\r
+    {MSGCENTER_CMD_DEVICE, MSGCENTER_TYPE_ID_STOP_FIND_PHONE, msg_center_device_findphone},\r
+    {MSGCENTER_CMD_DEVICE, MSGCENTER_TYPE_ID_WATCH_EXIT_CAMERA, msg_center_camera_exit},\r
+    {MSGCENTER_CMD_DEVICE, MSGCENTER_TYPE_ID_CAMERA_CONNECTED_PHONE, msg_center_camera_online},\r
+    {MSGCENTER_CMD_DEVICE, MSGCENTER_TYPE_ID_SYNC_WEATHER_REC, msg_center_device_sync_weather_rec},\r
+    {MSGCENTER_CMD_DEVICE, MSGCENTER_TYPE_ID_SYNC_DATE_REC, msg_center_device_sync_date_rec},\r
 };\r
 \r
 errcode_t msg_center_device_type_dispatch(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len)\r
@@ -182,6 +169,9 @@ errcode_t msg_center_device_type_dispatch(uint8_t cmd_id, uint8_t type, void *us
 void device_init(void)\r
 {\r
     msg_center_register_cmd(MSGCENTER_CMD_DEVICE, msg_center_device_type_dispatch);\r
+#ifdef PUBLISH_TEST_DATA\r
+    PublishTestData();\r
+#endif\r
 }\r
 \r
 APP_FEATURE_INIT_PRI(device_init, LAYER_INIT_LEVEL_4);\r
index 56f89c1..80255a3 100644 (file)
@@ -1,19 +1,21 @@
 /*\r
- * Copyright (c) Huawei Technologies Co., Ltd. 2025. All rights reserved.\r
- * Description: Breath Ease\r
- * Author: wangle\r
- * Create: 2025-4-23\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: MsgCenter Device\r
+ * Create: 2025-06-06\r
  */\r
-#include "msg_center_protocol.h"\r
+\r
 #include "msg_center_device.h"\r
+#include "msg_center_protocol.h"\r
 #include "device_proxy.h"\r
 #include "wearable_log.h"\r
-#include "device_location.h"\r
 #include "AppViewIDs.h"\r
 #include "NativeAbility.h"\r
-#include "sports/SportsModel.h"\r
+#include "sport/SportView.h"\r
+#include "sport/SportModel.h"\r
 #include "findphone/FindPhoneMainPage.h"\r
 #include "camera/CameraMainPage.h"\r
+#include "weather/WeatherMainPage.h"\r
+#include "date/DateMainPage.h"\r
 \r
 #ifdef __cplusplus\r
 extern "C" {\r
@@ -22,10 +24,9 @@ extern "C" {
 #include "diag_ind_src.h"\r
 \r
 uint8_t g_bloodoxygen = 0;\r
-uint16_t g_heartrate = 0;\r
+uint8_t g_heartrate = 0;\r
 uint32_t g_stepdata = 0;\r
 uint32_t g_distance = 0;\r
-extern LocationInfo_t g_locationInfo;\r
 // 获取电量\r
 errcode_t msg_center_get_battery_level(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len)\r
 {\r
@@ -100,29 +101,6 @@ errcode_t msg_center_get_language_id(uint8_t cmd_id, uint8_t type, void *usr_dat
     }\r
     return ERRCODE_SUCC;\r
 }\r
-// 获取音量\r
-errcode_t msg_center_get_volume_info(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len)\r
-{\r
-    WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "get_volume_info");\r
-    uint8_t tl_len = msg_center_get_tlv_tl_len(usr_data);\r
-    void *v_data = msg_center_get_tlv_payload(usr_data);\r
-    uint8_t v_len = usr_len - tl_len;\r
-\r
-    uint8_t vol_type = 0;\r
-    if (v_len == sizeof(uint8_t)) {\r
-        vol_type = *(uint8_t *)v_data;\r
-    }\r
-\r
-    std::vector<OHOS::volume_info> vol_info;\r
-    OHOS::device_proxy::get_volume_info(vol_type, vol_info);\r
-\r
-    errcode_t ret = msg_center_send_data(cmd_id, type, &vol_info[0], vol_info.size() * sizeof(OHOS::volume_info));\r
-    if (ret != ERRCODE_SUCC) {\r
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "send get_volume_info_ack fail, ret = %d", ret);\r
-        return ERRCODE_FAIL;\r
-    }\r
-    return ERRCODE_SUCC;\r
-}\r
 // 设置语言\r
 errcode_t msg_center_set_language_id(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len)\r
 {\r
@@ -147,30 +125,6 @@ errcode_t msg_center_set_language_id(uint8_t cmd_id, uint8_t type, void *usr_dat
     }\r
     return ERRCODE_SUCC;\r
 }\r
-// 设置音量\r
-errcode_t msg_center_set_volume_info(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len)\r
-{\r
-    WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "set_volume_info");\r
-    uint8_t tl_len = msg_center_get_tlv_tl_len(usr_data);\r
-    void *v_data = msg_center_get_tlv_payload(usr_data);\r
-    uint8_t v_len = usr_len - tl_len;\r
-\r
-    OHOS::volume_info info;\r
-    if (v_len != sizeof(OHOS::volume_info)) {\r
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "v_len check error, v_len=%u, need=%u", v_len, sizeof(uint8_t));\r
-        return ERRCODE_FAIL;\r
-    }\r
-\r
-    memcpy_s(&info, sizeof(OHOS::volume_info), v_data, v_len);\r
-    OHOS::device_proxy::set_volume_info(info);\r
-\r
-    errcode_t ret = msg_center_send_data(cmd_id, type, &info, sizeof(OHOS::volume_info));\r
-    if (ret != ERRCODE_SUCC) {\r
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "send set_volume_info_ack fail, ret = %d", ret);\r
-        return ERRCODE_FAIL;\r
-    }\r
-    return ERRCODE_SUCC;\r
-}\r
 // ota初始化\r
 errcode_t msg_center_ota_init(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len)\r
 {\r
@@ -218,7 +172,7 @@ errcode_t msg_center_ota_update(uint8_t cmd_id, uint8_t type, void *usr_data, ui
         return ERRCODE_FAIL;\r
     }\r
     WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "send ret = %d", ret);\r
-    OHOS::device_proxy::call_ui_ota_update();    \r
+    OHOS::device_proxy::call_ui_ota_update();\r
 \r
     WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "send ui over");\r
     return ERRCODE_SUCC;\r
@@ -274,89 +228,6 @@ errcode_t msg_center_device_bloodoxygen(uint8_t cmd_id, uint8_t type, void *usr_
 \r
     return ERRCODE_SUCC;\r
 }\r
-\r
-/* LOCATION */\r
-errcode_t msg_center_location_get_info(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len)\r
-{\r
-    uint8_t tl_len = msg_center_get_tlv_tl_len(usr_data);\r
-    uint16_t payload_len = usr_len - tl_len;\r
-    uint8_t *tlv_payload = (uint8_t *)msg_center_get_tlv_payload(usr_data);\r
-    errcode_t ret = ERRCODE_SUCC;\r
-\r
-    ret = msg_center_send_data(cmd_id, type, &g_locationInfo, sizeof(g_locationInfo));\r
-    if (ret != ERRCODE_SUCC) {\r
-        return ERRCODE_FAIL;\r
-    }\r
-    WEARABLE_LOGD(WEARABLE_LOG_MODULE_MSG_CENTER, "msg_center_location_get_info latitude_:%d,longitude_:%d\n",\r
-                  g_locationInfo.latitude_, g_locationInfo.longitude_);\r
-    /* notify UI or call UI load */\r
-\r
-    return ERRCODE_SUCC;\r
-}\r
-\r
-errcode_t msg_center_location_start(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len)\r
-{\r
-    uint8_t tl_len = msg_center_get_tlv_tl_len(usr_data);\r
-    uint16_t payload_len = usr_len - tl_len;\r
-    uint8_t *tlv_payload = (uint8_t *)msg_center_get_tlv_payload(usr_data);\r
-    errcode_t ret = ERRCODE_SUCC;\r
-    uint8_t ack = 1;\r
-\r
-    WEARABLE_LOGI(WEARABLE_LOG_MODULE_MSG_CENTER, "msg_center_location_start finish\r\n");\r
-    ret = deviceLocationStartLocating();\r
-    if (ret != ERRCODE_SUCC) {\r
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_MSG_CENTER, "msg_center_location_start fail\r\n");\r
-        ret = msg_center_send_data(cmd_id, type, &ack, sizeof(ack));\r
-        if (ret != ERRCODE_SUCC) {\r
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_MSG_CENTER, "msg_center_location_start send msg fail\r\n");\r
-            return ERRCODE_FAIL;\r
-        }\r
-    } else {\r
-        ret = msg_center_send_data(cmd_id, type, &ack, sizeof(ack));\r
-        if (ret != ERRCODE_SUCC) {\r
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_MSG_CENTER, "msg_center_location_start send msg fail\r\n");\r
-            return ERRCODE_FAIL;\r
-        }\r
-    }\r
-\r
-    WEARABLE_LOGI(WEARABLE_LOG_MODULE_MSG_CENTER, "msg_center_location_start finish\r\n");\r
-    /* notify UI or call UI load */\r
-\r
-    return ERRCODE_SUCC;\r
-}\r
-\r
-errcode_t msg_center_location_stop(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len)\r
-{\r
-    uint8_t tl_len = msg_center_get_tlv_tl_len(usr_data);\r
-    uint16_t payload_len = usr_len - tl_len;\r
-    uint8_t *tlv_payload = (uint8_t *)msg_center_get_tlv_payload(usr_data);\r
-    errcode_t ret = ERRCODE_SUCC;\r
-    uint8_t ack = 1;\r
-\r
-    WEARABLE_LOGI(WEARABLE_LOG_MODULE_MSG_CENTER, "msg_center_location_stop\r\n");\r
-    ret = deviceLocationStopLocating();\r
-    ret = msg_center_send_data(cmd_id, type, &ack, sizeof(ack));\r
-    if (ret != ERRCODE_SUCC) {\r
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_MSG_CENTER, "msg_center_location_stop fail\r\n");\r
-        ret = msg_center_send_data(cmd_id, type, &ack, sizeof(ack));\r
-        if (ret != ERRCODE_SUCC) {\r
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_MSG_CENTER, "msg_center_location_stop send msg fail\r\n");\r
-            return ERRCODE_FAIL;\r
-        }\r
-    } else {\r
-        ret = msg_center_send_data(cmd_id, type, &ack, sizeof(ack));\r
-        if (ret != ERRCODE_SUCC) {\r
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_MSG_CENTER, "msg_center_location_stop send msg fail\r\n");\r
-            return ERRCODE_FAIL;\r
-        }\r
-    }\r
-\r
-    WEARABLE_LOGI(WEARABLE_LOG_MODULE_MSG_CENTER, "msg_center_location_stop\r\n");\r
-    /* notify UI or call UI load */\r
-\r
-    return ERRCODE_SUCC;\r
-}\r
-\r
 /* SPORT */\r
 errcode_t msg_center_sport_action(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len)\r
 {\r
@@ -365,31 +236,27 @@ errcode_t msg_center_sport_action(uint8_t cmd_id, uint8_t type, void *usr_data,
     uint8_t *tlv_payload = (uint8_t *)msg_center_get_tlv_payload(usr_data);\r
     errcode_t ret = ERRCODE_SUCC;\r
     uint8_t ack = 1;\r
-    sport_action_t action = (sport_action_t)*tlv_payload;\r
-\r
-    WEARABLE_LOGD(WEARABLE_LOG_MODULE_MSG_CENTER, "msg_center_sport_action : %d\r\n", action);\r
-\r
-    switch (action) {\r
-        case SPORT_ACTION_START:\r
-            OHOS::NativeAbility::GetInstance().ChangeSlice(VIEW_SPORTS);\r
-            OHOS::SportsModel::GetInstance()->ResetSportsData();\r
-            if (!OHOS::SportsModel::GetInstance()->StartSportsTimer()) {\r
-                WEARABLE_LOGE(WEARABLE_LOG_MODULE_MSG_CENTER, "msg_center_sport_start StartSportsTimer failed\r\n");\r
-                ret = ERRCODE_FAIL;\r
-            }\r
+    OHOS::sport_control_t *sport = (OHOS::sport_control_t *)tlv_payload;\r
+\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_MSG_CENTER, "msg_center_sport_action=%d, type=%d", sport->action, sport->type);\r
+\r
+    switch (sport->action) {\r
+        case OHOS::SPORT_ACTION_START:\r
+            OHOS::SportModel::GetInstance().SetSportType(static_cast<OHOS::SportType>(sport->type));\r
+            OHOS::SportModel::GetInstance().StartSport(false);\r
+            OHOS::NativeAbility::GetInstance().SwitchSlice(VIEW_SPORT, OHOS::SportPages::SPORT_PAGE_DATA);\r
             break;\r
-        case SPORT_ACTION_PAUSE:\r
-            OHOS::SportsModel::GetInstance()->StopSportsTimer(false);\r
+        case OHOS::SPORT_ACTION_PAUSE:\r
+            OHOS::SportModel::GetInstance().PauseAndReport(false);\r
+            OHOS::NativeAbility::GetInstance().SwitchSlice(VIEW_SPORT, OHOS::SportPages::SPORT_PAGE_PAUSE);\r
             break;\r
-        case SPORT_ACTION_RESUME:\r
-            if (!OHOS::SportsModel::GetInstance()->StartSportsTimer()) {\r
-                WEARABLE_LOGE(WEARABLE_LOG_MODULE_MSG_CENTER, "msg_center_sport_resume StartSportsTimer failed\r\n");\r
-                ret = ERRCODE_FAIL;\r
-            }\r
+        case OHOS::SPORT_ACTION_RESUME:\r
+            OHOS::SportModel::GetInstance().ResumeAndReport(false);\r
+            OHOS::NativeAbility::GetInstance().SwitchSlice(VIEW_SPORT, OHOS::SportPages::SPORT_PAGE_DATA);\r
             break;\r
-        case SPORT_ACTION_STOP:\r
-            OHOS::SportsModel::GetInstance()->StopSportsTimer(false);\r
-            OHOS::NativeAbility::GetInstance().ChangeSlice(VIEW_MAIN_SAMPLE);\r
+        case OHOS::SPORT_ACTION_STOP:\r
+            OHOS::SportModel::GetInstance().StopAndReport(false);\r
+            OHOS::NativeAbility::GetInstance().SwitchSlice(VIEW_SPORT, OHOS::SportPages::SPORT_PAGE_MENU);\r
             break;\r
         default:\r
             ret = ERRCODE_FAIL;\r
@@ -398,38 +265,65 @@ errcode_t msg_center_sport_action(uint8_t cmd_id, uint8_t type, void *usr_data,
 \r
     ret = msg_center_send_data(cmd_id, type, &ack, sizeof(ack));\r
     if (ret != ERRCODE_SUCC) {\r
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_MSG_CENTER, "msg_center_sport_resume send data failed\r\n");\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_MSG_CENTER, "msg_center_sport_action send data failed\r\n");\r
         return ERRCODE_FAIL;\r
     }\r
     return ERRCODE_SUCC;\r
 }\r
 \r
-errcode_t msg_center_sport_get_data(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len)\r
+errcode_t msg_center_sport_get_record(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len)\r
 {\r
     uint8_t tl_len = msg_center_get_tlv_tl_len(usr_data);\r
     uint16_t payload_len = usr_len - tl_len;\r
     uint8_t *tlv_payload = (uint8_t *)msg_center_get_tlv_payload(usr_data);\r
     errcode_t ret = ERRCODE_SUCC;\r
 \r
-    WEARABLE_LOGI(WEARABLE_LOG_MODULE_MSG_CENTER, "msg_center_sport_get_data\r\n");\r
-    OHOS::sport_data_t *sportData = OHOS::SportsModel::GetInstance()->GetSportsData();\r
-    ret = msg_center_send_data(cmd_id, type, sportData, sizeof(OHOS::sport_data_t));\r
-    if (ret != ERRCODE_SUCC) {\r
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_MSG_CENTER, "msg_center_sport_get_data end data failed\r\n");\r
+    auto record = OHOS::SportModel::GetInstance().GetRecord();\r
+    uint16_t num = record.size();\r
+    uint16_t size = sizeof(uint16_t) + num * sizeof(OHOS::sport_data_t);\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_MSG_CENTER, "msg_center_sport_get_record record num=%d, malloc szie=%d\r\n", num,\r
+                  size);\r
+    uint8_t *data = (uint8_t *)malloc(size);\r
+    if (data == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_MSG_CENTER, "msg_center_sport_get_record malloc data failed\r\n");\r
         return ERRCODE_FAIL;\r
     }\r
-    return ERRCODE_SUCC;\r
-}\r
+    uint8_t *data_addr = data;\r
+\r
+    memcpy_s(data, sizeof(uint16_t), &num, sizeof(uint16_t));\r
+    data += sizeof(uint16_t);\r
+\r
+    for (int i = 0; i < num; i++) {\r
+        memcpy_s(data, sizeof(OHOS::sport_data_t), &record[i], sizeof(OHOS::sport_data_t));\r
+        data += sizeof(OHOS::sport_data_t);\r
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_MSG_CENTER, "========record[%d]=============", i);\r
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_MSG_CENTER, "type:%d", record[i].type);\r
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_MSG_CENTER, "heartRate:%d", record[i].heartRate);\r
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_MSG_CENTER, "calorie:%d", record[i].calorie);\r
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_MSG_CENTER, "altitude:%d", record[i].altitude);\r
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_MSG_CENTER, "ascent:%d", record[i].ascent);\r
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_MSG_CENTER, "descent:%d", record[i].descent);\r
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_MSG_CENTER, "distance:%d", record[i].distance);\r
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_MSG_CENTER, "lap:%d", record[i].lap);\r
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_MSG_CENTER, "startTime:%d", record[i].startTime);\r
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_MSG_CENTER, "endTime:%d", record[i].endTime);\r
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_MSG_CENTER, "elapsedTime:%d", record[i].elapsedTime);\r
+    }\r
 \r
-errcode_t msg_center_sport_report_data(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len)\r
-{\r
+    ret = msg_center_send_data(cmd_id, type, data_addr, size);\r
+    free(data_addr);\r
+    if (ret != ERRCODE_SUCC) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_MSG_CENTER, "msg_center_sport_get_record send data failed\r\n");\r
+        return ERRCODE_FAIL;\r
+    }\r
+    OHOS::SportModel::GetInstance().ClearRecord();\r
     return ERRCODE_SUCC;\r
 }\r
 \r
 errcode_t msg_center_camera_exit(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len)\r
 {\r
     WEARABLE_LOGD(WEARABLE_LOG_MODULE_MSG_CENTER, "recv exit camera from phone");\r
-    OHOS::NativeAbility::GetInstance().ChangeSlice(VIEW_APPLIST);\r
+    OHOS::NativeAbility::GetInstance().ChangeSliceToApplist();\r
     return ERRCODE_SUCC;\r
 }\r
 \r
@@ -501,20 +395,38 @@ errcode_t msg_center_set_online_log_level(uint8_t cmd_id, uint8_t type, void *us
 \r
 errcode_t msg_center_device_findphone(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len)\r
 {\r
-    uint8_t tl_len = msg_center_get_tlv_tl_len(usr_data);\r
-    uint16_t payload_len = usr_len - tl_len;\r
-    uint8_t *tlv_payload = (uint8_t *)msg_center_get_tlv_payload(usr_data);\r
     bool ret = true;\r
-    if ( OHOS::FindPhoneMainPage::GetInstance() != nullptr) {\r
+    if (OHOS::FindPhoneMainPage::GetInstance() != nullptr) {\r
         ret = OHOS::FindPhoneMainPage::GetInstance()->StopFindPhone();\r
     } else {\r
-        WEARABLE_LOGD(WEARABLE_LOG_MODULE_MSG_CENTER, "FindphonePage not exist\r\n");\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_MSG_CENTER, "FindphonePage not exist\r\n");\r
     }\r
     if (!ret) {\r
         return ERRCODE_FAIL;\r
     }\r
     return ERRCODE_SUCC;\r
 }\r
+\r
+errcode_t msg_center_device_sync_weather_rec(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len)\r
+{\r
+    if (OHOS::WeatherMainPage::GetInstance() != nullptr) {\r
+        OHOS::WeatherMainPage::GetInstance()->ReloadPage();\r
+    } else {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_MSG_CENTER, "WeatherMainPage not exist\r\n");\r
+    }\r
+    return ERRCODE_SUCC;\r
+}\r
+\r
+errcode_t msg_center_device_sync_date_rec(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len)\r
+{\r
+    if (OHOS::DateMainPage::GetInstance() != nullptr) {\r
+        OHOS::DateMainPage::GetInstance()->ReloadPage();\r
+    } else {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_MSG_CENTER, "DateMainPage not exist\r\n");\r
+    }\r
+    return ERRCODE_SUCC;\r
+}\r
+\r
 #ifdef __cplusplus\r
 }\r
 #endif
\ No newline at end of file
index 02f3c25..57a66e4 100644 (file)
@@ -1,9 +1,9 @@
 /*\r
- * Copyright (c) Huawei Technologies Co., Ltd. 2025. All rights reserved.\r
- * Description: Breath Ease\r
- * Author: wangle\r
- * Create: 2025-4-23\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: MsgCenter Device\r
+ * Create: 2025-06-06\r
  */\r
+\r
 #ifndef MSG_CENTER_DEVICE_H\r
 #define MSG_CENTER_DEVICE_H\r
 \r
 extern "C" {\r
 #endif\r
 \r
-typedef enum sport_action {\r
-    SPORT_ACTION_START = 1,\r
-    SPORT_ACTION_PAUSE = 2,\r
-    SPORT_ACTION_RESUME = 3,\r
-    SPORT_ACTION_STOP = 4,\r
-} sport_action_t;\r
-\r
 typedef enum msg_center_device_type_id {\r
-    MSGCENTER_TYPE_ID_GET_BATTERY_LEVEL = 0x1,\r
-    MSGCENTER_TYPE_ID_GET_STORAGE_INFO = 0x2,\r
-    MSGCENTER_TYPE_ID_GET_PRODUCT_INFO = 0x3,\r
-    MSGCENTER_TYPE_ID_GET_LANGUAGE_ID = 0x4,\r
-    MSGCENTER_TYPE_ID_GET_VOLUME_INFO = 0x5,\r
-    MSGCENTER_TYPE_ID_SET_LANGUAGE_ID = 0x6,\r
-    MSGCENTER_TYPE_ID_SET_VOLUME_INFO = 0x7,\r
-    MSGCENTER_TYPE_ID_DEVICE_HEARTRATE = 0x8,\r
-    MSGCENTER_TYPE_ID_DEVICE_STEPDATA = 0x9,\r
-    MSGCENTER_TYPE_ID_DEVICE_BLOODOXYGEN = 0xa,\r
-    MSGCENTER_TYPE_ID_OFFLINE_LOG_SWITCH = 0xb,\r
-    MSGCENTER_TYPE_ID_LOCATION_GET_INFO = 0x20,\r
-    MSGCENTER_TYPE_ID_LOCATION_START = 0x21,\r
-    MSGCENTER_TYPE_ID_LOCATION_STOP = 0x22,\r
-    MSGCENTER_TYPE_ID_LOCATION_REPORT = 0x23,\r
-    MSGCENTER_TYPE_ID_SPORT_ACTION = 0x27,\r
-    MSGCENTER_TYPE_ID_SPORT_GET_DATA = 0x28,\r
-    MSGCENTER_TYPE_ID_SPORT_REPORT_DATA = 0x29,\r
-    MSGCENTER_TYPE_ID_SET_ONLINELOG_CHANNEL = 0x30,\r
-    MSGCENTER_TYPE_ID_SET_ONLINELOG_LEVEL = 0x31,\r
-    MSGCENTER_TYPE_ID_ONLINELOG_REPORT = 0x33,\r
-    MSGCENTER_TYPE_ID_OTA_INIT = 0x34,\r
-    MSGCENTER_TYPE_ID_OTA_UPDATE = 0x35,\r
-    MSGCENTER_TYPE_ID_ON_FIND_PHONE = 0x36,\r
-    MSGCENTER_TYPE_ID_OFF_FIND_PHONE = 0x37,\r
-    MSGCENTER_TYPE_ID_SLEEP_DATA = 0x38,\r
-    MSGCENTER_TYPE_ID_ON_CAMERA = 0x39,\r
-    MSGCENTER_TYPE_ID_CAMERA_WATCH_EXIT = 0x40,\r
-    MSGCENTER_TYPE_ID_CAMERA_PHONE_EXIT = 0x41,\r
-    MSGCENTER_TYPE_ID_CAMERA_CONNECT_PHONE = 0x42,\r
-    MSGCENTER_TYPE_ID_CAMERA_CONNECT_PHONE_SUCCESS = 0x43,\r
+    MSGCENTER_TYPE_ID_GET_BATTERY_LEVEL = 0x01,\r
+    MSGCENTER_TYPE_ID_GET_STORAGE_INFO = 0x02,\r
+    MSGCENTER_TYPE_ID_GET_PRODUCT_INFO = 0x03,\r
+    MSGCENTER_TYPE_ID_GET_LANGUAGE_ID = 0x04,\r
+    MSGCENTER_TYPE_ID_SET_LANGUAGE_ID = 0x05,\r
+    MSGCENTER_TYPE_ID_DEVICE_HEARTRATE = 0x06,\r
+    MSGCENTER_TYPE_ID_DEVICE_STEPDATA = 0x07,\r
+    MSGCENTER_TYPE_ID_DEVICE_BLOODOXYGEN = 0x08,\r
+    MSGCENTER_TYPE_ID_SPORT_ACTION = 0x09,\r
+    MSGCENTER_TYPE_ID_SPORT_REPORT_ACTION = 0x0a,\r
+    MSGCENTER_TYPE_ID_SPORT_REPORT_DATA = 0x0b,\r
+    MSGCENTER_TYPE_ID_SPORT_GET_RECORD = 0x0c,\r
+    MSGCENTER_TYPE_ID_SET_ONLINELOG_CHANNEL = 0x0d,\r
+    MSGCENTER_TYPE_ID_SET_ONLINELOG_LEVEL = 0x0e,\r
+    MSGCENTER_TYPE_ID_OFFLINE_LOG_SWITCH = 0x0f,\r
+    MSGCENTER_TYPE_ID_ONLINELOG_REPORT = 0x10,\r
+    MSGCENTER_TYPE_ID_START_FIND_PHONE = 0x11,\r
+    MSGCENTER_TYPE_ID_STOP_FIND_PHONE = 0x12,\r
+    MSGCENTER_TYPE_ID_SLEEP_DATA = 0x13,\r
+    MSGCENTER_TYPE_ID_ON_CAMERA = 0x14,\r
+    MSGCENTER_TYPE_ID_WATCH_EXIT_CAMERA = 0x15,\r
+    MSGCENTER_TYPE_ID_PHONE_EXIT_CAMERA = 0x16,\r
+    MSGCENTER_TYPE_ID_CAMERA_CONNECTING_PHONE = 0x17,\r
+    MSGCENTER_TYPE_ID_CAMERA_CONNECTED_PHONE = 0x18,\r
+    MSGCENTER_TYPE_ID_OTA_INIT = 0x19,\r
+    MSGCENTER_TYPE_ID_OTA_UPDATE = 0x1a,\r
+    MSGCENTER_TYPE_ID_SYNC_WEATHER_REQ = 0x1b,\r
+    MSGCENTER_TYPE_ID_SYNC_WEATHER_REC = 0x1c,\r
+    MSGCENTER_TYPE_ID_SYNC_DATE_REQ = 0x1d,\r
+    MSGCENTER_TYPE_ID_SYNC_DATE_REC = 0x1e,\r
 } msg_center_device_type_id_t;\r
 \r
 // 获取电量\r
@@ -63,12 +55,8 @@ errcode_t msg_center_get_storage_info(uint8_t cmd_id, uint8_t type, void *usr_da
 errcode_t msg_center_get_product_info(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len);\r
 // 获取语言\r
 errcode_t msg_center_get_language_id(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len);\r
-// 获取音量\r
-errcode_t msg_center_get_volume_info(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len);\r
 // 设置语言\r
 errcode_t msg_center_set_language_id(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len);\r
-// 设置音量\r
-errcode_t msg_center_set_volume_info(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len);\r
 // ota初始化\r
 errcode_t msg_center_ota_init(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len);\r
 // ota检测和本地升级\r
@@ -78,15 +66,9 @@ errcode_t msg_center_device_heartrate(uint8_t cmd_id, uint8_t type, void *usr_da
 errcode_t msg_center_device_stepdata(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len);\r
 errcode_t msg_center_device_bloodoxygen(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len);\r
 \r
-/* LOCATION */\r
-errcode_t msg_center_location_get_info(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len);\r
-errcode_t msg_center_location_start(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len);\r
-errcode_t msg_center_location_stop(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len);\r
-\r
 /* SPORT */\r
 errcode_t msg_center_sport_action(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len);\r
-errcode_t msg_center_sport_get_data(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len);\r
-errcode_t msg_center_sport_report_data(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len);\r
+errcode_t msg_center_sport_get_record(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len);\r
 \r
 /* 离线日志开关 */\r
 errcode_t msg_center_offline_log_switch(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len);\r
@@ -94,6 +76,12 @@ errcode_t msg_center_offline_log_switch(uint8_t cmd_id, uint8_t type, void *usr_
 /* 查找手机 */\r
 errcode_t msg_center_device_findphone(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len);\r
 \r
+/* 天气 */\r
+errcode_t msg_center_device_sync_weather_rec(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len);\r
+\r
+/* 日历 */\r
+errcode_t msg_center_device_sync_date_rec(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len);\r
+\r
 /* CAMERA */\r
 errcode_t msg_center_camera_exit(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len);\r
 errcode_t msg_center_camera_online(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len);\r
index 22745fe..45c223c 100644 (file)
@@ -3,7 +3,6 @@ set(COMPONENT_NAME "msg_center")
 set(PUBLIC_HEADER
     ${CMAKE_CURRENT_SOURCE_DIR}/include
     ${CMAKE_CURRENT_SOURCE_DIR}/include/notify
-    ${CMAKE_CURRENT_SOURCE_DIR}/src/notify/ketinput/include
 )
 
 set(PRIVATE_HEADER
@@ -17,6 +16,7 @@ set(PRIVATE_HEADER
     ${ROOT_DIR}/middleware/services/gui/uikit/surface/interfaces/kits
     ${ROOT_DIR}/middleware/services/gui/uikit/ui/frameworks
     ${ROOT_DIR}/middleware/services/gui/uikit/proprietary/src/ui/frameworks/components_ext
+    ${ROOT_DIR}/middleware/services/gui/uikit/proprietary/src/ui/frameworks
     ${ROOT_DIR}/open_source/openharmony/drivers/peripheral/display/interfaces/include
     ${ROOT_DIR}/application/wearable/service/xiaodu_voice
     ${ROOT_DIR}/application/wearable/service/watch_setting_msg/include
@@ -26,11 +26,6 @@ set(PRIVATE_HEADER
     ${ROOT_DIR}/application/wearable/nativeapp/nativelauncher/include
     ${ROOT_DIR}/application/wearable/nativeabilityfwk/include
     ${ROOT_DIR}/open_source/openharmony/foundation/multimedia/player/interfaces/kits
-    ${ROOT_DIR}/open_source/openharmony/third_party/lwip/lwip_v2.1.3/src/include
-    ${ROOT_DIR}/open_source/openharmony/third_party/lwip/lwip_adapter/liteos/src/include
-    ${ROOT_DIR}/zhihui/4g/cat1Service
-    ${ROOT_DIR}/zhihui/4g/cat1Service/include
-    ${ROOT_DIR}/zhihui/4g/cat1Service/Service
 )
 
 set(SOURCES
@@ -109,6 +104,7 @@ set(PRIVATE_HEADER
     ${ROOT_DIR}/middleware/services/gui/uikit/surface/interfaces/kits
     ${ROOT_DIR}/middleware/services/gui/uikit/ui/frameworks
     ${ROOT_DIR}/middleware/services/gui/uikit/proprietary/src/ui/frameworks/components_ext
+    ${ROOT_DIR}/middleware/services/gui/uikit/proprietary/src/ui/frameworks
     ${ROOT_DIR}/open_source/openharmony/foundation/multimedia/audio_player/interfaces/kits
     ${ROOT_DIR}/open_source/openharmony/foundation/multimedia/audiomanager/interfaces/kits/audiomanager
     ${ROOT_DIR}/open_source/openharmony/foundation/multimedia/audiomanager/interfaces/kits/audiocommon
@@ -135,7 +131,7 @@ set(SOURCES
     ${CMAKE_CURRENT_SOURCE_DIR}/src/msg_center_customer.cpp
     ${CMAKE_CURRENT_SOURCE_DIR}/src/msg_center_cmd.cpp
     ${CMAKE_CURRENT_SOURCE_DIR}/src/notify/alarm_notification.cpp
-    ${CMAKE_CURRENT_SOURCE_DIR}/src/notify/makephone_notification.cpp
+    ${CMAKE_CURRENT_SOURCE_DIR}/src/notify/calendar_notification.cpp
     ${CMAKE_CURRENT_SOURCE_DIR}/src/common/msg_center_common.cpp
     ${CMAKE_CURRENT_SOURCE_DIR}/src/common/msg_center_utils.cpp
     ${CMAKE_CURRENT_SOURCE_DIR}/src/common/msg_center_self_cmd.cpp
@@ -147,7 +143,6 @@ set(SOURCES
     ${CMAKE_CURRENT_SOURCE_DIR}/src/msg_center_customer.cpp
     ${CMAKE_CURRENT_SOURCE_DIR}/src/msg_center_cmd.cpp
     ${CMAKE_CURRENT_SOURCE_DIR}/src/notify/alarm_notification.cpp
-    ${CMAKE_CURRENT_SOURCE_DIR}/src/notify/makephone_notification.cpp
     ${CMAKE_CURRENT_SOURCE_DIR}/src/notify/ketinput/src/NotifyOnKeyListener.cpp
     ${CMAKE_CURRENT_SOURCE_DIR}/src/notify/phone_msg_notification.cpp
 )
index c6b588a..f787fb8 100644 (file)
Binary files a/code/sdk/application/wearable/evb/service/msg_center/brandy-auto-ota-cli/libmsg_center.a and b/code/sdk/application/wearable/evb/service/msg_center/brandy-auto-ota-cli/libmsg_center.a differ
index 19e2cb5..59d450a 100644 (file)
Binary files a/code/sdk/application/wearable/evb/service/msg_center/brandy-auto-ota-ser/libmsg_center.a and b/code/sdk/application/wearable/evb/service/msg_center/brandy-auto-ota-ser/libmsg_center.a differ
index b1e105a..7e69f1c 100644 (file)
Binary files a/code/sdk/application/wearable/evb/service/msg_center/brandy-native-js/libmsg_center.a and b/code/sdk/application/wearable/evb/service/msg_center/brandy-native-js/libmsg_center.a differ
index 7f842a9..26ab44f 100644 (file)
Binary files a/code/sdk/application/wearable/evb/service/msg_center/brandy-xts/libmsg_center.a and b/code/sdk/application/wearable/evb/service/msg_center/brandy-xts/libmsg_center.a differ
index ae8cc4d..3d25dfe 100644 (file)
@@ -19,6 +19,7 @@ typedef enum {
     BT_CONNECTED_TO_MSGCENTER,
     MSGCENTER_ADD_SLEEP_VETO,
     MSGCENTER_RM_SLEEP_VETO,
+    CALENDAR_TO_MSGCENTER,
 } MsgCenterServiceMsgId;
 
 #ifdef __cplusplus
diff --git a/code/sdk/application/wearable/evb/service/msg_center/include/notify/calendar_notification.h b/code/sdk/application/wearable/evb/service/msg_center/include/notify/calendar_notification.h
new file mode 100644 (file)
index 0000000..4f341bb
--- /dev/null
@@ -0,0 +1,73 @@
+/*
+ * Copyright (c) CompanyNameMagicTag 2025-2025. All rights reserved.
+ * Description: calendar notification api
+ * Author: CompanyName
+ * Create: 2025-10-23
+ */
+ 
+#ifndef CALENDAR_NOTIFICATION_H
+#define CALENDAR_NOTIFICATION_H
+ 
+static constexpr const char* CALENDAR_IMAGE_DELETE = "calendar_delete";
+static constexpr const char* CALENDAR_IMAGE_CLOCK = "calendar_clock";
+static constexpr const char* CALENDAR_VIEW_CLOSE = "calendar_close";
+static constexpr const char* CALENDAR_VIEW_DELAY = "calendar_delay";
+static constexpr const char* CALENDAR_VIEW_POPUP = "calendar_popup";
+ 
+enum class CalendarTimerType {
+    NOTIFY_CALENDAR_CLOSE = 0,
+    NOTIFY_CALENDAR_DELAY = 1,
+    NOTIFY_CALENDAR_RING = 2,
+    NOTIFY_CALENDAR_UNKNOWN = 10,
+};
+ 
+typedef struct {
+    int id;
+    int type;
+    int64_t startTime;
+    int64_t endTime;
+    bool isAllDay;
+    bool hasReminder;
+    bool isRepeat;
+    int64_t recurrenceFrequency;
+    char bundlename[64]; // 外部传入字符串,内部不负责释放
+    char eventContent[256];
+} CalendarEvent;
+ 
+ 
+namespace OHOS {
+UIViewGroup* CreateCalendarView(CalendarEvent *event);
+void FreeCalendarView(void);
+ 
+class CalendarViewEventListener : public OHOS::UIView::OnClickListener,
+                               public OHOS::UIView::OnLongPressListener,
+                               public OHOS::UIView::OnTouchListener,
+                               public OHOS::UIView::OnDragListener {
+public:
+    CalendarViewEventListener();
+    virtual ~CalendarViewEventListener();
+    static CalendarViewEventListener *GetInstance(void);
+    bool OnDrag(UIView& view, const DragEvent& event) override;
+    bool OnDragEnd(OHOS::UIView& view, const OHOS::DragEvent& event) override;
+    bool OnClick(OHOS::UIView& view, const OHOS::ClickEvent& event) override;
+    bool OnPress(OHOS::UIView& view, const OHOS::PressEvent& event) override
+    {
+        return true;
+    }
+    bool OnLongPress(OHOS::UIView& view, const OHOS::LongPressEvent& event) override
+    {
+        return true;
+    }
+    bool OnRelease(OHOS::UIView& view, const OHOS::ReleaseEvent& event) override
+    {
+        return true;
+    }
+ 
+    bool OnDragStart(OHOS::UIView& view, const OHOS::DragEvent& event) override
+    {
+        return true;
+    }
+};
+}; // namespace OHOS
+ 
+#endif /* CALENDAR_NOTIFICATION_H */
\ No newline at end of file
index 345828d..c378b5a 100644 (file)
@@ -23,8 +23,8 @@
 #include "components/root_view.h"
 #include "components/ui_view_group.h"
 #include "alarm_notification.h"
-#include "makephone_notification.h"
 #include "phone_msg_notification.h"
+#include "calendar_notification.h"
 
 constexpr uint16_t HALF_SCREEN = 2;
 constexpr int16_t NOTIFY_PRIORITY_DEFAULT = 4;
index 735c01e..8a4a341 100644 (file)
@@ -1,19 +1,21 @@
 /*\r
  * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
- * Description: phone message notification \r
- * Author: \r
+ * Description: phone message notification\r
+ * Author:\r
  * Create: 2025-04-25\r
  */\r
 \r
 #ifndef PHONE_MSG_NOTIFICATION_H\r
 #define PHONE_MSG_NOTIFICATION_H\r
 \r
+#include <unordered_map>\r
 #include "components/ui_view_group.h"\r
 #include "components/ui_view_group.h"\r
 #include "components/ui_label.h"\r
+#include "components/ui_image_view.h"\r
 #include "components/ui_label_button_ext.h"\r
+#include "components/ui_scroll_view.h"\r
 #include "graphic_timer.h"\r
-#include <unordered_map>\r
 \r
 struct PhoneMsg {\r
     std::string appName;\r
@@ -29,11 +31,14 @@ public:
     static void UpDatePhoneMsg(std::string appName, std::string titile, std::string content);\r
     static void StartPhoneMsgTimer(int32_t interval);\r
     static void DisablePhoneMsgTimer();\r
+    static void ShowDateMsg(std::string appName, std::string title, std::string content);\r
+    static void SetControl();\r
     static const uint32_t notifyTime = 5000;\r
 \r
 private:\r
-    static UIViewGroup *phoneMsgView_;\r
+    static UIScrollView *phoneMsgView_;\r
     static UILabel *appNameLabel_;\r
+    static UIImageView *appIcon_;\r
     static UILabel *titleLabel_;\r
     static UILabel *contentLabel_;\r
     static GraphicTimer *phoneMsgNotifyStop_;\r
index 56f8f9e..6647df9 100644 (file)
@@ -14,6 +14,7 @@
 #include "element_name.h"
 #include "abilityms_slite_client.h"
 #include <string.h>
+#include "appexecfwk_errors.h"
 
 #ifdef __cplusplus
 extern "C" {
@@ -64,12 +65,15 @@ errcode_t msg_center_install_js_app(char *bundleName)
 
 bool msg_center_is_js_app_install(char *bundleName)
 {
-    InstallState installState;
-    uint8_t installProcess;
-    OHOS::BundleMsClient::GetInstance().GetInstallState(bundleName, &installState, &installProcess);
-    if (installState == BUNDLE_INSTALL_OK) {
+    if (bundleName == nullptr) {
+        return false;
+    }
+    BundleInfo bundleInfo;
+    uint8_t ret = OHOS::BundleMsClient::GetInstance().GetBundleInfo(bundleName, false, &bundleInfo);
+    if (ret == ERR_OK) {
         return true;
     }
+    
     return false;
 }
 
index 6a39ae2..aeb792c 100644 (file)
@@ -16,7 +16,7 @@
 #include "broadcast_service.h"
 #include "alarm/AlarmClockModel.h"
 #include "alarm/AlarmPopUpPresenter.h"
-#include "callerlog/CallerLogModel.h"
+#include "phonemenu/PhoneMenuCallerLogModel.h"
 #include "notification_manager.h"
 #include "NativeAbility.h"
 #include "abilityms_slite_client.h"
 #include "main/VolumeSettingPresenter.h"
 #include "main/VolumeSettingView.h"
 #include "cJSON.h"
-#include "heartrate/HeartModel.h"
-#include "device_location.h"
+#include "heartrate/HeartRateModel.h"
+#include "phonemenu/PhoneMenuView.h"
+
 namespace OHOS {
 
 #ifdef __cplusplus
 extern "C" {
 #endif
 
-#ifdef SUPPORT_CYWEE_SERVICE
-#include "cywee_data.h"
-#include "cywee_hal.h"
-#endif
-
 extern uint8_t g_bloodoxygen;
-extern uint16_t g_heartrate;
+extern uint8_t g_heartrate;
 extern uint32_t g_stepdata;
 extern uint32_t g_distance;
-extern LocationInfo_t g_locationInfo;
 
 /* 订阅事件设定优先级 */
 const PriorityMapper PRI_MAPPER[] = {
     {TOPIC_EVENT_ALARM_RING, PRIORITY_TWO},
-    {TOPIC_EVENT_ON_TIME,PRIORITY_TWO},
     {TOPIC_EVENT_NEXTDAY_UPDATE, PRIORITY_TWO},
     {TOPIC_EVENT_HFP_INCOMMING, PRIORITY_ONE},
     {TOPIC_EVENT_HFP_FINISHED, PRIORITY_ONE},
@@ -69,12 +63,12 @@ const PriorityMapper PRI_MAPPER[] = {
     {TOPIC_EVENT_HEARTRATE_UPDATA, PRIORITY_TWO},
     {TOPIC_EVENT_BLOODOXYGEN_UPDATA, PRIORITY_TWO},
     {TOPIC_EVENT_SPORT_DISTANCE, PRIORITY_TWO},
-    {TOPIC_EVENT_LOCATION, PRIORITY_TWO},
+    {TOPIC_EVENT_CALENDAR_NOTIFY, PRIORITY_TWO},
 };
 
 bool g_pressFlag = false;
 bool g_longPressFlag = false;
-
+CalendarEvent *g_tmpevent = nullptr;
 static bool CheckPriority(const Topic topic)
 {
     uint16_t mapperSize = sizeof(PRI_MAPPER) / sizeof(PRI_MAPPER[0]);
@@ -95,7 +89,6 @@ static bool CheckPriority(const Topic topic)
 void MsgCenterSubscribe()
 {
     MsgCenterSubscribeTopic(TOPIC_EVENT_ALARM_RING);
-    MsgCenterSubscribeTopic(TOPIC_EVENT_ON_TIME);
     MsgCenterSubscribeTopic(TOPIC_EVENT_NEXTDAY_UPDATE);
     MsgCenterSubscribeTopic(TOPIC_EVENT_HFP_INCOMMING);
     MsgCenterSubscribeTopic(TOPIC_EVENT_HFP_PHONE_ACTIVE);
@@ -107,7 +100,6 @@ void MsgCenterSubscribe()
     MsgCenterSubscribeTopic(TOPIC_EVENT_HEARTRATE_UPDATA);
     MsgCenterSubscribeTopic(TOPIC_EVENT_BLOODOXYGEN_UPDATA);
     MsgCenterSubscribeTopic(TOPIC_EVENT_SPORT_DISTANCE);
-    MsgCenterSubscribeTopic(TOPIC_EVENT_LOCATION);
 }
 
 static OHOS::UIViewGroup* ShowAlarmNotify(void)
@@ -115,19 +107,21 @@ static OHOS::UIViewGroup* ShowAlarmNotify(void)
     return OHOS::CreateAlarmView();
 }
 
-static OHOS::UIViewGroup* ShowPhoneCallNotify(void)
-{
-    return OHOS::CreatePhoneCallView();
-}
-
-static OHOS::UIViewGroup* ShowCallingNotify(void)
+static OHOS::UIViewGroup* ShowCalendarNotify(void)
 {
-    return OHOS::CreateCallingView();
-}
-
-static OHOS::UIViewGroup* ShowMultiPhoneCallNotify(void)
-{
-    return OHOS::CreateMultiplePhoneView();
+    // only show one notify
+    if (!g_tmpevent) {
+        return nullptr;
+    }
+    OHOS::UIViewGroup* group = OHOS::CreateCalendarView(g_tmpevent);
+    if (g_tmpevent) {
+        free(g_tmpevent);
+        g_tmpevent = nullptr;
+    }
+    if (!group) {
+        return nullptr;
+    }
+    return group;
 }
 
 static OHOS::UIViewGroup* ShowMsgNotify(void)
@@ -139,7 +133,6 @@ static OHOS::UIViewGroup* ShowMsgNotify(void)
 void MsgCenterNotifyAlarmProc(const Topic topic, Request* req)
 {
     unused(req);
-    // The alarm notification is not displayed if the incoming call notification is already being processed
     if (CheckPriority(topic)) {
         AlarmClockModel::GetInstance()->PopInterPlayMusic();
         NotificationManager::GetInstance()->SetNotifyPriority(PRIORITY_TWO);
@@ -152,6 +145,26 @@ void MsgCenterNotifyAlarmProc(const Topic topic, Request* req)
     }
 }
 
+void MsgCenterNotifyCalendarProc(const Topic topic, Request* req)
+{
+    if (g_tmpevent == nullptr) {
+        g_tmpevent = (CalendarEvent *)malloc(sizeof(CalendarEvent));
+        if (g_tmpevent == nullptr) {
+            return;
+        }
+    } else {
+        return;
+    }
+    if (memcpy_s(g_tmpevent, sizeof(CalendarEvent), req->data, sizeof(CalendarEvent)) != EOK) {
+         return;
+    }
+    // The alarm notification is not displayed if the incoming call notification is already being processed
+    if (CheckPriority(topic)) {
+        NotificationManager::GetInstance()->SetNotifyPriority(PRIORITY_TWO);
+        NotificationManager::GetInstance()->ShowNotify(ShowCalendarNotify, static_cast<uint16_t>(topic), true);
+    }
+}
+
 void MsgCenterNotifyNextDayProc(const Topic topic, Request* req)
 {
     unused(topic);
@@ -168,14 +181,22 @@ void MsgCenterNotifyHfpIncomingProc(const Topic topic, Request* req)
     } else {
     // Prevent this from happening:
     // When the incoming call view is displayed, the calling number is not set in CallerLogModel.
-    CallerLogModel::GetInstance()->SetoperateNumber(callData.number, callData.number_len);
+    PhoneMenuCallerLogModel::GetInstance()->SetoperateNumber(callData.number, callData.number_len);
     }
     NotificationManager::GetInstance()->SetNotifyPriority(PRIORITY_ONE);
-    CallerLogModel::GetInstance()->SetNotifyFlag(true);
+    PhoneMenuCallerLogModel::GetInstance()->SetNotifyFlag(true);
     if (GetCurrCallNum() == 1) {
-        NotificationManager::GetInstance()->ShowNotify(ShowPhoneCallNotify, static_cast<uint16_t>(topic), true);
+        PhoneMenuCallerLogModel::GetInstance()->SaveCurPage();
+    } else {
+        PhoneMenuCallerLogModel::GetInstance()->SetCallStatus(false);
+        PhoneMenuCallerLogModel::GetInstance()->SetWaitingStatus(true);
+    }
+    uint32_t targetId = NativeAbility::GetInstance().GetCurSliceId();
+    if (targetId == VIEW_PHONE_MENU) {
+        NativeAbility::GetInstance().SwitchPageInSlice(PhoneMenuPages::PHONE_MENU_CALLING_PAGE,
+            TransitionType::TRANSITION_INVALID, false);
     } else {
-        EnableWaitingView();
+        NativeAbility::GetInstance().SwitchSlice(VIEW_PHONE_MENU, PhoneMenuPages::PHONE_MENU_CALLING_PAGE);
     }
     NotificationManager::GetInstance()->SetWatchCallStatus(true);
 }
@@ -184,10 +205,10 @@ void MsgCenterNotifyHfpPhoneProc(const Topic topic, Request* req)
 {
     unused(req);
     // finish a single-channel call, or switch to phone, stop the notify
-    if (CallerLogModel::GetInstance()->GetNotifyFlag()) {
-        DisableWatingView();
+    if (PhoneMenuCallerLogModel::GetInstance()->GetNotifyFlag()) {
+        PhoneMenuCallerLogModel::GetInstance()->SetWaitingStatus(false);
         if ((topic == TOPIC_EVENT_HFP_FINISHED && GetCurrCallNum() == 0) ||
-        topic == TOPIC_EVENT_HFP_PHONE_ACTIVE || topic == TOPIC_EVENT_HFP_WATCH_TO_PHONE) {
+            topic == TOPIC_EVENT_HFP_PHONE_ACTIVE || topic == TOPIC_EVENT_HFP_WATCH_TO_PHONE) {
             NotificationManager::GetInstance()->StopNotify();
             NotificationManager::GetInstance()->SetWatchCallStatus(false);
         }
@@ -197,15 +218,20 @@ void MsgCenterNotifyHfpPhoneProc(const Topic topic, Request* req)
 void MsgCenterNotifyHfpWatchProc(const Topic topic, Request* req)
 {
     unused(req);
-    if (CallerLogModel::GetInstance()->GetNotifyFlag()) {
+    if (PhoneMenuCallerLogModel::GetInstance()->GetNotifyFlag()) {
         NotificationManager::GetInstance()->SetNotifyPriority(PRIORITY_ONE);
         // default not mute
         SetMicMute(false);
-        if (CallerLogModel::GetInstance()->IsMulitplePhoneStatus()) {
-            NotificationManager::GetInstance()->ShowNotify(ShowMultiPhoneCallNotify,
-                                                           static_cast<uint16_t>(topic), true);
+        PhoneMenuCallerLogModel::GetInstance()->SetMicMute(false);
+        if (PhoneMenuCallerLogModel::GetInstance()->IsMulitplePhoneStatus()) {
+            PhoneMenuCallerLogModel::GetInstance()->SetWaitingStatus(false);
+        }
+        uint32_t targetId = NativeAbility::GetInstance().GetCurSliceId();
+        if (targetId == VIEW_PHONE_MENU) {
+            NativeAbility::GetInstance().SwitchPageInSlice(PhoneMenuPages::PHONE_MENU_CALLING_PAGE,
+                TransitionType::TRANSITION_INVALID, false);
         } else {
-            NotificationManager::GetInstance()->ShowNotify(ShowCallingNotify, static_cast<uint16_t>(topic), true);
+            NativeAbility::GetInstance().SwitchSlice(VIEW_PHONE_MENU, PhoneMenuPages::PHONE_MENU_CALLING_PAGE);
         }
         NotificationManager::GetInstance()->SetWatchCallStatus(true);
     }
@@ -278,53 +304,9 @@ void MsgCenterNotifyDistanceProc(const Topic topic, Request* req)
     }
 }
 
-void MsgCenterNotifyLocationProc(const Topic topic, Request* req)
-{
-    unused(topic);
-    if(req && req->data){
-        LocationInfo_t* location = (LocationInfo_t*)req->data;
-        g_locationInfo.latitude_ = location->latitude_;
-        g_locationInfo.longitude_ = location->longitude_;
-        WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "latitude_:%d,longitude_:%d\n", g_locationInfo.latitude_, g_locationInfo.longitude_);
-    }
-}
-
-
-void MsgCenterNotifyONtimeProc(const Topic topic, Request* req)
-{
-    unused(req);
-    AlarmClockEventData* time=(AlarmClockEventData*)req->data;
-    // The alarm notification is not displayed if the incoming call notification is already being processed
-#ifdef SUPPORT_CYWEE_SERVICE
-    cywee_save_data();
-
-    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "保存每小时步数");
-
-    cywee_step_history_save(time->value);
-
-    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "保存每小时站立数据");
-    if(cywee_get_stand_flag())
-    {
-        cywee_stand_history_save(time->value);
-    }
-    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "保存每小时卡路里数据");
-
-    cywee_calories_history_save(time->value);
-    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "保存每小时距离数据");
-
-    cywee_distances_history_save(time->value);
-    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "保存每小时燃脂数据");
-
-    cywee_fat_history_save(time->value);
-#endif
-    // 保存完增加一次读取数据
-    SendMsgToUIService(UI_UPDATE_GOAL, 0, nullptr, 0);
-}
-
 /* 订阅事件通知逻辑可定制 */
 static MsgCenterNotifyTable g_msgCenterNotifyTable[] = {
     {TOPIC_EVENT_ALARM_RING,         MsgCenterNotifyAlarmProc},
-    {TOPIC_EVENT_ON_TIME,            MsgCenterNotifyONtimeProc},//增加整点保存数据
     {TOPIC_EVENT_NEXTDAY_UPDATE,     MsgCenterNotifyNextDayProc},
     {TOPIC_EVENT_HFP_INCOMMING,      MsgCenterNotifyHfpIncomingProc},
     {TOPIC_EVENT_HFP_PHONE_ACTIVE,   MsgCenterNotifyHfpPhoneProc},
@@ -337,7 +319,7 @@ static MsgCenterNotifyTable g_msgCenterNotifyTable[] = {
     {TOPIC_EVENT_STEPDATA_UPDATE,    MsgCenterNotifyStepDataProc},
     {TOPIC_EVENT_BLOODOXYGEN_UPDATA, MsgCenterNotifyBloodOxygenProc},
     {TOPIC_EVENT_SPORT_DISTANCE,     MsgCenterNotifyDistanceProc},
-    {TOPIC_EVENT_LOCATION,           MsgCenterNotifyLocationProc},
+    {TOPIC_EVENT_CALENDAR_NOTIFY,         MsgCenterNotifyCalendarProc},
 };
 
 static MsgCenterNotifyTable *MsgCenterGetNotifyTblCb(uint8_t idx)
diff --git a/code/sdk/application/wearable/evb/service/msg_center/src/notify/calendar_notification.cpp b/code/sdk/application/wearable/evb/service/msg_center/src/notify/calendar_notification.cpp
new file mode 100644 (file)
index 0000000..32a93e0
--- /dev/null
@@ -0,0 +1,230 @@
+/*
+ * Copyright (c) CompanyNameMagicTag 2025-2025. All rights reserved.
+ * Description: calendar notification implement
+ * Author: CompanyName
+ * Create: 2025-10-23
+ */
+ 
+#include "notification_manager.h"
+#include "wearable_log.h"
+#include "UiConfig.h"
+#include "components/ui_image_view.h"
+#include "components/ui_label.h"
+#include "ability_manager.h"
+ 
+namespace OHOS {
+constexpr int32_t NOTIFY_THREE_SECONDS = 3000;
+constexpr int32_t NOTIFY_ONE_SECOND = 1000;
+constexpr int32_t NOTIFY_THIRTY_SECONDS = 30000;
+constexpr int32_t NOTIFY_ONE_MINUTE = 60000;
+constexpr int32_t NOTOFY_NO_OPERATE_TIME = 35000;
+ 
+UIViewGroup* g_calendarView = nullptr;
+UIImageView* g_calendarExit = nullptr;
+UIImageView* g_calendarConfirm = nullptr;
+UILabel* g_tooltip = nullptr;
+// calendar close view
+constexpr int16_t MAX_SET_SRC_LEN = 90;
+char g_bundlename[256] = {0};
+// calendar main view
+constexpr int16_t CONTAINER_X = 0;
+constexpr int16_t CONTAINER_Y = 0;
+constexpr int16_t IMAGE_DELETE_X = 85;
+constexpr int16_t IMAGE_DELETE_Y = 300;
+constexpr int16_t IMAGE_CLOCK_X = 275;
+constexpr int16_t IMAGE_CLOCK_Y = 300;
+constexpr int16_t BASE_YEARS = 1900;
+ 
+// calendar delay view
+constexpr int16_t DELAY_LABEL_X = 80;
+constexpr int16_t DELAY_LABEL_Y = 100;
+constexpr int16_t DELAY_LABEL_LENGTH = 350;
+constexpr int16_t DELAY_LABEL_HEIGHT = 35;
+constexpr int16_t DELAY_LABEL_FONT = 25;
+ 
+static bool CreateCalendarViewImage(void)
+{
+    g_calendarExit = new UIImageView();
+    if (g_calendarExit == nullptr) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "showCalendarNotify g_calendarExit null!");
+        return false;
+    }
+    g_calendarExit->SetPosition(IMAGE_DELETE_X, IMAGE_DELETE_Y);
+    g_calendarExit->SetWidth(MAX_SET_SRC_LEN);
+    g_calendarExit->SetHeight(MAX_SET_SRC_LEN);
+    g_calendarExit->SetViewId(CALENDAR_IMAGE_DELETE);
+    g_calendarExit->SetSrc(ALARM_DELETE_ADD_PATH);
+    g_calendarExit->SetTouchable(true);
+    UIView::OnClickListener *closeListener = static_cast<UIView::OnClickListener *>\
+        (CalendarViewEventListener::GetInstance());
+    g_calendarExit->SetOnClickListener(closeListener);
+    g_calendarConfirm = new UIImageView();
+    if (g_calendarConfirm == nullptr) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "showCalendarNotify g_calendarConfirm null!");
+        delete g_calendarExit;
+        return false;
+    }
+    g_calendarConfirm->SetPosition(IMAGE_CLOCK_X, IMAGE_CLOCK_Y);
+    g_calendarConfirm->SetWidth(MAX_SET_SRC_LEN);
+    g_calendarConfirm->SetHeight(MAX_SET_SRC_LEN);
+    g_calendarConfirm->SetViewId(CALENDAR_IMAGE_CLOCK);
+    g_calendarConfirm->SetSrc(ALARM_CLOCK_ADD_PATH);
+    g_calendarConfirm->SetTouchable(true);
+    UIView::OnClickListener *clockListener = static_cast<UIView::OnClickListener *>\
+        (OHOS::CalendarViewEventListener::GetInstance());
+    g_calendarConfirm->SetOnClickListener(clockListener);
+    return true;
+}
+ 
+static void FreeCalendarViewImage(void)
+{
+    delete g_calendarExit;
+    g_calendarExit = nullptr;
+    delete g_calendarConfirm;
+    g_calendarConfirm = nullptr;
+}
+ 
+static const char* GetFormatTimestamp(long long timestamp)
+{
+    static char buffer[20];
+    
+    time_t seconds = (time_t)(timestamp / NOTIFY_ONE_SECOND);
+ 
+    struct tm *localTime = localtime(&seconds);
+    if (localTime == NULL) {
+        return NULL;
+    }
+ 
+    int size = sprintf_s(buffer, sizeof(buffer), "%04d-%02d-%02d %02d:%02d:%02d",
+            localTime->tm_year + BASE_YEARS,
+            localTime->tm_mon + 1,
+            localTime->tm_mday,
+            localTime->tm_hour,
+            localTime->tm_min,
+            localTime->tm_sec);
+    if (size < 0) {
+        return NULL;
+    }
+    return buffer;
+}
+ 
+UIViewGroup* CreateCalendarView(CalendarEvent *event)
+{
+    g_calendarView = new UIViewGroup();
+    if (g_calendarView == nullptr) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "CreateCalendarView g_calendarView null!");
+        return nullptr;
+    }
+    g_calendarView->SetPosition(CONTAINER_X, CONTAINER_Y,
+        Screen::GetInstance().GetWidth(), Screen::GetInstance().GetHeight());
+    g_calendarView->SetViewId(CALENDAR_VIEW_POPUP);
+ 
+    if (!CreateCalendarViewImage()) {
+        delete g_calendarView;
+        g_calendarView = nullptr;
+        return nullptr;
+    }
+    g_tooltip = new UILabel();
+    if (g_tooltip == nullptr) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "AlarmRingView::g_tooltip null!");
+        delete g_calendarView;
+        g_calendarView = nullptr;
+        FreeCalendarViewImage();
+        return nullptr;
+    }
+    g_tooltip->SetPosition(DELAY_LABEL_X, DELAY_LABEL_Y, DELAY_LABEL_LENGTH, DELAY_LABEL_HEIGHT);
+    g_tooltip->SetLineBreakMode(UILabel::LINE_BREAK_WRAP);
+    g_tooltip->SetFont(DEFAULT_VECTOR_FONT_FILENAME, DELAY_LABEL_FONT);
+    char text[256] = {0};
+    int size = sprintf_s(text, sizeof(text), "id = %d                                      bundle = %s eventContent = %s starttime = %s",
+        event->id, event->bundlename, event->eventContent, GetFormatTimestamp(event->startTime));
+    memset_s(g_bundlename, sizeof(g_bundlename), 0, sizeof(g_bundlename));
+    int ret = memcpy_s(g_bundlename, sizeof(g_bundlename), event->bundlename, strlen(event->bundlename));
+    if (size < 0 || ret != EOK) {
+        FreeCalendarView();
+        return nullptr;
+    }
+    g_tooltip->SetText(text);
+    g_calendarView->Add(g_calendarExit);
+    g_calendarView->Add(g_calendarConfirm);
+    g_calendarView->Add(g_tooltip);
+    g_calendarView->SetDraggable(true);
+    g_calendarView->SetTouchable(true);
+    UIView::OnDragListener *listener = static_cast<UIView::OnDragListener*>(CalendarViewEventListener::GetInstance());
+    g_calendarView->SetOnDragListener(listener);
+    NotificationManager::GetInstance()->RegisterNotifyCleanupFunction(FreeCalendarView);
+    return g_calendarView;
+}
+void FreeCalendarView(void)
+{
+    if (g_calendarView != nullptr) {
+        g_calendarView->RemoveAll();
+        FreeCalendarViewImage();
+        delete g_tooltip;
+        g_tooltip = nullptr;
+        RootView::GetInstance()->Remove(g_calendarView);
+        delete g_calendarView;
+        g_calendarView = nullptr;
+    }
+}
+ 
+CalendarViewEventListener::CalendarViewEventListener()
+{
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "CalendarViewEventListener :%p", this);
+}
+ 
+CalendarViewEventListener::~CalendarViewEventListener()
+{
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "~CalendarViewEventListener");
+}
+ 
+CalendarViewEventListener *CalendarViewEventListener::GetInstance(void)
+{
+    static CalendarViewEventListener calendarViewEventListener;
+    return &calendarViewEventListener;
+}
+ 
+bool CalendarViewEventListener::OnDrag(UIView& view, const DragEvent& event)
+{
+    return true;
+}
+ 
+bool CalendarViewEventListener::OnDragEnd(UIView& view, const DragEvent& event)
+{
+    if (event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT) {
+        if (strcmp(view.GetViewId(), CALENDAR_VIEW_POPUP) == 0) {
+            NotificationManager::GetInstance()->screenContainer_->SetVisible(false);
+            NotificationManager::GetInstance()->StopNotify();
+        } else if (strcmp(view.GetViewId(), CALENDAR_VIEW_CLOSE) == 0 ||
+                   strcmp(view.GetViewId(), CALENDAR_VIEW_DELAY) == 0) {
+            NotificationManager::GetInstance()->screenContainer_->SetVisible(false);
+            NotificationManager::GetInstance()->StopNotify();
+        }
+    }
+    return true;
+}
+ 
+bool CalendarViewEventListener::OnClick(UIView& view, const ClickEvent& event)
+{
+    UNUSED(event);
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "AlamNotify ClickListener %s", view.GetViewId());
+    if (strcmp(view.GetViewId(), CALENDAR_IMAGE_DELETE) == 0) {
+        NotificationManager::GetInstance()->screenContainer_->SetVisible(false);
+        Want *want = new Want();
+        memset_s(want, sizeof(Want), 0, sizeof(Want));
+        ElementName startElement = {};
+        startElement.abilityName = (char *)"default";
+        startElement.bundleName = g_bundlename;
+        startElement.deviceId = nullptr;
+        SetWantElement(want, startElement);
+        StartAbility(want);
+        ClearWant(want);
+        delete want;
+        NotificationManager::GetInstance()->StopNotify();
+    } else if (strcmp(view.GetViewId(), CALENDAR_IMAGE_CLOCK) == 0) {
+        NotificationManager::GetInstance()->screenContainer_->SetVisible(false);
+        NotificationManager::GetInstance()->StopNotify();
+    }
+    return true;
+}
+}  // namespace OHOS
\ No newline at end of file
index cfff9a7..d1958e3 100644 (file)
@@ -18,9 +18,9 @@
 #include "dock/input_device.h"
 #include "notification_manager.h"
 #include "alarm/AlarmPopUpPresenter.h"
-#include "callerlog/CallerLogModel.h"
-#include "makephone/MainCallingPresenter.h"
+#include "phonemenu/PhoneMenuCallerLogModel.h"
 #include "applist/ApplistModel.h"
+
 namespace OHOS {
 static bool IsNotifyCallStatus()
 {
index eb6a408..9000a1d 100644 (file)
@@ -9,41 +9,45 @@
 #include "wearable_log.h"\r
 #include <string>\r
 #include "main/MessageModel.h"\r
+#include "ui_resource_message.h"\r
+#include "common/image_cache_manager.h"\r
+#include "main/LoadImg.h"\r
 \r
 namespace OHOS {\r
 // 三方应用名\r
-static const uint32_t APP_NAME_POS_X = 180;\r
-static const uint32_t APP_NAME_POS_Y = 82;\r
-static const uint32_t APP_NAME_WIDTH = 200;\r
-static const uint32_t APP_NAME_HEIGHT = 60;\r
+static const uint32_t APP_NAME_POS_X = 170;\r
+static const uint32_t APP_NAME_POS_Y = 40;\r
+static const uint32_t APP_NAME_WIDTH = 160;\r
+static const uint32_t APP_NAME_HEIGHT = 53;\r
 // 三方消息主题\r
-static const uint32_t MSG_TITLE_POS_X = 81;\r
-static const uint32_t MSG_TITLE_POS_Y = 122;\r
-static const uint32_t MSG_TITLE_WIDTH = 409;\r
-static const uint32_t MSG_TITLE_HEIGHT = 83;\r
+static const uint32_t MSG_TITLE_POS_X = 15;\r
+static const uint32_t MSG_TITLE_POS_Y = 138;\r
+static const uint32_t MSG_TITLE_WIDTH = 370;\r
+static const uint32_t MSG_TITLE_HEIGHT = 50;\r
 // 三方消息内容\r
-static const uint32_t MSG_CONTENT_POS_X = 78;\r
-static const uint32_t MSG_CONTENT_POS_Y = 176;\r
-static const uint32_t MSG_CONTENT_WIDTH = 457;\r
-static const uint32_t MSG_CONTENT_HEIGHT = 269;\r
-// 取消通知\r
-static const uint32_t CANCEL_BUTTON_POS_X = 150;\r
-static const uint32_t CANCEL_BUTTON_POS_Y = 323;\r
-static const uint32_t CANCEL_BUTTON_WIDTH = 165;\r
-static const uint32_t CANCEL_BUTTON_HEIGHT = 44;\r
+static const uint32_t MSG_CONTENT_POS_X = 15;\r
+static const uint32_t MSG_CONTENT_POS_Y = 201;\r
+static const uint32_t MSG_CONTENT_WIDTH = 370;\r
+static const uint32_t MSG_CONTENT_HEIGHT = 200;\r
+// 通知图标\r
+static const uint32_t MSG_ICON_POS_X = 130;\r
+static const uint32_t MSG_ICON_POS_Y = 50;\r
+static const uint32_t MSG_ICON_WIDTH = 40;\r
+static const uint32_t MSG_ICON_HEIGHT = 40;\r
+static const uint32_t MSG_PAGE_WIDTH = 454;\r
 \r
 // 设置字体大小\r
-static const uint32_t APP_NAME_FONT_SIZE = 20;\r
-static const uint32_t MSG_TITLE_FONT_SIZE = 20;\r
-static const uint32_t MSG_CONTENT_FONT_SIZE = 40;\r
+static const uint32_t APP_NAME_FONT_SIZE = 38;\r
+static const uint32_t MSG_TITLE_FONT_SIZE = 36;\r
+static const uint32_t MSG_CONTENT_FONT_SIZE = 36;\r
 \r
-UIViewGroup *PhoneMsgView::phoneMsgView_ = nullptr;\r
+UIScrollView *PhoneMsgView::phoneMsgView_ = nullptr;\r
 UILabel *PhoneMsgView::appNameLabel_ = nullptr;\r
+UIImageView *PhoneMsgView::appIcon_ = nullptr;\r
 UILabel *PhoneMsgView::titleLabel_ = nullptr;\r
 UILabel *PhoneMsgView::contentLabel_ = nullptr;\r
 GraphicTimer *PhoneMsgView::phoneMsgNotifyStop_ = nullptr;\r
 PhoneMsg PhoneMsgView::phoneMsg_;\r
-UILabelButtonExt *PhoneMsgView::cancelButton_ = nullptr;\r
 \r
 void PhoneMsgStopNotifyCallback(void *data)\r
 {\r
@@ -71,9 +75,11 @@ void PhoneMsgView::DisablePhoneMsgTimer()
 UIViewGroup *PhoneMsgView::CreatePhoneMsgView()\r
 {\r
     if (phoneMsgView_ == nullptr) {\r
-        phoneMsgView_ = new UIViewGroup();\r
-        phoneMsgView_->SetPosition(0, 0, Screen::GetInstance().GetWidth(), Screen::GetInstance().GetHeight());\r
+        phoneMsgView_ = new UIScrollView();\r
+        phoneMsgView_->SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);\r
         phoneMsgView_->SetViewId("phoneMsgView");\r
+        phoneMsgView_->SetThrowDrag(true);\r
+        phoneMsgView_->SetScrollBlankSize(40);\r
     }\r
 \r
     if (appNameLabel_ == nullptr) {\r
@@ -83,20 +89,22 @@ UIViewGroup *PhoneMsgView::CreatePhoneMsgView()
     appNameLabel_->SetText(phoneMsg_.appName.c_str());\r
     appNameLabel_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, APP_NAME_FONT_SIZE);\r
     appNameLabel_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
-    // Add to rootView\r
     phoneMsgView_->Add(appNameLabel_);\r
-    appNameLabel_->SetVisible(true);\r
+\r
+    if (appIcon_ == nullptr) {\r
+        appIcon_ = new UIImageView();\r
+    }\r
+    appIcon_->SetPosition(MSG_ICON_POS_X, MSG_ICON_POS_Y, MSG_ICON_WIDTH, MSG_ICON_HEIGHT);\r
+    phoneMsgView_->Add(appIcon_);\r
+    appIcon_->SetVisible(true);\r
 \r
     if (titleLabel_ == nullptr) {\r
         titleLabel_ = new UILabel();\r
     }\r
     titleLabel_->SetPosition(MSG_TITLE_POS_X, MSG_TITLE_POS_Y, MSG_TITLE_WIDTH, MSG_TITLE_HEIGHT);\r
-    titleLabel_->SetText(phoneMsg_.msgTitle.c_str());\r
     titleLabel_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, MSG_TITLE_FONT_SIZE);\r
     titleLabel_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
-    // Add to rootView\r
     phoneMsgView_->Add(titleLabel_);\r
-    titleLabel_->SetVisible(true);\r
 \r
     if (contentLabel_ == nullptr) {\r
         contentLabel_ = new UILabel();\r
@@ -105,21 +113,11 @@ UIViewGroup *PhoneMsgView::CreatePhoneMsgView()
     contentLabel_->SetText(phoneMsg_.msgContent.c_str());\r
     contentLabel_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, MSG_CONTENT_FONT_SIZE);\r
     contentLabel_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
-    // Add to rootView\r
+    contentLabel_->SetLineBreakMode(UILabel::LINE_BREAK_ELLIPSIS);\r
     phoneMsgView_->Add(contentLabel_);\r
-    contentLabel_->SetVisible(true);\r
-\r
-    if (cancelButton_ == nullptr) {\r
-        cancelButton_ = new UILabelButtonExt();\r
-    }\r
-    cancelButton_->SetPosition(CANCEL_BUTTON_POS_X, CANCEL_BUTTON_POS_Y, CANCEL_BUTTON_WIDTH, CANCEL_BUTTON_HEIGHT);\r
-    cancelButton_->SetViewId("cancelButton");\r
-    cancelButton_->SetText("取消通知");\r
-    cancelButton_->SetTouchable(true);\r
-    cancelButton_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, APP_NAME_FONT_SIZE);\r
-    // Add to rootView\r
-    phoneMsgView_->Add(cancelButton_);\r
 \r
+    SetControl();\r
+    phoneMsgView_->Invalidate();\r
     phoneMsgView_->SetDraggable(true);\r
     phoneMsgView_->SetTouchable(true);\r
     UIView::OnDragListener *dragListener =\r
@@ -128,29 +126,78 @@ UIViewGroup *PhoneMsgView::CreatePhoneMsgView()
         static_cast<UIView::OnClickListener *>(PhoneMsgViewEventListener::GetInstance());\r
     phoneMsgView_->SetOnDragListener(dragListener);\r
     phoneMsgView_->SetOnClickListener(clickListener);\r
-    cancelButton_->SetOnClickListener(clickListener);\r
     StartPhoneMsgTimer(PhoneMsgView::notifyTime);\r
     NotificationManager::GetInstance()->RegisterNotifyCleanupFunction(FreePhoneMsgView);\r
     return phoneMsgView_;\r
 }\r
 \r
+void PhoneMsgView::SetControl()\r
+{\r
+    if (strcmp(phoneMsg_.appName.c_str(), "微信") == 0) {\r
+            LOADIMG::LoadImageViewImg(appIcon_, MESSAGE_IMAGE, IMAGE_MESSAGE_WX);\r
+    } else if (strcmp(phoneMsg_.appName.c_str(), "QQ") == 0) {\r
+            LOADIMG::LoadImageViewImg(appIcon_, MESSAGE_IMAGE, IMAGE_MESSAGE_QQ);\r
+    } else if (strcmp(phoneMsg_.appName.c_str(), "抖音") == 0) {\r
+            LOADIMG::LoadImageViewImg(appIcon_, MESSAGE_IMAGE, IMAGE_MESSAGE_DY);\r
+    } else if (strcmp(phoneMsg_.appName.c_str(), "日历") == 0) {\r
+            LOADIMG::LoadImageViewImg(appIcon_, MESSAGE_IMAGE, IMAGE_MESSAGE_CALENDAR);\r
+    } else if (strcmp(phoneMsg_.appName.c_str(), "信息") == 0) {\r
+            LOADIMG::LoadImageViewImg(appIcon_, MESSAGE_IMAGE, IMAGE_MESSAGE_DUANXIN);\r
+    } else if (strcmp(phoneMsg_.appName.c_str(), "短信") == 0) {\r
+            LOADIMG::LoadImageViewImg(appIcon_, MESSAGE_IMAGE, IMAGE_MESSAGE_DUANXIN);\r
+    } else if (strcmp(phoneMsg_.appName.c_str(), "今日头条") == 0) {\r
+            LOADIMG::LoadImageViewImg(appIcon_, MESSAGE_IMAGE, IMAGE_MESSAGE_TOUTIAO);\r
+    } else if (strcmp(phoneMsg_.appName.c_str(), "微博") == 0) {\r
+            LOADIMG::LoadImageViewImg(appIcon_, MESSAGE_IMAGE, IMAGE_MESSAGE_WB);\r
+    } else if (strcmp(phoneMsg_.appName.c_str(), "小红书") == 0) {\r
+            LOADIMG::LoadImageViewImg(appIcon_, MESSAGE_IMAGE, IMAGE_MESSAGE_XHS);\r
+    }\r
+    int controlOffset = 10;\r
+    int cut = 2;\r
+    int posX = (MSG_PAGE_WIDTH - appNameLabel_->GetTextWidth() - appIcon_->GetWidth() - controlOffset) / cut;\r
+    appIcon_->SetX(posX);\r
+    appNameLabel_->SetWidth(appNameLabel_->GetTextWidth());\r
+    appNameLabel_->SetX(posX + appIcon_->GetWidth() + controlOffset);\r
+\r
+    titleLabel_->SetText(phoneMsg_.msgTitle.c_str());\r
+    if (titleLabel_->GetTextWidth() > MSG_TITLE_WIDTH) {\r
+        titleLabel_->SetWidth(MSG_TITLE_WIDTH);\r
+    } else {\r
+        titleLabel_->SetWidth(titleLabel_->GetTextWidth());\r
+    }\r
+    titleLabel_->SetX((MSG_PAGE_WIDTH - titleLabel_->GetWidth()) / cut);\r
+\r
+    int height = contentLabel_->GetTextHeight();\r
+    contentLabel_->SetHeight(height);\r
+    posX = (MSG_PAGE_WIDTH - contentLabel_->GetWidth()) / cut;\r
+    contentLabel_->SetX(posX);\r
+}\r
+\r
 void PhoneMsgView::FreePhoneMsgView(void)\r
 {\r
     WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "FreePhoneMsgView");\r
     if (phoneMsgView_ != nullptr) {\r
         DisablePhoneMsgTimer();\r
         phoneMsgView_->RemoveAll();\r
+        RootView::GetInstance()->Remove(phoneMsgView_);\r
+        delete phoneMsgView_;\r
+        phoneMsgView_ = nullptr;\r
+    }\r
+    if (appNameLabel_ != nullptr) {\r
         delete appNameLabel_;\r
         appNameLabel_ = nullptr;\r
+    }\r
+    if (appIcon_ != nullptr) {\r
+        delete appIcon_;\r
+        appIcon_ = nullptr;\r
+    }\r
+    if (titleLabel_ != nullptr) {\r
         delete titleLabel_;\r
         titleLabel_ = nullptr;\r
+    }\r
+    if (contentLabel_ != nullptr) {\r
         delete contentLabel_;\r
         contentLabel_ = nullptr;\r
-        delete cancelButton_;\r
-        cancelButton_ = nullptr;\r
-        RootView::GetInstance()->Remove(phoneMsgView_);\r
-        delete phoneMsgView_;\r
-        phoneMsgView_ = nullptr;\r
     }\r
 }\r
 \r
@@ -159,7 +206,23 @@ void PhoneMsgView::UpDatePhoneMsg(std::string appName, std::string titile, std::
     phoneMsg_.appName = appName;\r
     phoneMsg_.msgTitle = titile;\r
     phoneMsg_.msgContent = content;\r
-    MessageModel::GetInstance().GetMessageInfo(appName, titile, content);\r
+    MessageModel::GetInstance().SaveMsgToModel(appName, titile, content);\r
+    MessageModel::GetInstance().SetMsgListItems();\r
+}\r
+\r
+static OHOS::UIViewGroup* ShowMsgNotify(void)\r
+{\r
+    WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "ShowMsgNotify");\r
+    return OHOS::PhoneMsgView::CreatePhoneMsgView();\r
+}\r
+\r
+void PhoneMsgView::ShowDateMsg(std::string appName, std::string title, std::string content)\r
+{\r
+    const uint16_t TOPIC_DEMO_ALL_MSG = 10001;\r
+    UpDatePhoneMsg(appName, title, content);\r
+    int prio = 2;\r
+    NotificationManager::GetInstance()->SetNotifyPriority(prio);\r
+    NotificationManager::GetInstance()->ShowNotify(ShowMsgNotify, static_cast<uint16_t>(TOPIC_DEMO_ALL_MSG), true);\r
 }\r
 \r
 PhoneMsgViewEventListener::PhoneMsgViewEventListener()\r
@@ -188,7 +251,7 @@ bool PhoneMsgViewEventListener::OnDragEnd(UIView &view, const DragEvent &event)
     std::string viewId = view.GetViewId();\r
     WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "PhoneMsgViewEventListener OnDragEnd %s", viewId.c_str());\r
     if (viewId == "phoneMsgView") {\r
-        NotificationManager::GetInstance()->StopNotify();\r
+        // NotificationManager::GetInstance()->StopNotify();\r
     }\r
     return true;\r
 }\r
index f8e5abb..4ae08b7 100644 (file)
@@ -6,10 +6,12 @@ set(PUBLIC_HEADER
 set(PRIVATE_HEADER\r
     ${ROOT_DIR}/middleware/services/gui/uikit/utils/interfaces/innerkits\r
     ${ROOT_DIR}/middleware/services/gui/uikit/utils/interfaces/kits\r
+    ${ROOT_DIR}/application/wearable/nativeapp/nativeui/include/phonemenu\r
 )\r
 \r
 set(SOURCES\r
     ${CMAKE_CURRENT_SOURCE_DIR}/remote_msg.cpp\r
+    ${CMAKE_CURRENT_SOURCE_DIR}/phone_contacts.cpp\r
 )\r
 \r
 set(COMPONENT_PUBLIC_CCFLAGS\r
diff --git a/code/sdk/application/wearable/evb/service/remote_msg/phone_contacts.cpp b/code/sdk/application/wearable/evb/service/remote_msg/phone_contacts.cpp
new file mode 100644 (file)
index 0000000..b55356a
--- /dev/null
@@ -0,0 +1,32 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: PhoneContacts\r
+ * Create: 2025-07-12\r
+ */\r
+\r
+#include "wearable_log.h"\r
+#include "message.h"\r
+#include "PhoneMenuSync.h"\r
+#include "phone_contacts.h"\r
+\r
+#ifdef __cplusplus\r
+extern "C" {\r
+#endif\r
+uint8_t updata_contacts(Request *request)\r
+{\r
+    std::string content((char *)request->data, request->len);\r
+    uint8_t ret = OHOS::PhoneMenuSync::ParseContactsMsg(content);\r
+    if (ret != OHOS::OK) {\r
+        return ret;\r
+    }\r
+    OHOS::PhoneMenuSync::WriteFileContact(OHOS::CONTACTS_FILE_PATH, content);\r
+    return 0;\r
+}\r
+\r
+uint8_t lookup_contacts(std::string &lookupContacts)\r
+{\r
+    return OHOS::PhoneMenuSync::LookContacts(lookupContacts);\r
+}\r
+#ifdef __cplusplus\r
+}\r
+#endif\r
diff --git a/code/sdk/application/wearable/evb/service/remote_msg/phone_contacts.h b/code/sdk/application/wearable/evb/service/remote_msg/phone_contacts.h
new file mode 100644 (file)
index 0000000..8e517a3
--- /dev/null
@@ -0,0 +1,23 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: PhoneContacts\r
+ * Create: 2025-07-12\r
+ */\r
+\r
+#ifndef PHONE_CONTACTS_H\r
+#define PHONE_CONTACTS_H\r
+#include <string>\r
+#include "message.h"\r
+#ifdef __cplusplus\r
+#if __cplusplus\r
+extern "C" {\r
+#endif\r
+#endif\r
+uint8_t updata_contacts(Request *request); // 同步手机侧联系人到表侧\r
+uint8_t lookup_contacts(std::string &lookupContacts); // 查询表侧联系人到手机\r
+#ifdef __cplusplus\r
+#if __cplusplus\r
+}\r
+#endif\r
+#endif\r
+#endif /* PHONE_CONTACTS_H */
\ No newline at end of file
index a339654..5f8a450 100644 (file)
@@ -1,8 +1,9 @@
 /*\r
- * Copyright (c) CompanyNameMagicTag 2023-2023. All rights reserved.\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
  * Description: ota upgrade handle.\r
  * This file should be changed only infrequently and with great care.\r
  */\r
+\r
 #include <stdio.h>\r
 #include "securec.h"\r
 #include "msg_center.h"\r
@@ -13,7 +14,9 @@
 #include "msg_center.h"\r
 #include "msg_center_common.h"\r
 #include "ohos_init.h"\r
+#include "phone_contacts.h"\r
 #include "remote_msg.h"\r
+\r
 #ifdef __cplusplus\r
 extern "C" {\r
 #endif\r
@@ -22,6 +25,8 @@ static const msg_center_cmd_map_t g_msg_center_phone_msg_tbl[] = {
     {MSGCENTER_CMD_PHONE_MSG, MSGCENTER_TYPE_ID_MSG_THIRD_APP, msg_center_phone_msg_rec},\r
     {MSGCENTER_CMD_PHONE_MSG, MSGCENTER_TYPE_ID_MSG_SMS, msg_center_phone_msg_rec},\r
     {MSGCENTER_CMD_PHONE_MSG, MSGCENTER_TYPE_ID_MSG_PHONE, msg_center_phone_msg_rec},\r
+    {MSGCENTER_CMD_PHONE_MSG, MSGCENTER_TYPE_ID_UPDATE_CONTACTS, msg_center_update_contacts},\r
+    {MSGCENTER_CMD_PHONE_MSG, MSGCENTER_TYPE_ID_LOOKUP_CONTACTS, msg_center_lookup_contacts},\r
 };\r
 \r
 errcode_t msg_center_phone_msg_rec(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len)\r
@@ -45,6 +50,50 @@ errcode_t msg_center_phone_msg_rec(uint8_t cmd_id, uint8_t type, void *usr_data,
     return ERRCODE_SUCC;\r
 }\r
 \r
+errcode_t msg_center_update_contacts(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len)\r
+{\r
+    uint8_t tl_len = msg_center_get_tlv_tl_len(usr_data);\r
+    uint16_t payload_len = usr_len - tl_len;\r
+    uint8_t *tlv_payload = (uint8_t *)msg_center_get_tlv_payload(usr_data);\r
+    errcode_t ret = ERRCODE_SUCC;\r
+    uint8_t msg_result = 0;\r
+    WEARABLE_LOGI(WEARABLE_LOG_MODULE_MSG_CENTER, "update_contacts, cmd_id = %d, type = %d\r\n", cmd_id, type);\r
+    Request request;\r
+    request.msgId = type;\r
+    request.len = payload_len;\r
+    request.data = tlv_payload;\r
+    updata_contacts(&request);\r
+    ret = msg_center_send_data(cmd_id, type, &msg_result, sizeof(msg_result));\r
+    if (ret != ERRCODE_SUCC) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_MSG_CENTER, "msg_center_update_contacts fail, ret = %d\r\n", ret);\r
+        return ERRCODE_FAIL;\r
+    }\r
+    return ERRCODE_SUCC;\r
+}\r
+\r
+errcode_t msg_center_lookup_contacts(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len)\r
+{\r
+    uint8_t tl_len = msg_center_get_tlv_tl_len(usr_data);\r
+    uint16_t payload_len = usr_len - tl_len;\r
+    uint8_t *tlv_payload = (uint8_t *)msg_center_get_tlv_payload(usr_data);\r
+    errcode_t ret = ERRCODE_SUCC;\r
+    uint8_t msg_result = 0;\r
+    WEARABLE_LOGI(WEARABLE_LOG_MODULE_MSG_CENTER, "lookup_contacts, cmd_id = %d, type = %d\r\n", cmd_id, type);\r
+    std::string lookupContacts;\r
+    uint8_t result = lookup_contacts(lookupContacts);\r
+    if (!result) {\r
+        ret = msg_center_send_data(cmd_id, type, (void *)lookupContacts.c_str(), lookupContacts.size());\r
+    } else {\r
+        ret = msg_center_send_data(cmd_id, type, (void *)&result, 1);\r
+    }\r
+    if (ret != ERRCODE_SUCC) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_MSG_CENTER, "msg_center_lookup_contacts fail, ret = %d\r\n", ret);\r
+        return ERRCODE_FAIL;\r
+    }\r
+    return ERRCODE_SUCC;\r
+}\r
+\r
+\r
 errcode_t msg_center_phone_msg_type_dispatch(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len)\r
 {\r
     WEARABLE_LOGI(WEARABLE_LOG_MODULE_MSG_CENTER, "msg_center_phone_msg_type_dispatch, cmd_id = %d, type = %d\r\n",\r
index 2787377..e974e4c 100644 (file)
@@ -20,10 +20,14 @@ typedef enum msg_center_phone_msg_type_id {
     MSGCENTER_TYPE_ID_MSG_THIRD_APP = 0x1, // 三方应用消息\r
     MSGCENTER_TYPE_ID_MSG_SMS,             // 短信\r
     MSGCENTER_TYPE_ID_MSG_PHONE,           // 电话\r
+    MSGCENTER_TYPE_ID_UPDATE_CONTACTS,\r
+    MSGCENTER_TYPE_ID_LOOKUP_CONTACTS,\r
     MSGCENTER_TYPE_ID_MSG_MAX,\r
 } msg_center_msg_notify_type_id_t;\r
 \r
 errcode_t msg_center_phone_msg_rec(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len);\r
+errcode_t msg_center_update_contacts(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len);\r
+errcode_t msg_center_lookup_contacts(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len);\r
 \r
 #ifdef __cplusplus\r
 #if __cplusplus\r
index 13a4f40..3a6612c 100644 (file)
@@ -262,7 +262,8 @@ public:
         }
     }
     //仅用于打电话结束恢复时使用
-    bool Back_CountSlice_make_phone(const TransitionType transitionId,const uint16_t priority ) 
+    bool Back_CountSlice_make_phone(const TransitionType transitionId = TransitionType::TRANSITION_INVALID,
+        const uint16_t priority = gSliceDefaultPriority)
     { 
         if(!backStack_.empty())
         {
index aebc7f9..b08e02f 100644 (file)
@@ -25,7 +25,7 @@ public:
     virtual ~PresenterBase() = default;
 
     /**
-     * @deprecated ÍƼöʹÓ÷½·¨OnStart(void* data)
+     * @deprecated 推荐使用方法OnStart(void* data)
      */
     virtual void OnStart() {}
 
index cb173b6..3cf948d 100644 (file)
@@ -25,7 +25,9 @@
 #include "PageTransitionMgr.h"
 #include "gfx_utils/list.h"
 #include "AbilitySlice.h"
+#if 0 // 1201patch 为编译过屏蔽
 #include "settings/model/SettingDesktopModel.h"
+#endif
 #include "NativeAbility.h"
 #include "power_display_service.h"
 
@@ -271,6 +273,7 @@ void Ability::ChangeSlice(uint16_t sliceId, TransitionType type,
 
 void Ability::ChangeSliceToApplist()
 {
+    #if 0 // 1201patch 为编译过屏蔽
     if (SettingDesktopModel::GetInstance().GetDesktopStyle() == HEXAGONS_STYLE) {
         NativeAbility::GetInstance().ChangeSlice(VIEW_APPLIST, TransitionType::TRANSITION_BACK_TO_HEXAGONS);
     } else if (SettingDesktopModel::GetInstance().GetDesktopStyle() == WATERFALL_STYLE) {
@@ -278,10 +281,12 @@ void Ability::ChangeSliceToApplist()
     } else {
         NativeAbility::GetInstance().ChangeSlice(VIEW_APPLIST);
     }
+    #endif
 }
 
 void Ability::EnterAod()
 {
+#if 0 // 1201patch 为编译过屏蔽
 #ifdef JS_ENABLE
     ElementName *elementName = OHOS::AbilityMsClient::GetInstance().GetTopAbility();
     if (elementName != nullptr && strcmp(elementName->bundleName, "com.huawei.launcher") != 0) {
@@ -311,10 +316,12 @@ void Ability::EnterAod()
     StartSlice(VIEW_AOD);
     ResumeSlice();
     PageTransitionMgr::GetInstance().EndTransition(true);
+#endif
 }
 
 void Ability::ExitAod(uint32_t targetId)
 {
+#if 0 // 1201patch 为编译过屏蔽
     TransitionTarget target;
     target.sliceInfo.sliceAndPageId = targetId;
     target.sliceInfo.data = nullptr;
@@ -350,6 +357,7 @@ void Ability::ExitAod(uint32_t targetId)
     }
     ResumeSlice();
     PageTransitionMgr::GetInstance().EndTransition(true);
+#endif
 }
 
 void Ability::PostChangeSlice(uint32_t targetId, TransitionType type, void* data)
index 6eb9e3b..6cc07e3 100644 (file)
@@ -3,8 +3,9 @@
  * Description: BackToCrossShapedTransition\r
  * Create: 2025-04\r
  */\r
-\r
+#if 0 // 1201patch 为编译过屏蔽\r
 #include "applist/AppItemView.h"\r
+#endif\r
 #include "animator/easing_equation.h"\r
 #include "common/screen.h"\r
 #include "components/root_view.h"\r
index 3ccd66e..3b96ee4 100644 (file)
@@ -9,7 +9,9 @@
 #include "TransitionManager.h"
 #include "NativeAbility.h"
 #include "components/root_view.h"
+#if 0 // 1201patch 为编译过屏蔽
 #include "applist/HexagonsDesktopFragment.h"
+#endif
 #include "hal_tick.h"
 #include "wearable_log.h"
 #ifdef JS_ENABLE
@@ -24,6 +26,7 @@ static const float TARGET_SCALE_END = 1.0f;
 
 void BackToHexagonsTransition::OnTransitionStart(UIImageView* current, UIViewGroup* target)
 {
+#if 0 // 1201patch 为编译过屏蔽
     current_ = current;
     target_ = dynamic_cast<UICustomHexagonsList*>(TransitionUtils::GetViewAndTransparentizePath(target, UI_HEXAGONS_LIST));
     if ((target_ == nullptr) || (current_ == nullptr)) {
@@ -72,6 +75,7 @@ void BackToHexagonsTransition::OnTransitionStart(UIImageView* current, UIViewGro
     float yScale = current->GetHeight() * 1.0f / rect.GetHeight();
     tarScaleStart_ = FloatLessEqual(xScale, yScale) ? xScale : yScale;
     curScaleEnd_ = 1.0f / tarScaleStart_;
+#endif
 }
 
 void BackToHexagonsTransition::TransitionAlg(uint32_t time)
index f2167b1..c047df4 100644 (file)
@@ -9,7 +9,7 @@
 #include "TransitionManager.h"
 #include "NativeAbility.h"
 #include "components/root_view.h"
-#include "applist/WaterfallDesktopFragment.h"
+// #include "applist/WaterfallDesktopFragment.h"
 #include "hal_tick.h"
 #include "wearable_log.h"
 #ifdef JS_ENABLE
@@ -24,6 +24,7 @@ static const float TARGET_SCALE_END = 1.0f;
 
 void BackToWaterfallTransition::OnTransitionStart(UIImageView* current, UIViewGroup* target)
 {
+#if 0 // 1201patch 为编译过屏蔽
     current_ = current;
     target_ = dynamic_cast<UIWaterfallList*>(TransitionUtils::GetViewAndTransparentizePath(target, UI_WATERFALL_LIST));
     if ((target_ == nullptr) || (current_ == nullptr)) {
@@ -79,6 +80,7 @@ void BackToWaterfallTransition::OnTransitionStart(UIImageView* current, UIViewGr
     float yScale = current->GetHeight() * 1.0f / rect.GetHeight();
     tarScaleStart_ = FloatLessEqual(xScale, yScale) ? xScale : yScale;
     curScaleEnd_ = 1.0f / tarScaleStart_;
+#endif
 }
 
 void BackToWaterfallTransition::TransitionAlg(uint32_t time)
index 64a7f76..d824432 100644 (file)
@@ -4,7 +4,9 @@
  * Create: 2025-04\r
  */\r
 \r
+#if 0 // 1201patch 为编译过屏蔽\r
 #include "applist/AppItemView.h"\r
+#endif\r
 #include "animator/easing_equation.h"\r
 #include "common/screen.h"\r
 #include "components/root_view.h"\r
diff --git a/code/sdk/application/wearable/n9/nativeabilityfwk/src/transition/ZoomOutTransition.cpp b/code/sdk/application/wearable/n9/nativeabilityfwk/src/transition/ZoomOutTransition.cpp
new file mode 100644 (file)
index 0000000..d4c4c52
--- /dev/null
@@ -0,0 +1,43 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: ZoomOutTransition\r
+ * Create: 2025-04\r
+ */\r
+\r
+#include "animator/easing_equation.h"\r
+#include "common/screen.h"\r
+#include "components/root_view.h"\r
+#include "TransitionManager.h"\r
+#include "wearable_log.h"\r
+#include "ZoomOutTransition.h"\r
+\r
+namespace OHOS {\r
+static constexpr int16_t DURATION = 200;\r
+static constexpr float HALF = 0.5f;\r
+static constexpr float NUM2 = 2.0f;\r
+static constexpr int16_t SCALE_BASE = 1;\r
+REGIST_TRANSITION(TransitionType::TRANSITION_ZOOM_OUT, ZoomOutTransition, DURATION, true, true);\r
+\r
+void ZoomOutTransition::OnTransitionStart(UIImageView* current, UIImageView* target)\r
+{\r
+    if (current == nullptr || target == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_LAUNCHER_FWK, "ZoomOutTransition ImageView is empty!");\r
+        return;\r
+    }\r
+    target_ = target;\r
+    current_ = current;\r
+    RootView::GetInstance()->Remove(target);\r
+    RootView::GetInstance()->Insert(nullptr, target);\r
+    middleWidth_ = Screen::GetInstance().GetWidth() / NUM2;\r
+    middleHeight_ = Screen::GetInstance().GetHeight() / NUM2;\r
+}\r
+\r
+void ZoomOutTransition::TransitionAlg(uint32_t time)\r
+{\r
+    float zoom_scale = EasingEquation::LinearEaseNone(DURATION, 0, time, duration_) / static_cast<float>(DURATION);\r
+    float zoom_in_scale = zoom_scale;\r
+    current_->Scale(Vector2<float>{zoom_in_scale, zoom_in_scale}, Vector2<float>{middleWidth_, middleHeight_});\r
+    float zoom_out_scale = SCALE_BASE + zoom_scale;\r
+    target_->Scale(Vector2<float>{zoom_out_scale, zoom_out_scale}, Vector2<float>{middleWidth_, middleHeight_});\r
+}\r
+} // namespace OHOS\r
diff --git a/code/sdk/application/wearable/n9/nativeabilityfwk/src/transition/ZoomOutTransition.h b/code/sdk/application/wearable/n9/nativeabilityfwk/src/transition/ZoomOutTransition.h
new file mode 100644 (file)
index 0000000..1bbd02a
--- /dev/null
@@ -0,0 +1,26 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: ZoomOutTransition\r
+ * Create: 2025-04\r
+ */\r
+\r
+#ifndef ZOOM_OUT_TRANSITION_H\r
+#define ZOOM_OUT_TRANSITION_H\r
+#include "TransitionCallback.h"\r
+\r
+namespace OHOS {\r
+class ZoomOutTransition : public TransitionCallback {\r
+public:\r
+    ZoomOutTransition(uint32_t time, bool enableCurrentSnapshot, bool enableTargetSnapshot) :\r
+        TransitionCallback(time, enableCurrentSnapshot, enableTargetSnapshot) {}\r
+    ~ZoomOutTransition() override {}\r
+    void OnTransitionStart(UIImageView* current, UIImageView* target) override;\r
+    void TransitionAlg(uint32_t time) override;\r
+private:\r
+    UIImageView* current_ = nullptr;\r
+    UIImageView* target_ = nullptr;\r
+    float middleWidth_;\r
+    float middleHeight_;\r
+};\r
+} // namespace OHOS\r
+#endif // ZOOM_OUT_TRANSITION_H
\ No newline at end of file
index dcec9a0..297c1df 100644 (file)
@@ -69,6 +69,9 @@ set(PRIVATE_HEADER
     ${ROOT_DIR}/open_source/openharmony/foundation/ace/ace_engine_lite/modules/calendarManager
     ${ROOTDIR}/open_source/openharmony/third_party/lwip/lwip_adapter/liteos/src/include/public
 
+
+    ${ROOT_DIR}/open_source/openharmony/third_party/lwip/lwip_v2.1.3/src/include
+    ${ROOT_DIR}/open_source/openharmony/third_party/lwip/lwip_adapter/liteos/src/include
     ${ROOT_DIR}/zhihui/drivers/
     ${ROOT_DIR}/zhihui/UI/CustomUIComponentTool/
     ${ROOT_DIR}/zhihui/UI/producttest/include/
@@ -77,7 +80,6 @@ set(PRIVATE_HEADER
     ${ROOT_DIR}/zhihui/4g/cat1Service/include
     ${ROOT_DIR}/zhihui/4g/cat1Service/Service
     ${ROOT_DIR}/zhihui/ai/include/
-    ${ROOT_DIR}/zhihui/leiniao/imsl_ln
 
 )
 
@@ -101,7 +103,7 @@ if(NOT "CONFIG_NATIVEAPP_TEST" IN_LIST DEFINES)
     file(GLOB FILES_TO_REMOVE_MONKEY "${CMAKE_CURRENT_SOURCE_DIR}/nativeui/monkey/src/*.cpp")
     file(GLOB FILES_TO_REMOVE_EMPTY "${CMAKE_CURRENT_SOURCE_DIR}/nativeui/emptypage/src/*.cpp")
     list(APPEND FILES_TO_REMOVE ${FILES_TO_REMOVE_MONKEY} ${FILES_TO_REMOVE_EMPTY})
-    list(REMOVE_ITEM SOURCES ${FILES_TO_REMOVE})
+    # list(REMOVE_ITEM SOURCES ${FILES_TO_REMOVE})
 endif()
 
 set(SOURCES
index cda6089..d86bf66 100644 (file)
@@ -51,6 +51,13 @@ namespace OHOS
         DIAL_DISPLAY_MODE_MAX,
     } DialDispayMode;
 
+       typedef enum {
+        DIAL_DISPLAY_SUPPORT_NORMAL = 0,
+        DIAL_DISPLAY_SUPPORT_AOD,
+        DIAL_DISPLAY_SUPPORT_NORMAL_AOD,
+        DIAL_DISPLAY_SUPPORT_MAX,
+    } DialDisplayAbility;
+
     /*主界面上下拉界面*/
     typedef enum
     {
diff --git a/code/sdk/application/wearable/n9/nativeapp/nativelauncher/include/ui_stopwatch_resource.h b/code/sdk/application/wearable/n9/nativeapp/nativelauncher/include/ui_stopwatch_resource.h
deleted file mode 100644 (file)
index 56019f1..0000000
+++ /dev/null
@@ -1,25 +0,0 @@
-/*\r
- * Copyright (c) CompanyNameMagicTag 2025-2025. All rights reserved.\r
- * Description: UIStopWatchResource\r
- * Create: 2025-06-05\r
- */\r
-\r
-#ifndef UI_STOPWATCH_RESOURCE_H\r
-#define UI_STOPWATCH_RESOURCE_H\r
-\r
-#include <cstdint>\r
-\r
-namespace OHOS {\r
-static const int IMAGE_STOPWATCH_STOPWATCH01 = 0x100001;\r
-static const int IMAGE_STOPWATCH_STOPWATCH02 = 0x100002;\r
-static const int IMAGE_STOPWATCH_STOPWATCH04 = 0x100003;\r
-static const int IMAGE_STOPWATCH_STOPWATCH06 = 0x100004;\r
-static const int IMAGE_STOPWATCH_STOPWATCH08 = 0x100005;\r
-static const int IMAGE_STOPWATCH_STOPWATCH10 = 0x100006;\r
-static const int IMAGE_STOPWATCH_STOPWATCH12 = 0x100007;\r
-static const int IMAGE_STOPWATCH_STOPWATCH14 = 0x100008;\r
-static const int IMAGE_STOPWATCH_STOPWATCH16 = 0x100009;\r
-static const int IMAGE_STOPWATCH_STOPWATCH19 = 0x10000a;\r
-static const int IMAGE_STOPWATCH_STOPWATCH20 = 0x10000b;\r
-}  // OHOS\r
-#endif  // UI_STOPWATCH_RESOURCE_H\r
index 7f7aeae..546e86f 100644 (file)
@@ -13,6 +13,7 @@ namespace OHOS {
 void UIWatchDialFactory::RegisterWatchDial(const uint16_t ability, const uint16_t id,
     UIWatchDialProxyInterface* uiWatchDial, const DialInfo* dialInfo)
 {
+#if 0 // 1201patch 为编译过屏蔽
     if (ability >= DIAL_DISPLAY_SUPPORT_MAX || uiWatchDial == nullptr) {
         WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Can't register watch dial using invalid ability or proxy %d-%p",
         ability, uiWatchDial);
@@ -38,6 +39,7 @@ void UIWatchDialFactory::RegisterWatchDial(const uint16_t ability, const uint16_
             watchDials_[DIAL_DISPLAY_MODE_AOD].insert({id, uiWatchDial});
         }
     }
+#endif
 }
 
 const DialInfo* UIWatchDialFactory::GetNormalDialInfo(uint16_t id)
@@ -58,6 +60,7 @@ uint8_t UIWatchDialFactory::GetNormalDialInfoNum()
 
 UICardPage* UIWatchDialFactory::CreateNormalDial(uint16_t id)
 {
+#if 0 // 1201patch 为编译过屏蔽
     auto it = watchDials_[DIAL_DISPLAY_MODE_NORMAL].find(id);
     if (it != watchDials_[DIAL_DISPLAY_MODE_NORMAL].end()) {
         return it->second->CreateWatchDialCardPage(id);
@@ -65,6 +68,8 @@ UICardPage* UIWatchDialFactory::CreateNormalDial(uint16_t id)
         WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "normal dial id:%d was not registered", id);
         return nullptr;
     }
+#endif
+    return nullptr;
 }
 
 UIFragment* UIWatchDialFactory::CreateAodDial(uint16_t id)
diff --git a/code/sdk/application/wearable/n9/nativeapp/nativeui/applist/include/DesktopFactory.h b/code/sdk/application/wearable/n9/nativeapp/nativeui/applist/include/DesktopFactory.h
new file mode 100644 (file)
index 0000000..d50a69c
--- /dev/null
@@ -0,0 +1,71 @@
+// /*
+//  * Copyright (c) CompanyNameMagicTag 2025. All rights reserved.
+//  * Description: DesktopFactory
+//  * Author:
+//  * Create: 2025-07
+//  */
+
+// #ifndef DESKTOP_FACTORY_H
+// #define DESKTOP_FACTORY_H
+
+// #include <unordered_map>
+// #include "UIDesktopFragment.h"
+
+// namespace OHOS {
+// class DesktopInterface;
+// class DesktopFactory {
+// public:
+//     static DesktopFactory& GetInstance()
+//     {
+//         static DesktopFactory instance;
+//         return instance;
+//     }
+//     void RegisterDesktopStyle(const uint16_t style, DesktopInterface* desktop);
+//     UIDesktopFragment* CreateDesktopStyle(uint16_t style);
+
+// private:
+//     DesktopFactory() {};
+//     ~DesktopFactory() {};
+//     DesktopFactory(const DesktopFactory&) = delete;
+//     DesktopFactory &operator=(const DesktopFactory&) = delete;
+//     std::unordered_map<uint16_t, DesktopInterface*> desktops_;
+// };
+
+// class DesktopStyleRegister {
+// public:
+//     DesktopStyleRegister(const uint16_t style, DesktopInterface* uiCardPage)
+//     {
+//         DesktopFactory::GetInstance().RegisterDesktopStyle(style, uiCardPage);
+//     }
+// };
+
+// class DesktopInterface {
+// public:
+//     virtual UIDesktopFragment* CreateDesktop() = 0;
+//     DesktopInterface() = default;
+//     virtual ~DesktopInterface() = default;
+//     DesktopInterface(const DesktopInterface&) = delete;
+//     DesktopInterface& operator=(const DesktopInterface&) = delete;
+//     DesktopInterface(DesktopInterface&&) = delete;
+//     DesktopInterface& operator=(DesktopInterface&&) = delete;
+// };
+
+// template <class D>
+// class DesktopProxy : public DesktopInterface {
+// public:
+//     UIDesktopFragment* CreateDesktop() override
+//     {
+//         D* d = new D();
+//         UIDesktopFragment* fragment = dynamic_cast<UIDesktopFragment*>(d);
+//         if (fragment == nullptr) {
+//             delete d;
+//         }
+//         return fragment;
+//     }
+// };
+// } // namespace OHOS
+
+// #define REGIST_DESKTOP_STYLE(style, D) \
+//     const static OHOS::DesktopStyleRegister (STATIC_VAR)(static_cast<uint16_t>(style), new DesktopProxy<D>())
+
+// #endif // DESKTOP_FACTORY_H
\ No newline at end of file
diff --git a/code/sdk/application/wearable/n9/nativeapp/nativeui/applist/include/FootballDesktopFragment.h b/code/sdk/application/wearable/n9/nativeapp/nativeui/applist/include/FootballDesktopFragment.h
new file mode 100644 (file)
index 0000000..a5851cd
--- /dev/null
@@ -0,0 +1,87 @@
+// /*
+//  * Copyright (c) CompanyNameMagicTag 2025-2025. All rights reserved.
+//  * Description: FootballDesktopFragment.h
+//  * Author:
+//  * Create: 2025-07-04
+//  */
+
+// #ifndef FOOTBALL_DESKTOP_FRAGMENT_H
+// #define FOOTBALL_DESKTOP_FRAGMENT_H
+
+// #include "UIDesktopFragment.h"
+// #include "components/ui_icosahedron_view.h"
+
+// namespace OHOS {
+// class FootballAnimatorCallback;
+// class FootballItemView;
+// class FootballDesktopFragment : public UIDesktopFragment {
+// public:
+//     bool OnClick(UIView &view, const ClickEvent &event) override;
+//     void AddAppItemToList(const AppItem &item) override;
+//     void ClearAppItemToList() override;
+//     void RefreshAppList() override;
+
+// protected:
+//     void OnCreateView(void* data) override;
+//     void OnDestroyView() override;
+//     void OnResumeView() override;
+
+// private:
+//     UIIcosahedronView* footballList_ = nullptr;
+//     List<FootballItemView*> footballItemList_;
+//     ImageInfo* footballDefaultImg_ = nullptr;
+//     FootballAnimatorCallback* callback_ = nullptr;
+//     Animator* enterAnimator_ = nullptr;
+// };
+
+// class FootballAnimatorCallback : public AnimatorCallback {
+// public:
+//     explicit FootballAnimatorCallback(UIView* view, int16_t startPos, int16_t endPos)
+//         : startPos_(startPos),
+//           endPos_(endPos),
+//           startTime_(0),
+//           animator_(new Animator(this, view, 1000, false)) {}  // 1000:duration of animator_, in milliseconds.
+
+//     ~FootballAnimatorCallback() override
+//     {
+//         if (animator_ != nullptr) {
+//             delete animator_;
+//             animator_ = nullptr;
+//         }
+//     }
+
+//     void Callback(UIView* view) override;
+
+//     Animator* GetAnimator() const
+//     {
+//         return animator_;
+//     }
+
+//     void SetStartTime(uint32_t time)
+//     {
+//         isStartAnim_ = false;
+//         startTime_ = time;
+//     }
+// protected:
+//     int16_t startPos_;
+//     int16_t endPos_;
+//     uint32_t startTime_;
+//     bool isStartAnim_ = false;
+//     Animator* animator_;
+// };
+
+// class FootballItemView : public UIImageView {
+// public:
+//     explicit FootballItemView() {}
+//     ~FootballItemView() override;
+//     bool SetItemInfo(const AppItem &itemInfo);
+//     AppViewId GetViewId();
+//     const char *GetAppUid();
+// private:
+//     FootballItemView(const FootballItemView &);
+//     FootballItemView &operator = (const FootballItemView &);
+//     AppItem itemInfo_;
+// };
+// }
+
+// #endif // FOOTBALL_DESKTOP_FRAGMENT_H
diff --git a/code/sdk/application/wearable/n9/nativeapp/nativeui/applist/include/HexagonsDesktopFragment.h b/code/sdk/application/wearable/n9/nativeapp/nativeui/applist/include/HexagonsDesktopFragment.h
new file mode 100644 (file)
index 0000000..fb24447
--- /dev/null
@@ -0,0 +1,47 @@
+// /*
+//  * Copyright (c) CompanyNameMagicTag 2025-2025. All rights reserved.
+//  * Description: HexagonsDesktopFragment.h
+//  * Author:
+//  * Create: 2025-07-04
+//  */
+
+// #ifndef HEXAGONS_DESKTOP_FRAGMENT_H
+// #define HEXAGONS_DESKTOP_FRAGMENT_H
+
+// #include "UIDesktopFragment.h"
+// #include "components/ui_custom_hexagons_list.h"
+
+// namespace OHOS {
+// class HexagonsItemView;
+// class HexagonsDesktopFragment : public UIDesktopFragment {
+// public:
+//     bool OnClick(UIView &view, const ClickEvent &event) override;
+//     bool OnRotate(UIView& view, const RotateEvent& event) override;
+//     void AddAppItemToList(const AppItem &item) override;
+//     void ClearAppItemToList() override;
+//     void RefreshAppList() override;
+
+// protected:
+//     void OnCreateView(void* data) override;
+//     void OnDestroyView() override;
+
+// private:
+//     UICustomHexagonsList* hexagonsList_{nullptr};
+//     List<HexagonsItemView*> listHexagonsView_;
+// };
+
+// class HexagonsItemView : public UIImageView {
+// public:
+//     explicit HexagonsItemView() {};
+//     ~HexagonsItemView();
+//     bool SetItemInfo(const AppItem &itemInfo);
+//     AppViewId GetViewId();
+//     const char *GetAppUid();
+// private:
+//     HexagonsItemView(const HexagonsItemView &);
+//     HexagonsItemView &operator = (const HexagonsItemView &);
+//     AppItem itemInfo_;
+// };
+// }
+
+// #endif // HEXAGONS_DESKTOP_FRAGMENT_H
diff --git a/code/sdk/application/wearable/n9/nativeapp/nativeui/applist/include/ListDesktopFragment.h b/code/sdk/application/wearable/n9/nativeapp/nativeui/applist/include/ListDesktopFragment.h
new file mode 100644 (file)
index 0000000..4892e8a
--- /dev/null
@@ -0,0 +1,81 @@
+// /*
+//  * Copyright (c) CompanyNameMagicTag 2025-2025. All rights reserved.
+//  * Description: ListDesktopFragment.h
+//  * Author:
+//  * Create: 2025-07-04
+//  */
+
+// #ifndef LIST_DESKTOP_FRAGMENT_H
+// #define LIST_DESKTOP_FRAGMENT_H
+
+// #include "UIDesktopFragment.h"
+// #include "ApplistAdapter.h"
+// #include "ChangeSliceListener.h"
+// #include "components/ui_list.h"
+// #include "drag_event.h"
+
+// namespace OHOS {
+// class ListDesktopFragment : public UIDesktopFragment {
+// public:
+//     bool OnClick(UIView &view, const ClickEvent &event) override;
+//     void OnItemSelected(int16 index, UIView *view) override;
+//     void AddAppItemToList(const AppItem &item) override;
+//     void ClearAppItemToList() override;
+//     void RefreshAppList() override;
+
+// protected:
+//     void OnCreateView(void* data) override;
+//     void OnDestroyView() override;
+
+// private:
+//     ApplistAdapter *listAdapter_{nullptr};
+//     UIList *contentList_{nullptr};
+//     UIView::OnDragListener *dragListener_{nullptr};
+//     AppItemView *itemViewSele{nullptr};
+//     AppItemView *preItemViewSele{nullptr};
+// };
+
+// class AppListOnDragListener : public UIView::OnDragListener {
+// public:
+//     AppListOnDragListener()
+//     {
+//         continueDrag_ = false;
+//     }
+//     ~AppListOnDragListener() override {}
+//     bool OnDragStart(UIView& view, const DragEvent& event) override
+//     {
+//         UNUSED(view);
+//         UNUSED(event);
+//         WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Applist Ondragstart!!");
+//         continueDrag_ = true;
+//         return false;
+//     }
+
+//     bool OnDrag(UIView& view, const DragEvent& event) override
+//     {
+//         UNUSED(view);
+//         if (!continueDrag_) {
+//             WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "AppList : Can not continue drag!!");
+//             return false;
+//         }
+//         if ((event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT) &&
+//             (event.GetDeltaX() > X_DRAG_OFFSET) && (event.GetDeltaX() > (DOUBLES * MATH_ABS(event.GetDeltaY())))) {
+//             WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Applist Ondrag!!");
+//             NativeAbility::GetInstance().ChangeSlice(VIEW_MAIN_SAMPLE, TransitionType::TRANSITION_ZOOM);
+//         }
+
+//         return false;
+//     }
+
+//     bool OnDragEnd(UIView& view, const DragEvent& event) override
+//     {
+//         UNUSED(view);
+//         UNUSED(event);
+//         return false;
+//     }
+// private:
+//     bool continueDrag_{false};
+// };
+// }
+
+// #endif // LIST_DESKTOP_FRAGMENT_H
diff --git a/code/sdk/application/wearable/n9/nativeapp/nativeui/applist/include/PlanetDesktopFragment.h b/code/sdk/application/wearable/n9/nativeapp/nativeui/applist/include/PlanetDesktopFragment.h
new file mode 100644 (file)
index 0000000..f7c4bd2
--- /dev/null
@@ -0,0 +1,48 @@
+// /*
+//  * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.
+//  * Description: PlanetDesktop
+//  * Created: 2025-07-29
+//  */
+
+// #ifndef PLANET_DESKTOP_FRAGMENT_H
+// #define PLANET_DESKTOP_FRAGMENT_H
+
+// #include "UIDesktopFragment.h"
+// #include "components/ui_custom_planet_list.h"
+
+// namespace OHOS {
+// class PlanetItemView;
+// class PlanetDesktopFragment : public UIDesktopFragment {
+// public:
+//     bool OnClick(UIView &view, const ClickEvent &event) override;
+//     void AddAppItemToList(const AppItem &item) override;
+//     void ClearAppItemToList() override;
+//     void RefreshAppList() override;
+
+// protected:
+//     void OnCreateView(void* data) override;
+//     void OnDestroyView() override;
+
+// private:
+//     UICustomPlanetList* planetList_{nullptr};
+//     List<PlanetItemView*> pltItemList_;
+//     List<UILabel*> pltLabelList_;
+// };
+
+// class PlanetItemView : public UIImageView {
+// public:
+//     explicit PlanetItemView() {}
+//     ~PlanetItemView() {}
+//     void SetItemInfo(const AppItem &itemInfo);
+//     AppViewId GetViewId();
+//     const char *GetAppUid();
+//     const char *GetAppLabel();
+
+// private:
+//     PlanetItemView(const PlanetItemView &) = delete;
+//     PlanetItemView &operator = (const PlanetItemView &) = delete;
+//     AppItem itemInfo_ = { VIEW_INVALID, nullptr, nullptr, nullptr, nullptr };
+// };
+// }
+
+// #endif // PLANET_DESKTOP_FRAGMENT_H
diff --git a/code/sdk/application/wearable/n9/nativeapp/nativeui/applist/include/SphereDesktopFragment.h b/code/sdk/application/wearable/n9/nativeapp/nativeui/applist/include/SphereDesktopFragment.h
new file mode 100644 (file)
index 0000000..cf9c510
--- /dev/null
@@ -0,0 +1,93 @@
+//   /*
+//  * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025. All rights reserved.
+//  * Description: SphereDesktopFragment
+//  * Author: Hisi Graphic Team
+//  * Created: 2025-09
+//  */
+
+// #ifndef SPHERE_DESKTOP_FRAGMENT_H
+// #define SPHERE_DESKTOP_FRAGMENT_H
+
+// #include "UIDesktopFragment.h"
+// #include "components/ui_sphere_view.h"
+// #include "components/ui_transform_group.h"
+
+// namespace OHOS {
+// class SphereAnimatorCallback;
+// class SphereItemView;
+// class SphereDesktopFragment : public UIDesktopFragment {
+// public:
+//     bool OnClick(UIView &view, const ClickEvent &event) override;
+//     bool OnRotate(UIView& view, const RotateEvent& event) override;
+//     void AddAppItemToList(const AppItem &item) override;
+//     void ClearAppItemToList() override;
+//     void RefreshAppList() override;
+
+// protected:
+//     void OnCreateView(void* data) override;
+//     void OnDestroyView() override;
+//     void OnResumeView() override;
+
+// private:
+//     UISphereView* sphereView_{nullptr};
+//     List<SphereItemView*> listSphereView_;
+//     SphereAnimatorCallback* callback_ = nullptr;
+//     Animator* enterAnimator_ = nullptr;
+// };
+
+// class SphereAnimatorCallback : public AnimatorCallback {
+// public:
+//     explicit SphereAnimatorCallback(UIView* view, int16_t width, int16_t height)
+//         : width_(width),
+//           height_(height),
+//           startTime_(0),
+//           passTime_(0),
+//           angle_(0),
+//           animator_(new Animator(this, view, 600, false)) {}  // 600 ms:duration of animator_
+
+//     ~SphereAnimatorCallback() override
+//     {
+//         if (animator_ != nullptr) {
+//             delete animator_;
+//             animator_ = nullptr;
+//         }
+//     }
+
+//     void Callback(UIView* view) override;
+
+//     Animator* GetAnimator() const
+//     {
+//         return animator_;
+//     }
+
+//     void SetStartTime(uint32_t time)
+//     {
+//         isStartAnim_ = false;
+//         startTime_ = time;
+//     }
+// protected:
+//     int16_t width_;
+//     int16_t height_;
+//     uint32_t startTime_;
+//     uint32_t passTime_;
+//     bool isStartAnim_ = false;
+//     int16_t angle_;
+//     Animator* animator_;
+// };
+
+// class SphereItemView : public UITransformGroup {
+// public:
+//     explicit SphereItemView() {};
+//     ~SphereItemView();
+//     bool SetItemInfo(const AppItem &itemInfo);
+//     AppViewId GetViewId();
+//     const char *GetAppUid();
+// private:
+//     SphereItemView(const SphereItemView &);
+//     SphereItemView &operator = (const SphereItemView &);
+//     UIImageView* imageView_{nullptr};
+//     AppItem itemInfo_;
+// };
+// }
+
+// #endif // SPHERE_DESKTOP_FRAGMENT_H
diff --git a/code/sdk/application/wearable/n9/nativeapp/nativeui/applist/include/UIDesktopFragment.h b/code/sdk/application/wearable/n9/nativeapp/nativeui/applist/include/UIDesktopFragment.h
new file mode 100644 (file)
index 0000000..34758a8
--- /dev/null
@@ -0,0 +1,37 @@
+// /*
+//  * Copyright (c) CompanyNameMagicTag 2025-2025. All rights reserved.
+//  * Description: UIDesktopFragment.h
+//  * Author:
+//  * Create: 2025-07-07
+//  */
+
+// #ifndef UI_DESKTOP_FRAGMENT_H
+// #define UI_DESKTOP_FRAGMENT_H
+
+// #include "applist/include/AppItemView.h"
+// #include "components/ui_fragment.h"
+// #include "components/ui_list.h"
+// #include "components/ui_view_group.h"
+// #include "components/ui_scroll_view.h"
+// #include "TransitionType.h"
+// #include "ohos_types.h"
+// #include "wearable_log.h"
+
+// namespace OHOS {
+// class UIDesktopFragment : public UIFragment, public UIView::OnClickListener,
+//                           public ListScrollListener, public UIView::OnRotateListener {
+// public:
+//     virtual void AddAppItemToList(const AppItem &item) = 0;
+//     virtual void ClearAppItemToList() = 0;
+//     virtual void RefreshAppList() = 0;
+//     void SetPosition(int16_t x, int16_t y, int16_t width, int16_t height);
+
+// protected:
+//     uint16_t imgSize_ = 0;
+//     uint16_t imgDistance_ = 0;
+//     void OnCreateView(void* data) override {};
+//     void OnDestroyView() override {};
+//     bool SwitchView(AppViewId viewId, char *uid, TransitionType type, DesktopStyle style);
+// };
+// }
+// #endif // UI_DESKTOP_FRAGMENT_H
\ No newline at end of file
diff --git a/code/sdk/application/wearable/n9/nativeapp/nativeui/applist/include/WaterfallDesktopFragment.h b/code/sdk/application/wearable/n9/nativeapp/nativeui/applist/include/WaterfallDesktopFragment.h
new file mode 100644 (file)
index 0000000..96a73d2
--- /dev/null
@@ -0,0 +1,47 @@
+// /*
+//  * Copyright (c) CompanyNameMagicTag 2025-2025. All rights reserved.
+//  * Description: WaterfallDesktopFragment.h
+//  * Author:
+//  * Create: 2025-07-04
+//  */
+
+// #ifndef WATERFALL_DESKTOP_FRAGMENT_H
+// #define WATERFALL_DESKTOP_FRAGMENT_H
+
+// #include "UIDesktopFragment.h"
+// #include "components/ui_waterfall_list.h"
+
+// namespace OHOS {
+// class WaterfallItemView;
+// class WaterfallDesktopFragment : public UIDesktopFragment {
+// public:
+//     bool OnClick(UIView &view, const ClickEvent &event) override;
+//     void AddAppItemToList(const AppItem &item) override;
+//     void ClearAppItemToList() override;
+//     void RefreshAppList() override;
+
+// protected:
+//     void OnCreateView(void* data) override;
+//     void OnDestroyView() override;
+//     void OnResumeView() override;
+
+// private:
+//     UIWaterfallList* waterfallList_{nullptr};
+//     List<WaterfallItemView*> waterfallItemList_;
+// };
+
+// class WaterfallItemView : public UIImageView {
+// public:
+//     explicit WaterfallItemView() {}
+//     ~WaterfallItemView();
+//     bool SetItemInfo(const AppItem &itemInfo);
+//     AppViewId GetViewId();
+//     const char *GetAppUid();
+// private:
+//     WaterfallItemView(const WaterfallItemView &);
+//     WaterfallItemView &operator = (const WaterfallItemView &);
+//     AppItem itemInfo_;
+// };
+// }
+
+// #endif // WATERFALL_DESKTOP_FRAGMENT_H
diff --git a/code/sdk/application/wearable/n9/nativeapp/nativeui/applist/src/DesktopFactory.cpp b/code/sdk/application/wearable/n9/nativeapp/nativeui/applist/src/DesktopFactory.cpp
new file mode 100644 (file)
index 0000000..fa943b2
--- /dev/null
@@ -0,0 +1,37 @@
+// /*
+//  * Copyright (c) CompanyNameMagicTag 2025. All rights reserved.
+//  * Description: DesktopFactory
+//  * Author:
+//  * Create: 2025-07
+//  */
+
+// #include "applist/include/DesktopFactory.h"
+// #include "wearable_log.h"
+
+// namespace OHOS {
+
+// void DesktopFactory::RegisterDesktopStyle(const uint16_t style, DesktopInterface* desktop)
+// {
+//     if (desktop == nullptr) {
+//         WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Can't register desktop using null proxy");
+//         return;
+//     }
+//     if (desktops_.find(style) != desktops_.end()) {
+//         WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "desktop style %d has already been registered", style);
+//         return;
+//     } else {
+//         desktops_.insert({style, desktop});
+//     }
+// }
+
+// UIDesktopFragment* DesktopFactory::CreateDesktopStyle(uint16_t style)
+// {
+//     auto it = desktops_.find(style);
+//     if (it != desktops_.end()) {
+//         return it->second->CreateDesktop();
+//     } else {
+//         WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Desktop style:%d was not registered", style);
+//         return nullptr;
+//     }
+// }
+// } // namespace OHOS
diff --git a/code/sdk/application/wearable/n9/nativeapp/nativeui/applist/src/FootballDesktopFragment.cpp b/code/sdk/application/wearable/n9/nativeapp/nativeui/applist/src/FootballDesktopFragment.cpp
new file mode 100644 (file)
index 0000000..a57ea87
--- /dev/null
@@ -0,0 +1,174 @@
+// /*
+//  * Copyright (c) CompanyNameMagicTag 2025-2025. All rights reserved.
+//  * Description: FootballDesktopFragment.cpp
+//  * Author:
+//  * Create: 2025-07-04
+//  */
+
+// #include "applist/include/FootballDesktopFragment.h"
+// #include "applist/include/DesktopFactory.h"
+// #include "common/image_cache_manager.h"
+// #include "common/screen.h"
+// #include "hal_tick.h"
+
+// namespace OHOS {
+// REGIST_DESKTOP_STYLE(FOOTBALL_STYLE, FootballDesktopFragment);
+
+// void FootballDesktopFragment::OnCreateView(void* data)
+// {
+//     WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "FootballDesktopFragment::OnCreateView ");
+//     if (footballList_ == nullptr) {
+//         footballList_ = new UIIcosahedronView();
+//     }
+//     footballList_->SetThrowDrag(true);
+//     if (footballDefaultImg_ == nullptr) {
+//         footballDefaultImg_ = ImageCacheManager::GetInstance().LoadSingleRes(PNG_APPLIST_NOTSETUSE_IMG);
+//         if (footballDefaultImg_ == nullptr) {
+//             WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "load res faild");
+//             return;
+//         }
+//     }
+//     if (callback_ == nullptr) {
+//         callback_ = new FootballAnimatorCallback(footballList_, 30, 200); // 30: Initial Size 200: Final display size
+//     }
+//     footballList_->SetDefaultImage(footballDefaultImg_);
+//     footballList_->SetPosition(0, 0, fragmentView_.GetWidth(), fragmentView_.GetHeight());
+//     enterAnimator_ = callback_->GetAnimator();
+//     fragmentView_.Add(footballList_);
+//     if (callback_ != nullptr) {
+//         callback_->SetStartTime(HALTick::GetInstance().GetTime());
+//     }
+// }
+
+// void FootballDesktopFragment::OnDestroyView()
+// {
+//     WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "FootballDesktopFragment::OnDestroyView");
+//     ClearAppItemToList();
+//     if (footballList_ != nullptr) {
+//         delete footballList_;
+//         footballList_ = nullptr;
+//     }
+//     if (footballDefaultImg_ != nullptr) {
+//         ImageCacheManager::GetInstance().UnloadSingleRes(PNG_APPLIST_NOTSETUSE_IMG);
+//         footballDefaultImg_ = nullptr;
+//     }
+//     if (callback_ != nullptr) {
+//         delete callback_;
+//         callback_ = nullptr;
+//     }
+//     enterAnimator_ = nullptr;
+// }
+
+// void FootballDesktopFragment::OnResumeView()
+// {
+//     WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "FootballDesktopFragment::OnResumeView");
+//     if (enterAnimator_ != nullptr) {
+//         enterAnimator_->Start();
+//     }
+// }
+
+// bool FootballDesktopFragment::OnClick(UIView &view, const ClickEvent &event)
+// {
+//     UNUSED(event);
+//     FootballItemView *itemView = dynamic_cast<FootballItemView *>(&view);
+//     AppViewId viewId = itemView->GetViewId();
+//     char *uid = (char *)itemView->GetAppUid();
+
+//     WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "FootballDesktopFragment::OnClick viewid = %d", viewId);
+//     return SwitchView(viewId, uid, TransitionType::TRANSITION_INVALID, FOOTBALL_STYLE);
+// }
+
+// void FootballDesktopFragment::AddAppItemToList(const AppItem &item)
+// {
+//     WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "FootballDesktopFragment::AddAppItemToList");
+//     FootballItemView *itemView = new FootballItemView();
+//     if (!itemView->SetItemInfo(item)) {
+//         delete itemView;
+//         return;
+//     }
+//     itemView->SetTouchable(true);
+//     itemView->SetOnClickListener(this);
+//     footballList_->Add(itemView);
+//     footballItemList_.PushBack(itemView);
+// }
+
+// void FootballDesktopFragment::ClearAppItemToList()
+// {
+//     WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "FootballDesktopFragment::ClearAppItemToList");
+//     if (enterAnimator_ != nullptr) {
+//         enterAnimator_->Stop();
+//     }
+//     if (footballList_ != nullptr) {
+//         footballList_->RemoveAll();
+//     }
+//     ListNode<FootballItemView*>* viewNode = footballItemList_.Head();
+//     while (viewNode != footballItemList_.End()) {
+//         delete(viewNode->data_);
+//         viewNode = viewNode->next_;
+//     }
+//     footballItemList_.Clear();
+// }
+
+// void FootballDesktopFragment::RefreshAppList(void)
+// {
+//     WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "FootballDesktopFragment::RefreshAppList");
+//     footballList_->RefreshIcosahedron();
+// }
+
+// void FootballAnimatorCallback::Callback(UIView *view)
+// {
+//     if (HALTick::GetInstance().GetElapseTime(startTime_) < 300) { // 300, empirical coefficient
+//         return;
+//     }
+//     if (!isStartAnim_) {
+//         animator_->Stop();
+//         animator_->Start();
+//         isStartAnim_ = true;
+//     }
+//     UIIcosahedronView* footView = dynamic_cast<UIIcosahedronView*>(view);
+//     int16_t el = EasingEquation::LinearEaseNone(startPos_, endPos_, animator_->GetRunTime(), animator_->GetTime());
+//     footView->SetSideLength(el);
+//     footView->RefreshIcosahedron();
+//     const Vector3<float> rotateStart(Screen::GetInstance().GetWidth() / 2.0, // 2.0: divisor
+//         Screen::GetInstance().GetHeight() / 2.0, 0); // 2.0: divisor
+//     const Vector3<float> rotateEnd(0, 0, 0);
+//     // 270 : stop angle
+//     int16_t angle = EasingEquation::LinearEaseNone(0, 270, animator_->GetRunTime(), animator_->GetTime());
+//     footView->RotatePlanes(angle, rotateStart, rotateEnd);
+// }
+
+// FootballItemView::~FootballItemView()
+// {
+//     if (itemInfo_.iconHexagon == nullptr && itemInfo_.hexagonPath != nullptr) {
+//         ImageCacheManager::GetInstance().UnloadOneInMultiRes(itemInfo_.hexagonId, itemInfo_.hexagonPath);
+//     }
+// }
+
+// bool FootballItemView::SetItemInfo(const AppItem &itemInfo)
+// {
+//     itemInfo_ = itemInfo;
+//     if (itemInfo.iconHexagon == nullptr && itemInfo.hexagonPath != nullptr) {
+//         ImageInfo* image =
+//             ImageCacheManager::GetInstance().LoadOneInMultiRes(itemInfo.hexagonId, itemInfo.hexagonPath);
+//         if (image == nullptr) {
+//             WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Load App Icon path %s Image %x fail",
+//                 itemInfo.hexagonId, itemInfo.hexagonPath);
+//             return false;
+//         }
+//         SetSrc(image);
+//     } else {
+//         SetSrc(itemInfo.iconHexagon);
+//     }
+//     return true;
+// }
+
+// AppViewId FootballItemView::GetViewId()
+// {
+//     return static_cast<AppViewId>(itemInfo_.id);
+// }
+
+// const char *FootballItemView::GetAppUid()
+// {
+//     return itemInfo_.uid;
+// }
+// }
diff --git a/code/sdk/application/wearable/n9/nativeapp/nativeui/applist/src/HexagonsDesktopFragment.cpp b/code/sdk/application/wearable/n9/nativeapp/nativeui/applist/src/HexagonsDesktopFragment.cpp
new file mode 100644 (file)
index 0000000..516b5b9
--- /dev/null
@@ -0,0 +1,153 @@
+// /*
+//  * Copyright (c) CompanyNameMagicTag 2025-2025. All rights reserved.
+//  * Description: HexagonsDesktopFragment.cpp
+//  * Author:
+//  * Create: 2025-07-04
+//  */
+
+// #include "applist/include/HexagonsDesktopFragment.h"
+// #include "applist/include/DesktopFactory.h"
+// #include "common/image_cache_manager.h"
+// #include "NativeAbility.h"
+
+// namespace OHOS {
+// REGIST_DESKTOP_STYLE(HEXAGONS_STYLE, HexagonsDesktopFragment);
+
+// void HexagonsDesktopFragment::OnCreateView(void* data)
+// {
+//     WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HexagonsDesktopFragment::OnCreateView ");
+//     if (hexagonsList_ == nullptr) {
+//         hexagonsList_ = new UICustomHexagonsList();
+//     }
+//     hexagonsList_->SetPosition(0, 0, fragmentView_.GetWidth(), fragmentView_.GetHeight()); // 2, two
+//     imgDistance_ = hexagonsList_->GetWidth() * 0.25991; // 0.25991, empirical coefficient
+//     imgSize_ = hexagonsList_->GetWidth() * 0.23348; // 0.23348, empirical coefficient
+//     hexagonsList_->SetImageDistance(imgDistance_);
+//     hexagonsList_->SetImageSizeInCenter(imgSize_);
+//     int16_t blankSize = hexagonsList_->GetRelativeRect().GetWidth() > hexagonsList_->GetRelativeRect().GetHeight() ?
+//         hexagonsList_->GetRelativeRect().GetWidth() / 2 : hexagonsList_->GetRelativeRect().GetHeight() / 2; // 2, half
+//     hexagonsList_->SetScrollBlankSize(blankSize);
+//     hexagonsList_->SetReboundSize(blankSize);
+//     hexagonsList_->SetThrowDrag(true);
+//     hexagonsList_->SetOnRotateListener(this);
+//     hexagonsList_->RequestFocus();
+//     fragmentView_.Add(hexagonsList_);
+// }
+
+// void HexagonsDesktopFragment::OnDestroyView()
+// {
+//     WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HexagonsDesktopFragment::OnDestroyView");
+//     ClearAppItemToList();
+//     if (hexagonsList_ != nullptr) {
+//         delete hexagonsList_;
+//         hexagonsList_ = nullptr;
+//     }
+// }
+
+// bool HexagonsDesktopFragment::OnRotate(UIView& view, const RotateEvent& event)
+// {
+//     UICustomHexagonsList* hexagonsView = dynamic_cast<UICustomHexagonsList *>(&view);
+//     if (hexagonsView == nullptr) {
+//         return false;
+//     }
+//     int8_t index = hexagonsView->GetFocusedImgIndex();
+//     uint8_t focusIndex_ = 0;
+//     if (index >= 0) {
+//         focusIndex_ = static_cast<uint8_t>(index);
+//     }
+//     HexagonsItemView *itemView = dynamic_cast<HexagonsItemView *>(hexagonsView->GetViewByIndex(focusIndex_));
+//     AppViewId viewId = itemView->GetViewId();
+//     if (FloatMore(hexagonsView->GetGlobalScale(), 2.0f)) { // 2.0 threshold for beginning transition
+//         hexagonsView->StopRotateAnimator();
+//         NativeAbility::GetInstance().ChangeSlice(viewId, TransitionType::TRANSITION_HEXAGONS);
+//         hexagonsView->ClearFocus();
+//     }
+//     return true;
+// }
+
+// bool HexagonsDesktopFragment::OnClick(UIView &view, const ClickEvent &event)
+// {
+//     UNUSED(event);
+//     HexagonsItemView *itemView = dynamic_cast<HexagonsItemView *>(&view);
+//     UIHexagonsList *hexagonsView = dynamic_cast<UIHexagonsList *>(itemView->GetParent());
+//     if (hexagonsView == nullptr || itemView == nullptr) {
+//         WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "hexagonsView or itemView is nullptr");
+//         return false;
+//     }
+//     AppViewId viewId = itemView->GetViewId();
+//     char *uid = (char *)itemView->GetAppUid();
+//     hexagonsView->SetDraggable(false);
+//     hexagonsView->Scale(1.0f, itemView->GetViewIndex()); // switch focus to click view
+
+//     WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "WaterfallDesktopFragment::OnClick viewid = %d", viewId);
+//     return SwitchView(viewId, uid, TransitionType::TRANSITION_HEXAGONS, HEXAGONS_STYLE);
+// }
+
+// void HexagonsDesktopFragment::AddAppItemToList(const AppItem &item)
+// {
+//     WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "WaterfallDesktopFragment::AddAppItemToList");
+//     HexagonsItemView *itemView = new HexagonsItemView();
+//     if (!itemView->SetItemInfo(item)) {
+//         delete itemView;
+//         return;
+//     }
+//     itemView->SetTouchable(true);
+//     itemView->SetOnClickListener(this);
+//     hexagonsList_->Add(itemView);
+//     listHexagonsView_.PushBack(itemView);
+// }
+
+// void HexagonsDesktopFragment::ClearAppItemToList()
+// {
+//     WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HexagonsDesktopFragment::ClearAppItemToList");
+//     if (hexagonsList_ != nullptr) {
+//         hexagonsList_->RemoveAll();
+//     }
+//     ListNode<HexagonsItemView*>* viewNode = listHexagonsView_.Head();
+//     while (viewNode != listHexagonsView_.End()) {
+//         delete(viewNode->data_);
+//         viewNode = viewNode->next_;
+//     }
+//     listHexagonsView_.Clear();
+// }
+
+// void HexagonsDesktopFragment::RefreshAppList(void)
+// {
+//     WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "WaterfallDesktopFragment::RefreshAppList");
+//     hexagonsList_->LayoutChildren(true);
+// }
+
+// HexagonsItemView::~HexagonsItemView()
+// {
+//     if (itemInfo_.iconSmall == nullptr && itemInfo_.resPath != nullptr) {
+//         ImageCacheManager::GetInstance().UnloadOneInMultiRes(itemInfo_.resId, itemInfo_.resPath);
+//     }
+// }
+
+// bool HexagonsItemView::SetItemInfo(const AppItem &itemInfo)
+// {
+//     itemInfo_ = itemInfo;
+//     if (itemInfo.iconSmall == nullptr && itemInfo.resPath != nullptr) {
+//         ImageInfo* image = ImageCacheManager::GetInstance().LoadOneInMultiRes(itemInfo.resId, itemInfo.resPath);
+//         if (image == nullptr) {
+//             WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Load App Icon path %s Image %x fail",
+//                 itemInfo.resId, itemInfo.resPath);
+//             return false;
+//         }
+//         SetSrc(image);
+//     } else {
+//         SetSrc(itemInfo.iconSmall);
+//     }
+//     return true;
+// }
+
+// AppViewId HexagonsItemView::GetViewId()
+// {
+//     return static_cast<AppViewId>(itemInfo_.id);
+// }
+
+// const char *HexagonsItemView::GetAppUid()
+// {
+//     return itemInfo_.uid;
+// }
+// }
diff --git a/code/sdk/application/wearable/n9/nativeapp/nativeui/applist/src/ListDesktopFragment.cpp b/code/sdk/application/wearable/n9/nativeapp/nativeui/applist/src/ListDesktopFragment.cpp
new file mode 100644 (file)
index 0000000..a7e5420
--- /dev/null
@@ -0,0 +1,138 @@
+// /*
+//  * Copyright (c) CompanyNameMagicTag 2025-2025. All rights reserved.
+//  * Description: ListDesktopFragment.cpp
+//  * Author:
+//  * Create: 2025-07-04
+//  */
+
+// #include "applist/include/ListDesktopFragment.h"
+// #include "applist/include/DesktopFactory.h"
+// #include "applist/include/ApplistModel.h"
+
+// namespace OHOS {
+// REGIST_DESKTOP_STYLE(APPLIST_STYLE, ListDesktopFragment);
+
+// static constexpr int16 NUM_2 = 2;
+// static constexpr int16 MAX_SCROLL_DIS = 1000;
+
+// void ListDesktopFragment::OnCreateView(void* data)
+// {
+//     WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ListDesktopFragment::OnCreateView");
+//     listAdapter_ = new ApplistAdapter();
+//     if (listAdapter_ == nullptr) {
+//         return;
+//     }
+//     listAdapter_->SetItemClickListener(this);
+
+//     contentList_ = new UIList(UIList::VERTICAL);
+//     if (contentList_ == nullptr) {
+//         return;
+//     }
+//     contentList_->SetPosition(0, 0);
+//     contentList_->Resize(HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);
+//     contentList_->SetScrollBlankSize(VERTICAL_RESOLUTION / NUM_2);
+//     contentList_->SetSelectPosition(VERTICAL_RESOLUTION / NUM_2); // middle position
+//     contentList_->SetDraggable(true);
+//     contentList_->SetThrowDrag(true);
+//     contentList_->EnableAutoAlign(true);
+//     contentList_->SetScrollStateListener(this);
+//     contentList_->SetMaxScrollDistance(MAX_SCROLL_DIS);
+//     contentList_->SetYScrollBarVisible(true);
+
+//     dragListener_ = new AppListOnDragListener();
+//     if (dragListener_ == nullptr) {
+//         return;
+//     }
+//     contentList_->SetOnDragListener(dragListener_);
+//     fragmentView_.Add(contentList_);
+// }
+
+
+// void ListDesktopFragment::OnDestroyView()
+// {
+//     WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ListDesktopFragment::OnDestroyView");
+//     int16_t listHeadY = contentList_->GetChildrenHead()->GetY();
+//     int16_t listHeadIndex = contentList_->GetChildrenHead()->GetViewIndex();
+//     ApplistModel *model = &ApplistModel::GetInstance();
+//     model->SetHeadItemY(listHeadY);
+//     model->SetStartIndex(listHeadIndex);
+
+//     ClearAppItemToList();
+
+//     if (listAdapter_ != nullptr) {
+//         delete listAdapter_;
+//         listAdapter_ = nullptr;
+//     }
+//     if (contentList_ != nullptr) {
+//         delete contentList_;
+//         contentList_ = nullptr;
+//     }
+//     if (dragListener_ != nullptr) {
+//         delete dragListener_;
+//         dragListener_ = nullptr;
+//     }
+// }
+
+// bool ListDesktopFragment::OnClick(UIView &view, const ClickEvent &event)
+// {
+//     UNUSED(event);
+//     AppItemView *itemView = dynamic_cast<AppItemView *>(&view);
+//     if (itemView == nullptr) {
+//         WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "itemView is nullptr");
+//         return false;
+//     }
+//     AppViewId viewId = itemView->GetViewId();
+//     char *uid = (char *)itemView->GetAppUid();
+
+//     WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ListDesktopFragment::OnClick viewid = %d", viewId);
+//     return SwitchView(viewId, uid, TransitionType::TRANSITION_INVALID, APPLIST_STYLE);
+// }
+
+// void ListDesktopFragment::OnItemSelected(int16 index, UIView *view)
+// {
+//     UNUSED(index);
+//     if (view != nullptr) {
+//         itemViewSele = static_cast<AppItemView *>(view);
+//         itemViewSele->SelectedChange();
+
+//         if (preItemViewSele != nullptr && preItemViewSele != itemViewSele) {
+//             preItemViewSele->Reset();
+//         }
+//         preItemViewSele = itemViewSele;
+//     }
+// }
+
+// void ListDesktopFragment::AddAppItemToList(const AppItem &item)
+// {
+//     WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ListDesktopFragment::AddAppItemToList");
+//     listAdapter_->AddListItem(item);
+// }
+
+// void ListDesktopFragment::ClearAppItemToList()
+// {
+//     WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ListDesktopFragment::ClearAppItemToList");
+//     listAdapter_->ClearItem();
+// }
+
+// void ListDesktopFragment::RefreshAppList(void)
+// {
+//     WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ListDesktopFragment::RefreshAppList");
+//     uint16_t startIndex = 0;
+//     int16_t headY = 0;
+//     ApplistModel *model = &ApplistModel::GetInstance();
+//     if (model->GetStartIndex() >= model->GetAppListNum()) {
+//         startIndex = model->GetAppListNum() - 1;
+//         headY = VERTICAL_RESOLUTION / NUM_2;
+//     } else {
+//         startIndex = model->GetStartIndex();
+//         headY = model->GetHeadItemY();
+//         if (headY == 0) {
+//             headY = VERTICAL_RESOLUTION / NUM_2;
+//         }
+//     }
+//     contentList_->SetAdapter(listAdapter_);
+//     contentList_->ScrollTo(startIndex);
+//     contentList_->ScrollBy(headY);
+//     contentList_->RefreshList();
+// }
+// }
diff --git a/code/sdk/application/wearable/n9/nativeapp/nativeui/applist/src/PlanetDesktopFragment.cpp b/code/sdk/application/wearable/n9/nativeapp/nativeui/applist/src/PlanetDesktopFragment.cpp
new file mode 100644 (file)
index 0000000..a0afaa5
--- /dev/null
@@ -0,0 +1,134 @@
+// /*
+//  * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.
+//  * Description: PlanetDesktop
+//  * Created: 2025-07-29
+//  */
+
+// #include "applist/include/PlanetDesktopFragment.h"
+// #include "applist/include/DesktopFactory.h"
+// #include "applist/include/ApplistModel.h"
+
+// namespace OHOS {
+// REGIST_DESKTOP_STYLE(PLANET_STYLE, PlanetDesktopFragment);
+
+// static constexpr int16 LABEL_FONT_SIZE = 15;
+
+// void PlanetDesktopFragment::OnCreateView(void* data)
+// {
+//     WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "PlanetDesktopFragment::OnCreateView ");
+//     imgSize_ = 100; // 100, size of item
+//     int16_t imageDistance = 5; // 5, image distance
+//     if (planetList_ == nullptr) {
+//         planetList_ = new UICustomPlanetList(imgSize_, imageDistance);
+//     }
+//     planetList_->SetPosition(0, 0, fragmentView_.GetWidth(), fragmentView_.GetHeight());
+//     planetList_->SetDraggable(true);
+//     planetList_->SetThrowDrag(true);
+//     planetList_->SetItemClickListener(this);
+//     planetList_->RequestFocus();
+//     fragmentView_.Add(planetList_);
+// }
+
+// void PlanetDesktopFragment::OnDestroyView()
+// {
+//     WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "PlanetDesktopFragment::OnDestroyView");
+//     ClearAppItemToList();
+//     if (planetList_ != nullptr) {
+//         delete planetList_;
+//         planetList_ = nullptr;
+//     }
+// }
+
+// bool PlanetDesktopFragment::OnClick(UIView &view, const ClickEvent &event)
+// {
+//     UNUSED(event);
+//     PlanetItemView *itemView = dynamic_cast<PlanetItemView *>(&view);
+//     AppViewId viewId = itemView->GetViewId();
+//     char *uid = (char *)itemView->GetAppUid();
+
+//     WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "PlanetDesktopFragment::OnClick viewid = %d", viewId);
+//     return SwitchView(viewId, uid, TransitionType::TRANSITION_INVALID, PLANET_STYLE);
+// }
+
+// void PlanetDesktopFragment::AddAppItemToList(const AppItem &item)
+// {
+//     WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "PlanetDesktopFragment::AddAppItemToList");
+//     PlanetItemView* itemView = new PlanetItemView();
+//     UILabel* label = new UILabel();
+//     itemView->SetItemInfo(item);
+//     itemView->SetSrc(item.iconSmall);
+//     itemView->SetTouchable(true);
+//     itemView->SetAutoEnable(false);
+//     itemView->SetResizeMode(UIImageView::ImageResizeMode::CONTAIN);
+//     itemView->SetOnClickListener(this);
+//     label->SetText(item.label);
+//     label->SetFont(DEFAULT_VECTOR_FONT_FILENAME, LABEL_FONT_SIZE);
+//     label->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);
+//     label->SetVisible(false);
+//     label->SetHeight(30); // 30, label height
+//     label->SetWidth(100); // 100, label width
+//     planetList_->AddItemVIew(itemView);
+//     planetList_->AddLabel(label);
+//     pltItemList_.PushBack(itemView);
+//     pltLabelList_.PushBack(label);
+// }
+
+// void PlanetDesktopFragment::ClearAppItemToList()
+// {
+//     WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "PlanetDesktopFragment::ClearAppItemToList");
+//     int16_t offsetX = 0;
+//     int16_t offsetY = 0;
+//     ApplistModel *model = &ApplistModel::GetInstance();
+
+//     planetList_->RestoreItemState();
+//     planetList_->GetLastOffset(offsetX, offsetY);
+//     model->SetLastOffset(offsetX, offsetY);
+//     if (planetList_ != nullptr) {
+//         planetList_->RemoveAll();
+//     }
+//     ListNode<PlanetItemView*>* viewNode = pltItemList_.Head();
+//     while (viewNode != pltItemList_.End()) {
+//         delete(viewNode->data_);
+//         viewNode = viewNode->next_;
+//     }
+//     pltItemList_.Clear();
+//     ListNode<UILabel*>* labelNode = pltLabelList_.Head();
+//     while (labelNode != pltLabelList_.End()) {
+//         delete(labelNode->data_);
+//         labelNode = labelNode->next_;
+//     }
+//     pltLabelList_.Clear();
+// }
+
+// void PlanetDesktopFragment::RefreshAppList(void)
+// {
+//     WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "PlanetDesktopFragment::RefreshAppList");
+//     int16_t offsetX = 0;
+//     int16_t offsetY = 0;
+//     ApplistModel *model = &ApplistModel::GetInstance();
+//     model->GetLastOffset(offsetX, offsetY);
+//     planetList_->SetLastOffset(offsetX, offsetY);
+//     planetList_->LayoutChildren(true);
+//     planetList_->AddClickListenerToAppItems();
+// }
+
+// void PlanetItemView::SetItemInfo(const AppItem &itemInfo)
+// {
+//     itemInfo_ = itemInfo;
+// }
+
+// AppViewId PlanetItemView::GetViewId()
+// {
+//     return static_cast<AppViewId>(itemInfo_.id);
+// }
+
+// const char *PlanetItemView::GetAppUid()
+// {
+//     return itemInfo_.uid;
+// }
+
+// const char *PlanetItemView::GetAppLabel()
+// {
+//     return itemInfo_.label;
+// }
+// }
diff --git a/code/sdk/application/wearable/n9/nativeapp/nativeui/applist/src/SphereDesktopFragment.cpp b/code/sdk/application/wearable/n9/nativeapp/nativeui/applist/src/SphereDesktopFragment.cpp
new file mode 100644 (file)
index 0000000..78426cd
--- /dev/null
@@ -0,0 +1,192 @@
+//   /*
+//  * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025. All rights reserved.
+//  * Description: SphereDesktopFragment
+//  * Author: Hisi Graphic Team
+//  * Created: 2025-09
+//  */
+
+// #include <cmath>
+// #include "applist/include/SphereDesktopFragment.h"
+// #include "applist/include/DesktopFactory.h"
+// #include "common/image_cache_manager.h"
+// #include "NativeAbility.h"
+// #include "hal_tick.h"
+
+// namespace OHOS {
+// REGIST_DESKTOP_STYLE(SPHERE_STYLE, SphereDesktopFragment);
+
+// void SphereDesktopFragment::OnCreateView(void* data)
+// {
+//     WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SphereDesktopFragment::OnCreateView ");
+//     if (sphereView_ == nullptr) {
+//         sphereView_ = new UISphereView(1);
+//     }
+//     sphereView_->SetThrowDrag(true);
+
+//     if (callback_ == nullptr) {
+//         callback_ = new SphereAnimatorCallback(sphereView_, fragmentView_.GetWidth(), fragmentView_.GetHeight());
+//     }
+
+//     sphereView_->SetPosition(0, 0, fragmentView_.GetWidth(), fragmentView_.GetHeight());
+//     enterAnimator_ = callback_->GetAnimator();
+//     sphereView_->SetVisible(false);
+//     fragmentView_.Add(sphereView_);
+//     if (callback_ != nullptr) {
+//         callback_->SetStartTime(HALTick::GetInstance().GetTime());
+//     }
+// }
+
+// void SphereDesktopFragment::OnDestroyView()
+// {
+//     WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SphereDesktopFragment::OnDestroyView");
+//     ClearAppItemToList();
+//     if (sphereView_ != nullptr) {
+//         delete sphereView_;
+//         sphereView_ = nullptr;
+//     }
+//     if (callback_ != nullptr) {
+//         delete callback_;
+//         callback_ = nullptr;
+//     }
+//     enterAnimator_ = nullptr;
+// }
+
+// void SphereDesktopFragment::OnResumeView()
+// {
+//     WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SphereDesktopFragment::OnResumeView");
+//     if (enterAnimator_ != nullptr) {
+//         enterAnimator_->Start();
+//     }
+// }
+
+// bool SphereDesktopFragment::OnRotate(UIView& view, const RotateEvent& event)
+// {
+//     UISphereView *sphereView = dynamic_cast<UISphereView *>(&view);
+//     if (sphereView == nullptr) {
+//         return false;
+//     }
+//     sphereView->UpdateItemAngle(event.GetRotate());
+//     return true;
+// }
+
+// bool SphereDesktopFragment::OnClick(UIView &view, const ClickEvent &event)
+// {
+//     UNUSED(event);
+//     SphereItemView *itemView = dynamic_cast<SphereItemView *>(&view);
+//     UISphereView *sphereView = dynamic_cast<UISphereView *>(itemView->GetParent());
+//     if (sphereView == nullptr || itemView == nullptr) {
+//         WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "sphereView or itemView is nullptr");
+//         return false;
+//     }
+//     AppViewId viewId = itemView->GetViewId();
+//     char *uid = (char *)itemView->GetAppUid();
+//     sphereView->SetDraggable(false);
+
+//     WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SphereDesktopFragment::OnClick viewid = %d", viewId);
+//     return SwitchView(viewId, uid, TransitionType::TRANSITION_FADEINOUT, SPHERE_STYLE);
+// }
+
+// void SphereDesktopFragment::AddAppItemToList(const AppItem &item)
+// {
+//     WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SphereDesktopFragment::AddAppItemToList");
+//     SphereItemView *itemView = new SphereItemView();
+//     if (!itemView->SetItemInfo(item)) {
+//         delete itemView;
+//         return;
+//     }
+//     itemView->SetTouchable(true);
+//     itemView->SetOnClickListener(this);
+//     sphereView_->Add(itemView);
+//     listSphereView_.PushBack(itemView);
+//     sphereView_->SetNumberOfRow((listSphereView_.Size() + 2) / 3); // 控制在3排显示
+// }
+
+// void SphereDesktopFragment::ClearAppItemToList()
+// {
+//     WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SphereDesktopFragment::ClearAppItemToList");
+//     if (enterAnimator_ != nullptr) {
+//         enterAnimator_->Stop();
+//     }
+//     if (sphereView_ != nullptr) {
+//         sphereView_->RemoveAll();
+//     }
+//     ListNode<SphereItemView*>* viewNode = listSphereView_.Head();
+//     while (viewNode != listSphereView_.End()) {
+//         delete(viewNode->data_);
+//         viewNode = viewNode->next_;
+//     }
+//     listSphereView_.Clear();
+// }
+
+// void SphereDesktopFragment::RefreshAppList(void)
+// {
+//     WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SphereDesktopFragment::RefreshAppList");
+//     sphereView_->LayoutChildren(true);
+// }
+
+// void SphereAnimatorCallback::Callback(UIView *view)
+// {
+//     if (HALTick::GetInstance().GetElapseTime(startTime_) < 300) { // 300: 动画延迟显示时间,观感效果更好
+//         angle_=0;
+//         return;
+//     }
+//     if (!view->IsVisible()) {
+//         view->SetVisible(true);
+//     }
+//     if (!isStartAnim_) {
+//         animator_->Stop();
+//         animator_->Start();
+//         isStartAnim_ = true;
+//     }
+//     UISphereView* sphereView = dynamic_cast<UISphereView*>(view);
+//     const int16_t precision = 1000;// 1000: 精度
+//     int16_t el = EasingEquation::QuadEaseOut(0, precision, animator_->GetRunTime(), animator_->GetTime()); 
+//     int roateAngle = el * 360 / precision; // 360 : 一共旋转360度
+//     sphereView->UpdateItemAngle(roateAngle - angle_);
+//     angle_ = roateAngle;
+// }
+
+// SphereItemView::~SphereItemView()
+// {
+//     if (imageView_ != nullptr) {
+//         delete imageView_;
+//         imageView_ = nullptr;
+//     }
+//     if (itemInfo_.iconSmall == nullptr && itemInfo_.resPath != nullptr) {
+//         ImageCacheManager::GetInstance().UnloadOneInMultiRes(itemInfo_.resId, itemInfo_.resPath);
+//     }
+// }
+
+// bool SphereItemView::SetItemInfo(const AppItem &itemInfo)
+// {
+//     if (imageView_ == nullptr) {
+//         imageView_ = new UIImageView();
+//     }
+//     itemInfo_ = itemInfo;
+//     if (itemInfo.iconSmall == nullptr && itemInfo.resPath != nullptr) {
+//         ImageInfo* image = ImageCacheManager::GetInstance().LoadOneInMultiRes(itemInfo.resId, itemInfo.resPath);
+//         if (image == nullptr) {
+//             WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Load App Icon path %s Image %x fail",
+//                 itemInfo.resId, itemInfo.resPath);
+//             return false;
+//         }
+//         imageView_->SetSrc(image);
+//     } else {
+//         imageView_->SetSrc(itemInfo.iconSmall);
+//     }
+//     Add(imageView_);
+//     SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);
+//     Resize(imageView_->GetWidth(), imageView_->GetHeight());
+//     return true;
+// }
+
+// AppViewId SphereItemView::GetViewId()
+// {
+//     return static_cast<AppViewId>(itemInfo_.id);
+// }
+
+// const char *SphereItemView::GetAppUid()
+// {
+//     return itemInfo_.uid;
+// }
+// }
diff --git a/code/sdk/application/wearable/n9/nativeapp/nativeui/applist/src/UIDesktopFragment.cpp b/code/sdk/application/wearable/n9/nativeapp/nativeui/applist/src/UIDesktopFragment.cpp
new file mode 100644 (file)
index 0000000..40a5383
--- /dev/null
@@ -0,0 +1,50 @@
+// /*
+//  * Copyright (c) CompanyNameMagicTag 2025-2025. All rights reserved.
+//  * Description: UIDesktopFragment.cpp
+//  * Author:
+//  * Create: 2025-07-07
+//  */
+
+// #include "applist/include/UIDesktopFragment.h"
+// #include "common/image_cache_manager.h"
+// #include "ability_manager.h"
+// #include "NativeAbility.h"
+
+// namespace OHOS {
+// void UIDesktopFragment::SetPosition(int16_t x, int16_t y, int16_t width, int16_t height)
+// {
+//     fragmentView_.SetPosition(x, y, width, height);
+// }
+
+// bool UIDesktopFragment::SwitchView(AppViewId viewId, char *uid, TransitionType type, DesktopStyle style)
+// {
+//     if (viewId < VIEW_MAX_INTER_APP) {
+//         if (viewId == VIEW_SETTING && style == DesktopStyle::APPLIST_STYLE) {
+//             NativeAbility::GetInstance().ChangeSlice(viewId, type, gSliceDefaultPriority, true);
+//         } else {
+//             NativeAbility::GetInstance().ChangeSlice(viewId, type);
+//         }
+//         return true;
+//     } else if (viewId == VIEW_EXTERN_APP) {
+// #ifdef JS_ENABLE
+//         WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "UIDesktopFragment::OnClick bundleName = %s", uid);
+//         Want *want = new Want();
+//         memset_s(want, sizeof(Want), 0, sizeof(Want));
+//         ElementName startElement = {};
+//         startElement.abilityName = (char *)"default";
+//         startElement.bundleName = uid;
+//         startElement.deviceId = nullptr;
+//         SetWantElement(want, startElement);
+//         if (viewId == VIEW_SETTING && style == DesktopStyle::APPLIST_STYLE) {
+//             StartAbilityWithAnimation(want, static_cast<uint8_t>(type), true);
+//         } else {
+//             StartAbilityWithAnimation(want, static_cast<uint8_t>(type), false);
+//         }
+//         ClearWant(want);
+//         delete want;
+//         return true;
+// #endif
+//     }
+//     return false;
+// }
+// }
diff --git a/code/sdk/application/wearable/n9/nativeapp/nativeui/applist/src/WaterfallDesktopFragment.cpp b/code/sdk/application/wearable/n9/nativeapp/nativeui/applist/src/WaterfallDesktopFragment.cpp
new file mode 100644 (file)
index 0000000..6e73e2c
--- /dev/null
@@ -0,0 +1,146 @@
+// /*
+//  * Copyright (c) CompanyNameMagicTag 2025-2025. All rights reserved.
+//  * Description: WaterfallDesktopFragment.cpp
+//  * Author:
+//  * Create: 2025-07-04
+//  */
+
+// #include "applist/include/WaterfallDesktopFragment.h"
+// #include "applist/include/DesktopFactory.h"
+// #include "common/image_cache_manager.h"
+// #include "common/screen.h"
+
+// namespace OHOS {
+// REGIST_DESKTOP_STYLE(WATERFALL_STYLE, WaterfallDesktopFragment);
+
+// void WaterfallDesktopFragment::OnCreateView(void* data)
+// {
+//     WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "WaterfallDesktopFragment::OnCreateView ");
+//     if (waterfallList_ == nullptr) {
+//         waterfallList_ = new UIWaterfallList();
+//     }
+//     waterfallList_->SetPosition(0, 0, fragmentView_.GetWidth(), fragmentView_.GetHeight());
+//     imgDistance_ = waterfallList_->GetWidth() * 0.25991; // 0.25991, empirical coefficient
+//     imgSize_ = waterfallList_->GetWidth() * 0.23348; // 0.23348, empirical coefficient
+//     waterfallList_->SetImageDistance(imgDistance_);
+//     waterfallList_->SetImageSizeInCenter(imgSize_);
+//     int16_t blankSize = waterfallList_->GetRelativeRect().GetWidth() > waterfallList_->GetRelativeRect().GetHeight() ?
+//         waterfallList_->GetRelativeRect().GetWidth() / 2 : waterfallList_->GetRelativeRect().GetHeight() / 2; // 2, half
+//     waterfallList_->SetThrowDrag(true);
+//     uint16_t layoutHeight = static_cast<uint16_t>(imgDistance_ * Sin(60));
+//     waterfallList_->SetReboundSize(layoutHeight); // 60: degree, row's layout height
+//     waterfallList_->SetScrollBlankSize(layoutHeight, UIAbstractScroll::Direction::TOP);
+//     waterfallList_->SetScrollBlankSize(Screen::GetInstance().GetHeight() / 2 - layoutHeight, // 2: half
+//         UIAbstractScroll::Direction::BOTTOM);
+//     waterfallList_->RequestFocus();
+//     waterfallList_->SetRotateFactor(10); // 10, empirical coefficient
+//     waterfallList_->SetOnRotateListener(this);
+//     waterfallList_->SetTouchable(false);
+//     waterfallList_->SetDraggable(false); // ensure that it can't be dragged during animation to avoid error display
+//     fragmentView_.Add(waterfallList_);
+// }
+
+// void WaterfallDesktopFragment::OnDestroyView()
+// {
+//     WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "WaterfallDesktopFragment::OnDestroyView");
+//     ClearAppItemToList();
+//     if (waterfallList_ != nullptr) {
+//         delete waterfallList_;
+//         waterfallList_ = nullptr;
+//     }
+// }
+
+// void WaterfallDesktopFragment::OnResumeView()
+// {
+//     if (waterfallList_ != nullptr) {
+//         waterfallList_->SetTouchable(true);
+//         waterfallList_->SetDraggable(true); // resume touchable after transition animation
+//     }
+// }
+
+// bool WaterfallDesktopFragment::OnClick(UIView &view, const ClickEvent &event)
+// {
+//     UNUSED(event);
+//     WaterfallItemView *itemView = dynamic_cast<WaterfallItemView *>(&view);
+//     UIWaterfallList *waterfallView = dynamic_cast<UIWaterfallList *>(itemView->GetParent());
+//     if (waterfallView == nullptr || itemView == nullptr) {
+//         WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "waterfallView or itemView is nullptr");
+//         return false;
+//     }
+//     AppViewId viewId = itemView->GetViewId();
+//     char *uid = (char *)itemView->GetAppUid();
+//     waterfallView->SetDraggable(false);
+//     waterfallView->Scale(1.0f, itemView->GetViewIndex());
+
+//     WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "WaterfallDesktopFragment::OnClick viewid = %d", viewId);
+//     return SwitchView(viewId, uid, TransitionType::TRANSITION_WATERFALL, APPLIST_STYLE);
+// }
+
+// void WaterfallDesktopFragment::AddAppItemToList(const AppItem &item)
+// {
+//     WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "WaterfallDesktopFragment::AddAppItemToList");
+//     WaterfallItemView *itemView = new WaterfallItemView();
+//     if (!itemView->SetItemInfo(item)) {
+//         delete itemView;
+//         return;
+//     }
+//     itemView->SetTouchable(true);
+//     itemView->SetOnClickListener(this);
+//     waterfallList_->Add(itemView);
+//     waterfallItemList_.PushBack(itemView);
+// }
+
+// void WaterfallDesktopFragment::ClearAppItemToList()
+// {
+//     WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "WaterfallDesktopFragment::ClearAppItemToList");
+//     if (waterfallList_ != nullptr) {
+//         waterfallList_->RemoveAll();
+//     }
+//     ListNode<WaterfallItemView*>* viewNode = waterfallItemList_.Head();
+//     while (viewNode != waterfallItemList_.End()) {
+//         delete(viewNode->data_);
+//         viewNode = viewNode->next_;
+//     }
+//     waterfallItemList_.Clear();
+// }
+
+// void WaterfallDesktopFragment::RefreshAppList(void)
+// {
+//     WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "WaterfallDesktopFragment::RefreshAppList");
+//     waterfallList_->LayoutChildren(true);
+// }
+
+// WaterfallItemView::~WaterfallItemView()
+// {
+//     if (itemInfo_.iconSmall == nullptr && itemInfo_.resPath != nullptr) {
+//         ImageCacheManager::GetInstance().UnloadOneInMultiRes(itemInfo_.resId, itemInfo_.resPath);
+//     }
+// }
+
+// bool WaterfallItemView::SetItemInfo(const AppItem &itemInfo)
+// {
+//     itemInfo_ = itemInfo;
+//     if (itemInfo.iconSmall == nullptr && itemInfo.resPath != nullptr) {
+//         ImageInfo* image = ImageCacheManager::GetInstance().LoadOneInMultiRes(itemInfo.resId, itemInfo.resPath);
+//         if (image == nullptr) {
+//             WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Load App Icon path %s Image %x fail",
+//                 itemInfo.resId, itemInfo.resPath);
+//             return false;
+//         }
+//         SetSrc(image);
+//     } else {
+//         SetSrc(itemInfo.iconSmall);
+//     }
+//     return true;
+// }
+
+// AppViewId WaterfallItemView::GetViewId()
+// {
+//     return static_cast<AppViewId>(itemInfo_.id);
+// }
+
+// const char *WaterfallItemView::GetAppUid()
+// {
+//     return itemInfo_.uid;
+// }
+// }
index 94c990a..3c56330 100644 (file)
@@ -12,6 +12,7 @@
 #include "bts_gatt_stru.h"\r
 #include "bts_gatt_server.h"\r
 #include "bts_le_gap.h"\r
+#include "bts_gatt_client.h"\r
 \r
 #ifdef __cplusplus\r
 extern "C" {\r
@@ -24,7 +25,8 @@ errcode_t wrapper_gatts_register_server(bt_uuid_t *app_uuid, uint8_t *server_id)
 errcode_t wrapper_gatts_add_service(uint8_t server_id, bt_uuid_t *service_uuid, bool is_primary);\r
 void wrapper_gatts_service_start(void);\r
 void wrapper_gatts_clear_service(void);\r
-\r
+errcode_t wrapper_gattc_register_callbacks(gattc_callbacks_t *func);\r
+errcode_t wrapper_gattc_register_client(bt_uuid_t *uuid, uint8_t *clientId);\r
 #ifdef __cplusplus\r
 }\r
 #endif\r
index af22c1a..91af34e 100644 (file)
@@ -9,7 +9,6 @@
 #include "bluetooth/include/BluetoothModelC.h"\r
 #include "bluetooth/include/BluetoothWrapper.h"\r
 #include "bluetooth/include/BluetoothPresenter.h"\r
-#include "connectnewphone/include/ConnectPhonePresenter.h"\r
 #include "player/include/MusicPlayerSourceView.h"\r
 #include "bluetooth/include/BluetoothItemView.h"\r
 #include "player/include/PlayersModel.h"\r
@@ -891,17 +890,6 @@ void BtGapPairStatusChangedCallback(const bd_addr_t *bdAddr, int status)
             set_br_pair(1);\r
         }\r
     }\r
-\r
-   \r
-\r
-    if (status == GAP_PAIR_PAIRED) {\r
-        \r
-        if (ConnectPhonePresenter::GetInstance() != nullptr) {\r
-            NativeAbility::GetInstance().ChangeSlice(VIEW_SETTING);\r
-        }\r
-       \r
-    }\r
-\r
     #endif\r
 }\r
 \r
index 2274cba..f0185f4 100644 (file)
@@ -336,4 +336,23 @@ void wrapper_gatts_clear_service(void)
 }\r
 #ifdef __cplusplus\r
 }\r
+\r
+errcode_t wrapper_gattc_register_callbacks(gattc_callbacks_t *func)\r
+{\r
+    // g_gattc_callback_list.push_back(*func);\r
+    return ERRCODE_SUCC;\r
+}\r
+errcode_t wrapper_gattc_register_client(bt_uuid_t *uuid, uint8_t *clientId)\r
+{\r
+    errcode_t ret = ERRCODE_SUCC;\r
+    // if (gattc_register_flag) {\r
+    //     *clientId = gattc_client_id;\r
+    //     ret = ERRCODE_SUCC;\r
+    // } else {\r
+    //     gattc_register_flag = true;\r
+    //     ret = gattc_register_client(uuid, clientId);\r
+    //     gattc_client_id = *clientId;\r
+    // }\r
+    return ret;\r
+}\r
 #endif\r
diff --git a/code/sdk/application/wearable/n9/nativeapp/nativeui/heartrate/src/HeartModel.cpp b/code/sdk/application/wearable/n9/nativeapp/nativeui/heartrate/src/HeartModel.cpp
new file mode 100644 (file)
index 0000000..60f18f1
--- /dev/null
@@ -0,0 +1,1105 @@
+#include "heartrate/include/HeartModel.h"
+#include "indoorwalk/include/IndoorWalkPreparedView.h"
+#include "indoorwalk/include/IndoorWalkPresenter.h"
+#include "main/include/MainViewSample.h"
+#include "graphic_service.h"
+#include "wearable_log.h"
+
+#include "main/include/dial/DialModelHeartRate.h"
+#include "heartrate/include/HeartChartView.h"
+#include "heartrate/include/HeartDetectionPresenter.h"
+#include "heartrate/include/HeartRateView.h"
+#include "heartrate/include/HeartResultPresenter.h"
+
+#include "ConfigModel.h"
+#include "main/include/dial/DialModelHeartRate.h"
+#include "custom_runtime.h"
+#include "custom_utils.h"
+
+#include "health/health_service/health_service.h"
+#include <cstdint>
+
+#ifdef SUPPORT_PPG_SERVICE
+#include "ppg_hal.h"
+#include "ppg_service.h"
+#endif
+
+#include "settings/include/SettingModel.h"
+#include "uiservice/include/ui_service.h"
+#include "wearable_log.h"
+#include <algorithm>
+
+#include "clock/include/MainClockView.h"
+
+#ifdef SUPPORT_BLE_SERVICE
+#include "bleEvent.h"
+#include "bleInstruct.h"
+#include "bleService.h"
+#endif
+
+#include <cmsis_os.h>
+#include <cmsis_os2.h>
+#include <custom_utils.h>
+#include <iostream>
+#include <memory>
+#include <ohos_types.h>
+#include <random>
+#include <service/graphic_service.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/stat.h>
+#include <unistd.h>
+
+#ifdef SUPPORT_BATTERY_SERVICE
+#include "battery_hal.h"
+#endif
+
+#include "languagecode/LanguageInit.h"
+#include "uiservice/include/ui_service.h"
+
+#include <custom_save_runtime.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define MAX_UNWEAR_COUNT 2
+#define MAX_VALID_HRS_COUNT 10    //最大有效数
+#define MAX_DISVALID_HRS_COUNT 15 //最大无效数
+#define MIN_DISPLAY_HEART 50      //最新心率
+#define DISPLAY_COUNT 0
+#define HEARTTEST 1 //[0 开启测试 1 关闭]
+#define KEEP_SCREEN_ON_HEART 1
+#define HEART_TIMER_DATA 1
+
+/*佩戴检测结果*/
+enum {
+  SENSOR_WEAR_ON = 0,
+  SENSOR_WEAR_OFF,
+  SENSOR_WEAR_UNKNOW,
+  SENSOR_WEAR_MAX
+};
+
+using namespace OHOS;
+#define LEN 32
+
+static void Notify(void *args, const Topic topic, Request *request);
+
+Subscriber heartSubscirber = {
+    .identity = nullptr,
+    .args = nullptr,
+    .Notify = Notify,
+};
+static void ProcessHeartRateUpdate(Request *request);
+static void RefreshHeartData();
+void save_heart_maxmin();
+void HeartDataSubscribeTopic(Topic topic) {
+  BroadcastApi *broadcastApi = nullptr;
+  IUnknown *api = SAMGR_GetInstance()->GetFeatureApi(BROADCAST_SERVICE_NAME,
+                                                     BROADCAST_FEATURE_NAME);
+  if (api == nullptr) {
+    return;
+  }
+  int result =
+      api->QueryInterface(api, DEFAULT_VERSION, (void **)&broadcastApi);
+  if (result != 0 || broadcastApi == nullptr) {
+    return;
+  }
+  int ret = broadcastApi->SubscribeTopic((IUnknown *)broadcastApi, topic,
+                                         &heartSubscirber);
+  WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HeartSubscribeTopic ret=%d,topic=%u",
+                ret, topic);
+  broadcastApi->Release((IUnknown *)broadcastApi);
+}
+
+void HearDatatUnsubscribeTopic(Topic topic) {
+  BroadcastApi *broadcastApi = nullptr;
+  IUnknown *api = SAMGR_GetInstance()->GetFeatureApi(BROADCAST_SERVICE_NAME,
+                                                     BROADCAST_FEATURE_NAME);
+  if (api == nullptr) {
+    return;
+  }
+  int result =
+      api->QueryInterface(api, DEFAULT_VERSION, (void **)&broadcastApi);
+  if (result != 0 || broadcastApi == nullptr) {
+    return;
+  }
+  broadcastApi->UnsubscribeTopic((IUnknown *)broadcastApi, topic,
+                                 &heartSubscirber);
+  broadcastApi->Release((IUnknown *)broadcastApi);
+}
+
+static void Notify(void *args, const Topic topic, Request *request) {
+  UNUSED(args);
+  UNUSED(topic);
+
+  // 训练过程中不需要判断数据准确性,不需要存储心率数据
+  if (uapi_dev_runtime_get_train_status() == 1 ||
+      uapi_dev_runtime_get_respiratory_training_status() || request == NULL) {
+    return;
+  }
+  if (request->msgId == TOPIC_EVENT_HEARTRATE_UPDATA) {
+    GraphicService::GetInstance()->PostGraphicEvent(std::bind(
+        &HeartModel::RefreshHeartRateScreen, HeartModel::GetInstance()));
+  }
+}
+
+static void ProcessHeartRateUpdate(Request *request) {
+  uint16_t preheart = *reinterpret_cast<uint16_t *>(request->data);
+
+  // 直接处理心率数据,不进行筛选
+  uint16_t index_ = HeartModel::GetInstance()->GetIndex();
+  HeartDatas *heartInfo = (HeartDatas *)malloc(sizeof(HeartDatas));
+  if (heartInfo == NULL) {
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[Notify] malloc fail");
+    return;
+  }
+
+  heartInfo->index = index_;
+  heartInfo->maxX = index_;
+  heartInfo->minX = index_;
+  heartInfo->perSec = preheart;
+  heartInfo->rest = preheart;
+  /*最大最小值不为0*/
+  heartInfo->maxValue = preheart;
+  heartInfo->minValue = preheart;
+  WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "heartRateData=%d%d", heartInfo->index,
+                preheart);
+  OHOS::HeartModel::GetInstance()->HeartRatePros(heartInfo);
+
+  free(heartInfo); // 释放内存
+  heartInfo = nullptr;
+}
+
+static void RefreshHeartData() {
+  OHOS::HeartModel::GetInstance()->ClearHeartData();
+  GraphicService::GetInstance()->PostGraphicEvent(std::bind(
+      &OHOS::HeartModel::Heart_Update_View, OHOS::HeartModel::GetInstance()));
+}
+
+#ifdef __cplusplus
+}
+#endif
+
+namespace OHOS {
+void HeartModel::ClearHeartData(void) {
+  pretime = 0;
+  entryTimes = 0;
+  aveCount = 0;
+  preMaxValue = 0;
+  preMaxX = NUM_1;
+  preMinValue = HEART_RATE_LIMIT_UPPER;
+  preMinX = NUM_1;
+  countMax = 0;
+  countMin = 0;
+  healthDatas.heartRateMax.x = (uint16_t)0XFFFF;
+  healthDatas.heartRateMax.y = 0;
+  healthDatas.heartRateMin.x = (uint16_t)0XFFFF;
+  healthDatas.heartRateMin.y = (uint16_t)0XFFFF;
+  for (int i = 0; i < HEART_AVE_NUM; i++) {
+    healthDatas.heartRateAvg[i].x = (uint16_t)0XFFFF;
+    healthDatas.heartRateAvg[i].y = (uint16_t)0XFFFF;
+  }
+  if (HeartRateView::GetInstance() != nullptr) {
+    HeartRateView::GetInstance()->ClearElectrocardiogram();
+  }
+  SetAveHeartRateCount(0);
+  // GraphicService::GetInstance()->PostGraphicEvent(
+  //     std::bind(&HeartModel::RefreshHeartRateScreen,
+  //     HeartModel::GetInstance(),
+  //               healthDatas.heartRatePerSec, healthDatas.heartRateRest,
+  //               healthDatas.heartRateMax.y, healthDatas.heartRateMin.y));
+}
+
+HeartModel::HeartModel() {
+  /*初始化读取文件*/
+  WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartModel::HeartModel()");
+  /*初始化历史文件*/
+  HealthService::GetInstance()->LoadDailyHeartRate();
+  /*读取上一次心率数据*/
+  HeartRateData data;
+  HealthService::GetInstance()->ReadHeartRateData(data);
+  currentheart = data.Heart;
+  timestamp_ms = data.timestamp;
+  WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "currentheart %d timestamp_ms %d",
+                currentheart, timestamp_ms);
+  // 更新表盘心率数据
+  DialModelHeartRate::GetInstance()->UpdateHeartRate(currentheart);
+
+  //读取最大最小值
+  HealthService::GetInstance()->LoadHeartMaxMin(displayheart_max,
+                                                displayheart_min);
+  // 配置动态数组
+  SetArrayData();
+}
+
+HeartModel::~HeartModel() {
+  WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HeartModel::~HeartModel()");
+  HearDatatUnsubscribeTopic(TOPIC_EVENT_HEARTRATE_UPDATA);
+  HearDatatUnsubscribeTopic(TOPIC_EVENT_NEXTDAY_UPDATE);
+  HearDatatUnsubscribeTopic(TOPIC_EVENT_UTCTIME_UPDATE);
+  HearDatatUnsubscribeTopic(TOPIC_EVENT_WEARSTATE_UPDATE);
+}
+
+HeartModel *HeartModel::GetInstance(void) {
+  static HeartModel heartModel;
+  return &heartModel;
+}
+uint16_t HeartModel::GetIndex() { return index_; }
+void HeartModel::SetIndex(uint16_t index) { index_ = index; }
+
+void HeartModel::Init(void) {
+  HeartDataSubscribeTopic(TOPIC_EVENT_HEARTRATE_UPDATA);
+  HeartDataSubscribeTopic(TOPIC_EVENT_NEXTDAY_UPDATE);
+  HeartDataSubscribeTopic(TOPIC_EVENT_UTCTIME_UPDATE);
+  HeartDataSubscribeTopic(TOPIC_EVENT_WEARSTATE_UPDATE);
+}
+
+Point *HeartModel::GetAveHeartRate(void) { return healthDatas.heartRateAvg; }
+
+void HeartModel::HandleMaxHeart(uint16 coord, uint16 value) {
+  healthDatas.heartRateMax.x = coord;
+  healthDatas.heartRateMax.y = value;
+  // 插入最大心率 countMax 数据个数
+  if (preMaxValue != healthDatas.heartRateMax.y && aveCount < HEART_AVE_NUM) {
+    if (preMaxX == healthDatas.heartRateMax.x && countMax < HEART_AVE_NUM) {
+      healthDatas.heartRateAvg[countMax].y = healthDatas.heartRateMax.y;
+    } else if (aveCount > NUM_2 && (healthDatas.heartRateMax.x ==
+                                    healthDatas.heartRateAvg[aveCount - 1].x)) {
+      healthDatas.heartRateAvg[aveCount - 1].y = healthDatas.heartRateMax.y;
+    } else {
+      healthDatas.heartRateAvg[aveCount] = healthDatas.heartRateMax;
+      countMax = aveCount;
+      aveCount++;
+    }
+    if (healthDatas.heartRateMax.x != 0) {
+      if (healthDatas.heartRateAvg[0].x == 0 &&
+          healthDatas.heartRateAvg[1].x == 0) {
+        for (int i = 1; i < (aveCount - 1); i++) {
+          healthDatas.heartRateAvg[i] = healthDatas.heartRateAvg[i + 1];
+        }
+        aveCount--;
+        countMax--;
+      }
+    }
+  }
+  preMaxValue = healthDatas.heartRateMax.y;
+  preMaxX = healthDatas.heartRateMax.x;
+}
+
+void HeartModel::HandleMinHeart(uint16 coord, uint16 value) {
+  // 最小心率
+  healthDatas.heartRateMin.x = coord;
+  healthDatas.heartRateMin.y = value;
+  // 插入最小心率
+  // avecount 当下有效数据个数,在MaxHeart中也用到,看起来似乎有问题???
+  // preMinValue 上一个心率最小值
+  // preMinX 上一个最小值对应的坐标
+  // 当上一个值与当前值不等,且没有超过总数限制,则进行数据处理
+  if (preMinValue != healthDatas.heartRateMin.y && aveCount < HEART_AVE_NUM) {
+
+    if (preMinX == healthDatas.heartRateMin.x && countMin < HEART_AVE_NUM) {
+      // 上一个最小坐标和当前值一致,且数据没超过限制,则直接赋值给有效数据
+      // countMin 即可
+      healthDatas.heartRateAvg[countMin].y = healthDatas.heartRateMin.y;
+    } else if (aveCount > NUM_2 && (healthDatas.heartRateMin.x ==
+                                    healthDatas.heartRateAvg[aveCount - 1].x)) {
+      // 有效数据大于2,且当前x值与原始数据最后一个x一致,最后一个数据赋值
+      healthDatas.heartRateAvg[aveCount - 1].y = healthDatas.heartRateMin.y;
+    } else {
+      healthDatas.heartRateAvg[aveCount] = healthDatas.heartRateMin;
+      countMin = aveCount;
+      aveCount++;
+    }
+
+    // 最初的值一直是0 ,则只显示1个 ,不会在后面增加数据。
+    if (healthDatas.heartRateMin.x != 0) {
+      if (healthDatas.heartRateAvg[0].x == 0 &&
+          healthDatas.heartRateAvg[1].x == 0) {
+        for (int i = 0; i < (aveCount - 1); i++) {
+          healthDatas.heartRateAvg[i] = healthDatas.heartRateAvg[i + 1];
+        }
+        aveCount--;
+        countMin--;
+      }
+    }
+  }
+  preMinValue = healthDatas.heartRateMin.y;
+  preMinX = healthDatas.heartRateMin.x;
+}
+
+void HeartModel::HeartRatePros(HeartDatas *heartInfo) {
+  uint16_t perSecHeartRate = 0;
+  uint16_t restHeartRate = 0;
+
+  // 每秒心率
+  perSecHeartRate = heartInfo->perSec;
+  if (perSecHeartRate >= HEART_RATE_LIMIT_LOWER &&
+      perSecHeartRate <= HEART_RATE_LIMIT_UPPER) {
+    healthDatas.heartRatePerSec = perSecHeartRate;
+  }
+
+  // GraphicService::GetInstance()->PostGraphicEvent(
+  //     std::bind(&HeartModel::RefreshHeartRateScreen,
+  //     HeartModel::GetInstance(),
+  //               healthDatas.heartRatePerSec, healthDatas.heartRateRest,
+  //               healthDatas.heartRateMax.y, healthDatas.heartRateMin.y));
+}
+
+uint16_t HeartModel::GetAveHeartRateCount(void) { return aveCount; }
+
+uint16_t HeartModel::GetHeartRateMax(void) {
+  return healthDatas.heartRateMax.y;
+}
+
+uint16_t HeartModel::GetHeartRateMin(void) {
+  return healthDatas.heartRateMin.y;
+}
+
+void HeartModel::SetHeartRatePerSec(uint32 sec) {
+  healthDatas.heartRatePerSec = sec;
+  if (HeartRateView::GetInstance() == nullptr) {
+    return;
+  }
+  HeartRateView::GetInstance()->RefreshHeartRatePerSec(
+      healthDatas.heartRatePerSec);
+}
+
+void HeartModel::SetAveHeartRateCount(uint16_t value) { aveCount = value; }
+
+void HeartModel::RefreshHeartRateScreen() {
+  if (MainViewSample::GetInstance() != nullptr &&
+      HeartChartView::GetInstance() != nullptr) {
+    if (MainViewSample::GetInstance()->GetHorCurrentCard() == HEART_RATE) {
+      WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,
+                    "HeartChartView::GetInstance() start");
+      HeartChartView::GetInstance()->UpdateShowHeart();
+      WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,
+                    "HeartChartView::GetInstance() end");
+    }
+  }
+}
+/*----------------------------------状态检测
+ *----------------------------------*/
+
+// 重新初始化
+void HeartModel::ClearDisplayData() {
+  /*显示的心率数据清空*/
+  // currentheart = 0;
+  // timestamp_ms = 0;
+  displayheart = 0;
+  displayheart_max = 0; // 显示最大心率
+  displayheart_min = 0; // 显示最小心率
+}
+// 获取心率数据
+uint16_t HeartModel::GetHeartdata() { return currentheart; }
+
+uint16_t HeartModel::GetShowHeartdata() { return displayheart; }
+uint16_t HeartModel::GetShowMaxHeartdata() { return displayheart_max; }
+uint16_t HeartModel::GetShowMinHeartdata() { return displayheart_min; }
+uint32_t HeartModel::GetCheckTime() { return timestamp_ms; }
+
+void HeartModel::SetCheckTime(uint32_t time) { timestamp_ms = time; }
+void HeartModel::SetResult(HeartResult result) { heartresult_ = result; }
+HeartResult HeartModel::GetResult() { return heartresult_; }
+// 控制心率检测
+void HeartModel::Heart_Control(HeartState state, HeartCheck check) {
+
+  //优先级低不对高优先级处理
+  if (check < checkstate) {
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,
+                  "Higher execution instruction exists");
+    return;
+  }
+
+  //被动
+  if (check == HeartCheck::PASSIVITY) {
+    uapi_dev_runtime_set_hrs_passivity(1);
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,
+                  "uapi_dev_runtime_set_hrs_passivity(1)");
+  } else {
+    uapi_dev_runtime_set_hrs_passivity(0);
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,
+                  "uapi_dev_runtime_set_hrs_passivity(0)");
+  }
+
+  if (state == HeartState::End && heartstate == true) {
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartState End");
+    //状态数全部清空
+    valid_counter_ = 0;
+    disvalid_counter_ = 0;
+    unwear_counter_ = 0;
+    display_counter_ = 0;
+    displayheart = 0;
+#ifdef SUPPORT_PPG_SERVICE
+    ppg_hr_stop();
+#endif
+    heartstate = false;
+    if (checkstate == HeartCheck::CARDCHECK) {
+      //重置传感器状态
+      sensorstate = false;
+      uapi_dev_runtime_set_heartrate_detect_status(0);
+    }
+#ifdef SYSTEM_LOG_SERVICE
+    //记录日志
+    if (checkstate == HeartCheck::PASSIVITY) {
+      uapi_save_runtime_log(RUNTIME_LOG_OXYGEN_PASSIVE_MEASURE_END);
+    } else {
+      uapi_save_runtime_log(RUNTIME_LOG_HEART_MEASURE_END);
+    }
+#endif
+
+    // 复原检测状态
+    checkstate = HeartCheck::RESTSTSTE;
+    heart_stop_data_timer(); //关闭数据获取
+  } else if (state == HeartState::Start && heartstate == false) {
+    /*充电状态下不进行检测*/
+    bool isCharging = false;
+    #ifdef SUPPORT_BATTERY_SERVICE
+    isCharging = get_charge_stat(); // 获取充电状态
+    #endif
+    if (isCharging) {
+      WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "充电不能检测");
+      return;
+    }
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartState Start");
+#ifdef SUPPORT_PPG_SERVICE
+    ppg_hr_start();
+#endif
+    heartstate = true;
+    checkstate = check;
+#ifdef SYSTEM_LOG_SERVICE
+    //记录日志
+    if (checkstate == HeartCheck::PASSIVITY) {
+      uapi_save_runtime_log(RUNTIME_LOG_HEART_PASSIVE_MEASURE);
+    } else {
+      uapi_save_runtime_log(RUNTIME_LOG_HEART_MEASURE);
+    }
+#endif
+    heart_data_timer(); // 开始检测
+  }
+}
+// 开始检测
+void HeartModel::Heart_Start(HeartCheck check) {
+  if (!sensorstate) {
+    displayheart = 0;
+    SetResult(HeartResult::NOT_TESTED); // 重置检测
+    Heart_Control(HeartState::Start, check);
+    // ScreenTurnOn(60 * 1000); // 亮屏操作 600000ms 60秒关闭
+    sensorstate = true;
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "开始心率检测");
+    // 设置runtime
+    if (uapi_dev_runtime_get_heartrate_detect_status() == 0) {
+      uapi_dev_runtime_set_heartrate_detect_status(1);
+      ScreenAlwaysOnCtr(OPEN_SCREEN_ALWAYS_ON);
+      // 主动检测的亮屏60s
+      heart_start_screen60s_timer();
+    }
+  }
+}
+
+// 结束检测
+void HeartModel::Heart_Stop() {
+  valid_counter_ = 0;
+  disvalid_counter_ = 0;
+  unwear_counter_ = 0;
+
+  /*主界面卡片检测 或者 被动检测*/
+  if (checkstate == HeartCheck::PASSIVITY) {
+    if (heartresult_ == HeartResult::SUCCESS) {
+      Heart_Save();
+      /*更新曲线*/
+      GraphicService::GetInstance()->PostGraphicEvent(
+          std::bind(&HeartModel::Heart_Update_View, HeartModel::GetInstance()));
+    }
+    /*关闭被动检测*/
+    Heart_Control(HeartState::End, HeartCheck::PASSIVITY);
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "结束周期心率检测");
+    return;
+  }
+  //呼吸训练模式下不进行息屏与保存
+  if (sensorstate && uapi_dev_runtime_get_respiratory_training_status() != 1) {
+    // 恢复正常亮屏
+    HeartModel::GetInstance()->heart_stop_screen60s_timer();
+    // 取消常亮屏
+    ScreenAlwaysOnCtr(CANCEL_SCREEN_ALWAYS_ON);
+    //设置runtime
+
+    Heart_Result(); // 处理结果
+
+    //为了防止主界面卡片一直重复开传感器
+    if (checkstate != HeartCheck::CARDCHECK) {
+      //重置传感器状态
+      sensorstate = false;
+      uapi_dev_runtime_set_heartrate_detect_status(0);
+    }
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "本次心率检测结束");
+  }
+}
+// 保存检测数据
+void HeartModel::Heart_Save() {
+
+  uint32_t timestamp = HeartResultPresenter::GetInstance()->GetCurrentTime();
+  SetCheckTime(timestamp);
+
+  HealthService::GetInstance()->send_heart_save();
+
+  // 更新最大和最小心率
+  displayheart_max =
+      (displayheart_max < currentheart ? currentheart : displayheart_max);
+
+  // 确保最小心率的第一次赋值大于50
+  if (displayheart_min == 0 && currentheart > MIN_DISPLAY_HEART) {
+    displayheart_min = currentheart; // 初始化最小心率
+  } else {
+    displayheart_min =
+        (displayheart_min > currentheart && currentheart > MIN_DISPLAY_HEART)
+            ? currentheart
+            : displayheart_min;
+  }
+
+  // 将更新曲线写到这里提前更新
+  HealthService::GetInstance()->UpdateHourlyHeartRate(timestamp_ms,
+                                                      currentheart);
+  // WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "保存的心率数据:%d%ld",
+  // currentheart,data.timestamp);
+}
+
+void HeartModel::Heart_Result() {
+
+  if (heartresult_ == HeartResult::SUCCESS) {
+    // 获取心率提醒状态和阈值
+    heartRemindState = ConfigModel::GetInstance()->get_configData_int(
+        ConfigModel::CONFIGMODEL_ITEM_HEARTRATE_REMIND);
+    thresholdValue = ConfigModel::GetInstance()->get_configData_int(
+        ConfigModel::CONFIGMODEL_ITEM_HEARTRATE_THRESHOLD_VALUE);
+
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "心率提醒状态:%d,阈值:%d,當前值:%d",
+                  heartRemindState, thresholdValue, currentheart);
+
+    if (heartRemindState) {
+      // 获取当前心率状态
+      thresholdState = ConfigModel::GetInstance()->get_configData_int(
+          ConfigModel::CONFIGMODEL_ITEM_HEARTRATE_MAX_MIN);
+
+      if (currentheart != 0) {
+        if (thresholdState == 0 && currentheart < thresholdValue) {
+          // 当前心率低于阈值
+          heartresult_ = HeartResult::LOW_RESULT;
+          WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,
+                        "检测结果:低结果情况,currentheart=%d,ThresholdValue=%d",
+                        currentheart, thresholdValue);
+        } else if (thresholdState == 1 && currentheart > thresholdValue) {
+          // 当前心率高于阈值
+          heartresult_ = HeartResult::HIGH_RESULT;
+          WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,
+                        "检测结果:高结果情况,currentheart=%d,ThresholdValue=%d",
+                        currentheart, thresholdValue);
+        }
+      }
+    }
+  }
+  // 根据结果进行处理
+  handleHeartResult();
+}
+// 处理检测结果
+void HeartModel::handleHeartResult() {
+  switch (heartresult_) {
+  case HeartResult::SUCCESS:
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "检测结果:成功");
+    Heart_Save();
+    // 更新曲线
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "准备更新UI");
+    GraphicService::GetInstance()->PostGraphicEvent(
+        std::bind(&HeartModel::Heart_Update_View, HeartModel::GetInstance()));
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "更新UI完成");
+    break;
+
+  case HeartResult::NOT_WORN:
+  case HeartResult::TIMEOUT:
+  case HeartResult::INVALID_DATA:
+    logAndChangeSlice(heartresult_);
+    break;
+
+  case HeartResult::LOW_RESULT:
+    Heart_Save();
+    handleLowHeartRate();
+    break;
+
+  case HeartResult::HIGH_RESULT:
+    Heart_Save();
+    handleHighHeartRate();
+    break;
+
+  default:
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "检测结果:未知状态");
+    break;
+  }
+}
+//进行日志打印与界面切换
+void HeartModel::logAndChangeSlice(HeartResult result) {
+  const char *resultMsg = (result == HeartResult::NOT_WORN)  ? "未佩戴状态"
+                          : (result == HeartResult::TIMEOUT) ? "超时"
+                                                             : "无效数据";
+  WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "检测结果:%s情况", resultMsg);
+  uapi_set_screen_on_api(); // 亮屏
+  //需要先判断界面 心率卡片界面
+  if (MainViewSample::GetInstance()) {
+    if (MainViewSample::GetInstance()->GetHorCurrentCard() == HEART_RATE)
+      NativeAbility::GetInstance().ChangeSlice(VIEW_CHECK_ABNORMAL);
+  } else
+    NativeAbility::GetInstance().ChangeSlice(VIEW_CHECK_ABNORMAL);
+}
+// 处理低心率情况
+void HeartModel::handleLowHeartRate() {
+  WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "检测结果:低结果情况");
+  HealthState lowHealthState = {HEART_CHECK, LOW, thresholdValue};
+  HealthService::GetInstance()->SetHealthCurrent(lowHealthState);
+  uapi_set_screen_on_api(); // 亮屏
+  if (MainViewSample::GetInstance()) {
+    if (MainViewSample::GetInstance()->GetHorCurrentCard() == HEART_RATE)
+      NativeAbility::GetInstance().ChangeSlice(VIEW_CHECK_INVALID);
+  } else
+    NativeAbility::GetInstance().ChangeSlice(VIEW_CHECK_INVALID);
+}
+// 处理高心率情况
+void HeartModel::handleHighHeartRate() {
+  WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "检测结果:高结果情况");
+  HealthState highHealthState = {HEART_CHECK, HIGH, thresholdValue};
+  HealthService::GetInstance()->SetHealthCurrent(highHealthState);
+  uapi_set_screen_on_api(); // 亮屏
+  if (MainViewSample::GetInstance()) {
+    if (MainViewSample::GetInstance()->GetHorCurrentCard() == HEART_RATE)
+      NativeAbility::GetInstance().ChangeSlice(VIEW_CHECK_INVALID);
+  } else
+    NativeAbility::GetInstance().ChangeSlice(VIEW_CHECK_INVALID);
+}
+// 设置佩戴状态
+void HeartModel::SetWearStatus() {
+
+  WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "佩戴状态 %d %d",
+                uapi_dev_runtime_get_heartrate_detect_status(),
+                unwear_counter_);
+
+  // 如果处于训练模式,提前返回
+  if (uapi_dev_runtime_get_train_status() == 1 ||
+      // uapi_dev_runtime_get_heartrate_detect_status() == 0 ||
+      uapi_dev_runtime_get_respiratory_training_status())
+    return;
+
+  unwear_counter_++;
+#ifdef SYSTEM_LOG_SERVICE
+  uapi_save_runtime_log(RUNTIME_LOG_HEART_NOT_WEAR);
+#endif
+  // 设置佩戴状态
+  if (checkstate == HeartCheck::CARDCHECK) {
+    if (unwear_counter_ > MAX_UNWEAR_COUNT) {
+      if (MainViewSample::GetInstance()) {
+        //只有在心率卡片界面才触发
+        if (MainViewSample::GetInstance()->GetHorCurrentCard() == HEART_RATE) {
+          SetResult(HeartResult::NOT_WORN);
+#ifdef SYSTEM_LOG_SERVICE
+          uapi_save_runtime_log(RUNTIME_LOG_HEART_ERROR_NOT_WEAR);
+#endif
+          Heart_Stop();
+        }
+      }
+    }
+  } else {
+    SetResult(HeartResult::NOT_WORN);
+#ifdef SYSTEM_LOG_SERVICE
+    uapi_save_runtime_log(RUNTIME_LOG_HEART_ERROR_NOT_WEAR);
+#endif
+    Heart_Stop();
+  }
+}
+
+void HeartModel::UpHeartdata(uint16_t heart) {
+  // 如果处于训练模式,提前返回
+  if (uapi_dev_runtime_get_train_status() == 1)
+    return;
+
+  int max_valid_count = 0;
+
+  // if (heart != 0) {
+  //   if (display_counter_ >= DISPLAY_COUNT) {
+  //     displayheart = heart;
+  //   } else {
+  //     displayheart = 0;
+  //   }
+  //   display_counter_++;
+  // } else {
+  //   displayheart = 0;
+  // }
+
+  displayheart = heart;
+
+  // 更新心率和计数器
+  if (displayheart != 0) {
+    currentheart = displayheart; // 更新当前心率
+    valid_counter_++;            // 增加有效计数器
+    disvalid_counter_ = 0;       // 清空无效计数器
+#ifdef SYSTEM_LOG_SERVICE
+    uapi_save_runtime_log(RUNTIME_LOG_HEART_VALID_VALUE);
+#endif
+  } else {
+    disvalid_counter_++; // 增加无效计数器
+    valid_counter_ = 0;  // 清零有效计数器
+#ifdef SYSTEM_LOG_SERVICE
+    uapi_save_runtime_log(RUNTIME_LOG_HEART_INVALID_VALUE);
+#endif
+  }
+
+  // 检查无效计数器是否达标
+  if (uapi_dev_runtime_get_sleep_monitoring_status()) //睡眠监测模式下,增加未佩戴个数最大值,避免误判
+    max_valid_count = MAX_DISVALID_HRS_COUNT * 2;
+  else
+    max_valid_count = MAX_DISVALID_HRS_COUNT;
+
+  if (disvalid_counter_ >= max_valid_count) {
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,
+                  "检测结果:无效数达标 disvalid_counter:%d", disvalid_counter_);
+    SetResult(HeartResult::INVALID_DATA); // 标记为无效数据
+#ifdef SYSTEM_LOG_SERVICE
+    uapi_save_runtime_log(RUNTIME_LOG_HEAR_ERROR_INVALID_VALUE);
+#endif
+    Heart_Stop();
+    return;
+  }
+
+  // 检查有效计数器是否达标
+  if (valid_counter_ >= MAX_VALID_HRS_COUNT) {
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,
+                  "检测结果:成功 valid_counter:%d currentheart:%d",
+                  valid_counter_, currentheart);
+#ifdef SYSTEM_LOG_SERVICE
+    uapi_save_runtime_log(RUNTIME_LOG_HEAR_SUCCESS);
+#endif
+    SetResult(HeartResult::SUCCESS); // 标记为成功检测
+    Heart_Stop();
+    return;
+  }
+
+  // 刷新心率显示
+  WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,
+                "[heart data update displayheart%d displayheart_max%d "
+                "displayheart_min%d]",
+                displayheart, displayheart_max, displayheart_min);
+
+  // GraphicService::GetInstance()->PostGraphicEvent(
+  //     std::bind(&HeartModel::RefreshHeartRateScreen,
+  //     HeartModel::GetInstance(),
+  //               displayheart));
+}
+
+void HeartModel::Heart_Update_View(void) {
+  WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "更新心率界面");
+  int hour = HealthService::GetInstance()->GetCurrentHour();
+  if (HeartRateView::GetInstance() != nullptr) {
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "更新主界面卡片");
+    HeartRateView::GetInstance()->Update_data_Chart(hour);
+  }
+  if (HeartChartView::GetInstance() != nullptr) {
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "更新测量心率卡片");
+    HeartChartView::GetInstance()->Update_data_Chart(hour);
+  }
+}
+
+void HeartModel::CleanAllData(void) {
+  WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Nextday!");
+  if (MainViewSample::GetInstance() != nullptr &&
+      HeartRateView::GetInstance() != nullptr) {
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "更新主界面心率卡片");
+    HeartRateView::GetInstance()->CleanAllDataView();
+  }
+  if (HeartChartView::GetInstance() != nullptr) {
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "更新测量心率卡片");
+    HeartChartView::GetInstance()->CleanAllDataView();
+  }
+}
+
+// 配置5个动态心率数据
+// 最大 最小
+void HeartModel::SetArrayData() {
+  // 如果没有进行心率检测,则默认为0-220
+  if (displayheart_max == 0 || displayheart_min == 0) {
+    dynamic_heartrate[0] = 0;
+    dynamic_heartrate[1] = 40;
+    dynamic_heartrate[2] = 100;
+    dynamic_heartrate[3] = 160;
+    dynamic_heartrate[4] = 220;
+    return; // 直接返回
+  }
+
+  // 计算心率范围并添加缓冲
+  uint16_t adjusted_min =
+      (displayheart_min > 10) ? (displayheart_min / 2) : displayheart_min;
+  uint16_t adjusted_max =
+      (displayheart_max < 210) ? (displayheart_max + 10) : displayheart_max;
+
+  uint16_t range = adjusted_max - adjusted_min;
+  uint16_t interval = range / 4; // 每个部分的宽度
+
+  // 设置动态心率数据
+  dynamic_heartrate[0] = adjusted_min;
+  dynamic_heartrate[1] = adjusted_min + interval;
+  dynamic_heartrate[2] = adjusted_min + 2 * interval;
+  dynamic_heartrate[3] = adjusted_min + 3 * interval;
+  dynamic_heartrate[4] = adjusted_max;
+
+  // 确保所有值为整数
+  for (int i = 0; i < 5; i++) {
+    dynamic_heartrate[i] = static_cast<uint16_t>(round(dynamic_heartrate[i]));
+  }
+
+  // 打印动态心率数据
+  for (int i = 0; i < 5; i++) {
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "dynamic_heartrate[%d]=%d", i,
+                  dynamic_heartrate[i]);
+  }
+}
+// 获取动态心率配置数组
+uint16_t *HeartModel::GetArrayData() { return dynamic_heartrate; }
+
+// 获取检测字符串
+// 获取检测字符串
+// TODO: 适配多国语言
+std::string HeartModel::GetCheckString() {
+  std::string check_string = "检测结果未知";
+
+  // 获取检测数据
+  if (currentheart == 0) {
+    if (ConfigModel::GetInstance()->GetLanguage() == ZH_CN) {
+      check_string = "暂无检测数据";
+    } else {
+      check_string = "No detection data is available";
+    }
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "检测数据:%s", check_string.c_str());
+    return check_string;
+  }
+
+  // 获取目前的时间戳
+  uint32_t currentTime;
+  if (uapi_get_timestampe_ss(&currentTime) != ERRCODE_SUCC) {
+    if (ConfigModel::GetInstance()->GetLanguage() == ZH_CN) {
+      check_string = "获取当前时间失败";
+    } else {
+      check_string = "Get time failed";
+    }
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "获取当前时间失败");
+    return check_string;
+  }
+
+  // 检查时间戳是否有效
+  if (timestamp_ms == 0) {
+    if (ConfigModel::GetInstance()->GetLanguage() == ZH_CN) {
+      check_string = std::to_string(currentheart) + " " + "时间无效,无法检测";
+    } else {
+      check_string =
+          std::to_string(currentheart) + " " + "Invalid time, cannot detect";
+    }
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "时间戳无效,无法检测:%s",
+                  check_string.c_str());
+    return check_string;
+  }
+
+  // 进行时间戳相减计算
+  uint32_t diff = currentTime - timestamp_ms;
+  uint32_t diff_min = diff / 60;
+  uint32_t diff_hour = diff_min / 60;
+
+  WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "当前时间:%d, 上次检测时间:%d",
+                currentTime, timestamp_ms);
+  WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,
+                "时间差(秒):%d, 时间差(分钟):%d, 时间差(小时):%d", diff,
+                diff_min, diff_hour);
+
+  // 根据时间差生成检测字符串
+  if (diff_min < 1) {
+    if (ConfigModel::GetInstance()->GetLanguage() == ZH_CN) {
+      check_string = std::to_string(currentheart) + "次/分 " + "刚刚检测"; //
+    } else {
+      check_string = std::to_string(currentheart) + " bpm " + "Just detected";
+    }
+  } else if (diff_hour < 1) { // Within one hour
+    if (ConfigModel::GetInstance()->GetLanguage() == ZH_CN) {
+      check_string = std::to_string(currentheart) + "次/分 " +
+                     std::to_string(diff_min) + "分钟前";
+    } else {
+      check_string = std::to_string(currentheart) + " bpm " +
+                     std::to_string(diff_min) + " minutes ago";
+    }
+  } else {
+    if (ConfigModel::GetInstance()->GetLanguage() == ZH_CN) {
+      check_string = std::to_string(currentheart) + "次/分 " + "超过一个小时前";
+    } else {
+      check_string =
+          std::to_string(currentheart) + " bpm " + "More than an hour ago";
+    }
+  }
+
+  WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "检测结果:%s", check_string.c_str());
+  return check_string; // Return the final string
+}
+
+#if KEEP_SCREEN_ON_HEART
+/////////////////////////////////////////亮屏定时器////////////////////////////////////////////
+// 声明定时器变量
+static osTimerId_t g_screen60s_timer = nullptr;
+static uint16_t SCREEN_60S_TIME = 60;
+static void heart_start_screen60s_timer_callbackProc(int data) {
+  WEARABLE_LOGD(
+      WEARABLE_LOG_MODULE_APP,
+      "HeartModel::heart_start_screen60s_timer_callbackProc,time = %d",
+      SCREEN_60S_TIME);
+  SCREEN_60S_TIME -= 30;
+  WEARABLE_LOGD(
+      WEARABLE_LOG_MODULE_APP,
+      "HeartModel::heart_start_screen60s_timer_callbackProc,time = %d",
+      SCREEN_60S_TIME);
+  if (SCREEN_60S_TIME <= 0) {
+    // 60s后息屏停止定时
+    HeartModel::GetInstance()->heart_stop_screen60s_timer();
+    // 取消常亮屏
+    ScreenAlwaysOnCtr(CANCEL_SCREEN_ALWAYS_ON);
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "heart_stop_screen60s_timer");
+  }
+}
+static void heart_start_screen60s_timer_callback(int data) {
+  GraphicService::GetInstance()->PostGraphicEvent(
+      std::bind(heart_start_screen60s_timer_callbackProc, data));
+}
+void HeartModel::heart_start_screen60s_timer(uint32_t interval) {
+  WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,
+                "HeartModel::heart_start_screen60s_timer");
+  /* -------------------------- 1.检查定时器是否已经存在,如果存在则返回
+   * ------------------------- */
+  if (g_screen60s_timer != nullptr) {
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Timer already exists!!");
+    return;
+  }
+  /* --------------------------------- 2.创建定时器
+   * -------------------------------- */
+  g_screen60s_timer =
+      osTimerNew((osTimerFunc_t)heart_start_screen60s_timer_callback,
+                 osTimerPeriodic, nullptr, nullptr);
+  // 检查定时器创建是否成功
+  if (g_screen60s_timer == nullptr) {
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Timer create failed!!");
+    return;
+  }
+  /* ----------------------------- 3.将毫秒转换为系统时钟节拍数
+   * ---------------------------- */
+  int tick = osMs2Tick(interval);
+  /* --------------------------------- 4.启动定时器
+   * -------------------------------- */
+  osStatus_t ret = osTimerStart(g_screen60s_timer, tick);
+  /* -------------------- 5.检查定时器启动是否成功,如果启动失败,删除定时器并置为
+   * nullptr -------------------- */
+  if (ret != osOK) {
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "osTimerDelete failed, ret = %lx!!",
+                  ret);
+    if (g_screen60s_timer != nullptr) {
+      ret = osTimerDelete(g_screen60s_timer);
+    }
+    g_screen60s_timer = nullptr;
+    return;
+  }
+}
+void HeartModel::heart_stop_screen60s_timer(void) {
+  // 检查定时器是否存在
+  if (g_screen60s_timer != nullptr) {
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,
+                  "HeartModel::heart_stop_screen60s_timer");
+    osTimerStop(g_screen60s_timer);
+    // 删除定时器并置为 nullptr
+    osStatus_t ret = osTimerDelete(g_screen60s_timer);
+    if (ret != osOK) {
+      WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,
+                    "osTimerDelete failed, ret = %lx!!", ret);
+    }
+    g_screen60s_timer = nullptr;
+    SCREEN_60S_TIME = 60;
+  }
+}
+void HeartModel::reset_heart_screen60s_timer_time() {
+  WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "reset_heart_screen60s_timer_time");
+  SCREEN_60S_TIME = 60;
+  if (nullptr == g_screen60s_timer) {
+    ScreenAlwaysOnCtr(OPEN_SCREEN_ALWAYS_ON); // 重新常亮屏
+    heart_start_screen60s_timer();            // 开启定时器
+  }
+}
+#endif
+//////////////////////////////////////////////////////////////////////////////////
+#if HEART_TIMER_DATA
+// 声明定时器变量
+static osTimerId_t g_data_timer = nullptr;
+
+static void heart_data_callbackProc(int data) {
+  //更新佩戴
+  uint8_t wear = 1;
+#ifdef SUPPORT_PPG_SERVICE
+  wear = ppg_get_wear_status();
+  WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"heart_data_callbackProc::hrs = %d\n", hrs);
+#endif
+  if (wear == 0) {
+    OHOS::HeartModel::GetInstance()->SetWearStatus();
+  }
+  //更新心率
+  uint8_t hrs = 0;
+#ifdef SUPPORT_PPG_SERVICE
+  hrs = ppg_get_hrs();
+  WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"heart_data_callbackProc::hrs = %d\n", hrs);
+#endif
+  OHOS::HeartModel::GetInstance()->UpHeartdata(hrs);
+  //打印佩戴与心率
+  WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "wear = %d, hrs = %d\n", wear, hrs);
+}
+static void heart_data_timer_callback(int data) {
+  GraphicService::GetInstance()->PostGraphicEvent(
+      std::bind(heart_data_callbackProc, data));
+}
+void HeartModel::heart_data_timer(uint32_t interval) {
+  WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,
+                "HeartModel::heart_data_timer");
+  if (g_data_timer != nullptr) {
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Timer already exists!!");
+    return;
+  }
+  g_data_timer = osTimerNew((osTimerFunc_t)heart_data_timer_callback,
+                            osTimerPeriodic, nullptr, nullptr);
+  if (g_data_timer == nullptr) {
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Timer create failed!!");
+    return;
+  }
+  int tick = osMs2Tick(interval);
+  osStatus_t ret = osTimerStart(g_data_timer, tick);
+  if (ret != osOK) {
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "osTimerDelete failed, ret = %lx!!",
+                  ret);
+    if (g_data_timer != nullptr) {
+      ret = osTimerDelete(g_data_timer);
+    }
+    g_data_timer = nullptr;
+    return;
+  }
+}
+void HeartModel::heart_stop_data_timer(void) {
+  // 检查定时器是否存在
+  if (g_data_timer != nullptr) {
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,
+                  "HeartModel::heart_stop_data_timer");
+    osTimerStop(g_data_timer);
+    // 删除定时器并置为 nullptr
+    osStatus_t ret = osTimerDelete(g_data_timer);
+    if (ret != osOK) {
+      WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,
+                    "osTimerDelete failed, ret = %lx!!", ret);
+    }
+    g_data_timer = nullptr;
+  }
+}
+#endif
+} // namespace OHOS
index 0897dc8..519c626 100644 (file)
@@ -110,8 +110,9 @@ namespace OHOS
 
     bool LanguageSwitchView::LanguageSwitchScrollViewInit(void)
     {
-        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "LanguageSwitchView::LanguageSwitchScrollViewInit");
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "LanguageSwitchView::LanguageSwitchScrollViewInit");
         LanguageSwitchScrollView = new UIScrollView();
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "LanguageSwitchView::LanguageSwitchScrollViewInit1");
         if (LanguageSwitchScrollView == nullptr)
         {
             WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "LanguageSwitchView::LanguageSwitchScrollView new fail!");
@@ -321,7 +322,9 @@ namespace OHOS
     {
         WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "LanguageSwitchView::OnStart");
         LanguageSwitchViewInit();
-        InithintView();
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "LanguageSwitchView::OnStart1");
+        // InithintView();
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "LanguageSwitchView::OnStart end");
         return;
     }
 }
\ No newline at end of file
diff --git a/code/sdk/application/wearable/n9/nativeapp/nativeui/uisample/src/UISampleView.cpp b/code/sdk/application/wearable/n9/nativeapp/nativeui/uisample/src/UISampleView.cpp
deleted file mode 100644 (file)
index 66dace2..0000000
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
- * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved.
- * Description: SettingView.cpp
- * Author:
- * Create: 2021-11-23
- */
-
-#include <string>
-
-#include "uisample/include/UISampleView.h"
-#include "uisample/include/UISamplePresenter.h"
-#include "ui_test_group.h"
-
-namespace OHOS {
-static UISampleView *g_pUISampleView = nullptr;
-
-UISampleView::UISampleView()
-{
-    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "UISampleView::UISampleView");
-    g_pUISampleView = this;
-}
-
-UISampleView::~UISampleView()
-{
-    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "UISampleView::~UISampleView");
-    g_pUISampleView = nullptr;
-}
-
-UISampleView* UISampleView::GetInstance()
-{
-    return g_pUISampleView;
-}
-
-void UISampleView::InitView()
-{
-    if ((mainList_ == nullptr) && (adapter_ == nullptr)) {
-        mainList_ = new UIList(UIList::VERTICAL);
-        mainList_->SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);
-        mainList_->SetThrowDrag(true);
-        mainList_->SetReboundSize(100); // 100: rebound size
-        mainList_->SetElastic(true);
-        mainList_->SetYScrollBarVisible(true);
-        adapter_ = new TestCaseListAdapter();
-        UITestGroup::GetInstance()->SetUpTestCase();
-        mainList_->SetAdapter(adapter_);
-
-        dragListener_ = new UISampleOnDragListener();
-        if (dragListener_ == nullptr) {
-            return;
-        }
-        mainList_->SetOnDragListener(dragListener_);
-    }
-    AddViewToRootContainer(mainList_);
-    RootView::GetInstance()->Invalidate();
-}
-
-void UISampleView::OnStart()
-{
-    InitView();
-}
-
-void UISampleView::OnStop()
-{
-    if (adapter_ != nullptr) {
-        delete adapter_;
-        adapter_ = nullptr;
-    }
-    if (dragListener_ != nullptr) {
-        delete dragListener_;
-        dragListener_ = nullptr;
-    }
-    if (mainList_ != nullptr) {
-        delete mainList_;
-        mainList_ = nullptr;
-    }
-    return;
-}
-}
diff --git a/code/sdk/application/wearable/n9/nativeapp/nativeui/uisample/uitest/framework/src/test_case_list_adapter.cpp b/code/sdk/application/wearable/n9/nativeapp/nativeui/uisample/uitest/framework/src/test_case_list_adapter.cpp
deleted file mode 100644 (file)
index fe58f91..0000000
+++ /dev/null
@@ -1,160 +0,0 @@
-/*
- * Copyright (c) 2020-2021 Huawei Device Co., Ltd.
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "test_case_list_adapter.h"
-#include "common/screen.h"
-#include "components/ui_button.h"
-#include "components/ui_label_button.h"
-#include "gfx_utils/list.h"
-#include "ui_test.h"
-#include "uisample/include/UISampleView.h"
-#include "ui_test_group.h"
-#include "wearable_log.h"
-
-namespace OHOS {
-namespace {
-const uint16_t TESTCASE_BUTTON_HEIGHT = 100;
-const uint16_t STYLE_BORDER_WIDTH_VALUE = 4;
-} // namespace
-
-static RootView::OnKeyActListener *g_keyListener = nullptr;
-
-uint16_t TestCaseListAdapter::GetCount()
-{
-    return UITestGroup::GetInstance()->GetTestCase().Size();
-}
-
-class TransparentBackButton : public UIButton {
-public:
-    TransparentBackButton() : UIButton()
-    {
-        opaScale_ = OPA_TRANSPARENT;
-    }
-
-    bool OnClickEvent(const ClickEvent& event) override
-    {
-        UISampleView::GetInstance()->GetRootContainer()->RemoveAll();
-        UITest* uiTest = UITestGroup::GetInstance()->GetTestCase(GetViewId());
-        if (uiTest != nullptr) {
-            uiTest->TearDown();
-        }
-       RootView::GetInstance()->SetOnKeyActListener(g_keyListener);
-        g_keyListener = nullptr;
-        UISampleView::GetInstance()->InitView();
-        return true;
-    }
-};
-
-class UiTestClickListener : public UIView::OnClickListener {
-public:
-    UiTestClickListener() {}
-    ~UiTestClickListener()
-    {
-        if (backBtn_ != nullptr) {
-            delete backBtn_;
-            backBtn_ = nullptr;
-        }
-    }
-
-    bool OnClick(UIView& view, const ClickEvent& event) override
-    {
-        UIViewGroup* rootContainer = UISampleView::GetInstance()->GetRootContainer();
-        UITest* uiTest = UITestGroup::GetInstance()->GetTestCase(view.GetViewId());
-        if (uiTest == nullptr) {
-            return false;
-        }
-        uiTest->SetUp();
-        rootContainer->RemoveAll();
-        UIView* tempView = const_cast<UIView*>(uiTest->GetTestView());
-        if (tempView != nullptr) {
-            tempView->SetTouchable(true);
-            tempView->SetViewId(view.GetViewId());
-            tempView->SetPosition(tempView->GetX(), tempView->GetY());
-            rootContainer->Add(tempView);
-            g_keyListener =     RootView::GetInstance()->GetOnKeyActListener();
-           RootView::GetInstance()->SetOnKeyActListener(nullptr);
-        }
-        if (backBtn_ == nullptr) {
-            backBtn_ = new TransparentBackButton();
-            backBtn_->SetPosition(0, 202, 50, 50); // 0: x position, 202: y position, 50: width and height
-        }
-        backBtn_->SetViewId(view.GetViewId());
-        rootContainer->Add(backBtn_);
-        rootContainer->Invalidate();
-        return true;
-    }
-
-private:
-    UIButton* backBtn_{nullptr};
-};
-
-UIView* TestCaseListAdapter::GetView(UIView* inView, int16_t index)
-{
-    List<TestCaseInfo> testCaseList = UITestGroup::GetInstance()->GetTestCase();
-    if (testCaseList.IsEmpty()) {
-        return nullptr;
-    }
-    if ((index > testCaseList.Size() - 1) || (index < 0)) {
-        return nullptr;
-    }
-    UILabelButton* item = nullptr;
-    if (inView == nullptr) {
-        item = new UILabelButton();
-        item->SetPosition(0, 0);
-        item->SetStyleForState(STYLE_BORDER_WIDTH, STYLE_BORDER_WIDTH_VALUE, UIButton::RELEASED);
-        item->SetStyleForState(STYLE_BORDER_WIDTH, STYLE_BORDER_WIDTH_VALUE, UIButton::PRESSED);
-        item->SetStyleForState(STYLE_BORDER_WIDTH, STYLE_BORDER_WIDTH_VALUE, UIButton::INACTIVE);
-        item->SetStyleForState(STYLE_BORDER_OPA, 0, UIButton::RELEASED);
-        item->SetStyleForState(STYLE_BORDER_OPA, 0, UIButton::PRESSED);
-        item->SetStyleForState(STYLE_BORDER_OPA, 0, UIButton::INACTIVE);
-        item->Resize(HORIZONTAL_RESOLUTION - TEXT_DISTANCE_TO_LEFT_SIDE, TESTCASE_BUTTON_HEIGHT);
-    } else {
-        item = static_cast<UILabelButton*>(inView);
-    }
-
-    if (listener_ == nullptr) {
-        listener_ = new UiTestClickListener();
-    }
-    ListNode<TestCaseInfo>* node = testCaseList.Begin();
-    for (uint16_t i = 0; i < index; i++) {
-        node = node->next_;
-    }
-    item->SetOnClickListener(listener_);
-    item->SetText(node->data_.sliceId);
-    item->SetViewId(node->data_.sliceId);
-    item->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 40); // 40: means font size
-    item->SetViewIndex(index);
-    item->SetAlign(TEXT_ALIGNMENT_LEFT);
-    item->SetLabelPosition(150, 0); // 150: label x-coordinate
-    item->SetStyleForState(STYLE_BORDER_RADIUS, 0, UIButton::RELEASED);
-    item->SetStyleForState(STYLE_BORDER_RADIUS, 0, UIButton::PRESSED);
-    item->SetStyleForState(STYLE_BORDER_RADIUS, 0, UIButton::INACTIVE);
-    item->SetStyleForState(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT, UIButton::RELEASED);
-    item->SetStyleForState(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT, UIButton::PRESSED);
-    item->SetStyleForState(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT, UIButton::INACTIVE);
-    return item;
-}
-
-int16_t TestCaseListAdapter::GetItemWidthWithMargin(int16_t index)
-{
-    // 2: two borders on both sides
-    return HORIZONTAL_RESOLUTION - TEXT_DISTANCE_TO_LEFT_SIDE + STYLE_BORDER_WIDTH_VALUE * 2;
-}
-
-int16_t TestCaseListAdapter::GetItemHeightWithMargin(int16_t index)
-{
-    return TESTCASE_BUTTON_HEIGHT + STYLE_BORDER_WIDTH_VALUE * 2; // 2: two borders on both sides
-}
-} // namespace OHOS
diff --git a/code/sdk/application/wearable/n9/service/device_msg/device_location.cpp b/code/sdk/application/wearable/n9/service/device_msg/device_location.cpp
deleted file mode 100644 (file)
index d24a14f..0000000
+++ /dev/null
@@ -1,174 +0,0 @@
-/*\r
- * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
- */\r
-#include "device_location.h"\r
-#include "wearable_log.h"\r
-#include "locator.h"\r
-\r
-using namespace OHOS::Location;\r
-\r
-LocationInfo_t g_locationInfo = {0};\r
-\r
-class GnssStatusCallback : public IGnssStatusCallback {\r
-public:\r
-    GnssStatusCallback() {}\r
-    ~GnssStatusCallback() {}\r
-\r
-    void OnStatusChange(const std::shared_ptr<SatelliteStatus> &statusInfo) override\r
-    {\r
-        WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "OnStatusChange, num:%d\n", statusInfo->GetSatellitesNumber());\r
-        for (int32_t satIdx = 0; satIdx < statusInfo->GetSatellitesNumber(); satIdx++) {\r
-            WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "sat index:%d svid:%d ele:%.3f az:%.3f  cnr:%.3f \n", satIdx,\r
-                          statusInfo->GetSatelliteIds()[satIdx], statusInfo->GetAltitudes()[satIdx],\r
-                          statusInfo->GetAzimuths()[satIdx], statusInfo->GetCarrierToNoiseDensitys()[satIdx]);\r
-        }\r
-    }\r
-\r
-private:\r
-};\r
-\r
-class NmeaMessageCallback : public INmeaMessageCallback {\r
-public:\r
-    NmeaMessageCallback() {}\r
-    ~NmeaMessageCallback() {}\r
-\r
-    void OnMessageChange(int64_t timestamp, const std::string msg) override\r
-    {\r
-        WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "OnMessageChange timestamp :%lld msg:%s\n", timestamp, msg.c_str());\r
-    }\r
-\r
-private:\r
-};\r
-\r
-class LocatorCallback : public ILocatorCallback {\r
-public:\r
-    LocatorCallback() {}\r
-\r
-    ~LocatorCallback() {}\r
-\r
-    void OnLocationReport(const std::shared_ptr<Location> &location) override\r
-    {\r
-        WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "OnLocationReport Lat:%.3f Long:%.3f Alt:%.3f Speed:%.3f dir:%.3f\n",\r
-                      location->GetLatitude(), location->GetLongitude(), location->GetAltitude(), location->GetSpeed(),\r
-                      location->GetDirection());\r
-    }\r
-\r
-    void OnErrorReport(const int errorCode) override\r
-    {\r
-        WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "error code:%d\n", errorCode);\r
-    }\r
-\r
-    void OnLocatingStatusChange(const int status) override\r
-    {\r
-        WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "OnLocatingStatusChange status:%d\n", status);\r
-    }\r
-\r
-private:\r
-};\r
-\r
-typedef struct {\r
-    Locator *locator;\r
-    bool isStarted;\r
-    LocatorCallback locatorCallback;\r
-    GnssStatusCallback gnssStatusCallback;\r
-    NmeaMessageCallback nmeaMessageCallback;\r
-} LocationSampleContext;\r
-\r
-static LocationSampleContext g_locationContext = {\r
-    .locator = nullptr,\r
-    .isStarted = false,\r
-};\r
-\r
-int32_t deviceLocationStartLocating()\r
-{\r
-    WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "LocationStartLocating\n");\r
-    if (g_locationContext.locator == nullptr) {\r
-        g_locationContext.locator = &Locator::GetInstance();\r
-    }\r
-    if (g_locationContext.locator == nullptr) {\r
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "locator is nullptr\n");\r
-        return ERRCODE_FAILURE;\r
-    }\r
-\r
-    bool isEnabled = false;\r
-    LocationErrCode errCode = g_locationContext.locator->IsLocationEnabled(isEnabled);\r
-    if (errCode != ERRCODE_SUCCESS) {\r
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "locator IsLocationEnabled failed:%d\n", errCode);\r
-        return errCode;\r
-    }\r
-\r
-    if (!isEnabled) {\r
-        errCode = g_locationContext.locator->EnableAbility(true);\r
-        if (errCode != ERRCODE_SUCCESS) {\r
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "locator EnableAbility failed:%d\n", errCode);\r
-            return errCode;\r
-        }\r
-    }\r
-    WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "RegisterGnssStatusCallback\n");\r
-    errCode = g_locationContext.locator->RegisterGnssStatusCallback(&g_locationContext.gnssStatusCallback);\r
-    if (errCode != ERRCODE_SUCCESS) {\r
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "locator RegisterGnssStatusCallback failed:%d\n", errCode);\r
-        return errCode;\r
-    }\r
-    WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "RegisterNmeaMessageCallback\n");\r
-    errCode = g_locationContext.locator->RegisterNmeaMessageCallback(&g_locationContext.nmeaMessageCallback);\r
-    if (errCode != ERRCODE_SUCCESS) {\r
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "locator RegisterNmeaMessageCallback failed:%d\n", errCode);\r
-        return errCode;\r
-    }\r
-    WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "StartLocating\n");\r
-    RequestConfig requestConfig;\r
-    requestConfig.SetPriority(PRIORITY_ACCURACY);\r
-    errCode = g_locationContext.locator->StartLocating(&requestConfig, &g_locationContext.locatorCallback);\r
-    if (errCode != ERRCODE_SUCCESS) {\r
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "locator StartLocating failed:%d\n", errCode);\r
-        return errCode;\r
-    }\r
-    g_locationContext.isStarted = true;\r
-    WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "StartLocating end\n");\r
-    return ERRCODE_SUCCESS;\r
-}\r
-\r
-int32_t deviceLocationStopLocating()\r
-{\r
-    if (!g_locationContext.isStarted) {\r
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "locator is not started\n");\r
-        return ERRCODE_FAILURE;\r
-    }\r
-    LocationErrCode errCode =\r
-        g_locationContext.locator->UnregisterNmeaMessageCallback(&g_locationContext.nmeaMessageCallback);\r
-    if (errCode != ERRCODE_SUCCESS) {\r
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "locator UnregisterNmeaMessageCallback failed:%d\n", errCode);\r
-        return errCode;\r
-    }\r
-    errCode = g_locationContext.locator->UnregisterGnssStatusCallback(&g_locationContext.gnssStatusCallback);\r
-    if (errCode != ERRCODE_SUCCESS) {\r
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "locator RegisterGnssStatusCallback failed:%d\n", errCode);\r
-        return errCode;\r
-    }\r
-    errCode = g_locationContext.locator->StopLocating(&g_locationContext.locatorCallback);\r
-    if (errCode != ERRCODE_SUCCESS) {\r
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "locator StopLocating failed:%d\n", errCode);\r
-        return errCode;\r
-    }\r
-    g_locationContext.isStarted = false;\r
-\r
-    bool isEnabled = false;\r
-    errCode = g_locationContext.locator->IsLocationEnabled(isEnabled);\r
-    if (errCode != ERRCODE_SUCCESS) {\r
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "locator IsLocationEnabled failed:%d\n", errCode);\r
-        return errCode;\r
-    }\r
-    if (!isEnabled) {\r
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "locator Is not Enabled\n");\r
-        return ERRCODE_FAILURE;\r
-    }\r
-    WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "EnableAbility false\n");\r
-    errCode = g_locationContext.locator->EnableAbility(false);\r
-    if (errCode != ERRCODE_SUCCESS) {\r
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "locator EnableAbility failed:%d\n", errCode);\r
-        return errCode;\r
-    }\r
-    WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "Disable end\n");\r
-    return ERRCODE_SUCCESS;\r
-}
\ No newline at end of file
diff --git a/code/sdk/application/wearable/n9/service/device_msg/device_location.h b/code/sdk/application/wearable/n9/service/device_msg/device_location.h
deleted file mode 100644 (file)
index 3305d69..0000000
+++ /dev/null
@@ -1,20 +0,0 @@
-/*\r
- * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
- */\r
-#ifndef DEVICE_LOCATION_H\r
-#define DEVICE_LOCATION_H\r
-#include <cinttypes>\r
-\r
-typedef struct LocationInfo {\r
-    int32_t latitude_;\r
-    int32_t longitude_;\r
-    uint16_t altitude_;\r
-    uint16_t accuracy_;\r
-    uint16_t speed_;\r
-    uint16_t direction_;\r
-    int64_t timeStamp_;\r
-} LocationInfo_t;\r
-\r
-int32_t deviceLocationStartLocating();\r
-int32_t deviceLocationStopLocating();\r
-#endif
\ No newline at end of file
index 80255a3..4f4bccf 100644 (file)
 #include "wearable_log.h"\r
 #include "AppViewIDs.h"\r
 #include "NativeAbility.h"\r
+#if 0 // 1201patch 为编译过屏蔽\r
 #include "sport/SportView.h"\r
 #include "sport/SportModel.h"\r
 #include "findphone/FindPhoneMainPage.h"\r
 #include "camera/CameraMainPage.h"\r
 #include "weather/WeatherMainPage.h"\r
 #include "date/DateMainPage.h"\r
+#endif\r
 \r
 #ifdef __cplusplus\r
 extern "C" {\r
@@ -27,6 +29,91 @@ uint8_t g_bloodoxygen = 0;
 uint8_t g_heartrate = 0;\r
 uint32_t g_stepdata = 0;\r
 uint32_t g_distance = 0;\r
+\r
+/* -------------------------------------------------------------------------- */\r
+#if 1// 1201patch 为编译过屏蔽\r
+errcode_t msg_center_get_battery_level(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len)\r
+{\r
+    return ERRCODE_SUCC;\r
+}\r
+errcode_t msg_center_get_storage_info(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len)\r
+{\r
+    return ERRCODE_SUCC;\r
+}\r
+errcode_t msg_center_get_product_info(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len)\r
+{\r
+    return ERRCODE_SUCC;\r
+}\r
+errcode_t msg_center_get_language_id(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len)\r
+{\r
+    return ERRCODE_SUCC;\r
+}\r
+errcode_t msg_center_set_language_id(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len)\r
+{\r
+    return ERRCODE_SUCC;\r
+}\r
+errcode_t msg_center_ota_init(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len)\r
+{\r
+    return ERRCODE_SUCC;\r
+}\r
+errcode_t msg_center_ota_update(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len)\r
+{\r
+    return ERRCODE_SUCC;\r
+}\r
+errcode_t msg_center_device_heartrate(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len)\r
+{\r
+    return ERRCODE_SUCC;\r
+}\r
+errcode_t msg_center_device_stepdata(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len)\r
+{\r
+    return ERRCODE_SUCC;\r
+}\r
+errcode_t msg_center_device_bloodoxygen(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len)\r
+{\r
+    return ERRCODE_SUCC;\r
+}\r
+errcode_t msg_center_sport_action(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len)\r
+{\r
+    return ERRCODE_SUCC;\r
+}\r
+errcode_t msg_center_sport_get_record(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len)\r
+{\r
+    return ERRCODE_SUCC;\r
+}\r
+errcode_t msg_center_camera_exit(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len)\r
+{\r
+    return ERRCODE_SUCC;\r
+}\r
+errcode_t msg_center_camera_online(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len)\r
+{\r
+    return ERRCODE_SUCC;\r
+}\r
+errcode_t msg_center_offline_log_switch(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len)\r
+{\r
+    return ERRCODE_SUCC;\r
+}\r
+errcode_t msg_center_set_online_log_channel(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len)\r
+{\r
+    return ERRCODE_SUCC;\r
+}\r
+errcode_t msg_center_set_online_log_level(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len)\r
+{\r
+    return ERRCODE_SUCC;\r
+}\r
+errcode_t msg_center_device_findphone(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len)\r
+{\r
+    return ERRCODE_SUCC;\r
+}\r
+errcode_t msg_center_device_sync_weather_rec(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len)\r
+{\r
+    return ERRCODE_SUCC;\r
+}\r
+errcode_t msg_center_device_sync_date_rec(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len)\r
+{\r
+    return ERRCODE_SUCC;\r
+}\r
+#else\r
+/* -------------------------------------------------------------------------- */\r
 // 获取电量\r
 errcode_t msg_center_get_battery_level(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len)\r
 {\r
@@ -426,6 +513,7 @@ errcode_t msg_center_device_sync_date_rec(uint8_t cmd_id, uint8_t type, void *us
     }\r
     return ERRCODE_SUCC;\r
 }\r
+#endif\r
 \r
 #ifdef __cplusplus\r
 }\r
index 24f5bec..07e95c9 100644 (file)
@@ -161,12 +161,11 @@ set(SOURCES
     ${CMAKE_CURRENT_SOURCE_DIR}/src/msg_center_customer.cpp
     ${CMAKE_CURRENT_SOURCE_DIR}/src/msg_center_cmd.cpp
     ${CMAKE_CURRENT_SOURCE_DIR}/src/notify/alarm_notification.cpp
-    ${CMAKE_CURRENT_SOURCE_DIR}/src/notify/makephone_notification.cpp
     ${CMAKE_CURRENT_SOURCE_DIR}/src/common/msg_center_common.cpp
     ${CMAKE_CURRENT_SOURCE_DIR}/src/common/msg_center_utils.cpp
     ${CMAKE_CURRENT_SOURCE_DIR}/src/common/msg_center_self_cmd.cpp
     ${CMAKE_CURRENT_SOURCE_DIR}/src/notify/ketinput/src/NotifyOnKeyListener.cpp
-    ${CMAKE_CURRENT_SOURCE_DIR}/src/notify/phone_msg_notification.cpp
+    # ${CMAKE_CURRENT_SOURCE_DIR}/src/notify/phone_msg_notification.cpp
     ${CMAKE_CURRENT_SOURCE_DIR}/src/notify/pairing_notification.cpp
     ${CMAKE_CURRENT_SOURCE_DIR}/src/notify/transmitting.cpp
     ${CMAKE_CURRENT_SOURCE_DIR}/src/notify/charge_notification.cpp
@@ -189,9 +188,8 @@ set(SOURCES
     ${CMAKE_CURRENT_SOURCE_DIR}/src/msg_center_customer.cpp
     ${CMAKE_CURRENT_SOURCE_DIR}/src/msg_center_cmd.cpp
     ${CMAKE_CURRENT_SOURCE_DIR}/src/notify/alarm_notification.cpp
-    ${CMAKE_CURRENT_SOURCE_DIR}/src/notify/makephone_notification.cpp
     ${CMAKE_CURRENT_SOURCE_DIR}/src/notify/ketinput/src/NotifyOnKeyListener.cpp
-    ${CMAKE_CURRENT_SOURCE_DIR}/src/notify/phone_msg_notification.cpp
+    # ${CMAKE_CURRENT_SOURCE_DIR}/src/notify/phone_msg_notification.cpp
     ${CMAKE_CURRENT_SOURCE_DIR}/src/notify/pairing_notification.cpp
     ${CMAKE_CURRENT_SOURCE_DIR}/src/notify/transmitting.cpp
     ${CMAKE_CURRENT_SOURCE_DIR}/src/notify/charge_notification.cpp
diff --git a/code/sdk/application/wearable/n9/service/msg_center/brandy-native-js-fd230/libmsg_center.a b/code/sdk/application/wearable/n9/service/msg_center/brandy-native-js-fd230/libmsg_center.a
deleted file mode 100644 (file)
index b1e105a..0000000
Binary files a/code/sdk/application/wearable/n9/service/msg_center/brandy-native-js-fd230/libmsg_center.a and /dev/null differ
diff --git a/code/sdk/application/wearable/n9/service/msg_center/brandy-native-js-ln/libmsg_center.a b/code/sdk/application/wearable/n9/service/msg_center/brandy-native-js-ln/libmsg_center.a
deleted file mode 100644 (file)
index b1e105a..0000000
Binary files a/code/sdk/application/wearable/n9/service/msg_center/brandy-native-js-ln/libmsg_center.a and /dev/null differ
index b1e105a..7e69f1c 100644 (file)
Binary files a/code/sdk/application/wearable/n9/service/msg_center/brandy-native-js-n9/libmsg_center.a and b/code/sdk/application/wearable/n9/service/msg_center/brandy-native-js-n9/libmsg_center.a differ
diff --git a/code/sdk/application/wearable/n9/service/msg_center/include/notify/makephone_notification.h b/code/sdk/application/wearable/n9/service/msg_center/include/notify/makephone_notification.h
deleted file mode 100644 (file)
index 82210db..0000000
+++ /dev/null
@@ -1,74 +0,0 @@
-/*\r
- * Copyright (c) CompanyNameMagicTag 2023-2023. All rights reserved.\r
- * Description: makephone notification api\r
- * Author: CompanyName\r
- * Create: 2023-08-11\r
- */\r
-\r
-#ifndef MAKEPHONE_NOTIFICATION_H\r
-#define MAKEPHONE_NOTIFICATION_H\r
-\r
-enum class CallTimerType {\r
-    NOTIFY_PHONE_CALLING_DISPLAY = 0,\r
-    NOTIFY_PHONE_CURTIME_DISPLAY = 1,\r
-    NOTIFY_PHONE_UNKNOWN = 10,\r
-};\r
-\r
-namespace OHOS {\r
-class VolumeSettingView;\r
-UIViewGroup* CreatePhoneCallView(void);\r
-UIViewGroup* CreateCallingView(void);\r
-UIViewGroup* CreateMultiplePhoneView(void);\r
-UIViewGroup* CreateWaitingHintsView(void);\r
-void HonrsViewChange(void);\r
-VolumeSettingView *GetvolumeSetting(void);\r
-void FreeCallingView(void);\r
-void FreePhoneCallView(void);\r
-void FreeMultiplePhoneCallView(void);\r
-void FreeWaitingHintsView(void);\r
-void RefreshMicrophoneImageSrc(const char* src);\r
-void CallTimerCallBackProc(int data);\r
-void CallCurTimerCallBack(int data);\r
-void StartCallTimer(CallTimerType type, int32_t interval);\r
-void DisableCallTimer(CallTimerType type);\r
-void EnableWaitingView(void);\r
-void DisableWatingView(void);\r
-\r
-class CallViewEventListener : public OHOS::UIView::OnClickListener,\r
-                              public OHOS::UIView::OnLongPressListener,\r
-                              public OHOS::UIView::OnTouchListener,\r
-                              public OHOS::UIView::OnDragListener {\r
-public:\r
-    CallViewEventListener();\r
-    ~CallViewEventListener() override;\r
-    static CallViewEventListener *GetInstance(void);\r
-    bool OnClick(OHOS::UIView& view, const OHOS::ClickEvent& event) override;\r
-    bool OnDrag(UIView& view, const DragEvent& event) override\r
-    {\r
-        return true;\r
-    }\r
-    bool OnDragEnd(OHOS::UIView& view, const OHOS::DragEvent& event) override\r
-    {\r
-        return true;\r
-    }\r
-    bool OnPress(OHOS::UIView& view, const OHOS::PressEvent& event) override\r
-    {\r
-        return true;\r
-    }\r
-    bool OnLongPress(OHOS::UIView& view, const OHOS::LongPressEvent& event) override\r
-    {\r
-        return true;\r
-    }\r
-    bool OnRelease(OHOS::UIView& view, const OHOS::ReleaseEvent& event) override\r
-    {\r
-        return true;\r
-    }\r
-\r
-    bool OnDragStart(OHOS::UIView& view, const OHOS::DragEvent& event) override\r
-    {\r
-        return true;\r
-    }\r
-};\r
-}; // namespace OHOS\r
-\r
-#endif /* MAKEPHONE_NOTIFICATION_H */\r
index 345828d..478ba07 100644 (file)
@@ -23,8 +23,7 @@
 #include "components/root_view.h"
 #include "components/ui_view_group.h"
 #include "alarm_notification.h"
-#include "makephone_notification.h"
-#include "phone_msg_notification.h"
+// #include "phone_msg_notification.h"
 
 constexpr uint16_t HALF_SCREEN = 2;
 constexpr int16_t NOTIFY_PRIORITY_DEFAULT = 4;
index 0796212..a54eac7 100644 (file)
 /*
- * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved.
- * Description: broadcast feature implement
- * Author: CompanyName
- * Create: 2021-11-11
- */
-
- #include <cstdio>
- #include "securec.h"
- #include "adapter.h"
- #include "ohos_init.h"
- #include "samgr_lite.h"
- #include "memory_adapter.h"
- #include "wearable_log.h"
- #include "service_id_define.h"
- #include "broadcast_service.h"
- #include "alarm/include/AlarmClockModel.h"
- #include "AlarmPopUpPresenter.h"
- #include "CallerLogModel.h"
- #include "notification_manager.h"
- #include "NativeAbility.h"
- #include "abilityms_slite_client.h"
- #include "element_name.h"
- #include "want.h"
- #include "msg_center.h"
- #include "msg_center_msg.h"
- #include "msg_center_protocol.h"
- #include "xiaodu_navi_vector.h"
- #include "baidumap.h"
- #include "common_def.h"
- #include "keyinput.h"
- #include "KeyInputListener.h"
- #include "VolumeSettingView.h"
- #include "VolumeSettingPresenter.h"
- #include "VolumeSettingView.h"
- 
- #define DIALDATASET 1
- 
- #ifdef SUPPORT_BLE_SERVICE
- #include "bleInstruct.h"
- #endif
- 
- #ifdef CUSTOM_ZHIHUI
- 
- #ifdef SUPPORT_CAT1_HFP_AG_SERV
- #include "phoneservice/include/PhoneAGService.h"
- #endif
- 
- #include "goal/include/goalmodel.h"
- #include "goal/include/goalview.h"
- #include "goal/include/goalother.h"
- 
- #include "ConfigModel.h"
- #include "PlayersModelC.h"
- #include "PlayersModel.h"
- 
- #include "main/include/PullUpDownView.h"
- 
- 
- #include "custom_save_runtime.h"
- #include "transmitting.h"
- #include "charge_notification.h"
- #include "motion_recognition_notification.h"
- #include "sedentaryReminder_notification.h"
- #include "findwatch_notification.h"
- #include "debug_output_notification/debug_output_notification.h"
- #include "pairing_notification.h"
- #include "phone_crt.h"
- #include "main/include/dial/DialModelChargeC.h"
- #include "saveele/include/SaveEleModel.h"
- #include "testchangingC.h"
- #include "custom_runtime.h"
- #include "message_notification.h"
- #include "goal_notification.h"
- #include "drinkReminder_notification.h"
- #include "sleep_notification.h"
- #include "sleep/include/SleepModel.h"
- #include "health/health_service/health_service.h"
- #include "player/include/PlayersModelC.h"
- #include "system/include/SystemLogModelC.h"
- 
- #include "bloodoxygen/include/BloodOxygenModel.h"
- #include "heartrate/include/HeartModel.h"
- #include "saveele/include/SaveEleModel.h"
- #include "respiratorytraining/include/RespiratoryTrainingModel.h"
- 
- #include "custom_utilscpp.h"
- #include "custom_utils.h"
- #ifdef SUPPORT_POWER_MANAGER
- #include "power_display_service.h"
- #endif
- #endif
- 
- #ifdef SUPPORT_CYWEE_SERVICE
- #include "cywee_hal.h"
- #include "cywee_data.h"
- #include "cywee_service.h"
- #endif
- 
- #ifdef SUPPORT_CAT1_SERVICE
- #include "cat1_pub_api.h"
- #endif
- #include "uiservice/include/ui_service.h"
- 
- #include "goal_notification.h"
- namespace OHOS {
- 
- #ifdef __cplusplus
- extern "C" {
- #endif  
- 
- /* 订阅事件设定优先级 */
- const PriorityMapper PRI_MAPPER[] = {
-     {TOPIC_EVENT_ALARM_RING, PRIORITY_ONE},
-     {TOPIC_EVENT_NEXTDAY_UPDATE, PRIORITY_TWO},
-     {TOPIC_EVENT_HFP_INCOMMING, PRIORITY_ONE},
-     {TOPIC_EVENT_HFP_FINISHED, PRIORITY_ONE},
-     {TOPIC_EVENT_HFP_PHONE_ACTIVE, PRIORITY_ONE},
-     {TOPIC_EVENT_HFP_WATCH_ACTIVE, PRIORITY_ONE},
-     {TOPIC_EVENT_HFP_WATCH_TO_PHONE, PRIORITY_ONE},
-     {TOPIC_EVENT_HFP_PHONE_TO_WATCH, PRIORITY_ONE},
-     
- #ifdef SUPPORT_CAT1_MODEM
-     {TOPIC_EVENT_CAT1_INCOMMING, PRIORITY_ONE},
-     {TOPIC_EVENT_CAT1_CALLCONNTED, PRIORITY_ONE},
-     {TOPIC_EVENT_CAT1_CALLENDED, PRIORITY_ONE},
-     {TOPIC_EVENT_CAT1_CALLDIAL,PRIORITY_ONE},
-     {TOPIC_EVENT_CAT1_SIGNAL_UPDATE, PRIORITY_ONE},
-     {TOPIC_EVENT_CAT1_POWER_ON, PRIORITY_ONE},
-     {TOPIC_EVENT_CAT1_POWER_OFF, PRIORITY_ONE},
-     {TOPIC_EVENT_CAT1_CALL_FAIL,PRIORITY_ONE},
-     {TOPIC_EVENT_HFP_HINT,PRIORITY_ONE},
- #endif
-     {TOPIC_EVENT_ON_TIME,PRIORITY_TWO},
- 
- #ifdef SUPPORT_CYWEE_SERVICE
-     // {TOPIC_EVENT_ACTIVITY_UPDATE,PRIORITY_TWO},
-     // {TOPIC_EVENT_ACTIVITY_EXTRA_INFO_UPDATE,PRIORITY_TWO},
-     {TOPIC_EVENT_AR_ALERT_TYPE_UPDATE,PRIORITY_TWO},
-     {TOPIC_EVENT_INACTIVITY_UPDATE,PRIORITY_TWO},
-     // {TOPIC_EVENT_INACTIVITY_ACCUMULATE_TIME_UPDATE,PRIORITY_TWO},
- #endif
-     {TOPIC_EVENT_GOAL_SHOW_VIEW,PRIORITY_TWO},
-     {TOPIC_EVENT_STEPDATA_UPDATE,PRIORITY_TWO},
- 
- 
-     {TOPIC_EVENT_BLE_TRAINING,PRIORITY_TWO},
-     {TOPIC_EVENT_BLE_TRANSMIT,PRIORITY_ONE},
- 
-     {TOPIC_EVENT_CHARGE_PLUG, PRIORITY_TWO},
-     {TOPIC_EVENT_CHARGE_UNPLUG, PRIORITY_TWO},
-     {TOPIC_EVENT_LOWPOWER_ALARM,PRIORITY_TWO},
- 
-     {TOPIC_EVENT_DEVICE_BIND, PRIORITY_ONE},
-     {TOPIC_EVENT_FIND_WATCH,PRIORITY_TWO},// 找手表 [2]
-     {TOPIC_EVENT_DRINKREMINDER,PRIORITY_TWO},//喝水提醒 [2]
-     {TOPIC_EVENT_MESSAGENOTE,PRIORITY_THREE},//消息提醒 [3]
-     {TOPIC_EVENT_MESSAGE_UPDATA,PRIORITY_TWO},//消息更新提醒 [3]
-     {TOPIC_EVENT_SLEEPNOTE,PRIORITY_THREE},//睡眠弹窗 [3]
-     {TOPIC_EVENT_DEBUGOUTPUT,PRIORITY_ONE},//开发调试专用窗口
-     {TOPIC_EVENT_SHUTDOWN_ANIMATIOR,PRIORITY_ONE},//关机动画
- };
- 
- bool g_pressFlag = false;
- bool g_longPressFlag = false;
- 
- static bool CheckPriority(const Topic topic)
- {
-     uint16_t mapperSize = sizeof(PRI_MAPPER) / sizeof(PRI_MAPPER[0]);
-     for (uint16_t i = 0; i < mapperSize; i++) {
-         if (topic == PRI_MAPPER[i].topicId) {
-             if (PRI_MAPPER[i].prId <= OHOS::NativeAbility::GetInstance().GetCurSlicePriority() &&
-                 PRI_MAPPER[i].prId <= OHOS::NotificationManager::GetInstance()->GetNotifyPriority()) {
-                 return true;
-             } else {
-                 return false;
-             }
-         }
-     }
-     return false;
- }
- 
- /* 订阅事件可定制 */
- void MsgCenterSubscribe()
- {
-     MsgCenterSubscribeTopic(TOPIC_EVENT_ALARM_RING);
-     MsgCenterSubscribeTopic(TOPIC_EVENT_NEXTDAY_UPDATE);
-     MsgCenterSubscribeTopic(TOPIC_EVENT_ON_TIME);
-     MsgCenterSubscribeTopic(TOPIC_EVENT_STEPDATA_UPDATE);
-     MsgCenterSubscribeTopic(TOPIC_EVENT_HFP_INCOMMING);
-     MsgCenterSubscribeTopic(TOPIC_EVENT_HFP_PHONE_ACTIVE);
-     MsgCenterSubscribeTopic(TOPIC_EVENT_HFP_WATCH_ACTIVE);
-     MsgCenterSubscribeTopic(TOPIC_EVENT_HFP_FINISHED);
-     MsgCenterSubscribeTopic(TOPIC_EVENT_HFP_PHONE_TO_WATCH);
-     MsgCenterSubscribeTopic(TOPIC_EVENT_HFP_WATCH_TO_PHONE);
-     MsgCenterSubscribeTopic(TOPIC_EVENT_HFP_HINT);
-     // MsgCenterSubscribeTopic(TOPIC_EVENT_ACTIVITY_UPDATE);
-     // MsgCenterSubscribeTopic(TOPIC_EVENT_ACTIVITY_EXTRA_INFO_UPDATE);
-     MsgCenterSubscribeTopic(TOPIC_EVENT_AR_ALERT_TYPE_UPDATE);
-     MsgCenterSubscribeTopic(TOPIC_EVENT_INACTIVITY_UPDATE);
-     // MsgCenterSubscribeTopic(TOPIC_EVENT_INACTIVITY_ACCUMULATE_TIME_UPDATE);
-     MsgCenterSubscribeTopic(TOPIC_EVENT_BLE_TRAINING);
-     MsgCenterSubscribeTopic(TOPIC_EVENT_BLE_TRANSMIT);
-     MsgCenterSubscribeTopic(TOPIC_EVENT_GOAL_SHOW_VIEW);
-     MsgCenterSubscribeTopic(TOPIC_EVENT_CHARGE_PLUG);
-     MsgCenterSubscribeTopic(TOPIC_EVENT_CHARGE_UNPLUG);
-     MsgCenterSubscribeTopic(TOPIC_EVENT_LOWPOWER_ALARM);
- #ifdef SUPPORT_CAT1_MODEM
-     MsgCenterSubscribeTopic(TOPIC_EVENT_CAT1_INCOMMING);
-     MsgCenterSubscribeTopic(TOPIC_EVENT_CAT1_CALLCONNTED);
-     MsgCenterSubscribeTopic(TOPIC_EVENT_CAT1_CALLENDED);
-     MsgCenterSubscribeTopic(TOPIC_EVENT_CAT1_CALLDIAL);
-     // MsgCenterSubscribeTopic(TOPIC_EVENT_CAT1_SIGNAL_UPDATE);
-     // MsgCenterSubscribeTopic(TOPIC_EVENT_CAT1_POWER_ON);
-     // MsgCenterSubscribeTopic(TOPIC_EVENT_CAT1_POWER_OFF);
-     MsgCenterSubscribeTopic(TOPIC_EVENT_CAT1_CALL_FAIL);
+* Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved.
+* Description: broadcast feature implement
+* Author: CompanyName
+* Create: 2021-11-11
+*/
+
+#include <cstdio>
+#include "securec.h"
+#include "adapter.h"
+#include "ohos_init.h"
+#include "samgr_lite.h"
+#include "memory_adapter.h"
+#include "wearable_log.h"
+#include "service_id_define.h"
+#include "broadcast_service.h"
+#include "alarm/include/AlarmClockModel.h"
+#include "AlarmPopUpPresenter.h"
+#include "CallerLogModel.h"
+#include "notification_manager.h"
+#include "NativeAbility.h"
+#include "abilityms_slite_client.h"
+#include "element_name.h"
+#include "want.h"
+#include "msg_center.h"
+#include "msg_center_msg.h"
+#include "msg_center_protocol.h"
+#include "xiaodu_navi_vector.h"
+#include "baidumap.h"
+#include "common_def.h"
+#include "keyinput.h"
+#include "KeyInputListener.h"
+#include "VolumeSettingView.h"
+#include "VolumeSettingPresenter.h"
+#include "VolumeSettingView.h"
+
+#define DIALDATASET 1
+
+#ifdef SUPPORT_BLE_SERVICE
+#include "bleInstruct.h"
+#endif
+
+#ifdef CUSTOM_ZHIHUI
+
+#ifdef SUPPORT_CAT1_HFP_AG_SERV
+#include "phoneservice/include/PhoneAGService.h"
+#endif
+
+#include "goal/include/goalmodel.h"
+#include "goal/include/goalview.h"
+#include "goal/include/goalother.h"
+
+#include "ConfigModel.h"
+#include "PlayersModelC.h"
+#include "PlayersModel.h"
+
+#include "main/include/PullUpDownView.h"
+
+
+#include "custom_save_runtime.h"
+#include "transmitting.h"
+#include "charge_notification.h"
+#include "motion_recognition_notification.h"
+#include "sedentaryReminder_notification.h"
+#include "findwatch_notification.h"
+#include "debug_output_notification/debug_output_notification.h"
+#include "pairing_notification.h"
+#include "phone_crt.h"
+#include "main/include/dial/DialModelChargeC.h"
+#include "saveele/include/SaveEleModel.h"
+#include "testchangingC.h"
+#include "custom_runtime.h"
+#include "message_notification.h"
+#include "goal_notification.h"
+#include "drinkReminder_notification.h"
+#include "sleep_notification.h"
+#include "sleep/include/SleepModel.h"
+#include "health/health_service/health_service.h"
+#include "player/include/PlayersModelC.h"
+#include "system/include/SystemLogModelC.h"
+
+#include "bloodoxygen/include/BloodOxygenModel.h"
+#include "heartrate/include/HeartModel.h"
+#include "saveele/include/SaveEleModel.h"
+#include "respiratorytraining/include/RespiratoryTrainingModel.h"
+
+#include "custom_utilscpp.h"
+#include "custom_utils.h"
+#ifdef SUPPORT_POWER_MANAGER
+#include "power_display_service.h"
+#endif
+#endif
+
+#ifdef SUPPORT_CYWEE_SERVICE
+#include "cywee_hal.h"
+#include "cywee_data.h"
+#include "cywee_service.h"
+#endif
+
+#ifdef SUPPORT_CAT1_SERVICE
+#include "cat1_pub_api.h"
+#endif
+#include "uiservice/include/ui_service.h"
+
+#include "goal_notification.h"
+namespace OHOS {
+
+#ifdef __cplusplus
+extern "C" {
+#endif  
+
+/* 订阅事件设定优先级 */
+const PriorityMapper PRI_MAPPER[] = {
+    {TOPIC_EVENT_ALARM_RING, PRIORITY_ONE},
+    {TOPIC_EVENT_NEXTDAY_UPDATE, PRIORITY_TWO},
+    {TOPIC_EVENT_HFP_INCOMMING, PRIORITY_ONE},
+    {TOPIC_EVENT_HFP_FINISHED, PRIORITY_ONE},
+    {TOPIC_EVENT_HFP_PHONE_ACTIVE, PRIORITY_ONE},
+    {TOPIC_EVENT_HFP_WATCH_ACTIVE, PRIORITY_ONE},
+    {TOPIC_EVENT_HFP_WATCH_TO_PHONE, PRIORITY_ONE},
+    {TOPIC_EVENT_HFP_PHONE_TO_WATCH, PRIORITY_ONE},
     
- #endif
-     MsgCenterSubscribeTopic(TOPIC_EVENT_DEVICE_BIND); 
-     MsgCenterSubscribeTopic(TOPIC_EVENT_FIND_WATCH);
-     MsgCenterSubscribeTopic(TOPIC_EVENT_DRINKREMINDER);
-     MsgCenterSubscribeTopic(TOPIC_EVENT_MESSAGENOTE);
-     MsgCenterSubscribeTopic(TOPIC_EVENT_SLEEPNOTE);
-     MsgCenterSubscribeTopic(TOPIC_EVENT_DEBUGOUTPUT);
-     MsgCenterSubscribeTopic(TOPIC_EVENT_SHUTDOWN_ANIMATIOR);
- }
- 
- static OHOS::UIViewGroup* ShowGoalNotify(void)
- {
-     return OHOS::GoalviewShow();
- }
- 
- static OHOS::UIViewGroup* ShowAlarmNotify(void)
- {
-     return OHOS::CreateAlarmView();
- }
- 
- static OHOS::UIViewGroup* ShowPhoneCallNotify(void)
- {
-     return OHOS::CreatePhoneCallView();
- }
- 
- static OHOS::UIViewGroup* ShowCallingNotify(void)
- {
-     return OHOS::CreateCallingView();
- }
- 
- static OHOS::UIViewGroup* ShowMultiPhoneCallNotify(void)
- {
-     return OHOS::CreateMultiplePhoneView();
- }
- 
- 
- /*显示绑定通知*/
- static OHOS::UIViewGroup* showDeviceBindingNotify(void)
- {
-     return OHOS::CreateDeviceBindingView();
- }
- 
- /*显示解绑通知*/
- static OHOS::UIViewGroup* showDeviceUnBindingNotify(void)
- {
-     return OHOS::CreateDeviceUnBindingView();
- }
- 
- /*显示解除绑定请求(与新设备连接)通知*/
- static OHOS::UIViewGroup* showDeviceUnbindingRequestNotify(void)
- {
-     return OHOS::CreateDeviceUnbindingRequestGroupView();
- }
- 
- /*显示低电量通知*/
- static OHOS::UIViewGroup* showlowpowerNotify(void)
- {
-     return OHOS::lowPowerShow();
- }
- 
- static OHOS::UIViewGroup* ShowChargeingNotify(void)
- {
-     return OHOS::ShowChargeingView();
- }
- 
- 
- static OHOS::UIViewGroup* showFindWatchNotify(void)
- {
-     return OHOS::CreateFindWatchView();
- }
- 
- /*显示喝水提醒视图*/
- static OHOS::UIViewGroup* showDrinkReminderNotify(void)
- {
-     return OHOS::CreateDrinkReminderView();
- }
- 
- /*显示久坐提醒视图*/
- static OHOS::UIViewGroup* showSedentaryReminderNotify(void)
- {
-     return OHOS::CreateSedentaryReminderView();
- }
- 
- /*显示运动识别视图*/
- static OHOS::UIViewGroup* showMotionRecognitionNotify(void)
- {
-     return OHOS::CreateMotionRecognitionView();
- }
- 
- /*显示传输中*/
- static OHOS::UIViewGroup* showtransmitNotify(void)
- {
-     return OHOS::transmittingShow();
- }
- 
- //关机动画
- static OHOS::UIViewGroup* showShutdownAnimatorNotify(void)
- {
-     return OHOS::showShutDownAnimation();
- }
- //无法呼叫sos
- static OHOS::UIViewGroup* showSOSNotify(void)
- {
-     return OHOS::SOS_cant_dial();
- }
- 
- /*显示消息提醒*/
- static OHOS::UIViewGroup *showMessageNotify(void) {
-     OHOS::UIViewGroup *view = OHOS::CreateMessageView();
-     printf("showMessageNotify %p",view);
-     return view;
- }
- /*显示睡眠提醒*/
- static OHOS::UIViewGroup* showSleepNotify(void)
- {
-     return OHOS::CreateSleepNotifyView();
- }
- 
- //显示新来电
- static OHOS::UIViewGroup* showcallhintNotify(void)
- {
-     return OHOS::CALL_INCOMING_HINT();
- }
- 
- static OHOS::UIViewGroup* showDebugOutputNotify(void)
- {
-     return OHOS::CreateDebugOutputMainView();
- }
- 
- 
- static OHOS::UIViewGroup* showcallfailNotify(void)
- {
-     return OHOS::CALL_FAIL_HINT();
- }
- 
- static OHOS::UIViewGroup* showCat1UpdataNotify(void)
- {
-     // return OHOS::Cat1PythonUpdataShow();
- }
- 
- 
- void MsgCenterNotifyAlarmProc(const Topic topic, Request* req)
- {
-     unused(req);
-     // The alarm notification is not displayed if the incoming call notification is already being processed
-     if (CheckPriority(topic)) {
-         // AlarmClockModel::GetInstance()->PopInterPlayMusic();
-         // AlarmViewEventListener::GetInstance()->PopAlarmRing();
-         NotificationManager::GetInstance()->SetNotifyPriority(PRIORITY_ONE);
-         NotificationManager::GetInstance()->ShowNotify(ShowAlarmNotify, static_cast<uint16_t>(topic), true);
-     } else {
-         // just delay the alarm
-         WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "just delay the alarm");
-         // AlarmClockModel::GetInstance()->AlarmGetClockNum();
-         // AlarmPopUpPresenter::GetInstance()->DelayAlarmRing();
-         AlarmViewEventListener::GetInstance()->DelayAlarmRing();
-     }
- }
- /*NextDay*/
- void MsgCenterNotifyNextDayProc(const Topic topic, Request *req)
- {
-     unused(topic);
-     unused(req);
-     AlarmClockModel::GetInstance()->NextDayNotify();
-     // current_year = 0;
-     printf("******nextday is begin******\r\n");
-     // 存储nextday执行日志
-     start_report_nextday_log_start();
-     /* ----------------------------------- 睡眠相关 ----------------------------------- */
-     if (!ConfigModel::GetInstance()->get_configData_int(OHOS::ConfigModel::CONFIGMODEL_ITEM_SLEEP))
-     {
-         // 未设置睡眠监控 nextday进行清除睡眠数据。
-         SleepModel::GetInstance().DeleteSleepData();
-         // 通知UI更新
-         GraphicService::GetInstance()->PostGraphicEvent(
-             std::bind(&OHOS::SleepModel::UpdateSleepView, &OHOS::SleepModel::GetInstance()));
-     }
-     printf("sleep end\n");
-     /* ---------------------------------- 健康数据相关 ---------------------------------- */
-     // 清空当日的心率血氧数据
-     HealthService::GetInstance()->CleanHealthData();
-     // 通知UI更新
-     GraphicService::GetInstance()->PostGraphicEvent(
-         std::bind(&OHOS::HeartModel::CleanAllData, OHOS::HeartModel::GetInstance()));
-     GraphicService::GetInstance()->PostGraphicEvent(
-         std::bind(&OHOS::BloodOxygenModel::CleanAllData,
-                   OHOS::BloodOxygenModel::GetInstance()));
-     printf("health end\n");
-     /* ---------------------------------- 呼吸训练相关 ---------------------------------- */
-     RespiratoryTrainingModel::GetInstance().ClearTotalRespiratoryTrainingTime();
- 
-     // 存储nextday执行日志
-     start_report_nextday_log_end();
-     // 清除popup_windows日志
-     nextday_clear_popup_windows_log();
- 
-     printf("******nextday is end******\r\n");
- #ifdef SUPPORT_CYWEE_SERVICE
-     /* --------------------------------- 每日目标相关 --------------------------------- */
-     cywee_reset_history_daily_data(); //清除运动相关数据
- 
-     // 午夜清除运动数据
-     for(int i=1;i<6;i++)
-     {
-         set_Is_show_flag(1,i);
-     }
+#ifdef SUPPORT_CAT1_MODEM
+    {TOPIC_EVENT_CAT1_INCOMMING, PRIORITY_ONE},
+    {TOPIC_EVENT_CAT1_CALLCONNTED, PRIORITY_ONE},
+    {TOPIC_EVENT_CAT1_CALLENDED, PRIORITY_ONE},
+    {TOPIC_EVENT_CAT1_CALLDIAL,PRIORITY_ONE},
+    {TOPIC_EVENT_CAT1_SIGNAL_UPDATE, PRIORITY_ONE},
+    {TOPIC_EVENT_CAT1_POWER_ON, PRIORITY_ONE},
+    {TOPIC_EVENT_CAT1_POWER_OFF, PRIORITY_ONE},
+    {TOPIC_EVENT_CAT1_CALL_FAIL,PRIORITY_ONE},
+    {TOPIC_EVENT_HFP_HINT,PRIORITY_ONE},
+#endif
+    {TOPIC_EVENT_ON_TIME,PRIORITY_TWO},
+
+#ifdef SUPPORT_CYWEE_SERVICE
+    // {TOPIC_EVENT_ACTIVITY_UPDATE,PRIORITY_TWO},
+    // {TOPIC_EVENT_ACTIVITY_EXTRA_INFO_UPDATE,PRIORITY_TWO},
+    {TOPIC_EVENT_AR_ALERT_TYPE_UPDATE,PRIORITY_TWO},
+    {TOPIC_EVENT_INACTIVITY_UPDATE,PRIORITY_TWO},
+    // {TOPIC_EVENT_INACTIVITY_ACCUMULATE_TIME_UPDATE,PRIORITY_TWO},
+#endif
+    {TOPIC_EVENT_GOAL_SHOW_VIEW,PRIORITY_TWO},
+    {TOPIC_EVENT_STEPDATA_UPDATE,PRIORITY_TWO},
+
+
+    {TOPIC_EVENT_BLE_TRAINING,PRIORITY_TWO},
+    {TOPIC_EVENT_BLE_TRANSMIT,PRIORITY_ONE},
+
+    {TOPIC_EVENT_CHARGE_PLUG, PRIORITY_TWO},
+    {TOPIC_EVENT_CHARGE_UNPLUG, PRIORITY_TWO},
+    {TOPIC_EVENT_LOWPOWER_ALARM,PRIORITY_TWO},
+
+    {TOPIC_EVENT_DEVICE_BIND, PRIORITY_ONE},
+    {TOPIC_EVENT_FIND_WATCH,PRIORITY_TWO},// 找手表 [2]
+    {TOPIC_EVENT_DRINKREMINDER,PRIORITY_TWO},//喝水提醒 [2]
+    {TOPIC_EVENT_MESSAGENOTE,PRIORITY_THREE},//消息提醒 [3]
+    {TOPIC_EVENT_MESSAGE_UPDATA,PRIORITY_TWO},//消息更新提醒 [3]
+    {TOPIC_EVENT_SLEEPNOTE,PRIORITY_THREE},//睡眠弹窗 [3]
+    {TOPIC_EVENT_DEBUGOUTPUT,PRIORITY_ONE},//开发调试专用窗口
+    {TOPIC_EVENT_SHUTDOWN_ANIMATIOR,PRIORITY_ONE},//关机动画
+};
+
+bool g_pressFlag = false;
+bool g_longPressFlag = false;
+
+static bool CheckPriority(const Topic topic)
+{
+    uint16_t mapperSize = sizeof(PRI_MAPPER) / sizeof(PRI_MAPPER[0]);
+    for (uint16_t i = 0; i < mapperSize; i++) {
+        if (topic == PRI_MAPPER[i].topicId) {
+            if (PRI_MAPPER[i].prId <= OHOS::NativeAbility::GetInstance().GetCurSlicePriority() &&
+                PRI_MAPPER[i].prId <= OHOS::NotificationManager::GetInstance()->GetNotifyPriority()) {
+                return true;
+            } else {
+                return false;
+            }
+        }
+    }
+    return false;
+}
+
+/* 订阅事件可定制 */
+void MsgCenterSubscribe()
+{
+    MsgCenterSubscribeTopic(TOPIC_EVENT_ALARM_RING);
+    MsgCenterSubscribeTopic(TOPIC_EVENT_NEXTDAY_UPDATE);
+    MsgCenterSubscribeTopic(TOPIC_EVENT_ON_TIME);
+    MsgCenterSubscribeTopic(TOPIC_EVENT_STEPDATA_UPDATE);
+    MsgCenterSubscribeTopic(TOPIC_EVENT_HFP_INCOMMING);
+    MsgCenterSubscribeTopic(TOPIC_EVENT_HFP_PHONE_ACTIVE);
+    MsgCenterSubscribeTopic(TOPIC_EVENT_HFP_WATCH_ACTIVE);
+    MsgCenterSubscribeTopic(TOPIC_EVENT_HFP_FINISHED);
+    MsgCenterSubscribeTopic(TOPIC_EVENT_HFP_PHONE_TO_WATCH);
+    MsgCenterSubscribeTopic(TOPIC_EVENT_HFP_WATCH_TO_PHONE);
+    MsgCenterSubscribeTopic(TOPIC_EVENT_HFP_HINT);
+    // MsgCenterSubscribeTopic(TOPIC_EVENT_ACTIVITY_UPDATE);
+    // MsgCenterSubscribeTopic(TOPIC_EVENT_ACTIVITY_EXTRA_INFO_UPDATE);
+    MsgCenterSubscribeTopic(TOPIC_EVENT_AR_ALERT_TYPE_UPDATE);
+    MsgCenterSubscribeTopic(TOPIC_EVENT_INACTIVITY_UPDATE);
+    // MsgCenterSubscribeTopic(TOPIC_EVENT_INACTIVITY_ACCUMULATE_TIME_UPDATE);
+    MsgCenterSubscribeTopic(TOPIC_EVENT_BLE_TRAINING);
+    MsgCenterSubscribeTopic(TOPIC_EVENT_BLE_TRANSMIT);
+    MsgCenterSubscribeTopic(TOPIC_EVENT_GOAL_SHOW_VIEW);
+    MsgCenterSubscribeTopic(TOPIC_EVENT_CHARGE_PLUG);
+    MsgCenterSubscribeTopic(TOPIC_EVENT_CHARGE_UNPLUG);
+    MsgCenterSubscribeTopic(TOPIC_EVENT_LOWPOWER_ALARM);
+#ifdef SUPPORT_CAT1_MODEM
+    MsgCenterSubscribeTopic(TOPIC_EVENT_CAT1_INCOMMING);
+    MsgCenterSubscribeTopic(TOPIC_EVENT_CAT1_CALLCONNTED);
+    MsgCenterSubscribeTopic(TOPIC_EVENT_CAT1_CALLENDED);
+    MsgCenterSubscribeTopic(TOPIC_EVENT_CAT1_CALLDIAL);
+    // MsgCenterSubscribeTopic(TOPIC_EVENT_CAT1_SIGNAL_UPDATE);
+    // MsgCenterSubscribeTopic(TOPIC_EVENT_CAT1_POWER_ON);
+    // MsgCenterSubscribeTopic(TOPIC_EVENT_CAT1_POWER_OFF);
+    MsgCenterSubscribeTopic(TOPIC_EVENT_CAT1_CALL_FAIL);
+
+#endif
+    MsgCenterSubscribeTopic(TOPIC_EVENT_DEVICE_BIND); 
+    MsgCenterSubscribeTopic(TOPIC_EVENT_FIND_WATCH);
+    MsgCenterSubscribeTopic(TOPIC_EVENT_DRINKREMINDER);
+    MsgCenterSubscribeTopic(TOPIC_EVENT_MESSAGENOTE);
+    MsgCenterSubscribeTopic(TOPIC_EVENT_SLEEPNOTE);
+    MsgCenterSubscribeTopic(TOPIC_EVENT_DEBUGOUTPUT);
+    MsgCenterSubscribeTopic(TOPIC_EVENT_SHUTDOWN_ANIMATIOR);
+}
+
+static OHOS::UIViewGroup* ShowGoalNotify(void)
+{
+    return OHOS::GoalviewShow();
+}
+
+static OHOS::UIViewGroup* ShowAlarmNotify(void)
+{
+    return OHOS::CreateAlarmView();
+}
+
+static OHOS::UIViewGroup* ShowCallingNotify(void)
+{
+    //  return OHOS::CreateCallingView();
+    return nullptr;
+}
+
+static OHOS::UIViewGroup* ShowMultiPhoneCallNotify(void)
+{
+    // return OHOS::CreateMultiplePhoneView();
+    return nullptr;
+}
+
+
+/*显示绑定通知*/
+static OHOS::UIViewGroup* showDeviceBindingNotify(void)
+{
+    return OHOS::CreateDeviceBindingView();
+}
+
+/*显示解绑通知*/
+static OHOS::UIViewGroup* showDeviceUnBindingNotify(void)
+{
+    return OHOS::CreateDeviceUnBindingView();
+}
+
+/*显示解除绑定请求(与新设备连接)通知*/
+static OHOS::UIViewGroup* showDeviceUnbindingRequestNotify(void)
+{
+    return OHOS::CreateDeviceUnbindingRequestGroupView();
+}
+
+/*显示低电量通知*/
+static OHOS::UIViewGroup* showlowpowerNotify(void)
+{
+    return OHOS::lowPowerShow();
+}
+
+static OHOS::UIViewGroup* ShowChargeingNotify(void)
+{
+    return OHOS::ShowChargeingView();
+}
+
+
+static OHOS::UIViewGroup* showFindWatchNotify(void)
+{
+    return OHOS::CreateFindWatchView();
+}
+
+/*显示喝水提醒视图*/
+static OHOS::UIViewGroup* showDrinkReminderNotify(void)
+{
+    return OHOS::CreateDrinkReminderView();
+}
+
+/*显示久坐提醒视图*/
+static OHOS::UIViewGroup* showSedentaryReminderNotify(void)
+{
+    return OHOS::CreateSedentaryReminderView();
+}
+
+/*显示运动识别视图*/
+static OHOS::UIViewGroup* showMotionRecognitionNotify(void)
+{
+    return OHOS::CreateMotionRecognitionView();
+}
+
+/*显示传输中*/
+static OHOS::UIViewGroup* showtransmitNotify(void)
+{
+    return OHOS::transmittingShow();
+}
+
+//关机动画
+static OHOS::UIViewGroup* showShutdownAnimatorNotify(void)
+{
+    return OHOS::showShutDownAnimation();
+}
+//无法呼叫sos
+static OHOS::UIViewGroup* showSOSNotify(void)
+{
+    return OHOS::SOS_cant_dial();
+}
+
+/*显示消息提醒*/
+static OHOS::UIViewGroup *showMessageNotify(void) {
+    OHOS::UIViewGroup *view = OHOS::CreateMessageView();
+    printf("showMessageNotify %p",view);
+    return view;
+}
+/*显示睡眠提醒*/
+static OHOS::UIViewGroup* showSleepNotify(void)
+{
+    return OHOS::CreateSleepNotifyView();
+}
+
+//显示新来电
+static OHOS::UIViewGroup* showcallhintNotify(void)
+{
+    return OHOS::CALL_INCOMING_HINT();
+}
+
+static OHOS::UIViewGroup* showDebugOutputNotify(void)
+{
+    return OHOS::CreateDebugOutputMainView();
+}
+
+
+static OHOS::UIViewGroup* showcallfailNotify(void)
+{
+    return OHOS::CALL_FAIL_HINT();
+}
+
+static OHOS::UIViewGroup* showCat1UpdataNotify(void)
+{
+    // return OHOS::Cat1PythonUpdataShow();
+}
+
+
+void MsgCenterNotifyAlarmProc(const Topic topic, Request* req)
+{
+    unused(req);
+    // The alarm notification is not displayed if the incoming call notification is already being processed
+    if (CheckPriority(topic)) {
+        // AlarmClockModel::GetInstance()->PopInterPlayMusic();
+        // AlarmViewEventListener::GetInstance()->PopAlarmRing();
+        NotificationManager::GetInstance()->SetNotifyPriority(PRIORITY_ONE);
+        NotificationManager::GetInstance()->ShowNotify(ShowAlarmNotify, static_cast<uint16_t>(topic), true);
+    } else {
+        // just delay the alarm
+        WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "just delay the alarm");
+        // AlarmClockModel::GetInstance()->AlarmGetClockNum();
+        // AlarmPopUpPresenter::GetInstance()->DelayAlarmRing();
+        AlarmViewEventListener::GetInstance()->DelayAlarmRing();
+    }
+}
+/*NextDay*/
+void MsgCenterNotifyNextDayProc(const Topic topic, Request *req)
+{
+    unused(topic);
+    unused(req);
+    AlarmClockModel::GetInstance()->NextDayNotify();
+    // current_year = 0;
+    printf("******nextday is begin******\r\n");
+    // 存储nextday执行日志
+    start_report_nextday_log_start();
+    /* ----------------------------------- 睡眠相关 ----------------------------------- */
+    if (!ConfigModel::GetInstance()->get_configData_int(OHOS::ConfigModel::CONFIGMODEL_ITEM_SLEEP))
+    {
+        // 未设置睡眠监控 nextday进行清除睡眠数据。
+        SleepModel::GetInstance().DeleteSleepData();
+        // 通知UI更新
+        GraphicService::GetInstance()->PostGraphicEvent(
+            std::bind(&OHOS::SleepModel::UpdateSleepView, &OHOS::SleepModel::GetInstance()));
+    }
+    printf("sleep end\n");
+    /* ---------------------------------- 健康数据相关 ---------------------------------- */
+    // 清空当日的心率血氧数据
+    HealthService::GetInstance()->CleanHealthData();
+    // 通知UI更新
+    GraphicService::GetInstance()->PostGraphicEvent(
+        std::bind(&OHOS::HeartModel::CleanAllData, OHOS::HeartModel::GetInstance()));
+    GraphicService::GetInstance()->PostGraphicEvent(
+        std::bind(&OHOS::BloodOxygenModel::CleanAllData,
+                OHOS::BloodOxygenModel::GetInstance()));
+    printf("health end\n");
+    /* ---------------------------------- 呼吸训练相关 ---------------------------------- */
+    RespiratoryTrainingModel::GetInstance().ClearTotalRespiratoryTrainingTime();
+
+    // 存储nextday执行日志
+    start_report_nextday_log_end();
+    // 清除popup_windows日志
+    nextday_clear_popup_windows_log();
+
+    printf("******nextday is end******\r\n");
+#ifdef SUPPORT_CYWEE_SERVICE
+    /* --------------------------------- 每日目标相关 --------------------------------- */
+    cywee_reset_history_daily_data(); //清除运动相关数据
+
+    // 午夜清除运动数据
+    for(int i=1;i<6;i++)
+    {
+        set_Is_show_flag(1,i);
+    }
+
+    do_cywee_service_check_msg(CYWEE_SERVICE_CMD_RESET_DAILY_DATA, NULL);
+
+    SendMsgToUIService(UI_UPDATE_GOAL, 0, nullptr, 0);
+    printf("sport end\n");
+#endif
+
+}
+void MsgCenterNotifyONtimeProc(const Topic topic, Request* req)
+{
+    unused(req);
+    AlarmClockEventData* time=(AlarmClockEventData*)req->data;
+    #ifdef SUPPORT_CYWEE_SERVICE
+
+    cywee_save_data(); //暂时没有这个函数
+
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "保存每小时步数");
+    cywee_step_history_save(time->value);
+
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "保存每小时站立数据");
+    if(cywee_get_stand_flag())
+    cywee_stand_history_save(time->value);
+
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "保存每小时卡路里数据");
+    cywee_calories_history_save(time->value); 
+
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "保存每小时距离数据");
+    cywee_distances_history_save(time->value);
+
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "保存每小时燃脂数据");
+    cywee_fat_history_save(time->value);
+    // 保存完增加一次读取数据
+    SendMsgToUIService(UI_UPDATE_GOAL, 0, nullptr, 0);
+#endif
+    }
+//设备绑定通知
+void MsgCenterNotifyDeviceBindProc(const Topic topic, Request* req)
+{
+    #ifdef SUPPORT_BLE_SERVICE
+    //unused(req);
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "MsgCenterNotifyBindProc Bind!");
+    // const power_display_svr_api_t *display_api = power_display_svr_get_api();
+    // if (display_api->get_screen_state() != SCREEN_ON)
+    // {
+    //     display_api->turn_on_screen();
+    // }
+    uint8_t* data=(uint8_t*)req->data;
+    /* 安全:固定上限 + 显式终止 */
+    const size_t kMaxDevName = 64;
+    char devname[kMaxDevName + 1] = {0};
+    if (data != NULL && req->len >= 2)
+    {
+        switch(data[0])
+        {
+            case DEVICEBIND:
+                NotificationManager::GetInstance()->SetNotifyPriority(PRIORITY_ONE);
+                {
+                    /* 设备名在 payload[2..],长度为 req->len-2,做边界裁剪并追加'\0' */
+                    size_t name_len = (req->len > 2) ? (size_t)req->len - 2 : 0;
+                    if (name_len > 0)
+                    {
+                        size_t copy_len = (name_len > kMaxDevName) ? kMaxDevName : name_len;
+                        (void)memcpy_s(devname, sizeof(devname), (const char*)req->data + 2, copy_len);
+                        devname[copy_len] = '\0';
+                        PairingViewEventListener::GetInstance().SetDeviceName(devname);
+                    }
+                    else
+                    {
+                        PairingViewEventListener::GetInstance().SetDeviceName(NULL);
+                    }
+                }
+                if(NotificationManager::GetInstance()->HasNotifyShowing())
+                {
+                    NotificationManager::GetInstance()->StopNotify();
+                }
+                NotificationManager::GetInstance()->ShowNotify(showDeviceBindingNotify, (uint16_t)topic, true);
+                break;
+            case DEVICEUNBIND:
+                
+                NotificationManager::GetInstance()->SetNotifyPriority(PRIORITY_ONE);
+                {
+                    size_t name_len = (req->len > 2) ? (size_t)req->len - 2 : 0;
+                    if (name_len > 0)
+                    {
+                        size_t copy_len = (name_len > kMaxDevName) ? kMaxDevName : name_len;
+                        (void)memcpy_s(devname, sizeof(devname), (const char*)req->data + 2, copy_len);
+                        devname[copy_len] = '\0';
+                        PairingViewEventListener::GetInstance().SetDeviceName(devname);
+                    }
+                    else
+                    {
+                        PairingViewEventListener::GetInstance().SetDeviceName(NULL);
+                    }
+                }
+                NotificationManager::GetInstance()->ShowNotify(showDeviceUnBindingNotify, (uint16_t)topic, true);
+                break;
+            case DeviceUnBindingRequest:
+                NotificationManager::GetInstance()->SetNotifyPriority(PRIORITY_TWO);
+                NotificationManager::GetInstance()->ShowNotify(showDeviceUnbindingRequestNotify, (uint16_t)topic, true);
+                break;
+            case SHUTDOWN:
+                WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, " SHUTDOWN");
+                set_lowpower_falg(3);
+                if (NotificationManager::GetInstance()->HasNotifyShowing())
+                NotificationManager::GetInstance()->StopNotify();
+
+                NotificationManager::GetInstance()->SetNotifyPriority(PRIORITY_TWO);
+
+                NotificationManager::GetInstance()->ShowNotify(showlowpowerNotify, (uint16_t)topic, true);
+                //low_power_play(true);
+                break;
+            case REBOOT:
+                set_lowpower_falg(4);
+                if (NotificationManager::GetInstance()->HasNotifyShowing())
+                NotificationManager::GetInstance()->StopNotify();
+
+                NotificationManager::GetInstance()->SetNotifyPriority(PRIORITY_TWO);
+                NotificationManager::GetInstance()->ShowNotify(showlowpowerNotify, (uint16_t)topic, true);
+                //low_power_play(false);
+                break;
+
+            default:
+                break;
+        }
+    
+    }
+    #endif
+}
+
+
+
+void MsgCenterNotifybleTransmit(const Topic topic, Request* req)
+{
+#ifdef SUPPORT_BLE_SERVICE
+unused(topic);
+uint8_t* data=(uint8_t*)req->data;
+WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "MsgCenterNotifybleTransmit:%d",data[0]);
+
+
+if(data[0]==TRANS_FREE)
+{
+    if(transmittingISShow())
+    NotificationManager::GetInstance()->StopNotify();
+}
+else if (data[0]==IS_NEED_CAT1_OTA)
+{
+
+    NotificationManager::GetInstance()->SetNotifyPriority(PRIORITY_ONE);
+
+    // NotificationManager::GetInstance()->ShowNotify(showCat1UpdataNotify, (uint16_t)topic, true);
+}
+else if (data[0]==FILE_IS_DONE)
+{
+    set_transmittingShow_falg(data[0]);
+}
+else
+{
+    set_transmittingShow_falg(data[0]);
+    
+    NotificationManager::GetInstance()->SetNotifyPriority(PRIORITY_ONE);
+
+    NotificationManager::GetInstance()->ShowNotify(showtransmitNotify, (uint16_t)topic, true);
+}
+#endif
+}
+
+void MsgCenterNotifyChargePlugProc(const Topic topic, Request* req)
+{
+    #ifdef SUPPORT_BATTERY_SERVICE
+    unused(req);
+    WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "MsgCenterNotifyProc:: CHarger Plug !");
+#ifdef SYSTEM_LOG_SERVICE
+    uapi_save_runtime_log(RUNTIME_LOG_CHARGE_START);//充电开始事件
+#endif
+    const power_display_svr_api_t *display_api = power_display_svr_get_api();
+    if (display_api->get_screen_state() != SCREEN_ON)
+    {
+        display_api->turn_on_screen();
+    }
+
+    if(PullUpDownView::GetInstance())
+    {
+        GraphicService::GetInstance()->PostGraphicEvent(std::bind(&OHOS::PullUpDownView::UpdateBatteryProcess,  OHOS::PullUpDownView::GetInstance() ));
+    }
+#if DIALDATASET
+    // DialModelCharge::GetInstance()->UpdatechargeStatus(1);
+    setChargeStatus(1);
+#endif
+    SaveEleModel::GetInstance()->SetChargeStatus(true);
+
+    if (uapi_dev_runtime_get_train_status()) 
+    {
+    WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "MsgCenterNotifyProc:: CHarger Plug ! but train status is true");
+    return ;
+    }
+
+    
+    if(IsTestCHANGINGViewCreated())
+    {
+        ChangeViewcolorC(1);
+    }
+    else
+    {
+        if (CheckPriority(topic) && !uapi_dev_runtime_get_factory_test_status_flag()) //产测模式不弹充电弹窗
+        {
+            NotificationManager::GetInstance()->SetNotifyPriority(PRIORITY_TWO);
+            NotificationManager::GetInstance()->ShowNotify(ShowChargeingNotify, (uint16_t)topic, true);
+        }
+    }
+    #endif
+}
+
+/*充电器已拔掉*/
+void MsgCenterNotifyChargeUnPlugProc(const Topic topic, Request* req)
+{
+    #ifdef SUPPORT_BATTERY_SERVICE
+    unused(req);
+    unused(topic);
+    WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "MsgCenterNotifyProc:: CHarger UnPlug !");
+#ifdef SYSTEM_LOG_SERVICE
+    //充电停止事件
+    uapi_save_runtime_log(RUNTIME_LOG_CHARGE_STOP);//TOOD*
+#endif
+    if(PullUpDownView::GetInstance())
+    {
+        GraphicService::GetInstance()->PostGraphicEvent(std::bind(&OHOS::PullUpDownView::UpdateBatteryProcess,  OHOS::PullUpDownView::GetInstance() ));
+    }
+#if DIALDATASET
+    // DialModelCharge::GetInstance()->UpdatechargeStatus(0);
+    setChargeStatus(0);
+#endif
+    SaveEleModel::GetInstance()->SetChargeStatus(false);
+
+
+    if(IsTestCHANGINGViewCreated())
+    {
+        ChangeViewcolorC(0);
+    }
+    else
+    {
+        if(is_UIViewGroup_charge())
+        {
+        NotificationManager::GetInstance()->StopNotify();
+        }
+    }
+#endif
+}
+
+/*低电量提醒*/
+void MsgCenterNotifyLowPowerAlarmProc(const Topic topic, Request* req)
+{
+WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "MsgCenterNotifyProc:: LowPower Alarm !");
+uint8 *x= (uint8 *)(req->data);
+const power_display_svr_api_t *display_api = power_display_svr_get_api();
+// if(*x==3)
+// {
+//     if (display_api->get_screen_state() != SCREEN_ON)
+//     {   
+//         display_api->turn_on_screen();  
+//     }
+//     display_api->set_screen_set_keepon_timeout(1000*5);
+//     //倒计时结束后,直接执行关机动画
+//     low_power_play();
+// }
+if(*x==0)
+{
+    //提醒低电充电
+    if (display_api->get_screen_state() != SCREEN_ON)
+    {   
+        display_api->turn_on_screen();  
+    }
+    display_api->set_screen_set_keepon_timeout(1000*5);
+
+    set_lowpower_falg(0);
+    if (CheckPriority(topic))
+    {
+        NotificationManager::GetInstance()->SetNotifyPriority(PRIORITY_TWO);
+        NotificationManager::GetInstance()->ShowNotify(showlowpowerNotify, (uint16_t)topic, true);
+    }
+}
+else
+{
+    //电量过低,直接提醒关机
+    if (display_api->get_screen_state() != SCREEN_ON)
+    {   
+        display_api->turn_on_screen();  
+    }
+    display_api->set_screen_set_keepon_timeout(1000*10);
+    set_lowpower_falg(1);
+    if (NotificationManager::GetInstance()->HasNotifyShowing())
+    NotificationManager::GetInstance()->StopNotify();
+    if (CheckPriority(topic))
+    {
+        NotificationManager::GetInstance()->SetNotifyPriority(PRIORITY_ONE);
+        NotificationManager::GetInstance()->ShowNotify(showlowpowerNotify, (uint16_t)topic, true);
+    }
+}
+}
+    //TODO: 亮屏弹窗倒计时5秒关机(不需要取消,强制关机)
+    // DialModelCharge::GetInstance()->UpdatechargeStatus(0);
+    // SaveEleModel::GetInstance()->SetChargeStatus(0);
+    
+    // testCHANINGView *t=testCHANINGView::GetInstance();
+    // if(t!=NULL)
+    // {
+        // t->ChangeViewcolor(false);
+    // }
+
+#ifdef SUPPORT_CAT1_MODEM
+void MsgCenterNotifyHfpIncomingProc(const Topic topic, Request* req)
+{
+    hfp_hf_calls_info_t callData = {0};
+    int32 ret = memcpy_s(&callData, sizeof(hfp_hf_calls_info_t), req->data, req->len);
+    if (ret != EOK) {
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "MsgCenterNotify memcpy_s request data fail!");
+    } else {
+    }
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "MsgCenterNotifyHfpIncomingProc");
+    CallerLogModel::GetInstance()->SetoperateNumber(callData.number, callData.number_len);
+    CallerLogModel::GetInstance()->SetCallSource(CallerLogModel::CallSource::CallSourcePhone);
+    NotificationManager::GetInstance()->SetWatchCallStatus(true);
+    if (true != OHOS::ConfigModel::GetInstance()->GetDnotdisturb() && (!uapi_sleep_mode_flag_get()))
+    {
+        // ui_api_vibrate_once_func();
+    }
+}
+void MsgCenterNotifyHfpPhoneProc(const Topic topic, Request* req)
+{
+    WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "1201patch合并为编译过屏蔽下方代码");
+    #if 0 // 1201patch 为编译过屏蔽
+    unused(req);
+    // finish a single-channel call, or switch to phone, stop the notify
+    if (CallerLogModel::GetInstance()->GetNotifyFlag()) 
+    {
+        DisableWatingView();
+        if ((topic == TOPIC_EVENT_HFP_FINISHED && GetCurrCallNum() == 0) ||
+            topic == TOPIC_EVENT_HFP_PHONE_ACTIVE || topic == TOPIC_EVENT_HFP_WATCH_TO_PHONE) 
+        {
+            NotificationManager::GetInstance()->StopNotify();
+            NotificationManager::GetInstance()->SetWatchCallStatus(false);
+        }
+    }
+    #endif
+}
+
+void MsgCenterNotifyHfpWatchProc(const Topic topic, Request* req)
+{
+
+WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "1201patch合并为编译过屏蔽下方代码");
+#if 0 // 1201patch 为编译过屏蔽
+unused(req);
+if (CallerLogModel::GetInstance()->GetNotifyFlag()) 
+{
+    NotificationManager::GetInstance()->SetNotifyPriority(PRIORITY_ONE);
+    // default not mute
+    SetMicMute(false);
+    if (CallerLogModel::GetInstance()->IsMulitplePhoneStatus()) 
+    {
+        NotificationManager::GetInstance()->ShowNotify(ShowMultiPhoneCallNotify,
+                                                    static_cast<uint16_t>(topic), true);
+    } else 
+    {
+        NotificationManager::GetInstance()->ShowNotify(ShowCallingNotify, static_cast<uint16_t>(topic), true);
+}
+    NotificationManager::GetInstance()->SetWatchCallStatus(true);
+}
+#endif
+}
+
+void MsgCenterNotifyHfpWatchHintProc(const Topic topic, Request* req)
+{
+    unused(req);
+
+    phone_VibratorFunc();
+    
+    if(NotificationManager::GetInstance()->HasNotifyShowing())
+    NotificationManager::GetInstance()->StopNotify();
+
+    NotificationManager::GetInstance()->ShowNotify(showcallhintNotify,
+                                                        static_cast<uint16_t>(topic), true);
+}
+
+//来电处理函数
+void MsgCenterNotifyCatIncomingCallProc(const Topic topic, Request* req)
+{
+    unused(topic);
+    unused(topic);
+    if (req == NULL) return ;
+    char* call_data = (char*)malloc(req->len);
+    if(call_data==NULL)
+    {
+        return;
+    }
+    int32 ret = memcpy_s(call_data, req->len, req->data, req->len);
+    if (ret != EOK) {
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "MsgCenterNotify memcpy_s request data fail!");
+    } else {
+    // Prevent this from happening:
+    // When the incoming call view is displayed, the calling number is not set in CallerLogModel.
+
+        if(NotificationManager::GetInstance()->GetWatchCallStatus() &&
+        (CallerLogModel::GetInstance()->GetCallSource()==CallerLogModel::CallSourceCat1))
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "OPERATE_WATCH_REJECT %s!=%s??",call_data,CallerLogModel::GetInstance()->GetPhoneNumber().c_str());
+            CallerLogModel::GetInstance()->tempSetoperateNumberCAT1END(call_data,req->len);
+            cat1_phone_state_change_cb(OPERATE_WATCH_REJECT);
+            free(call_data);                                
+            return;
+        }
+    
+        if((NotificationManager::GetInstance()->GetWatchCallStatus() &&
+        (CallerLogModel::GetInstance()->GetCallSource()==CallerLogModel::CallSourcePhone)) || uapi_dev_runtime_get_train_status() || transmittingISShow())
+        {
+
+            CallerLogModel::GetInstance()->tempSetoperateNumberCAT1(call_data,req->len);
+            cat1_phone_state_change_cb(OPERATE_WAITING);
+            free(call_data);
+            return;
+        }
+    
+        stopPlayingMusic();
+        PlayersModel::GetInstance()->HandPausePhoneMusic(); // 暂停手机音乐
+        uapi_set_screen_on_api();
+        phone_paly_ring();
+    
+        CallerLogModel::GetInstance()->SetoperateNumber(call_data,strlen(call_data));
+    
+        cat1_phone_state_change_cb(OPERATE_INCOMING);
+    
+    }
+    free(call_data);
+
+}
+//开始通话处理函数
+void MsgCenterNotifyCat1CallConnectedProc(const Topic topic, Request* req)
+{
+    unused(topic);
+    unused(req);
+
+    if (req == NULL) return ;
+    if(!NotificationManager::GetInstance()->GetWatchCallStatus())
+    {
+        return;
+    }
+    AlarmClockModel::GetInstance()->AlarmPlayerStop();
+    #ifdef SUPPORT_CAT1_HFP_AG_SERV
+    if(uapi_dev_runtime_get_earphone_connect_stat())
+    {
+        
+        if(headset_Is_connect())
+        {   
+            if(headset_SCO_Is_connect()==false)
+            {
+                cat1_ag_send_call_event(TOPIC_EVENT_CAT1_INCOMMING,CallerLogModel::GetInstance()->GetPhoneNumber().c_str());
+            }
+            else
+            {
+                if(cat1_api_get_cat1_volte_voice_state()==0)
+                do_custom_cmd_service_check_msg(CUSTOM_CMD_MSG_CAT_HFP_SCO_AUDIO_START, nullptr, 0);
+                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "headset_Is_connect is false");
+            }
+        
+        }
+        else
+        {
+            do_custom_cmd_service_check_msg(CUSTOM_CMD_MSG_CONNECT_AG, nullptr, 0);
+        }
+        cat1_ag_send_call_event(TOPIC_EVENT_CAT1_CALLCONNTED,NULL);
+    }
+    else
+    #endif
+    {
+        do_custom_cmd_service_check_msg(CUSTOM_CMD_MSG_CAT1_AUDIO_START, nullptr, 0);
+    }
+    SetMicMutecat1(false);
+    cat1_phone_state_change_cb(OPERATE_WATCH_ACTIVE);
+
+}
+#include "BluetoothModelC.h"
+#include "audio_manager_c_wrapper.h"
+#include "PhoneService.h"
+//拨号处理函数
+void MsgCenterNotifyCat1dialProc(const Topic topic, Request* req)
+{
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "MsgCenterNotify MsgCenterNotifyCat1dialProc");
+    unused(topic);
+    unused(req);
+    if (req == NULL) return ;
+    char* call_data = (char*)malloc(req->len);
+    if(call_data==NULL) return;
+    int32 ret = memcpy_s(call_data, req->len, req->data, req->len);
+    if (ret != EOK) {
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "MsgCenterNotify memcpy_s request data fail!");
+    } else {
+
+    // int ret = PlayersModel::GetInstance()->PlayerStop();
+    stopPlayingMusic();
+
+    if(strcmp(call_data,"SOS")==0)
+    {
+        free(call_data);
+        NotificationManager::GetInstance()->ShowNotify(showSOSNotify, (uint16_t)topic, true);
+        return;
+    }
     
-     do_cywee_service_check_msg(CYWEE_SERVICE_CMD_RESET_DAILY_DATA, NULL);
- 
-     SendMsgToUIService(UI_UPDATE_GOAL, 0, nullptr, 0);
-     printf("sport end\n");
- #endif
-
- }
- void MsgCenterNotifyONtimeProc(const Topic topic, Request* req)
- {
-     unused(req);
-     AlarmClockEventData* time=(AlarmClockEventData*)req->data;
-     #ifdef SUPPORT_CYWEE_SERVICE
- 
-     cywee_save_data(); //暂时没有这个函数
- 
-     WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "保存每小时步数");
-     cywee_step_history_save(time->value);
- 
-     WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "保存每小时站立数据");
-     if(cywee_get_stand_flag())
-     cywee_stand_history_save(time->value);
- 
-     WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "保存每小时卡路里数据");
-     cywee_calories_history_save(time->value); 
- 
-     WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "保存每小时距离数据");
-     cywee_distances_history_save(time->value);
- 
-     WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "保存每小时燃脂数据");
-     cywee_fat_history_save(time->value);
-     // 保存完增加一次读取数据
-     SendMsgToUIService(UI_UPDATE_GOAL, 0, nullptr, 0);
- #endif
-     }
- //设备绑定通知
- void MsgCenterNotifyDeviceBindProc(const Topic topic, Request* req)
- {
-     #ifdef SUPPORT_BLE_SERVICE
-     //unused(req);
-     WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "MsgCenterNotifyBindProc Bind!");
-     // const power_display_svr_api_t *display_api = power_display_svr_get_api();
-     // if (display_api->get_screen_state() != SCREEN_ON)
-     // {
-     //     display_api->turn_on_screen();
-     // }
-     uint8_t* data=(uint8_t*)req->data;
-     /* 安全:固定上限 + 显式终止 */
-     const size_t kMaxDevName = 64;
-     char devname[kMaxDevName + 1] = {0};
-     if (data != NULL && req->len >= 2)
-     {
-         switch(data[0])
-         {
-             case DEVICEBIND:
-                 NotificationManager::GetInstance()->SetNotifyPriority(PRIORITY_ONE);
-                 {
-                     /* 设备名在 payload[2..],长度为 req->len-2,做边界裁剪并追加'\0' */
-                     size_t name_len = (req->len > 2) ? (size_t)req->len - 2 : 0;
-                     if (name_len > 0)
-                     {
-                         size_t copy_len = (name_len > kMaxDevName) ? kMaxDevName : name_len;
-                         (void)memcpy_s(devname, sizeof(devname), (const char*)req->data + 2, copy_len);
-                         devname[copy_len] = '\0';
-                         PairingViewEventListener::GetInstance().SetDeviceName(devname);
-                     }
-                     else
-                     {
-                         PairingViewEventListener::GetInstance().SetDeviceName(NULL);
-                     }
-                 }
-                 if(NotificationManager::GetInstance()->HasNotifyShowing())
-                 {
-                     NotificationManager::GetInstance()->StopNotify();
-                 }
-                 NotificationManager::GetInstance()->ShowNotify(showDeviceBindingNotify, (uint16_t)topic, true);
-                 break;
-             case DEVICEUNBIND:
-                 
-                 NotificationManager::GetInstance()->SetNotifyPriority(PRIORITY_ONE);
-                 {
-                     size_t name_len = (req->len > 2) ? (size_t)req->len - 2 : 0;
-                     if (name_len > 0)
-                     {
-                         size_t copy_len = (name_len > kMaxDevName) ? kMaxDevName : name_len;
-                         (void)memcpy_s(devname, sizeof(devname), (const char*)req->data + 2, copy_len);
-                         devname[copy_len] = '\0';
-                         PairingViewEventListener::GetInstance().SetDeviceName(devname);
-                     }
-                     else
-                     {
-                         PairingViewEventListener::GetInstance().SetDeviceName(NULL);
-                     }
-                 }
-                 NotificationManager::GetInstance()->ShowNotify(showDeviceUnBindingNotify, (uint16_t)topic, true);
-                 break;
-             case DeviceUnBindingRequest:
-                 NotificationManager::GetInstance()->SetNotifyPriority(PRIORITY_TWO);
-                 NotificationManager::GetInstance()->ShowNotify(showDeviceUnbindingRequestNotify, (uint16_t)topic, true);
-                 break;
-             case SHUTDOWN:
-                 WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, " SHUTDOWN");
-                 set_lowpower_falg(3);
-                 if (NotificationManager::GetInstance()->HasNotifyShowing())
-                 NotificationManager::GetInstance()->StopNotify();
- 
-                 NotificationManager::GetInstance()->SetNotifyPriority(PRIORITY_TWO);
- 
-                 NotificationManager::GetInstance()->ShowNotify(showlowpowerNotify, (uint16_t)topic, true);
-                 //low_power_play(true);
-                 break;
-             case REBOOT:
-                 set_lowpower_falg(4);
-                 if (NotificationManager::GetInstance()->HasNotifyShowing())
-                 NotificationManager::GetInstance()->StopNotify();
- 
-                 NotificationManager::GetInstance()->SetNotifyPriority(PRIORITY_TWO);
-                 NotificationManager::GetInstance()->ShowNotify(showlowpowerNotify, (uint16_t)topic, true);
-                 //low_power_play(false);
-                 break;
- 
-             default:
-                 break;
-         }
+#ifdef SUPPORT_CAT1_SERVICE
+    cat1_cmd_send(CMD_4G_MAKE_CALL,call_data,strlen(call_data));
+#endif
+    CallerLogModel::GetInstance()->SetoperateNumber(call_data,req->len);
+
+#ifdef SUPPORT_CAT1_SERVICE
+    cat1_phone_state_change_cb(OPERATE_DIALING);
+#endif
+
+    #ifdef SUPPORT_CAT1_HFP_AG_SERV
+    if(uapi_dev_runtime_get_earphone_connect_stat())
+    {
+        if(headset_Is_connect())
+        {
+            cat1_ag_send_call_event(TOPIC_EVENT_CAT1_CALLDIAL,NULL);
         
-     }
-     #endif
- }
- 
- 
- 
- void MsgCenterNotifybleTransmit(const Topic topic, Request* req)
- {
-    #ifdef SUPPORT_BLE_SERVICE
+            if(headset_SCO_Is_connect())
+            {
+                if(cat1_api_get_cat1_volte_voice_state()==0)
+                do_custom_cmd_service_check_msg(CUSTOM_CMD_MSG_CAT_HFP_SCO_AUDIO_START, nullptr, 0);
+            }
+        }
+        else
+        {
+            do_custom_cmd_service_check_msg(CUSTOM_CMD_MSG_CONNECT_AG, nullptr, 0);
+        }
+    }
+    else
+    #endif
+    {
+        do_custom_cmd_service_check_msg(CUSTOM_CMD_MSG_CAT1_AUDIO_START, nullptr, 0);
+    }
+
+    }
+    free(call_data);
+}
+//电话结束处理函数
+void MsgCenterNotifyCat1CallEndedProc(const Topic topic, Request* req)
+{
     unused(topic);
-    uint8_t* data=(uint8_t*)req->data;
-    WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "MsgCenterNotifybleTransmit:%d",data[0]);
+    unused(req);
 
-    
-    if(data[0]==TRANS_FREE)
+    // just stop the notify
+    AlarmClockModel::GetInstance()->AlarmPlayerStop();
+
+
+    if(!NotificationManager::GetInstance()->GetWatchCallStatus())
     {
-        if(transmittingISShow())
-        NotificationManager::GetInstance()->StopNotify();
+        return;
     }
-    else if (data[0]==IS_NEED_CAT1_OTA)
+
+    if (req == NULL) return ;
+    char* call_data = (char*)malloc(req->len);
+
+    if(call_data==NULL)
     {
-    
-        NotificationManager::GetInstance()->SetNotifyPriority(PRIORITY_ONE);
+        return;
+    }
+    int32 ret = memcpy_s(call_data, req->len, req->data, req->len);
+
+    if(strcmp("callfail",call_data)==0)
+    {
+        
+        // cat1_call_hungup();
+        cat1_phone_state_change_cb(OPERATE_WATCH_FINISH);
+        CustomEventPublish(TOPIC_EVENT_CAT1_CALL_FAIL,NULL,0);
 
-        // NotificationManager::GetInstance()->ShowNotify(showCat1UpdataNotify, (uint16_t)topic, true);
+        free(call_data);
+        return;
     }
-    else if (data[0]==FILE_IS_DONE)
+
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "%s %s",call_data,CallerLogModel::GetInstance()->GetPhoneNumber().c_str());
+    uint8_t offset_watch =0;
+    if(CallerLogModel::GetInstance()->GetPhoneNumber().c_str()[0]=='+')
+    {
+        offset_watch++;
+    }
+
+    uint8_t offset_call =0;
+    if(call_data[0]=='+')
     {
-        set_transmittingShow_falg(data[0]);
+        offset_call++;
     }
+
+    if(strcmp(CallerLogModel::GetInstance()->GetPhoneNumber().c_str()+offset_watch,call_data+offset_call)!=0 && 
+        CallerLogModel::GetInstance()->GetCallSource()==CallerLogModel::CallSourceCat1)
+    {
+    
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "no OPERATE_WATCH_FINISH");
+        #ifdef SUPPORT_CAT1_HFP_AG_SERV
+        cat1_ag_send_call_event(TOPIC_EVENT_CAT1_CALLENDED,NULL);
+        #endif       
+    } 
     else
     {
-        set_transmittingShow_falg(data[0]);
-        
-        NotificationManager::GetInstance()->SetNotifyPriority(PRIORITY_ONE);
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "OPERATE_WATCH_FINISH");
+        cat1_phone_state_change_cb(OPERATE_WATCH_FINISH);
+        #ifdef SUPPORT_CAT1_HFP_AG_SERV
 
-        NotificationManager::GetInstance()->ShowNotify(showtransmitNotify, (uint16_t)topic, true);
+        #endif
     }
-    #endif
- }
- 
- void MsgCenterNotifyChargePlugProc(const Topic topic, Request* req)
- {
-     #ifdef SUPPORT_BATTERY_SERVICE
-     unused(req);
-     WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "MsgCenterNotifyProc:: CHarger Plug !");
- #ifdef SYSTEM_LOG_SERVICE
-     uapi_save_runtime_log(RUNTIME_LOG_CHARGE_START);//充电开始事件
- #endif
-     const power_display_svr_api_t *display_api = power_display_svr_get_api();
-     if (display_api->get_screen_state() != SCREEN_ON)
-     {
-         display_api->turn_on_screen();
-     }
- 
-     if(PullUpDownView::GetInstance())
-     {
-         GraphicService::GetInstance()->PostGraphicEvent(std::bind(&OHOS::PullUpDownView::UpdateBatteryProcess,  OHOS::PullUpDownView::GetInstance() ));
-     }
- #if DIALDATASET
-     // DialModelCharge::GetInstance()->UpdatechargeStatus(1);
-     setChargeStatus(1);
- #endif
-     SaveEleModel::GetInstance()->SetChargeStatus(true);
- 
-     if (uapi_dev_runtime_get_train_status()) 
-     {
-       WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "MsgCenterNotifyProc:: CHarger Plug ! but train status is true");
-       return ;
-     }
- 
-     
-     if(IsTestCHANGINGViewCreated())
-     {
-         ChangeViewcolorC(1);
-     }
-     else
-     {
-         if (CheckPriority(topic) && !uapi_dev_runtime_get_factory_test_status_flag()) //产测模式不弹充电弹窗
-         {
-             NotificationManager::GetInstance()->SetNotifyPriority(PRIORITY_TWO);
-             NotificationManager::GetInstance()->ShowNotify(ShowChargeingNotify, (uint16_t)topic, true);
-         }
-     }
-     #endif
- }
- 
- /*充电器已拔掉*/
- void MsgCenterNotifyChargeUnPlugProc(const Topic topic, Request* req)
- {
-     #ifdef SUPPORT_BATTERY_SERVICE
-     unused(req);
-     unused(topic);
-     WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "MsgCenterNotifyProc:: CHarger UnPlug !");
- #ifdef SYSTEM_LOG_SERVICE
-     //充电停止事件
-     uapi_save_runtime_log(RUNTIME_LOG_CHARGE_STOP);//TOOD*
- #endif
-     if(PullUpDownView::GetInstance())
-     {
-         GraphicService::GetInstance()->PostGraphicEvent(std::bind(&OHOS::PullUpDownView::UpdateBatteryProcess,  OHOS::PullUpDownView::GetInstance() ));
-     }
- #if DIALDATASET
-     // DialModelCharge::GetInstance()->UpdatechargeStatus(0);
-     setChargeStatus(0);
- #endif
-     SaveEleModel::GetInstance()->SetChargeStatus(false);
- 
- 
-     if(IsTestCHANGINGViewCreated())
-     {
-         ChangeViewcolorC(0);
-     }
-     else
-     {
-         if(is_UIViewGroup_charge())
-         {
-         NotificationManager::GetInstance()->StopNotify();
-         }
-     }
- #endif
- }
- 
- /*低电量提醒*/
-void MsgCenterNotifyLowPowerAlarmProc(const Topic topic, Request* req)
+
+    free(call_data);
+    
+}
+
+void MsgCenterNotifyCat1FailEProc(const Topic topic, Request* req)
 {
-    WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "MsgCenterNotifyProc:: LowPower Alarm !");
-    uint8 *x= (uint8 *)(req->data);
-    const power_display_svr_api_t *display_api = power_display_svr_get_api();
-    // if(*x==3)
+    unused(req);
+
+    phone_VibratorFunc();
+
+    if(NotificationManager::GetInstance()->HasNotifyShowing())
+    NotificationManager::GetInstance()->StopNotify();
+
+    NotificationManager::GetInstance()->ShowNotify(showcallfailNotify,
+                                                        static_cast<uint16_t>(topic), true);
+}
+#endif
+
+    static uint8_t goal_type=0;
+    void MsgCenterNotifystepProc(const Topic topic, Request* req)
+    {
+        //unused(req);
+        if (req->msgId == TOPIC_EVENT_STEPDATA_UPDATE)
+        {
+            
+            #ifdef SUPPORT_CYWEE_SERVICE
+            if (req->data == nullptr) {
+                return;
+            }
+            // 计步数据累加
+            
+            OHOS::GoalModel::GetInstance().show_data_step_refresh();
+            OHOS::GoalModel::GetInstance().show_data_calories_refresh();
+            OHOS::GoalModel::GetInstance().show_data_distance_refresh();
+            
+            if(OHOS::GoalView::GetInstance())
+            {
+                GraphicService::GetInstance()->PostGraphicEvent(
+                std::bind(&OHOS::GoalView::GoalViewrefresh,  OHOS::GoalView::GetInstance() ));
+
+            // OHOS::GoalView::GetInstance()->GoalViewrefresh();
+            }
+            if(OHOS::GoalotherView::GetInstance())
+            {
+                //OHOS::GoalotherView::GetInstance()->GoalViewrefresh();
+                GraphicService::GetInstance()->PostGraphicEvent(
+                std::bind(&OHOS::GoalotherView::GoalViewrefresh,  OHOS::GoalotherView::GetInstance() ));
+            }
+
+            if(OHOS::GoalModel::GetInstance().getstepvalue()>=100)
+            {
+
+                goal_type=GOAL_STEP;
+                if(get_Is_show_flag(goal_type))
+                {   
+                    if(OHOS::GoalModel::GetInstance().get_step_goal_show())
+                    {
+                        CustomEventPublish(TOPIC_EVENT_GOAL_SHOW_VIEW,(uint8_t *)&goal_type,1);
+                    }
+                }
+            }
+
+            if(OHOS::GoalModel::GetInstance().is_goal_DISTANCE_done())
+            {
+                goal_type=GOAL_DISTANCE;
+                if(get_Is_show_flag(goal_type))
+                {   
+                    if(OHOS::GoalModel::GetInstance().get_other_goal_show())
+                    {
+                        CustomEventPublish(TOPIC_EVENT_GOAL_SHOW_VIEW,(uint8_t *)&goal_type,1);
+                    }
+                
+                }
+            }
+
+            if(OHOS::GoalModel::GetInstance().is_goal_fatburning_done())
+            {
+                goal_type=GOAL_FAT;
+                if(get_Is_show_flag(goal_type))
+                {   
+                    if(OHOS::GoalModel::GetInstance().get_other_goal_show())
+                    {
+                        CustomEventPublish(TOPIC_EVENT_GOAL_SHOW_VIEW,(uint8_t *)&goal_type,1);
+                    }
+                }
+            }
+
+            if(OHOS::GoalModel::GetInstance().is_goal_stand_done())
+            {
+                goal_type=GOAL_STAND;
+                if(get_Is_show_flag(goal_type))
+                {   
+                    if(OHOS::GoalModel::GetInstance().get_other_goal_show())
+                    {
+                        CustomEventPublish(TOPIC_EVENT_GOAL_SHOW_VIEW,(uint8_t *)&goal_type,1);
+                    }
+                }
+            }
+
+            if(OHOS::GoalModel::GetInstance().is_goal_calories_done())
+            {
+                goal_type=GOAL_CALOREIE;
+                if(get_Is_show_flag(goal_type))
+                {   
+                if(OHOS::GoalModel::GetInstance().get_other_goal_show())
+                    {
+                        CustomEventPublish(TOPIC_EVENT_GOAL_SHOW_VIEW,(uint8_t *)&goal_type,1);
+                    }
+                }
+            }
+            #endif
+        }
+
+
+
+    }
+#ifdef SUPPORT_CYWEE_SERVICE    
+    //每日训练数据刷新
+    // void MsgCenterNotifyActivityProc(const Topic topic, Request* req)
+    // {
+    //     unused(topic);
+    //     cywee_activity_result_t* c_activity_result_t =  (cywee_activity_result_t *) malloc(req->len);
+    //     if(c_activity_result_t==NULL)
+    //     {
+    //         WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Memory allocation failure");
+    //         return;
+    //     }
+
+    //     int rets = memcpy_s(c_activity_result_t, req->len, (cywee_activity_result_t*)req->data, req->len);
+    //     if (rets != EOK)
+    //     {
+    //         free(c_activity_result_t);
+    //         c_activity_result_t = NULL;
+    //         WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "memcpy_s c_activity_result_t failed, ret = %d", rets);
+    //         return;
+    //     }
+    //     if(c_activity_result_t->activity_mode == SPORT_ACTIVE_MODE_NORMAL)
+    //     {
+    //         /*更新卡路里数据*/
+    //         //if(c_activity_result_t->calories!=0)
+    //         {
+    //             set_calories_data(c_activity_result_t->calories);
+    // #if DIALDATASET
+    //             uint32_t calories= OHOS::GoalModel::GetInstance().show_data_calories_refresh();
+                
+    //             DialModelCalorie::GetInstance()->UpdateCalorie(calories);
+    // #endif
+    //         }
+    //         /*更新距离数据*/
+    //         //if(c_activity_result_t->distance != 0)
+    //         {
+    //             set_distance_data(c_activity_result_t->distance);  
+    // #if DIALDATASET
+    //             float  distance= OHOS::GoalModel::GetInstance().show_data_distance_refresh();
+    //             DialModelDistance::GetInstance()->UpdateDistance(distance);
+    // #endif 
+    //         }
+    //     }
+    //     else if(c_activity_result_t->activity_mode == SPORT_ACTIVE_MODE_FREE_TRAINING && c_activity_result_t->MHR_zone >= 2)
+    //     {
+    //         /*更新燃脂时间数据*/
+    //         set_fat_time_data(1);
+    //     }
+        
+    //     free(c_activity_result_t);
+    //     c_activity_result_t = NULL;
+    // }
+    // static int train_fat_time = 0;
+    // void MsgCenterNotifyActivityExtraInfoProc(const Topic topic, Request* req)
     // {
-    //     if (display_api->get_screen_state() != SCREEN_ON)
-    //     {   
-    //         display_api->turn_on_screen();  
+    //     unused(topic);
+    //     cywee_activity_result_extre_info_t* c_activity_result_extre_info_t =  (cywee_activity_result_extre_info_t *) malloc(req->len);
+    //     if(c_activity_result_extre_info_t==NULL)
+    //     {
+    //         WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Memory allocation failure");
+    //         return;
+    //     }
+
+    //     int rets = memcpy_s(c_activity_result_extre_info_t, req->len, (cywee_activity_result_extre_info_t*)req->data, req->len);
+    //     if (rets != EOK)
+    //     {
+    //         free(c_activity_result_extre_info_t);
+    //         c_activity_result_extre_info_t = NULL;
+    //         WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "memcpy_s c_activity_result_extre_info_t failed, ret = %d", rets);
+    //         return;
+    //     }
+
+    //     if(uapi_dev_runtime_get_train_status() && c_activity_result_extre_info_t->ativity_zone_high_duration)
+    //     {
+    //         train_fat_time = c_activity_result_extre_info_t->ativity_zone_high_duration;
+    //     }
+    //     /*更新燃脂时间数据*/
+    //     else if(uapi_dev_runtime_get_train_status() == 0 && train_fat_time)
+    //     {
+    //         set_fat_time_data(train_fat_time);
+    //         train_fat_time = 0;
     //     }
-    //     display_api->set_screen_set_keepon_timeout(1000*5);
-    //     //倒计时结束后,直接执行关机动画
-    //     low_power_play();
+
+    //     free(c_activity_result_extre_info_t);
+    //     c_activity_result_extre_info_t = NULL;
     // }
-    if(*x==0)
+
+/*运动识别*/
+void MsgCenterNotifyArAlertProc(const Topic topic, Request* req)
+{
+    uint8_t* motionType=(uint8_t*)req->data;
+    WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "MsgCenterNotifyArAlertProc,motionType = %d !",*motionType);
+    MotionRecognitionViewEventListener::GetInstance().record_motion_recognition_log();
+    if(*motionType > 5 || *motionType <1) //未知运动不弹窗
     {
-        //提醒低电充电
-        if (display_api->get_screen_state() != SCREEN_ON)
-        {   
-            display_api->turn_on_screen();  
-        }
-        display_api->set_screen_set_keepon_timeout(1000*5);
+        return;
+    }
+    if (CheckPriority(topic))
+    {
+        MotionRecognitionViewEventListener::GetInstance().SetMotionTypeId(*motionType);
+        NotificationManager::GetInstance()->SetNotifyPriority(PRIORITY_TWO);
+        NotificationManager::GetInstance()->ShowNotify(showMotionRecognitionNotify, (uint16_t)topic, true);
+    }
 
-        set_lowpower_falg(0);
-        if (CheckPriority(topic))
-        {
-            NotificationManager::GetInstance()->SetNotifyPriority(PRIORITY_TWO);
-            NotificationManager::GetInstance()->ShowNotify(showlowpowerNotify, (uint16_t)topic, true);
+}
+
+void MsgCenterNotifyInactivityProc(const Topic topic, Request *req)
+{
+    WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "MsgCenterNotifyInactivityProc !");
+    inact_result_t *cywee_Inactivity_Info = (inact_result_t *)malloc(req->len);
+    if (!cywee_Inactivity_Info)
+    {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Memory allocation failure");
+        return;
+    }
+    
+    int rets = memcpy_s(cywee_Inactivity_Info, req->len, (inact_result_t*)req->data, req->len);
+    if (rets != EOK)
+    {
+        free(cywee_Inactivity_Info);
+        cywee_Inactivity_Info = NULL;
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "memcpy_s cywee_inactivity_result_t failed, ret = %d", rets);
+        return;
+    }
+    
+    WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "cywee_Inactivity_Info->output_number = %d", cywee_Inactivity_Info->output_number);
+
+    switch (cywee_Inactivity_Info->output_number)
+    {
+        case INACTIVITY_MODE_SEDENTARY_OUTPUT:
+            if(cywee_Inactivity_Info->status == 1)
+            {
+                SedentaryReminderViewEventListener::GetInstance().record_sedentary_reminder_log();
+                if (CheckPriority(topic))
+                {
+                    NotificationManager::GetInstance()->SetNotifyPriority(PRIORITY_TWO);
+                    NotificationManager::GetInstance()->ShowNotify(showSedentaryReminderNotify, (uint16_t)topic, true);
+                }
+            } 
+            else if(cywee_Inactivity_Info->status==9)
+            {
+                cywee_set_stand_flag();
+            }
+            break;
+        default:
+            break;
+    }
+    
+    free(cywee_Inactivity_Info);
+    cywee_Inactivity_Info = NULL;
+}
+
+#endif
+
+//查找手表通知
+void MsgCenterNotifyFindWatchProc(const Topic topic, Request* req)
+{
+    WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "MsgCenterNotifyFindWatchProc !");
+    if (CheckPriority(topic))
+    {
+        uint8_t* type=(uint8_t*)req->data;
+        if(*type == 1)
+    {
+        FindWatchViewEventListener::GetInstance().SetFindWatchNotifyFlag(true);
+        FindWatchViewEventListener::GetInstance().PopInterPlayMusic(nullptr);//播放铃声
+        NotificationManager::GetInstance()->SetNotifyPriority(PRIORITY_TWO);
+        NotificationManager::GetInstance()->ShowNotify(showFindWatchNotify, (uint16_t)topic, true);
+        //如果查找手表铃声播放成功,记录该事件
+        uapi_save_runtime_log(RUNTIME_LOG_RING_PLAY_START_FINDWATCH);//TOOD*
+        } else {
+    if (FindWatchViewEventListener::GetInstance().GetFindWatchNotifyFlag() == true) {
+        NotificationManager::GetInstance()->StopNotify();
+    }
+    FindWatchViewEventListener::GetInstance().SetFindWatchNotifyFlag(false);
         }
+    } else {
+        WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "NotifyPriority = %d ",NotificationManager::GetInstance()->GetNotifyPriority());
     }
-    else
+}
+
+void MsgCenterNotifyDebugOutProc(const Topic topic, Request *req)
+{
+    unused(req);
+    WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "MsgCenterNotifyDebugOutProc !");
+    if (CheckPriority(topic))
+    {
+        NotificationManager::GetInstance()->SetNotifyPriority(PRIORITY_ONE);
+        NotificationManager::GetInstance()->ShowNotify(showDebugOutputNotify, (uint16_t)topic, true);
+    }
+}
+//运动目标通知
+void MsgCenterNotifyGoalShowViewProc(const Topic topic, Request* req)
+{
+    unused(req);
+    if (CheckPriority(topic)) 
     {
-        //电量过低,直接提醒关机
-        if (display_api->get_screen_state() != SCREEN_ON)
+        uint8_t* data=(uint8_t*)req->data;
+        if(get_Is_show_flag(data[0]))
         {   
-            display_api->turn_on_screen();  
-        }
-        display_api->set_screen_set_keepon_timeout(1000*10);
-        set_lowpower_falg(1);
-        if (NotificationManager::GetInstance()->HasNotifyShowing())
-        NotificationManager::GetInstance()->StopNotify();
-        if (CheckPriority(topic))
-        {
-            NotificationManager::GetInstance()->SetNotifyPriority(PRIORITY_ONE);
-            NotificationManager::GetInstance()->ShowNotify(showlowpowerNotify, (uint16_t)topic, true);
+            set_goal_flag_view(data[0]);
+            set_Is_show_flag(0,data[0]);
+
+            const power_display_svr_api_t *display_api = power_display_svr_get_api();
+
+            uapi_set_screen_on_api();
+            
+            NotificationManager::GetInstance()->SetNotifyPriority(PRIORITY_TWO);
+            NotificationManager::GetInstance()->ShowNotify(ShowGoalNotify, static_cast<uint16_t>(topic), true);
         }
     }
 }
-     //TODO: 亮屏弹窗倒计时5秒关机(不需要取消,强制关机)
-     // DialModelCharge::GetInstance()->UpdatechargeStatus(0);
-     // SaveEleModel::GetInstance()->SetChargeStatus(0);
-     
-     // testCHANINGView *t=testCHANINGView::GetInstance();
-     // if(t!=NULL)
-     // {
-         // t->ChangeViewcolor(false);
-     // }
- 
- #ifdef SUPPORT_CAT1_MODEM
- void MsgCenterNotifyHfpIncomingProc(const Topic topic, Request* req)
- {
-     hfp_hf_calls_info_t callData = {0};
-     int32 ret = memcpy_s(&callData, sizeof(hfp_hf_calls_info_t), req->data, req->len);
-     if (ret != EOK) {
-     WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "MsgCenterNotify memcpy_s request data fail!");
-     } else {
-     }
-     WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "MsgCenterNotifyHfpIncomingProc");
-     CallerLogModel::GetInstance()->SetoperateNumber(callData.number, callData.number_len);
-     CallerLogModel::GetInstance()->SetCallSource(CallerLogModel::CallSource::CallSourcePhone);
-     NotificationManager::GetInstance()->SetWatchCallStatus(true);
-     if (true != OHOS::ConfigModel::GetInstance()->GetDnotdisturb() && (!uapi_sleep_mode_flag_get()))
-     {
-         // ui_api_vibrate_once_func();
-     }
- }
- void MsgCenterNotifyHfpPhoneProc(const Topic topic, Request* req)
- {
-     unused(req);
-     // finish a single-channel call, or switch to phone, stop the notify
-     if (CallerLogModel::GetInstance()->GetNotifyFlag()) {
-         DisableWatingView();
-     if ((topic == TOPIC_EVENT_HFP_FINISHED && GetCurrCallNum() == 0) ||
-     topic == TOPIC_EVENT_HFP_PHONE_ACTIVE || topic == TOPIC_EVENT_HFP_WATCH_TO_PHONE) {
-             NotificationManager::GetInstance()->StopNotify();
-             NotificationManager::GetInstance()->SetWatchCallStatus(false);
-         }
-         }
-     }
- 
- void MsgCenterNotifyHfpWatchProc(const Topic topic, Request* req)
- {
-     unused(req);
-     if (CallerLogModel::GetInstance()->GetNotifyFlag()) {
-         NotificationManager::GetInstance()->SetNotifyPriority(PRIORITY_ONE);
-         // default not mute
-         SetMicMute(false);
-         if (CallerLogModel::GetInstance()->IsMulitplePhoneStatus()) {
-             NotificationManager::GetInstance()->ShowNotify(ShowMultiPhoneCallNotify,
-                                                            static_cast<uint16_t>(topic), true);
-         } else {
-             NotificationManager::GetInstance()->ShowNotify(ShowCallingNotify, static_cast<uint16_t>(topic), true);
-     }
-     NotificationManager::GetInstance()->SetWatchCallStatus(true);
-     }
- }
- 
- void MsgCenterNotifyHfpWatchHintProc(const Topic topic, Request* req)
- {
-     unused(req);
- 
-     phone_VibratorFunc();
-     
-     if(NotificationManager::GetInstance()->HasNotifyShowing())
-     NotificationManager::GetInstance()->StopNotify();
- 
-     NotificationManager::GetInstance()->ShowNotify(showcallhintNotify,
-                                                            static_cast<uint16_t>(topic), true);
- }
- 
- //来电处理函数
- void MsgCenterNotifyCatIncomingCallProc(const Topic topic, Request* req)
- {
-     unused(topic);
-     unused(topic);
-     if (req == NULL) return ;
-     char* call_data = (char*)malloc(req->len);
-     if(call_data==NULL)
-     {
-         return;
-     }
-     int32 ret = memcpy_s(call_data, req->len, req->data, req->len);
-     if (ret != EOK) {
-     WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "MsgCenterNotify memcpy_s request data fail!");
-     } else {
-     // Prevent this from happening:
-     // When the incoming call view is displayed, the calling number is not set in CallerLogModel.
- 
-         if(NotificationManager::GetInstance()->GetWatchCallStatus() &&
-         (CallerLogModel::GetInstance()->GetCallSource()==CallerLogModel::CallSourceCat1))
-         {
-             WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "OPERATE_WATCH_REJECT %s!=%s??",call_data,CallerLogModel::GetInstance()->GetPhoneNumber().c_str());
-             CallerLogModel::GetInstance()->tempSetoperateNumberCAT1END(call_data,req->len);
-             cat1_phone_state_change_cb(OPERATE_WATCH_REJECT);
-             free(call_data);                                
-             return;
-         }
-       
-         if((NotificationManager::GetInstance()->GetWatchCallStatus() &&
-         (CallerLogModel::GetInstance()->GetCallSource()==CallerLogModel::CallSourcePhone)) || uapi_dev_runtime_get_train_status() || transmittingISShow())
-         {
- 
-             CallerLogModel::GetInstance()->tempSetoperateNumberCAT1(call_data,req->len);
-             cat1_phone_state_change_cb(OPERATE_WAITING);
-             free(call_data);
-             return;
-         }
-     
-         stopPlayingMusic();
-         PlayersModel::GetInstance()->HandPausePhoneMusic(); // 暂停手机音乐
-         uapi_set_screen_on_api();
-         phone_paly_ring();
-       
-         CallerLogModel::GetInstance()->SetoperateNumber(call_data,strlen(call_data));
-        
-         cat1_phone_state_change_cb(OPERATE_INCOMING);
+//喝水提醒通知
+void MsgCenterNotifyDrinkReminderProc(const Topic topic, Request *req)
+{
+// unused(topic);
+    unused(req);
+    WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "MsgCenterNotifyDrinkReminderProc !");
+    // DrinkReminderViewEventListener::GetInstance().set_screen_on_and_vibration();
+    DrinkReminderViewEventListener::GetInstance().record_drink_reminder_log();
+    if (CheckPriority(topic))
+    {
+        NotificationManager::GetInstance()->SetNotifyPriority(PRIORITY_TWO);
+        NotificationManager::GetInstance()->ShowNotify(showDrinkReminderNotify, (uint16_t)topic, true);
+    }
+}
+//关机动画
+void MsgCenterNotifyShutDownAnimatorProc(const Topic topic, Request* req)
+{
+    unused(topic);
+    uint8_t* data=(uint8_t*)req->data;
+    set_shutDownAnimation_falg(data[0]);
+    WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "MsgCenterNotifyShutDownAnimatorProc,shutdown_flag = %d",*data);
+    NotificationManager::GetInstance()->SetNotifyPriority(PRIORITY_ONE);
+    NotificationManager::GetInstance()->ShowNotify(showShutdownAnimatorNotify, (uint16_t)topic, true);
+}
+//消息通知
+void MsgCenterNotifyMessageProc(const Topic topic, Request* req)
+{
+    // unused(topic);
+    unused(req);
+    // WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "MsgCenterNotifyMessageProc !");
+    if (CheckPriority(topic)) {
+    // do_custom_fileoperate_service_check_msg(CUSTOM_FILEOPERATE_MSG_TYPE_MESSAGE_DATA_NOTIFY,
+    // nullptr, 0);
+    OHOS::NotificationManager::GetInstance()->SetNotifyPriority(PRIORITY_THREE);
+    OHOS::NotificationManager::GetInstance()->ShowNotify(OHOS::CreateMessageView, TOPIC_EVENT_MESSAGENOTE, true);
+    //进行消息显示记录
+    uapi_save_runtime_log(RUNTIME_LOG_MSG_SHOW);
+    }
+}
+
+//睡眠提醒通知
+void MsgCenterNotifySleepProc(const Topic topic, Request* req)
+{
+    unused(req);
+// unused(topic);
+    if (CheckPriority(topic))
+    {
         
-     }
-     free(call_data);
- 
- }
- //开始通话处理函数
- void MsgCenterNotifyCat1CallConnectedProc(const Topic topic, Request* req)
- {
-     unused(topic);
-     unused(req);
- 
-     if (req == NULL) return ;
-     if(!NotificationManager::GetInstance()->GetWatchCallStatus())
-     {
-         return;
-     }
-     AlarmClockModel::GetInstance()->AlarmPlayerStop();
-     #ifdef SUPPORT_CAT1_HFP_AG_SERV
-      if(uapi_dev_runtime_get_earphone_connect_stat())
-      {
-         
-         if(headset_Is_connect())
-         {   
-             if(headset_SCO_Is_connect()==false)
-             {
-                 cat1_ag_send_call_event(TOPIC_EVENT_CAT1_INCOMMING,CallerLogModel::GetInstance()->GetPhoneNumber().c_str());
-             }
-             else
-             {
-                 if(cat1_api_get_cat1_volte_voice_state()==0)
-                 do_custom_cmd_service_check_msg(CUSTOM_CMD_MSG_CAT_HFP_SCO_AUDIO_START, nullptr, 0);
-                 WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "headset_Is_connect is false");
-             }
-         
-         }
-         else
-         {
-             do_custom_cmd_service_check_msg(CUSTOM_CMD_MSG_CONNECT_AG, nullptr, 0);
-         }
-         cat1_ag_send_call_event(TOPIC_EVENT_CAT1_CALLCONNTED,NULL);
-     }
-     else
-     #endif
-     {
-         do_custom_cmd_service_check_msg(CUSTOM_CMD_MSG_CAT1_AUDIO_START, nullptr, 0);
-     }
-     SetMicMutecat1(false);
-     cat1_phone_state_change_cb(OPERATE_WATCH_ACTIVE);
- 
- }
- #include "BluetoothModelC.h"
- #include "audio_manager_c_wrapper.h"
- #include "PhoneService.h"
- //拨号处理函数
- void MsgCenterNotifyCat1dialProc(const Topic topic, Request* req)
- {
-     WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "MsgCenterNotify MsgCenterNotifyCat1dialProc");
-     unused(topic);
-     unused(req);
-      if (req == NULL) return ;
-     char* call_data = (char*)malloc(req->len);
-     if(call_data==NULL) return;
-     int32 ret = memcpy_s(call_data, req->len, req->data, req->len);
-     if (ret != EOK) {
-     WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "MsgCenterNotify memcpy_s request data fail!");
-     } else {
- 
-     // int ret = PlayersModel::GetInstance()->PlayerStop();
-     stopPlayingMusic();
- 
-     if(strcmp(call_data,"SOS")==0)
-     {
-         free(call_data);
-         NotificationManager::GetInstance()->ShowNotify(showSOSNotify, (uint16_t)topic, true);
-         return;
-     }
-     
-    #ifdef SUPPORT_CAT1_SERVICE
-     cat1_cmd_send(CMD_4G_MAKE_CALL,call_data,strlen(call_data));
-    #endif
-     CallerLogModel::GetInstance()->SetoperateNumber(call_data,req->len);
+    WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "MsgCenterNotifySleepProc %d!",SleepModel::GetInstance().get_sleep_state());
 
-    #ifdef SUPPORT_CAT1_SERVICE
-     cat1_phone_state_change_cb(OPERATE_DIALING);
-    #endif
-    
-     #ifdef SUPPORT_CAT1_HFP_AG_SERV
-     if(uapi_dev_runtime_get_earphone_connect_stat())
-     {
-         if(headset_Is_connect())
-         {
-             cat1_ag_send_call_event(TOPIC_EVENT_CAT1_CALLDIAL,NULL);
-         
-             if(headset_SCO_Is_connect())
-             {
-                 if(cat1_api_get_cat1_volte_voice_state()==0)
-                 do_custom_cmd_service_check_msg(CUSTOM_CMD_MSG_CAT_HFP_SCO_AUDIO_START, nullptr, 0);
-             }
-         }
-         else
-         {
-             do_custom_cmd_service_check_msg(CUSTOM_CMD_MSG_CONNECT_AG, nullptr, 0);
-         }
-     }
-     else
-     #endif
-     {
-         do_custom_cmd_service_check_msg(CUSTOM_CMD_MSG_CAT1_AUDIO_START, nullptr, 0);
-     }
+    /*早安闹钟*/
+    if(SleepModel::GetInstance().get_sleep_state()==SLEEPSTATE::WAKE)
+    {
+        NotificationManager::GetInstance()->SetNotifyPriority(PRIORITY_TWO);
+        SleepViewEventListener::GetInstance().PopInterPlayMusic();
+    }
+    else
+    {
+        NotificationManager::GetInstance()->SetNotifyPriority(PRIORITY_THREE);
+    }
+
+        NotificationManager::GetInstance()->ShowNotify(showSleepNotify, (uint16_t)topic, true);
+    }
     
-     }
-     free(call_data);
- }
- //电话结束处理函数
- void MsgCenterNotifyCat1CallEndedProc(const Topic topic, Request* req)
- {
-     unused(topic);
-     unused(req);
+}
+
+void MsgCenterNotifyInactivityAccumulateTimeProc(const Topic topic, Request* req)
+{
+    unused(topic);
+#if 0   
+    if(uapi_dev_runtime_get_absolute_static_status())
+    {
+        memset(&sleep_data,0,sizeof(SLEEP_T));
+        state_num = 0;
+        //fall_asleep_state_num = 0;
+        uapi_dev_runtime_set_absolute_static_status(0);
+        return;
+    }
+
+    cywee_inactivity_accumulate_time_t *cywee_Inactivity_Accumulate_Time_Info = (cywee_inactivity_accumulate_time_t *)malloc(req->len);
+    if (!cywee_Inactivity_Accumulate_Time_Info)
+    {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Memory allocation failure");
+        return;
+    }
     
-     // just stop the notify
-     AlarmClockModel::GetInstance()->AlarmPlayerStop();
- 
- 
-     if(!NotificationManager::GetInstance()->GetWatchCallStatus())
-     {
-         return;
-     }
- 
-     if (req == NULL) return ;
-     char* call_data = (char*)malloc(req->len);
- 
-     if(call_data==NULL)
-     {
-         return;
-     }
-     int32 ret = memcpy_s(call_data, req->len, req->data, req->len);
- 
-     if(strcmp("callfail",call_data)==0)
-     {
-         
-         // cat1_call_hungup();
-         cat1_phone_state_change_cb(OPERATE_WATCH_FINISH);
-         CustomEventPublish(TOPIC_EVENT_CAT1_CALL_FAIL,NULL,0);
- 
-         free(call_data);
-         return;
-     }
- 
-     WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "%s %s",call_data,CallerLogModel::GetInstance()->GetPhoneNumber().c_str());
-     uint8_t offset_watch =0;
-     if(CallerLogModel::GetInstance()->GetPhoneNumber().c_str()[0]=='+')
-     {
-         offset_watch++;
-     }
- 
-     uint8_t offset_call =0;
-     if(call_data[0]=='+')
-     {
-         offset_call++;
-     }
- 
-     if(strcmp(CallerLogModel::GetInstance()->GetPhoneNumber().c_str()+offset_watch,call_data+offset_call)!=0 && 
-         CallerLogModel::GetInstance()->GetCallSource()==CallerLogModel::CallSourceCat1)
-     {
-        
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "no OPERATE_WATCH_FINISH");
-         #ifdef SUPPORT_CAT1_HFP_AG_SERV
-         cat1_ag_send_call_event(TOPIC_EVENT_CAT1_CALLENDED,NULL);
-         #endif       
-     } 
-     else
-     {
-         WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "OPERATE_WATCH_FINISH");
-         cat1_phone_state_change_cb(OPERATE_WATCH_FINISH);
-         #ifdef SUPPORT_CAT1_HFP_AG_SERV
- 
-         #endif
-     }
- 
-     free(call_data);
-     
- }
- 
- void MsgCenterNotifyCat1FailEProc(const Topic topic, Request* req)
- {
-     unused(req);
- 
-     phone_VibratorFunc();
- 
-     if(NotificationManager::GetInstance()->HasNotifyShowing())
-     NotificationManager::GetInstance()->StopNotify();
- 
-     NotificationManager::GetInstance()->ShowNotify(showcallfailNotify,
-                                                            static_cast<uint16_t>(topic), true);
- }
- #endif
-
-     static uint8_t goal_type=0;
-     void MsgCenterNotifystepProc(const Topic topic, Request* req)
-     {
-         //unused(req);
-         if (req->msgId == TOPIC_EVENT_STEPDATA_UPDATE)
-         {
-             
-             #ifdef SUPPORT_CYWEE_SERVICE
-             if (req->data == nullptr) {
-                 return;
-             }
-             // 计步数据累加
-             
-             OHOS::GoalModel::GetInstance().show_data_step_refresh();
-             OHOS::GoalModel::GetInstance().show_data_calories_refresh();
-             OHOS::GoalModel::GetInstance().show_data_distance_refresh();
-             
-             if(OHOS::GoalView::GetInstance())
-             {
-                 GraphicService::GetInstance()->PostGraphicEvent(
-                 std::bind(&OHOS::GoalView::GoalViewrefresh,  OHOS::GoalView::GetInstance() ));
- 
-             // OHOS::GoalView::GetInstance()->GoalViewrefresh();
-             }
-             if(OHOS::GoalotherView::GetInstance())
-             {
-                 //OHOS::GoalotherView::GetInstance()->GoalViewrefresh();
-                 GraphicService::GetInstance()->PostGraphicEvent(
-                 std::bind(&OHOS::GoalotherView::GoalViewrefresh,  OHOS::GoalotherView::GetInstance() ));
-             }
- 
-             if(OHOS::GoalModel::GetInstance().getstepvalue()>=100)
-             {
- 
-                 goal_type=GOAL_STEP;
-                 if(get_Is_show_flag(goal_type))
-                 {   
-                     if(OHOS::GoalModel::GetInstance().get_step_goal_show())
-                     {
-                         CustomEventPublish(TOPIC_EVENT_GOAL_SHOW_VIEW,(uint8_t *)&goal_type,1);
-                     }
-                 }
-             }
- 
-             if(OHOS::GoalModel::GetInstance().is_goal_DISTANCE_done())
-             {
-                 goal_type=GOAL_DISTANCE;
-                 if(get_Is_show_flag(goal_type))
-                 {   
-                     if(OHOS::GoalModel::GetInstance().get_other_goal_show())
-                     {
-                         CustomEventPublish(TOPIC_EVENT_GOAL_SHOW_VIEW,(uint8_t *)&goal_type,1);
-                     }
-                 
-                 }
-             }
- 
-             if(OHOS::GoalModel::GetInstance().is_goal_fatburning_done())
-             {
-                 goal_type=GOAL_FAT;
-                 if(get_Is_show_flag(goal_type))
-                 {   
-                     if(OHOS::GoalModel::GetInstance().get_other_goal_show())
-                     {
-                         CustomEventPublish(TOPIC_EVENT_GOAL_SHOW_VIEW,(uint8_t *)&goal_type,1);
-                     }
-                 }
-             }
- 
-             if(OHOS::GoalModel::GetInstance().is_goal_stand_done())
-             {
-                 goal_type=GOAL_STAND;
-                 if(get_Is_show_flag(goal_type))
-                 {   
-                     if(OHOS::GoalModel::GetInstance().get_other_goal_show())
-                     {
-                         CustomEventPublish(TOPIC_EVENT_GOAL_SHOW_VIEW,(uint8_t *)&goal_type,1);
-                     }
-                 }
-             }
- 
-             if(OHOS::GoalModel::GetInstance().is_goal_calories_done())
-             {
-                 goal_type=GOAL_CALOREIE;
-                 if(get_Is_show_flag(goal_type))
-                 {   
-                 if(OHOS::GoalModel::GetInstance().get_other_goal_show())
-                     {
-                         CustomEventPublish(TOPIC_EVENT_GOAL_SHOW_VIEW,(uint8_t *)&goal_type,1);
-                     }
-                 }
-             }
-             #endif
-         }
- 
- 
- 
-     }
- #ifdef SUPPORT_CYWEE_SERVICE    
-     //每日训练数据刷新
-     // void MsgCenterNotifyActivityProc(const Topic topic, Request* req)
-     // {
-     //     unused(topic);
-     //     cywee_activity_result_t* c_activity_result_t =  (cywee_activity_result_t *) malloc(req->len);
-     //     if(c_activity_result_t==NULL)
-     //     {
-     //         WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Memory allocation failure");
-     //         return;
-     //     }
- 
-     //     int rets = memcpy_s(c_activity_result_t, req->len, (cywee_activity_result_t*)req->data, req->len);
-     //     if (rets != EOK)
-     //     {
-     //         free(c_activity_result_t);
-     //         c_activity_result_t = NULL;
-     //         WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "memcpy_s c_activity_result_t failed, ret = %d", rets);
-     //         return;
-     //     }
-     //     if(c_activity_result_t->activity_mode == SPORT_ACTIVE_MODE_NORMAL)
-     //     {
-     //         /*更新卡路里数据*/
-     //         //if(c_activity_result_t->calories!=0)
-     //         {
-     //             set_calories_data(c_activity_result_t->calories);
-     // #if DIALDATASET
-     //             uint32_t calories= OHOS::GoalModel::GetInstance().show_data_calories_refresh();
-                 
-     //             DialModelCalorie::GetInstance()->UpdateCalorie(calories);
-     // #endif
-     //         }
-     //         /*更新距离数据*/
-     //         //if(c_activity_result_t->distance != 0)
-     //         {
-     //             set_distance_data(c_activity_result_t->distance);  
-     // #if DIALDATASET
-     //             float  distance= OHOS::GoalModel::GetInstance().show_data_distance_refresh();
-     //             DialModelDistance::GetInstance()->UpdateDistance(distance);
-     // #endif 
-     //         }
-     //     }
-     //     else if(c_activity_result_t->activity_mode == SPORT_ACTIVE_MODE_FREE_TRAINING && c_activity_result_t->MHR_zone >= 2)
-     //     {
-     //         /*更新燃脂时间数据*/
-     //         set_fat_time_data(1);
-     //     }
-         
-     //     free(c_activity_result_t);
-     //     c_activity_result_t = NULL;
-     // }
-     // static int train_fat_time = 0;
-     // void MsgCenterNotifyActivityExtraInfoProc(const Topic topic, Request* req)
-     // {
-     //     unused(topic);
-     //     cywee_activity_result_extre_info_t* c_activity_result_extre_info_t =  (cywee_activity_result_extre_info_t *) malloc(req->len);
-     //     if(c_activity_result_extre_info_t==NULL)
-     //     {
-     //         WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Memory allocation failure");
-     //         return;
-     //     }
- 
-     //     int rets = memcpy_s(c_activity_result_extre_info_t, req->len, (cywee_activity_result_extre_info_t*)req->data, req->len);
-     //     if (rets != EOK)
-     //     {
-     //         free(c_activity_result_extre_info_t);
-     //         c_activity_result_extre_info_t = NULL;
-     //         WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "memcpy_s c_activity_result_extre_info_t failed, ret = %d", rets);
-     //         return;
-     //     }
- 
-     //     if(uapi_dev_runtime_get_train_status() && c_activity_result_extre_info_t->ativity_zone_high_duration)
-     //     {
-     //         train_fat_time = c_activity_result_extre_info_t->ativity_zone_high_duration;
-     //     }
-     //     /*更新燃脂时间数据*/
-     //     else if(uapi_dev_runtime_get_train_status() == 0 && train_fat_time)
-     //     {
-     //         set_fat_time_data(train_fat_time);
-     //         train_fat_time = 0;
-     //     }
- 
-     //     free(c_activity_result_extre_info_t);
-     //     c_activity_result_extre_info_t = NULL;
-     // }
- 
- /*运动识别*/
- void MsgCenterNotifyArAlertProc(const Topic topic, Request* req)
- {
-     uint8_t* motionType=(uint8_t*)req->data;
-     WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "MsgCenterNotifyArAlertProc,motionType = %d !",*motionType);
-     MotionRecognitionViewEventListener::GetInstance().record_motion_recognition_log();
-     if(*motionType > 5 || *motionType <1) //未知运动不弹窗
-     {
-         return;
-     }
-     if (CheckPriority(topic))
-     {
-         MotionRecognitionViewEventListener::GetInstance().SetMotionTypeId(*motionType);
-         NotificationManager::GetInstance()->SetNotifyPriority(PRIORITY_TWO);
-         NotificationManager::GetInstance()->ShowNotify(showMotionRecognitionNotify, (uint16_t)topic, true);
-     }
+    int rets = memcpy_s(cywee_Inactivity_Accumulate_Time_Info, req->len, (cywee_inactivity_accumulate_time_t*)req->data, req->len);
+    if (rets != EOK)
+    {
+        free(cywee_Inactivity_Accumulate_Time_Info);
+        cywee_Inactivity_Accumulate_Time_Info = NULL;
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "memcpy_s cywee_Inactivity_Accumulate_Time_Info failed, ret = %d", rets);
+        return;
+    }
+#ifdef CUSTOM_ZHIHUI
+    if(cywee_Inactivity_Accumulate_Time_Info->output_number == INACTIVITY_MODE_NAP_ACCUMULATE_TIME_OUTPUT)
+    {
+        nap_data.total_time = cywee_Inactivity_Accumulate_Time_Info->total_time;
+        set_nap_data(&nap_data);
+        do_custom_fileoperate_service_check_msg(
+        CUSTOM_FILEOPERATE_MSG_TYPE_NAPDATA_SAVE, nullptr, 0);
+        memset(&nap_data,0,sizeof(NAP_T));
+    }
+    else if(cywee_Inactivity_Accumulate_Time_Info->output_number == INACTIVITY_MODE_SLEEPING_ACCUMULATE_TIME_OUTPUT)
+    {
+        // if(sleep_data.fall_asleep_timestamp > sleep_data.wake_up_timestamp && sleep_data.wake_up_timestamp != 0)
+        // {
+        //     sleep_data.fall_asleep_timestamp -= 24 * 60 * 60;
+        //     sleep_data.sleep_status[fall_asleep_state_num].timestamp = sleep_data.fall_asleep_timestamp;
+        // }
+
+        sleep_data.total_time = cywee_Inactivity_Accumulate_Time_Info->total_time;
+        sleep_data.total_deep_sleep_time = cywee_Inactivity_Accumulate_Time_Info->total_deep_sleep_time;
+        sleep_data.total_mild_sleep_time = cywee_Inactivity_Accumulate_Time_Info->total_mild_sleep_time;
+        sleep_data.total_wake_time = cywee_Inactivity_Accumulate_Time_Info->total_wake_time;
+        sleep_data.total_rem_sleep_time = cywee_Inactivity_Accumulate_Time_Info->total_rem_sleep_time;
+        sleep_data.status_num = state_num;
+
+        set_sleep_data(&sleep_data);
+        do_custom_fileoperate_service_check_msg(
+        CUSTOM_FILEOPERATE_MSG_TYPE_SLEEPDATA_SAVE, nullptr, 0);
+        memset(&sleep_data,0,sizeof(SLEEP_T));
+        state_num = 0;
+        //fall_asleep_state_num = 0;
+    }
+#endif
+    free(cywee_Inactivity_Accumulate_Time_Info);
+    cywee_Inactivity_Accumulate_Time_Info = NULL;
+    //uapi_dev_runtime_set_sleep_status(0);
+#endif
+}
+
+//APP运动相关
+void MsgCenterNotifybleAPPtraining(const Topic topic, Request* req)
+{
+    unused(topic);
+    uint8_t* data=(uint8_t*)req->data;
+    if(data!=NULL && req->len>=2)
+    {
+        switch (data[1])
+        {
+            case START://运动开始
+
+            break;
+            case STOP://运动暂停
+
+            break;
+            case RECOVER://运动恢复
+
+            break;
+
+            case END://运动结束
+            break;
+        }
+    }
+
+    // unused(req);
+
+}
+
+
+/* 订阅事件通知逻辑可定制 */
+static MsgCenterNotifyTable g_msgCenterNotifyTable[] = {
+    {TOPIC_EVENT_ALARM_RING,         MsgCenterNotifyAlarmProc},
+    {TOPIC_EVENT_ON_TIME,            MsgCenterNotifyONtimeProc},//增加整点保存数据
+    {TOPIC_EVENT_NEXTDAY_UPDATE,     MsgCenterNotifyNextDayProc},
+    {TOPIC_EVENT_STEPDATA_UPDATE,    MsgCenterNotifystepProc},
+
+    {TOPIC_EVENT_HFP_INCOMMING,      MsgCenterNotifyHfpIncomingProc},
+    {TOPIC_EVENT_HFP_PHONE_ACTIVE,   MsgCenterNotifyHfpPhoneProc},
+    {TOPIC_EVENT_HFP_FINISHED,       MsgCenterNotifyHfpPhoneProc},
+    {TOPIC_EVENT_HFP_WATCH_TO_PHONE, MsgCenterNotifyHfpPhoneProc},
+    {TOPIC_EVENT_HFP_WATCH_ACTIVE,   MsgCenterNotifyHfpWatchProc},
+    {TOPIC_EVENT_HFP_PHONE_TO_WATCH, MsgCenterNotifyHfpWatchProc},
+    {TOPIC_EVENT_HFP_HINT,             MsgCenterNotifyHfpWatchHintProc},
     
- }
- 
- void MsgCenterNotifyInactivityProc(const Topic topic, Request *req)
- {
-     WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "MsgCenterNotifyInactivityProc !");
-     inact_result_t *cywee_Inactivity_Info = (inact_result_t *)malloc(req->len);
-     if (!cywee_Inactivity_Info)
-     {
-         WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Memory allocation failure");
-         return;
-     }
-     
-     int rets = memcpy_s(cywee_Inactivity_Info, req->len, (inact_result_t*)req->data, req->len);
-     if (rets != EOK)
-     {
-         free(cywee_Inactivity_Info);
-         cywee_Inactivity_Info = NULL;
-         WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "memcpy_s cywee_inactivity_result_t failed, ret = %d", rets);
-         return;
-     }
-       
-     WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "cywee_Inactivity_Info->output_number = %d", cywee_Inactivity_Info->output_number);
- 
-     switch (cywee_Inactivity_Info->output_number)
-     {
-         case INACTIVITY_MODE_SEDENTARY_OUTPUT:
-             if(cywee_Inactivity_Info->status == 1)
-             {
-                 SedentaryReminderViewEventListener::GetInstance().record_sedentary_reminder_log();
-                 if (CheckPriority(topic))
-                 {
-                     NotificationManager::GetInstance()->SetNotifyPriority(PRIORITY_TWO);
-                     NotificationManager::GetInstance()->ShowNotify(showSedentaryReminderNotify, (uint16_t)topic, true);
-                 }
-             } 
-             else if(cywee_Inactivity_Info->status==9)
-             {
-                 cywee_set_stand_flag();
-             }
-             break;
-         default:
-             break;
-     }
-     
-     free(cywee_Inactivity_Info);
-     cywee_Inactivity_Info = NULL;
- }
- 
- #endif
- 
- //查找手表通知
- void MsgCenterNotifyFindWatchProc(const Topic topic, Request* req)
- {
-     WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "MsgCenterNotifyFindWatchProc !");
-     if (CheckPriority(topic))
-     {
-         uint8_t* type=(uint8_t*)req->data;
-         if(*type == 1)
-     {
-         FindWatchViewEventListener::GetInstance().SetFindWatchNotifyFlag(true);
-         FindWatchViewEventListener::GetInstance().PopInterPlayMusic(nullptr);//播放铃声
-         NotificationManager::GetInstance()->SetNotifyPriority(PRIORITY_TWO);
-         NotificationManager::GetInstance()->ShowNotify(showFindWatchNotify, (uint16_t)topic, true);
-         //如果查找手表铃声播放成功,记录该事件
-         uapi_save_runtime_log(RUNTIME_LOG_RING_PLAY_START_FINDWATCH);//TOOD*
-         } else {
-     if (FindWatchViewEventListener::GetInstance().GetFindWatchNotifyFlag() == true) {
-         NotificationManager::GetInstance()->StopNotify();
-     }
-     FindWatchViewEventListener::GetInstance().SetFindWatchNotifyFlag(false);
-         }
-     } else {
-         WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "NotifyPriority = %d ",NotificationManager::GetInstance()->GetNotifyPriority());
-     }
- }
- 
- void MsgCenterNotifyDebugOutProc(const Topic topic, Request *req)
- {
-     unused(req);
-     WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "MsgCenterNotifyDebugOutProc !");
-     if (CheckPriority(topic))
-     {
-         NotificationManager::GetInstance()->SetNotifyPriority(PRIORITY_ONE);
-         NotificationManager::GetInstance()->ShowNotify(showDebugOutputNotify, (uint16_t)topic, true);
-     }
- }
- //运动目标通知
- void MsgCenterNotifyGoalShowViewProc(const Topic topic, Request* req)
- {
-     unused(req);
-     if (CheckPriority(topic)) 
-     {
-         uint8_t* data=(uint8_t*)req->data;
-         if(get_Is_show_flag(data[0]))
-         {   
-             set_goal_flag_view(data[0]);
-             set_Is_show_flag(0,data[0]);
- 
-              const power_display_svr_api_t *display_api = power_display_svr_get_api();
- 
-             uapi_set_screen_on_api();
-             
-             NotificationManager::GetInstance()->SetNotifyPriority(PRIORITY_TWO);
-             NotificationManager::GetInstance()->ShowNotify(ShowGoalNotify, static_cast<uint16_t>(topic), true);
-         }
-     }
- }
- //喝水提醒通知
- void MsgCenterNotifyDrinkReminderProc(const Topic topic, Request *req)
- {
-    // unused(topic);
-     unused(req);
-     WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "MsgCenterNotifyDrinkReminderProc !");
-     // DrinkReminderViewEventListener::GetInstance().set_screen_on_and_vibration();
-     DrinkReminderViewEventListener::GetInstance().record_drink_reminder_log();
-     if (CheckPriority(topic))
-     {
-         NotificationManager::GetInstance()->SetNotifyPriority(PRIORITY_TWO);
-         NotificationManager::GetInstance()->ShowNotify(showDrinkReminderNotify, (uint16_t)topic, true);
-     }
- }
- //关机动画
- void MsgCenterNotifyShutDownAnimatorProc(const Topic topic, Request* req)
- {
-     unused(topic);
-     uint8_t* data=(uint8_t*)req->data;
-     set_shutDownAnimation_falg(data[0]);
-     WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "MsgCenterNotifyShutDownAnimatorProc,shutdown_flag = %d",*data);
-     NotificationManager::GetInstance()->SetNotifyPriority(PRIORITY_ONE);
-     NotificationManager::GetInstance()->ShowNotify(showShutdownAnimatorNotify, (uint16_t)topic, true);
- }
- //消息通知
- void MsgCenterNotifyMessageProc(const Topic topic, Request* req)
- {
-     // unused(topic);
-     unused(req);
-     // WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "MsgCenterNotifyMessageProc !");
-     if (CheckPriority(topic)) {
-       // do_custom_fileoperate_service_check_msg(CUSTOM_FILEOPERATE_MSG_TYPE_MESSAGE_DATA_NOTIFY,
-       // nullptr, 0);
-       OHOS::NotificationManager::GetInstance()->SetNotifyPriority(PRIORITY_THREE);
-       OHOS::NotificationManager::GetInstance()->ShowNotify(OHOS::CreateMessageView, TOPIC_EVENT_MESSAGENOTE, true);
-       //进行消息显示记录
-       uapi_save_runtime_log(RUNTIME_LOG_MSG_SHOW);
-     }
- }
- 
- //睡眠提醒通知
- void MsgCenterNotifySleepProc(const Topic topic, Request* req)
- {
-     unused(req);
-    // unused(topic);
-     if (CheckPriority(topic))
-     {
-         
-     WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "MsgCenterNotifySleepProc %d!",SleepModel::GetInstance().get_sleep_state());
- 
-     /*早安闹钟*/
-     if(SleepModel::GetInstance().get_sleep_state()==SLEEPSTATE::WAKE)
-     {
-         NotificationManager::GetInstance()->SetNotifyPriority(PRIORITY_TWO);
-         SleepViewEventListener::GetInstance().PopInterPlayMusic();
-     }
-     else
-     {
-         NotificationManager::GetInstance()->SetNotifyPriority(PRIORITY_THREE);
-     }
+#ifdef SUPPORT_CYWEE_SERVICE
+    // {TOPIC_EVENT_ACTIVITY_UPDATE,       MsgCenterNotifyActivityProc},
+    // {TOPIC_EVENT_ACTIVITY_EXTRA_INFO_UPDATE,       MsgCenterNotifyActivityExtraInfoProc},
+    {TOPIC_EVENT_AR_ALERT_TYPE_UPDATE,       MsgCenterNotifyArAlertProc},
+    {TOPIC_EVENT_INACTIVITY_UPDATE,       MsgCenterNotifyInactivityProc},
+    // {TOPIC_EVENT_INACTIVITY_ACCUMULATE_TIME_UPDATE,       MsgCenterNotifyInactivityAccumulateTimeProc},
+#endif
+    {TOPIC_EVENT_GOAL_SHOW_VIEW,    MsgCenterNotifyGoalShowViewProc},
+    {TOPIC_EVENT_BLE_TRANSMIT,       MsgCenterNotifybleTransmit},
+
+    {TOPIC_EVENT_CHARGE_PLUG,        MsgCenterNotifyChargePlugProc},
+    {TOPIC_EVENT_CHARGE_UNPLUG,      MsgCenterNotifyChargeUnPlugProc},
+    {TOPIC_EVENT_LOWPOWER_ALARM,      MsgCenterNotifyLowPowerAlarmProc},
     
-         NotificationManager::GetInstance()->ShowNotify(showSleepNotify, (uint16_t)topic, true);
-     }
-     
- }
- 
- void MsgCenterNotifyInactivityAccumulateTimeProc(const Topic topic, Request* req)
- {
-     unused(topic);
-  #if 0   
-     if(uapi_dev_runtime_get_absolute_static_status())
-     {
-         memset(&sleep_data,0,sizeof(SLEEP_T));
-         state_num = 0;
-         //fall_asleep_state_num = 0;
-         uapi_dev_runtime_set_absolute_static_status(0);
-         return;
-     }
- 
-     cywee_inactivity_accumulate_time_t *cywee_Inactivity_Accumulate_Time_Info = (cywee_inactivity_accumulate_time_t *)malloc(req->len);
-     if (!cywee_Inactivity_Accumulate_Time_Info)
-     {
-         WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Memory allocation failure");
-         return;
-     }
-     
-     int rets = memcpy_s(cywee_Inactivity_Accumulate_Time_Info, req->len, (cywee_inactivity_accumulate_time_t*)req->data, req->len);
-     if (rets != EOK)
-     {
-         free(cywee_Inactivity_Accumulate_Time_Info);
-         cywee_Inactivity_Accumulate_Time_Info = NULL;
-         WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "memcpy_s cywee_Inactivity_Accumulate_Time_Info failed, ret = %d", rets);
-         return;
-     }
- #ifdef CUSTOM_ZHIHUI
-     if(cywee_Inactivity_Accumulate_Time_Info->output_number == INACTIVITY_MODE_NAP_ACCUMULATE_TIME_OUTPUT)
-     {
-         nap_data.total_time = cywee_Inactivity_Accumulate_Time_Info->total_time;
-         set_nap_data(&nap_data);
-         do_custom_fileoperate_service_check_msg(
-         CUSTOM_FILEOPERATE_MSG_TYPE_NAPDATA_SAVE, nullptr, 0);
-         memset(&nap_data,0,sizeof(NAP_T));
-     }
-     else if(cywee_Inactivity_Accumulate_Time_Info->output_number == INACTIVITY_MODE_SLEEPING_ACCUMULATE_TIME_OUTPUT)
-     {
-         // if(sleep_data.fall_asleep_timestamp > sleep_data.wake_up_timestamp && sleep_data.wake_up_timestamp != 0)
-         // {
-         //     sleep_data.fall_asleep_timestamp -= 24 * 60 * 60;
-         //     sleep_data.sleep_status[fall_asleep_state_num].timestamp = sleep_data.fall_asleep_timestamp;
-         // }
- 
-         sleep_data.total_time = cywee_Inactivity_Accumulate_Time_Info->total_time;
-         sleep_data.total_deep_sleep_time = cywee_Inactivity_Accumulate_Time_Info->total_deep_sleep_time;
-         sleep_data.total_mild_sleep_time = cywee_Inactivity_Accumulate_Time_Info->total_mild_sleep_time;
-         sleep_data.total_wake_time = cywee_Inactivity_Accumulate_Time_Info->total_wake_time;
-         sleep_data.total_rem_sleep_time = cywee_Inactivity_Accumulate_Time_Info->total_rem_sleep_time;
-         sleep_data.status_num = state_num;
- 
-         set_sleep_data(&sleep_data);
-         do_custom_fileoperate_service_check_msg(
-         CUSTOM_FILEOPERATE_MSG_TYPE_SLEEPDATA_SAVE, nullptr, 0);
-         memset(&sleep_data,0,sizeof(SLEEP_T));
-         state_num = 0;
-         //fall_asleep_state_num = 0;
-     }
- #endif
-     free(cywee_Inactivity_Accumulate_Time_Info);
-     cywee_Inactivity_Accumulate_Time_Info = NULL;
-     //uapi_dev_runtime_set_sleep_status(0);
- #endif
- }
- 
- //APP运动相关
- void MsgCenterNotifybleAPPtraining(const Topic topic, Request* req)
- {
-     unused(topic);
-      uint8_t* data=(uint8_t*)req->data;
-     if(data!=NULL && req->len>=2)
-     {
-         switch (data[1])
-         {
-             case START://运动开始
- 
-             break;
-             case STOP://运动暂停
- 
-             break;
-             case RECOVER://运动恢复
- 
-             break;
- 
-             case END://运动结束
-             break;
-         }
-     }
- 
-     // unused(req);
- 
- }
- 
- 
- /* 订阅事件通知逻辑可定制 */
- static MsgCenterNotifyTable g_msgCenterNotifyTable[] = {
-     {TOPIC_EVENT_ALARM_RING,         MsgCenterNotifyAlarmProc},
-     {TOPIC_EVENT_ON_TIME,            MsgCenterNotifyONtimeProc},//增加整点保存数据
-     {TOPIC_EVENT_NEXTDAY_UPDATE,     MsgCenterNotifyNextDayProc},
-     {TOPIC_EVENT_STEPDATA_UPDATE,    MsgCenterNotifystepProc},
- 
-     {TOPIC_EVENT_HFP_INCOMMING,      MsgCenterNotifyHfpIncomingProc},
-     {TOPIC_EVENT_HFP_PHONE_ACTIVE,   MsgCenterNotifyHfpPhoneProc},
-     {TOPIC_EVENT_HFP_FINISHED,       MsgCenterNotifyHfpPhoneProc},
-     {TOPIC_EVENT_HFP_WATCH_TO_PHONE, MsgCenterNotifyHfpPhoneProc},
-     {TOPIC_EVENT_HFP_WATCH_ACTIVE,   MsgCenterNotifyHfpWatchProc},
-     {TOPIC_EVENT_HFP_PHONE_TO_WATCH, MsgCenterNotifyHfpWatchProc},
-     {TOPIC_EVENT_HFP_HINT,             MsgCenterNotifyHfpWatchHintProc},
-     
- #ifdef SUPPORT_CYWEE_SERVICE
-     // {TOPIC_EVENT_ACTIVITY_UPDATE,       MsgCenterNotifyActivityProc},
-     // {TOPIC_EVENT_ACTIVITY_EXTRA_INFO_UPDATE,       MsgCenterNotifyActivityExtraInfoProc},
-     {TOPIC_EVENT_AR_ALERT_TYPE_UPDATE,       MsgCenterNotifyArAlertProc},
-     {TOPIC_EVENT_INACTIVITY_UPDATE,       MsgCenterNotifyInactivityProc},
-     // {TOPIC_EVENT_INACTIVITY_ACCUMULATE_TIME_UPDATE,       MsgCenterNotifyInactivityAccumulateTimeProc},
- #endif
-     {TOPIC_EVENT_GOAL_SHOW_VIEW,    MsgCenterNotifyGoalShowViewProc},
-     {TOPIC_EVENT_BLE_TRANSMIT,       MsgCenterNotifybleTransmit},
- 
-     {TOPIC_EVENT_CHARGE_PLUG,        MsgCenterNotifyChargePlugProc},
-     {TOPIC_EVENT_CHARGE_UNPLUG,      MsgCenterNotifyChargeUnPlugProc},
-     {TOPIC_EVENT_LOWPOWER_ALARM,      MsgCenterNotifyLowPowerAlarmProc},
-     
- #ifdef SUPPORT_CAT1_MODEM
-     {TOPIC_EVENT_CAT1_INCOMMING,        MsgCenterNotifyCatIncomingCallProc},
-     {TOPIC_EVENT_CAT1_CALLCONNTED,      MsgCenterNotifyCat1CallConnectedProc},
-     {TOPIC_EVENT_CAT1_CALLENDED,        MsgCenterNotifyCat1CallEndedProc},
-     {TOPIC_EVENT_CAT1_CALLDIAL,         MsgCenterNotifyCat1dialProc},
- 
-     // {TOPIC_EVENT_CAT1_SIGNAL_UPDATE,    MsgCenterNotifyCat1SignalUpdateProc},
-     // {TOPIC_EVENT_CAT1_POWER_ON,      MsgCenterNotifyCat1PowerOnProc},
-     // {TOPIC_EVENT_CAT1_POWER_OFF,      MsgCenterNotifyCat1PowerOffProc},
-      {TOPIC_EVENT_CAT1_CALL_FAIL, MsgCenterNotifyCat1FailEProc},
- #endif
-     {TOPIC_EVENT_DEVICE_BIND,     MsgCenterNotifyDeviceBindProc},
-     {TOPIC_EVENT_FIND_WATCH,MsgCenterNotifyFindWatchProc},
-     {TOPIC_EVENT_DRINKREMINDER,MsgCenterNotifyDrinkReminderProc},
-     {TOPIC_EVENT_MESSAGENOTE,MsgCenterNotifyMessageProc},
-     {TOPIC_EVENT_SLEEPNOTE,MsgCenterNotifySleepProc},
-     {TOPIC_EVENT_DEBUGOUTPUT,MsgCenterNotifyDebugOutProc},
-     {TOPIC_EVENT_SHUTDOWN_ANIMATIOR,MsgCenterNotifyShutDownAnimatorProc},
- };
- 
- static MsgCenterNotifyTable *MsgCenterGetNotifyTblCb(uint8_t idx)
- {
-     return &g_msgCenterNotifyTable[idx];
- }
- 
- static uint8_t MsgCenterGetNotifyTblSize(void)
- {
-     return sizeof(g_msgCenterNotifyTable) / sizeof(g_msgCenterNotifyTable[0]);
- }
- 
- static void CallVolumeDipSwitchControl(uint16_t notifyId, uint8_t states)
- {
-     VolumeSliderEventListener *volumeSliderEventListener = nullptr;
-     if (notifyId == TOPIC_EVENT_HFP_WATCH_ACTIVE ||
-             notifyId == TOPIC_EVENT_HFP_PHONE_TO_WATCH) {
-         if (NotificationManager::GetInstance()->GetVolumeScreenStatus()) {
-             VolumeSettingView *settingView = GetvolumeSetting();
-             if (settingView == nullptr) {
-                 return;
-             }
-             volumeSliderEventListener = settingView->GetVolumeEventListener();
-             if (volumeSliderEventListener == nullptr) {
-                 return;
-             }
-             volumeSliderEventListener->ChangeVolume(static_cast<VolumeChangeStatus>(states));
-         } else {
-             HonrsViewChange();
-             NotificationManager::GetInstance()->SetVolumeScreenStatus(true);
-         }
-     }
-     return;
- }
- 
- static void OnKeyLongPress(uint16_t keyID)
- {
-     g_longPressFlag = true; // Long press the logo
-     if (keyID == static_cast<uint16_t>(ZliteKeyCode::ZLITE_KEY_POWER)) { // Power button
-         // After StopNotify, a restart card will pop up first
-         uint16_t notifyId = NotificationManager::GetInstance()->GetShowingNotifyId();
-         if(notifyId == TOPIC_EVENT_ALARM_RING) {
-             NativeAbility::GetInstance().ChangeSlice(VIEW_REBOOT);
-             NotificationManager::GetInstance()->SetNativeUIRunning(true);
-             NotificationManager::GetInstance()->StopNotify();
-         }
-     } else if (keyID == static_cast<uint16_t>(ZliteKeyCode::ZLITE_KEY_FUNC)) { // Function buttons
-         // Switch to user configured shortcut card
-     }
-     return;
- }
- 
- static void HandleKeyPress(uint16_t notifyId)
- {
-     if (notifyId == TOPIC_EVENT_ALARM_RING) {
-         AlarmClockModel::GetInstance()->AlarmGetClockNum();
-         AlarmPopUpPresenter::GetInstance()->DelayAlarmRing();
-         NotificationManager::GetInstance()->StopNotify();
-     }
- }
- 
- static bool PressKeyEvent(uint16_t keyID, uint8_t state)
- {
-     switch (state) {
-         case InputDevice::STATE_PRESS:
-             g_pressFlag = true;
-             return true;
-         case InputDevice::STATE_LONG_PRESS:
-             OnKeyLongPress(keyID);
-             return true;
-         case InputDevice::STATE_RELEASE:
-             if (g_longPressFlag) {
-                 g_pressFlag = false;
-                 g_longPressFlag = false;
-                 return true;
-             }
-             break;
-         default:
-             break;
-     }
-     return false;
- }
- 
- static bool KeyNotifyCallback(uint16_t keyID, uint8_t state)
- {
-     if (!OHOS::NotificationManager::GetInstance()->HasNotifyShowing()) {
-         WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "Notify does not exist!");
-         OHOS::ACELite::KeyInputModule::SetNotifyKeyListener(nullptr);
-         g_pressFlag = false;
-         g_longPressFlag = false;
-         return false;
-     }
-     if (PressKeyEvent(keyID, state)) {
-         return true;
-     }
-     uint16_t notifyId = NotificationManager::GetInstance()->GetShowingNotifyId();
-     if (keyID == static_cast<uint16_t>(ZliteKeyCode::ZLITE_KEY_POWER)) { // Power button
-         if (NotificationManager::GetInstance()->GetWatchCallStatus()) { // Volume card
-             // volume+
-             CallVolumeDipSwitchControl(notifyId, VOLUMEUP);
-         } else {
-             HandleKeyPress(notifyId);
-         }
-     }
-     else if (keyID == static_cast<uint16_t>(ZliteKeyCode::ZLITE_KEY_FUNC)) { // Function buttons
-         if (NotificationManager::GetInstance()->GetWatchCallStatus()) { // Volume card
-             // volume-
-             CallVolumeDipSwitchControl(notifyId, VOLUMEDOWN);
-         } else {
-             // Switch to user configured shortcut card
-         }
-     }
-     g_pressFlag = false;
-     g_longPressFlag = false;
-     return true;
- }
- 
- bool MsgCenterNotifyProc(const Topic topic, Request* req)
- {
-     uint8_t i;
-     uint8_t tblSize = MsgCenterGetNotifyTblSize();
-     OHOS::ACELite::KeyInputModule::SetNotifyKeyListener(KeyNotifyCallback);
-     for (i = 0; i < tblSize; i++) {
-         MsgCenterNotifyTable *item = MsgCenterGetNotifyTblCb(i);
-         if (item != nullptr && item->topic == topic && item->cb != nullptr) {
-             item->cb(topic, req);
-             return true;
-         }
-     }
- 
-     WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "MsgCenterNotifyProc:: Can not find the cb!");
-     return false;
- }
- 
- #ifdef JS_ENABLE
- void StartJsApp(char *bundleName)
- {
-     ElementName* topAbility = OHOS::AbilityMsClient::GetInstance().GetTopAbility();
-     if (topAbility == nullptr) {
-         WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "topAbility is null");
-         return;
-     }
- 
-     if (strcmp(topAbility->bundleName, bundleName) == 0) {
-         WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "%s is active", bundleName);
-         FreeElement(topAbility);
-         return;
-     }
-     FreeElement(topAbility);
-     // If the alarm notification is being processed, we need to disable the alarm notification first.
-     if (OHOS::NotificationManager::GetInstance()->GetNotifyPriority() == PRIORITY_TWO &&
-         OHOS::NotificationManager::GetInstance()->HasNotifyShowing()) {
-         WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "Alarm notification needs to be disabled first.");
-         AlarmClockModel::GetInstance()->AlarmGetClockNum();
-         OHOS::AlarmPopUpPresenter::GetInstance()->DelayAlarmRing();
-         OHOS::NotificationManager::GetInstance()->StopNotify();
-     }
-     Want *want = new Want();
-     memset_s(want, sizeof(Want), 0, sizeof(Want));
- 
-     ElementName startElement = {};
-     startElement.abilityName = (char *)"default";
-     startElement.bundleName = bundleName;
-     startElement.deviceId = nullptr;
-     SetWantElement(want, startElement);
- 
-     StartAbility(want);
-     ClearWant(want);
-     delete want;
- }
- 
- void StopJsApp(char *bundleName)
- {
-     ElementName* topAbility = OHOS::AbilityMsClient::GetInstance().GetTopAbility();
-     if (topAbility == nullptr) {
-         WEARABLE_LOGE(HILOG_MODULE_AAFWK, "topAbility is null");
-         return;
-     }
- 
-     if (strcmp(topAbility->bundleName, bundleName) != 0) {
-         WEARABLE_LOGE(HILOG_MODULE_AAFWK, "%s is not top active", bundleName);
-         FreeElement(topAbility);
-         return;
-     }
-     FreeElement(topAbility);
-     int token = 0;
-     OHOS::AbilityMsClient::GetInstance().TerminateAbility(token);
- }
- 
- void MsgCenterReportBtStatusToJS(uint16_t msgId)
- {
-     ElementName *elementName = OHOS::AbilityMsClient::GetInstance().GetTopAbility();
-     if (!(elementName != nullptr && strcmp(elementName->bundleName, "com.huawei.launcher") != 0)) {
-         WEARABLE_LOGI(WEARABLE_LOG_MODULE_MSG_CENTER, "JS is not on top, ignore report");
-         FreeElement(elementName);
-         return;
-     }
-     FreeElement(elementName);
-     if (msgId == BT_DISCONNECTED_TO_MSGCENTER) {
-         BaidumapSendMsgToJS("0", MSGCENTER_TYPE_ID_VECTOR_NAVI_BT_DISCONNECTED);
-     } else if (msgId == BT_CONNECTED_TO_MSGCENTER) {
-         BaidumapSendMsgToJS("1", MSGCENTER_TYPE_ID_VECTOR_NAVI_BT_CONNECTED);
-     } else {
-         WEARABLE_LOGI(WEARABLE_LOG_MODULE_MSG_CENTER, "unexpected msgId %d", msgId);
-     }
- }
- #endif
- 
- #ifdef __cplusplus
- }
- #endif
- }
\ No newline at end of file
+#ifdef SUPPORT_CAT1_MODEM
+    {TOPIC_EVENT_CAT1_INCOMMING,        MsgCenterNotifyCatIncomingCallProc},
+    {TOPIC_EVENT_CAT1_CALLCONNTED,      MsgCenterNotifyCat1CallConnectedProc},
+    {TOPIC_EVENT_CAT1_CALLENDED,        MsgCenterNotifyCat1CallEndedProc},
+    {TOPIC_EVENT_CAT1_CALLDIAL,         MsgCenterNotifyCat1dialProc},
+
+    // {TOPIC_EVENT_CAT1_SIGNAL_UPDATE,    MsgCenterNotifyCat1SignalUpdateProc},
+    // {TOPIC_EVENT_CAT1_POWER_ON,      MsgCenterNotifyCat1PowerOnProc},
+    // {TOPIC_EVENT_CAT1_POWER_OFF,      MsgCenterNotifyCat1PowerOffProc},
+    {TOPIC_EVENT_CAT1_CALL_FAIL, MsgCenterNotifyCat1FailEProc},
+#endif
+    {TOPIC_EVENT_DEVICE_BIND,     MsgCenterNotifyDeviceBindProc},
+    {TOPIC_EVENT_FIND_WATCH,MsgCenterNotifyFindWatchProc},
+    {TOPIC_EVENT_DRINKREMINDER,MsgCenterNotifyDrinkReminderProc},
+    {TOPIC_EVENT_MESSAGENOTE,MsgCenterNotifyMessageProc},
+    {TOPIC_EVENT_SLEEPNOTE,MsgCenterNotifySleepProc},
+    {TOPIC_EVENT_DEBUGOUTPUT,MsgCenterNotifyDebugOutProc},
+    {TOPIC_EVENT_SHUTDOWN_ANIMATIOR,MsgCenterNotifyShutDownAnimatorProc},
+};
+
+static MsgCenterNotifyTable *MsgCenterGetNotifyTblCb(uint8_t idx)
+{
+    return &g_msgCenterNotifyTable[idx];
+}
+
+static uint8_t MsgCenterGetNotifyTblSize(void)
+{
+    return sizeof(g_msgCenterNotifyTable) / sizeof(g_msgCenterNotifyTable[0]);
+}
+
+static void CallVolumeDipSwitchControl(uint16_t notifyId, uint8_t states)
+{
+    WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "1201patch合并为编译过屏蔽下方代码");
+    #if 0 // 1201patch 为编译过屏蔽
+    VolumeSliderEventListener *volumeSliderEventListener = nullptr;
+    if (notifyId == TOPIC_EVENT_HFP_WATCH_ACTIVE ||
+            notifyId == TOPIC_EVENT_HFP_PHONE_TO_WATCH) {
+        if (NotificationManager::GetInstance()->GetVolumeScreenStatus()) {
+            VolumeSettingView *settingView = GetvolumeSetting();
+            if (settingView == nullptr) {
+                return;
+            }
+            volumeSliderEventListener = settingView->GetVolumeEventListener();
+            if (volumeSliderEventListener == nullptr) {
+                return;
+            }
+            volumeSliderEventListener->ChangeVolume(static_cast<VolumeChangeStatus>(states));
+        } else {
+            HonrsViewChange();
+            NotificationManager::GetInstance()->SetVolumeScreenStatus(true);
+        }
+    }
+    return;
+    #endif
+}
+
+static void OnKeyLongPress(uint16_t keyID)
+{
+    g_longPressFlag = true; // Long press the logo
+    if (keyID == static_cast<uint16_t>(ZliteKeyCode::ZLITE_KEY_POWER)) { // Power button
+        // After StopNotify, a restart card will pop up first
+        uint16_t notifyId = NotificationManager::GetInstance()->GetShowingNotifyId();
+        if(notifyId == TOPIC_EVENT_ALARM_RING) {
+            NativeAbility::GetInstance().ChangeSlice(VIEW_REBOOT);
+            NotificationManager::GetInstance()->SetNativeUIRunning(true);
+            NotificationManager::GetInstance()->StopNotify();
+        }
+    } else if (keyID == static_cast<uint16_t>(ZliteKeyCode::ZLITE_KEY_FUNC)) { // Function buttons
+        // Switch to user configured shortcut card
+    }
+    return;
+}
+
+static void HandleKeyPress(uint16_t notifyId)
+{
+    if (notifyId == TOPIC_EVENT_ALARM_RING) {
+        AlarmClockModel::GetInstance()->AlarmGetClockNum();
+        AlarmPopUpPresenter::GetInstance()->DelayAlarmRing();
+        NotificationManager::GetInstance()->StopNotify();
+    }
+}
+
+static bool PressKeyEvent(uint16_t keyID, uint8_t state)
+{
+    switch (state) {
+        case InputDevice::STATE_PRESS:
+            g_pressFlag = true;
+            return true;
+        case InputDevice::STATE_LONG_PRESS:
+            OnKeyLongPress(keyID);
+            return true;
+        case InputDevice::STATE_RELEASE:
+            if (g_longPressFlag) {
+                g_pressFlag = false;
+                g_longPressFlag = false;
+                return true;
+            }
+            break;
+        default:
+            break;
+    }
+    return false;
+}
+
+static bool KeyNotifyCallback(uint16_t keyID, uint8_t state)
+{
+    if (!OHOS::NotificationManager::GetInstance()->HasNotifyShowing()) {
+        WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "Notify does not exist!");
+        OHOS::ACELite::KeyInputModule::SetNotifyKeyListener(nullptr);
+        g_pressFlag = false;
+        g_longPressFlag = false;
+        return false;
+    }
+    if (PressKeyEvent(keyID, state)) {
+        return true;
+    }
+    uint16_t notifyId = NotificationManager::GetInstance()->GetShowingNotifyId();
+    if (keyID == static_cast<uint16_t>(ZliteKeyCode::ZLITE_KEY_POWER)) { // Power button
+        if (NotificationManager::GetInstance()->GetWatchCallStatus()) { // Volume card
+            // volume+
+            CallVolumeDipSwitchControl(notifyId, VOLUMEUP);
+        } else {
+            HandleKeyPress(notifyId);
+        }
+    }
+    else if (keyID == static_cast<uint16_t>(ZliteKeyCode::ZLITE_KEY_FUNC)) { // Function buttons
+        if (NotificationManager::GetInstance()->GetWatchCallStatus()) { // Volume card
+            // volume-
+            CallVolumeDipSwitchControl(notifyId, VOLUMEDOWN);
+        } else {
+            // Switch to user configured shortcut card
+        }
+    }
+    g_pressFlag = false;
+    g_longPressFlag = false;
+    return true;
+}
+
+bool MsgCenterNotifyProc(const Topic topic, Request* req)
+{
+    uint8_t i;
+    uint8_t tblSize = MsgCenterGetNotifyTblSize();
+    OHOS::ACELite::KeyInputModule::SetNotifyKeyListener(KeyNotifyCallback);
+    for (i = 0; i < tblSize; i++) {
+        MsgCenterNotifyTable *item = MsgCenterGetNotifyTblCb(i);
+        if (item != nullptr && item->topic == topic && item->cb != nullptr) {
+            item->cb(topic, req);
+            return true;
+        }
+    }
+
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "MsgCenterNotifyProc:: Can not find the cb!");
+    return false;
+}
+
+#ifdef JS_ENABLE
+void StartJsApp(char *bundleName)
+{
+    ElementName* topAbility = OHOS::AbilityMsClient::GetInstance().GetTopAbility();
+    if (topAbility == nullptr) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "topAbility is null");
+        return;
+    }
+
+    if (strcmp(topAbility->bundleName, bundleName) == 0) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "%s is active", bundleName);
+        FreeElement(topAbility);
+        return;
+    }
+    FreeElement(topAbility);
+    // If the alarm notification is being processed, we need to disable the alarm notification first.
+    if (OHOS::NotificationManager::GetInstance()->GetNotifyPriority() == PRIORITY_TWO &&
+        OHOS::NotificationManager::GetInstance()->HasNotifyShowing()) {
+        WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "Alarm notification needs to be disabled first.");
+        AlarmClockModel::GetInstance()->AlarmGetClockNum();
+        OHOS::AlarmPopUpPresenter::GetInstance()->DelayAlarmRing();
+        OHOS::NotificationManager::GetInstance()->StopNotify();
+    }
+    Want *want = new Want();
+    memset_s(want, sizeof(Want), 0, sizeof(Want));
+
+    ElementName startElement = {};
+    startElement.abilityName = (char *)"default";
+    startElement.bundleName = bundleName;
+    startElement.deviceId = nullptr;
+    SetWantElement(want, startElement);
+
+    StartAbility(want);
+    ClearWant(want);
+    delete want;
+}
+
+void StopJsApp(char *bundleName)
+{
+    ElementName* topAbility = OHOS::AbilityMsClient::GetInstance().GetTopAbility();
+    if (topAbility == nullptr) {
+        WEARABLE_LOGE(HILOG_MODULE_AAFWK, "topAbility is null");
+        return;
+    }
+
+    if (strcmp(topAbility->bundleName, bundleName) != 0) {
+        WEARABLE_LOGE(HILOG_MODULE_AAFWK, "%s is not top active", bundleName);
+        FreeElement(topAbility);
+        return;
+    }
+    FreeElement(topAbility);
+    int token = 0;
+    OHOS::AbilityMsClient::GetInstance().TerminateAbility(token);
+}
+
+void MsgCenterReportBtStatusToJS(uint16_t msgId)
+{
+    ElementName *elementName = OHOS::AbilityMsClient::GetInstance().GetTopAbility();
+    if (!(elementName != nullptr && strcmp(elementName->bundleName, "com.huawei.launcher") != 0)) {
+        WEARABLE_LOGI(WEARABLE_LOG_MODULE_MSG_CENTER, "JS is not on top, ignore report");
+        FreeElement(elementName);
+        return;
+    }
+    FreeElement(elementName);
+    if (msgId == BT_DISCONNECTED_TO_MSGCENTER) {
+        BaidumapSendMsgToJS("0", MSGCENTER_TYPE_ID_VECTOR_NAVI_BT_DISCONNECTED);
+    } else if (msgId == BT_CONNECTED_TO_MSGCENTER) {
+        BaidumapSendMsgToJS("1", MSGCENTER_TYPE_ID_VECTOR_NAVI_BT_CONNECTED);
+    } else {
+        WEARABLE_LOGI(WEARABLE_LOG_MODULE_MSG_CENTER, "unexpected msgId %d", msgId);
+    }
+}
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+}
\ No newline at end of file
index 55b885a..e7ca83a 100644 (file)
@@ -607,12 +607,12 @@ namespace OHOS
 
     lowppowrViewEventListener::lowppowrViewEventListener()
     {
-        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "CallViewEventListener :%p", this);
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "lowppowrViewEventListener :%p", this);
     }
 
     lowppowrViewEventListener::~lowppowrViewEventListener()
     {
-        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "~CallViewEventListener");
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "~lowppowrViewEventListener");
     }
 
     lowppowrViewEventListener *lowppowrViewEventListener::GetInstance(void)
index 00436da..fdb4aed 100644 (file)
@@ -440,12 +440,12 @@ namespace OHOS
 
     GoalViewEventListener::GoalViewEventListener()
     {
-        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "CallViewEventListener :%p", this);
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "GoalViewEventListener :%p", this);
     }
 
     GoalViewEventListener::~GoalViewEventListener()
     {
-        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "~CallViewEventListener");
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "~GoalViewEventListener");
     }
 
     GoalViewEventListener *GoalViewEventListener::GetInstance(void)
index 740582b..f7661ad 100644 (file)
@@ -67,6 +67,7 @@ void NotifyOnKeyListener::OnKeyLongPress(const KeyEvent &event)
 
 void NotifyOnKeyListener::CallVolumeDipSwitchControl(uint8_t status)
 {
+    #if 0 // 1201patch 为编译过屏蔽
     VolumeSliderEventListener *volumeSliderEventListener = nullptr;
     if (NotificationManager::GetInstance()->GetVolumeScreenStatus()) {
         VolumeSettingView *settingView = GetvolumeSetting();
@@ -79,10 +80,11 @@ void NotifyOnKeyListener::CallVolumeDipSwitchControl(uint8_t status)
         }
         volumeSliderEventListener->ChangeVolume(static_cast<VolumeChangeStatus>(status));
     } else {
-        HonrsViewChange();
+        // HonrsViewChange();
         NotificationManager::GetInstance()->SetVolumeScreenStatus(true);
     }
     return;
+    #endif
 }
 
 void NotifyOnKeyListener::OnKeyRelease(const KeyEvent &event)
diff --git a/code/sdk/application/wearable/n9/service/msg_center/src/notify/makephone_notification.cpp b/code/sdk/application/wearable/n9/service/msg_center/src/notify/makephone_notification.cpp
deleted file mode 100644 (file)
index 8d3b492..0000000
+++ /dev/null
@@ -1,782 +0,0 @@
-/*\r
- * Copyright (c) CompanyNameMagicTag 2023-2023. All rights reserved.\r
- * Description: makephone notification implement\r
- * Author: CompanyName\r
- * Create: 2023-08-11\r
- */\r
-\r
-#include "notification_manager.h"\r
-#include "wearable_log.h"\r
-#include "CallerLogModel.h"\r
-#include "PhoneService.h"\r
-#include "cmsis_os.h"\r
-#include "UiConfig.h"\r
-#include "components/ui_image_view.h"\r
-#include "components/ui_label.h"\r
-#include "common/image_cache_manager.h"\r
-#include "VolumeSettingView.h"\r
-#include "VolumeSettingPresenter.h"\r
-#include "ui_resource_image.h"\r
-#include "audio_manager.h"\r
-\r
-namespace OHOS {\r
-\r
-using namespace Audio;\r
-using Audio::AudioManager;\r
-\r
-constexpr int32_t NOTIFY_THREE_SECONDS = 3000;\r
-constexpr int32_t NOTIFY_ONE_SECOND = 1000;\r
-constexpr int32_t NOTIFY_THIRTY_SECONDS = 30000;\r
-constexpr int32_t NOTIFY_ONE_MINUTE = 60000;\r
-constexpr int32_t NOTOFY_NO_OPERATE_TIME = 35000;\r
-int g_changeImage = 0;\r
-osTimerId_t g_callDurationTimer = nullptr; // timer of call duration\r
-osTimerId_t g_callCurrentTime = nullptr; // timer of current time\r
-\r
-static constexpr uint16 MATH_ZERO = 0;\r
-\r
-// 来电显示\r
-static constexpr uint16 LABEL_PERCENT_POSITION_X = 0;\r
-static constexpr uint16 LABEL_PERCENT_POSITION_Y = 100;\r
-static constexpr uint16 LABEL_COMINGVIEW_POSITION_X = 0;\r
-static constexpr uint16 LABEL_COMINGVIEW_POSITION_Y = 80;\r
-static constexpr uint16 TITLE_LABEL_DEFAULT_HEIGHT = 80;\r
-\r
-// 当前时间\r
-static constexpr uint16 LABEL_CURREMTTIME_POSITION_X = 0;\r
-static constexpr uint16 LABEL_CURREMTTIME_POSITION_Y = 360;\r
-static constexpr uint16 LABEL_COMINGTIME_POSITION_X = 0;\r
-static constexpr uint16 LABEL_COMINGTIME_POSITION_Y = 340;\r
-\r
-// 图片坐标\r
-static constexpr uint16 LABEL_CALLERD_POSITION_X = 0;\r
-static constexpr uint16 LABEL_CALLERD_POSITION_Y = 160;\r
-static constexpr uint16 LABEL_NEWCALLERD_POSITION_X = 0;\r
-static constexpr uint16 LABEL_NEWCALLERD_POSITION_Y = 160;\r
-static constexpr uint16 IMAGE_HONRS_POSITION_X = 185;\r
-static constexpr uint16 IMAGE_HONRS_POSITION_Y = 10;\r
-static constexpr uint16 IMAGE_HANDUP_POSITION_X = 70;\r
-static constexpr uint16 IMAGE_MIC_POSITION_X = 280;\r
-static constexpr uint16 IMAGE_DISSGREE_POSITION_X = 80;\r
-static constexpr uint16 IMAGE_AGREEING_POSITION_X = 270;\r
-static constexpr uint16 IMAGE_ALL_POSITION_Y = 240;\r
-static constexpr uint16 IMAGE_HANDUP2_POSITION_X = 177;\r
-static constexpr uint16 IMAGE_HANDUP2_POSITION_Y = 270;\r
-\r
-// 字体大小\r
-static constexpr uint16 FONT_CURRENT_SIZE = 25;\r
-static constexpr uint16 FONT_CALLER_SIZE = 40;\r
-UIViewGroup* g_phoneView = nullptr;\r
-UIViewGroup* g_multiPhoneView = nullptr;\r
-UIViewGroup* g_callingView = nullptr;\r
-UIViewGroup* g_waitingHintsView = nullptr;\r
-VolumeSettingView *g_volumeSetting = nullptr;\r
-UIImageView* g_imageAgree = nullptr;\r
-UIImageView* g_imageDissgree = nullptr;\r
-UIImageView* g_imageMicrophone = nullptr;\r
-UIImageView* g_imageHandUp = nullptr;\r
-UIImageView* g_imageHorns = nullptr;\r
-UIImageView* g_imageDissgreeNew = nullptr;\r
-UILabel* g_callerNum = nullptr;\r
-UILabel* g_callerDisplay = nullptr;\r
-UILabel* g_callDuration = nullptr;\r
-UILabel* g_currentTimes = nullptr;\r
-UILabel* g_comingTimes = nullptr;\r
-UILabel* g_newCallHints = nullptr;\r
-UILabel* g_newCallNum = nullptr;\r
-\r
-void CallTimerCallBack(int data)\r
-{\r
-    GraphicService::GetInstance()->PostGraphicEvent(std::bind(CallTimerCallBackProc, data));\r
-}\r
-\r
-void CallTimerCallBackProc(int data)\r
-{\r
-    if (g_callDuration != nullptr) {\r
-        g_callDuration->SetText(CallerLogModel::GetInstance()->DisplayCallDuration().c_str());\r
-    }\r
-}\r
-\r
-void CallCurTimerCallBack(int data)\r
-{\r
-    if (g_currentTimes != nullptr) {\r
-        g_currentTimes->SetText(CallerLogModel::GetInstance()->InitDateHourTime().c_str());\r
-    }\r
-}\r
-\r
-void StartCallTimer(CallTimerType type, int32_t interval)\r
-{\r
-    uint32_t tick;\r
-    osStatus_t retTimer;\r
-    if (type >= CallTimerType::NOTIFY_PHONE_UNKNOWN) {\r
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "StartCallTimer type:%d invalid!!", type);\r
-        return;\r
-    }\r
-    switch (type) {\r
-        case CallTimerType::NOTIFY_PHONE_CALLING_DISPLAY:\r
-            g_callDurationTimer = osTimerNew((osTimerFunc_t)CallTimerCallBack, osTimerPeriodic, nullptr, nullptr);\r
-            tick = osMs2Tick(interval);\r
-            retTimer = osTimerStart(g_callDurationTimer, tick);\r
-            if (retTimer != osOK && g_callDurationTimer != nullptr) {\r
-                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,\r
-                    "StartCallTimer osTimerStart failed, type = %d ret = %lx!!", type, retTimer);\r
-                osTimerDelete(g_callDurationTimer);\r
-                g_callDurationTimer = nullptr;\r
-                return;\r
-            }\r
-            break;\r
-        case CallTimerType::NOTIFY_PHONE_CURTIME_DISPLAY:\r
-            g_callCurrentTime = osTimerNew((osTimerFunc_t)CallCurTimerCallBack, osTimerPeriodic, nullptr, nullptr);\r
-            tick = osMs2Tick(interval);\r
-            retTimer = osTimerStart(g_callCurrentTime, tick);\r
-            if (retTimer != osOK && g_callCurrentTime != nullptr) {\r
-                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,\r
-                    "StartCallTimer osTimerStart failed, type = %d ret = %lx!!", type, retTimer);\r
-                osTimerDelete(g_callCurrentTime);\r
-                g_callCurrentTime = nullptr;\r
-                return;\r
-            }\r
-            break;\r
-        default:\r
-            break;\r
-    }\r
-}\r
-\r
-void DisableCallTimer(CallTimerType type)\r
-{\r
-    if (type >= CallTimerType::NOTIFY_PHONE_UNKNOWN) {\r
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "DisableCallTimer type:%d invalid!!", type);\r
-        return;\r
-    }\r
-    osStatus_t ret;\r
-    switch (type) {\r
-        case CallTimerType::NOTIFY_PHONE_CALLING_DISPLAY:\r
-            if (g_callDurationTimer != nullptr) {\r
-                ret = osTimerDelete(g_callDurationTimer);\r
-                if (ret != osOK) {\r
-                    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "DisableCallTimer failed, type= %d ret = %lx!", type, ret);\r
-                    return;\r
-                }\r
-                g_callDurationTimer = nullptr;\r
-            }\r
-            break;\r
-        case CallTimerType::NOTIFY_PHONE_CURTIME_DISPLAY:\r
-            if (g_callCurrentTime != nullptr) {\r
-                ret = osTimerDelete(g_callCurrentTime);\r
-                if (ret != osOK) {\r
-                    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "DisableCallTimer failed, type= %d ret = %lx!", type, ret);\r
-                    return;\r
-                }\r
-                g_callCurrentTime = nullptr;\r
-            }\r
-            break;\r
-        default:\r
-            break;\r
-    }\r
-}\r
-\r
-void HonrsViewChange(void)\r
-{\r
-    if (g_volumeSetting == nullptr) {\r
-        g_volumeSetting = new VolumeSettingView();\r
-        if (g_volumeSetting == nullptr) {\r
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "makephone_notification::g_volumeSetting nullptr err");\r
-            return;\r
-        }\r
-        if (!g_volumeSetting->SetUpVolume()) {\r
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "makephone_notification::g_volumeSetting SetUpVolume fail");\r
-            return;\r
-        }\r
-        g_volumeSetting->GetProgress()->SetValue(\r
-            AudioManager::GetInstance().GetVolume(AUDIO_STREAM_VOICE_CALL_BT_SCO));\r
-        if (AudioManager::GetInstance().GetVolume(AUDIO_STREAM_VOICE_CALL_BT_SCO) == 0) {\r
-            ImageInfo *image = ImageCacheManager::GetInstance().LoadOneInMultiRes(PLAYER_MUTE_BUTTON, PLAYER_IAMGES);\r
-            g_volumeSetting->GetDecreaseButton()->SetImageSrc(image, image);\r
-        }\r
-        NotificationManager::GetInstance()->screenContainer_->Add(g_volumeSetting);\r
-    }\r
-    VolumeSliderEventListener *volumeSliderEventListener = g_volumeSetting->GetVolumeEventListener();\r
-    if (volumeSliderEventListener == nullptr) {\r
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "makephone_notification::volumeSliderEventListener nullptr err");\r
-        return;\r
-    }\r
-\r
-    volumeSliderEventListener->SetPlayerCoefficients(VOLUMEPHONENOTIFY); // 进度条系数\r
-    g_volumeSetting->SetVisible(true);\r
-    // 刷新UI\r
-    RootView::GetInstance()->Invalidate();\r
-}\r
-VolumeSettingView *GetvolumeSetting(void)\r
-{\r
-    return g_volumeSetting;\r
-}\r
-\r
-static void FreeCallingViewImage(void)\r
-{\r
-    if (g_imageMicrophone != nullptr) {\r
-        delete g_imageMicrophone;\r
-        g_imageMicrophone = nullptr;\r
-    }\r
-    if (g_imageHandUp != nullptr) {\r
-        delete g_imageHandUp;\r
-        g_imageHandUp = nullptr;\r
-    }\r
-    if (g_imageHorns != nullptr) {\r
-        delete g_imageHorns;\r
-        g_imageHorns = nullptr;\r
-    }\r
-}\r
-\r
-static bool DrawCallingViewImage(void)\r
-{\r
-    g_imageMicrophone = new UIImageView();\r
-    if (g_imageMicrophone == nullptr) {\r
-        return false;\r
-    }\r
-    g_imageMicrophone->SetPosition(IMAGE_MIC_POSITION_X, IMAGE_ALL_POSITION_Y);\r
-    g_imageMicrophone->SetSrc(PNG_MICROPHONE_OPEN_IMAGE_PATH);\r
-    g_imageMicrophone->SetTouchable(true);\r
-    g_imageMicrophone->SetViewId("microphoneChange");\r
-\r
-    g_imageHandUp = new UIImageView();\r
-    if (g_imageHandUp == nullptr) {\r
-        FreeCallingViewImage();\r
-        return false;\r
-    }\r
-    g_imageHandUp->SetPosition(IMAGE_HANDUP_POSITION_X, IMAGE_ALL_POSITION_Y);\r
-    g_imageHandUp->SetSrc(PNG_DISSGREE_IMAGE_PATH);\r
-    g_imageHandUp->SetTouchable(true);\r
-    g_imageHandUp->SetViewId("callingHandUp");\r
-\r
-    g_imageHorns = new UIImageView();\r
-    if (g_imageHorns == nullptr) {\r
-        FreeCallingViewImage();\r
-        return false;\r
-    }\r
-    g_imageHorns->SetPosition(IMAGE_HONRS_POSITION_X, IMAGE_HONRS_POSITION_Y);\r
-    g_imageHorns->SetSrc(PNG_SOUNDBUTTON2);\r
-    g_imageHorns->SetTouchable(true);\r
-    g_imageHorns->SetViewId("volumeSwitch");\r
-\r
-    return true;\r
-}\r
-\r
-static void FreeCallingViewUILabel(void)\r
-{\r
-    if (g_callerDisplay != nullptr) {\r
-        delete g_callerDisplay;\r
-        g_callerDisplay = nullptr;\r
-    }\r
-    if (g_callDuration != nullptr) {\r
-        delete g_callDuration;\r
-        g_callDuration =  nullptr;\r
-    }\r
-    if (g_currentTimes != nullptr) {\r
-        delete g_currentTimes;\r
-        g_currentTimes = nullptr;\r
-    }\r
-}\r
-\r
-static bool DrawCallingViewUILabel(void)\r
-{\r
-    g_callerDisplay = new UILabel();\r
-    if (g_callerDisplay == nullptr) {\r
-        return false;\r
-    }\r
-    g_callerDisplay->SetPosition(LABEL_PERCENT_POSITION_X, LABEL_PERCENT_POSITION_Y,\r
-        Screen::GetInstance().GetWidth(), TITLE_LABEL_DEFAULT_HEIGHT);\r
-    g_callerDisplay->SetStyle(STYLE_BACKGROUND_COLOR, OPA_TRANSPARENT);\r
-    g_callerDisplay->SetText(CallerLogModel::GetInstance()->GetPhoneNumber().c_str());\r
-    g_callerDisplay->SetAlign(TEXT_ALIGNMENT_CENTER);\r
-    g_callerDisplay->SetFont(DEFAULT_VECTOR_FONT_FILENAME, FONT_CALLER_SIZE);\r
-    g_callerDisplay->SetTextColor(Color::White());\r
-\r
-    g_callDuration = new UILabel();\r
-    if (g_callDuration == nullptr) {\r
-        FreeCallingViewUILabel();\r
-        return false;\r
-    }\r
-    g_callDuration->SetPosition(LABEL_CALLERD_POSITION_X, LABEL_CALLERD_POSITION_Y,\r
-        Screen::GetInstance().GetWidth(), TITLE_LABEL_DEFAULT_HEIGHT);\r
-    g_callDuration->SetStyle(STYLE_BACKGROUND_COLOR, OPA_TRANSPARENT);\r
-    g_callDuration->SetAlign(TEXT_ALIGNMENT_CENTER);\r
-    g_callDuration->SetText(CallerLogModel::GetInstance()->DisplayCallDuration().c_str());\r
-    g_callDuration->SetFont(DEFAULT_VECTOR_FONT_FILENAME, FONT_CURRENT_SIZE);\r
-    g_callDuration->SetTextColor(Color::White());\r
-\r
-    g_currentTimes = new UILabel();\r
-    if (g_currentTimes == nullptr) {\r
-        FreeCallingViewUILabel();\r
-        return false;\r
-    }\r
-    g_currentTimes->SetPosition(LABEL_CURREMTTIME_POSITION_X, LABEL_CURREMTTIME_POSITION_Y,\r
-        Screen::GetInstance().GetWidth(), TITLE_LABEL_DEFAULT_HEIGHT);\r
-    g_currentTimes->SetStyle(STYLE_BACKGROUND_COLOR, OPA_TRANSPARENT);\r
-    g_currentTimes->SetAlign(TEXT_ALIGNMENT_CENTER);\r
-    g_currentTimes->SetText(CallerLogModel::GetInstance()->InitDateHourTime().c_str());\r
-    g_currentTimes->SetFont(DEFAULT_VECTOR_FONT_FILENAME, FONT_CURRENT_SIZE);\r
-    g_currentTimes->SetTextColor(Color::White());\r
-\r
-    return true;\r
-}\r
-\r
-static bool DrawWaitingHintsViewImage(void)\r
-{\r
-    g_imageDissgreeNew = new UIImageView();\r
-    if (g_imageDissgreeNew == nullptr) {\r
-        FreeCallingViewImage();\r
-        return false;\r
-    }\r
-    g_imageDissgreeNew->SetPosition(IMAGE_HANDUP2_POSITION_X, IMAGE_HANDUP2_POSITION_Y);\r
-    g_imageDissgreeNew->SetSrc(PNG_DISSGREE_IMAGE_PATH);\r
-    g_imageDissgreeNew->SetTouchable(true);\r
-    g_imageDissgreeNew->SetViewId("newCallHandUp");\r
-    return true;\r
-}\r
-\r
-static void FreeWaitingHintsViewImage(void)\r
-{\r
-    if (g_imageDissgreeNew != nullptr) {\r
-        delete g_imageDissgreeNew;\r
-        g_imageDissgreeNew = nullptr;\r
-    }\r
-}\r
-\r
-static void FreeWaitingHintsViewLabel(void)\r
-{\r
-    if (g_newCallNum != nullptr) {\r
-        delete g_newCallNum;\r
-        g_newCallNum = nullptr;\r
-    }\r
-    if (g_newCallHints != nullptr) {\r
-        delete g_newCallHints;\r
-        g_newCallHints = nullptr;\r
-    }\r
-}\r
-\r
-static bool DrawWaitingHintsViewLabel(void)\r
-{\r
-    g_newCallNum = new UILabel();\r
-    if (g_newCallNum == nullptr) {\r
-        return false;\r
-    }\r
-    g_newCallNum->SetPosition(LABEL_PERCENT_POSITION_X, LABEL_PERCENT_POSITION_Y,\r
-        Screen::GetInstance().GetWidth(), TITLE_LABEL_DEFAULT_HEIGHT);\r
-    g_newCallNum->SetStyle(STYLE_BACKGROUND_COLOR, OPA_TRANSPARENT);\r
-    g_newCallNum->SetText(CallerLogModel::GetInstance()->GetPhoneNumber().c_str());\r
-    g_newCallNum->SetAlign(TEXT_ALIGNMENT_CENTER);\r
-    g_newCallNum->SetFont(DEFAULT_VECTOR_FONT_FILENAME, FONT_CALLER_SIZE);\r
-    g_newCallNum->SetTextColor(Color::White());\r
-\r
-    g_newCallHints = new UILabel();\r
-    if (g_newCallHints == nullptr) {\r
-        FreeWaitingHintsViewLabel();\r
-        return false;\r
-    }\r
-    g_newCallHints->SetPosition(LABEL_NEWCALLERD_POSITION_X, LABEL_NEWCALLERD_POSITION_Y,\r
-        Screen::GetInstance().GetWidth(), TITLE_LABEL_DEFAULT_HEIGHT);\r
-    g_newCallHints->SetStyle(STYLE_BACKGROUND_COLOR, OPA_TRANSPARENT);\r
-    g_newCallHints->SetText("新来电");\r
-    g_newCallHints->SetAlign(TEXT_ALIGNMENT_CENTER);\r
-    g_newCallHints->SetFont(DEFAULT_VECTOR_FONT_FILENAME, FONT_CALLER_SIZE);\r
-    g_newCallHints->SetTextColor(Color::White());\r
-    return true;\r
-}\r
-\r
-static void FreePhoneCallViewImage(void)\r
-{\r
-    if (g_imageAgree != nullptr) {\r
-        delete g_imageAgree;\r
-        g_imageAgree = nullptr;\r
-    }\r
-    if (g_imageDissgree != nullptr) {\r
-        delete g_imageDissgree;\r
-        g_imageDissgree = nullptr;\r
-    }\r
-}\r
-\r
-static bool DrawPhoneCallViewImage(void)\r
-{\r
-    g_imageAgree = new UIImageView();\r
-    if (g_imageAgree == nullptr) {\r
-        return false;\r
-    }\r
-    g_imageAgree->SetPosition(IMAGE_AGREEING_POSITION_X, IMAGE_ALL_POSITION_Y);\r
-    g_imageAgree->SetSrc(PNG_AGREEING_IMAGE_PATH);\r
-    g_imageAgree->SetTouchable(true);\r
-    g_imageAgree->SetViewId("answer");\r
-    UIView::OnClickListener *clickListener = static_cast<UIView::OnClickListener *>\\r
-        (OHOS::CallViewEventListener::GetInstance());\r
-    g_imageAgree->SetOnClickListener(clickListener);\r
-    g_imageDissgree = new UIImageView();\r
-    if (g_imageDissgree == nullptr) {\r
-        FreePhoneCallViewImage();\r
-        return false;\r
-    }\r
-    g_imageDissgree->SetPosition(IMAGE_DISSGREE_POSITION_X, IMAGE_ALL_POSITION_Y);\r
-    g_imageDissgree->SetSrc(PNG_DISSGREE_IMAGE_PATH);\r
-    g_imageDissgree->SetTouchable(true);\r
-    g_imageDissgree->SetViewId("displayHandUp");\r
-    g_imageDissgree->SetOnClickListener(clickListener);\r
-    return true;\r
-}\r
-\r
-static void FreePhoneCallViewLabel(void)\r
-{\r
-    if (g_callerNum != nullptr) {\r
-        delete g_callerNum;\r
-        g_callerNum = nullptr;\r
-    }\r
-    if (g_comingTimes != nullptr) {\r
-        delete g_comingTimes;\r
-        g_comingTimes = nullptr;\r
-    }\r
-}\r
-\r
-static bool DrawPhoneCallViewLabel(void)\r
-{\r
-    g_callerNum = new UILabel();\r
-    if (g_callerNum == nullptr) {\r
-        return false;\r
-    }\r
-    g_callerNum->SetPosition(LABEL_COMINGVIEW_POSITION_X, LABEL_COMINGVIEW_POSITION_Y,\r
-        Screen::GetInstance().GetWidth(), TITLE_LABEL_DEFAULT_HEIGHT);\r
-    g_callerNum->SetStyle(STYLE_BACKGROUND_COLOR, OPA_TRANSPARENT);\r
-    WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "CreatePhoneCallView phonenum:%s!",\r
-                  CallerLogModel::GetInstance()->GetPhoneNumber().c_str());\r
-    g_callerNum->SetText(CallerLogModel::GetInstance()->GetPhoneNumber().c_str());\r
-    g_callerNum->SetAlign(TEXT_ALIGNMENT_CENTER);\r
-    g_callerNum->SetFont(DEFAULT_VECTOR_FONT_FILENAME, FONT_CALLER_SIZE);\r
-    g_callerNum->SetTextColor(Color::White());\r
-\r
-    g_comingTimes = new UILabel();\r
-    if (g_comingTimes == nullptr) {\r
-        FreePhoneCallViewLabel();\r
-        return false;\r
-    }\r
-    g_comingTimes->SetPosition(LABEL_COMINGTIME_POSITION_X, LABEL_COMINGTIME_POSITION_Y,\r
-        Screen::GetInstance().GetWidth(), TITLE_LABEL_DEFAULT_HEIGHT);\r
-    g_comingTimes->SetStyle(STYLE_BACKGROUND_COLOR, OPA_TRANSPARENT);\r
-    g_comingTimes->SetAlign(TEXT_ALIGNMENT_CENTER);\r
-    g_comingTimes->SetText(CallerLogModel::GetInstance()->InitDateHourTime().c_str());\r
-    g_comingTimes->SetFont(DEFAULT_VECTOR_FONT_FILENAME, FONT_CURRENT_SIZE);\r
-    g_comingTimes->SetTextColor(Color::White());\r
-    return true;\r
-}\r
-\r
-UIViewGroup* CreatePhoneCallView(void)\r
-{\r
-    g_phoneView = new UIViewGroup();\r
-    if (g_phoneView == nullptr) {\r
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "CreatePhoneCallView g_phoneView null!");\r
-        return nullptr;\r
-    }\r
-    g_phoneView->SetPosition(MATH_ZERO, MATH_ZERO);\r
-    g_phoneView->SetWidth(Screen::GetInstance().GetWidth());\r
-    g_phoneView->SetHeight(Screen::GetInstance().GetHeight());\r
-    if (!DrawPhoneCallViewImage()) {\r
-        delete g_phoneView;\r
-        g_phoneView = nullptr;\r
-        return nullptr;\r
-    }\r
-    if (!DrawPhoneCallViewLabel()) {\r
-        FreePhoneCallViewImage();\r
-        delete g_phoneView;\r
-        g_phoneView = nullptr;\r
-        return nullptr;\r
-    }\r
-    g_phoneView->Add(g_imageAgree);\r
-    g_phoneView->Add(g_imageDissgree);\r
-    g_phoneView->Add(g_callerNum);\r
-    g_phoneView->Add(g_comingTimes);\r
-    g_phoneView->SetDraggable(true);\r
-    g_phoneView->SetTouchable(true);\r
-    NotificationManager::GetInstance()->RegisterNotifyCleanupFunction(FreePhoneCallView);\r
-    return g_phoneView;\r
-}\r
-\r
-void FreePhoneCallView(void)\r
-{\r
-    if (g_phoneView != nullptr) {\r
-        g_phoneView->RemoveAll();\r
-        FreePhoneCallViewImage();\r
-        FreePhoneCallViewLabel();\r
-        RootView::GetInstance()->Remove(g_phoneView);\r
-        delete g_phoneView;\r
-        g_phoneView = nullptr;\r
-    }\r
-}\r
-\r
-UIViewGroup* CreateMultiplePhoneView(void)\r
-{\r
-    g_multiPhoneView = new UIViewGroup();\r
-    if (g_multiPhoneView == nullptr) {\r
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "CreateMultiplePhoneView g_multiPhoneView null!");\r
-        return nullptr;\r
-    }\r
-    g_multiPhoneView->SetPosition(MATH_ZERO, MATH_ZERO);\r
-    g_multiPhoneView->SetWidth(Screen::GetInstance().GetWidth());\r
-    g_multiPhoneView->SetHeight(Screen::GetInstance().GetHeight());\r
-    if (!DrawCallingViewImage()) {\r
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "CreateMultiplePhoneView create image error!");\r
-        delete g_multiPhoneView;\r
-        g_multiPhoneView = nullptr;\r
-        return nullptr;\r
-    }\r
-    if (!DrawCallingViewUILabel()) {\r
-        FreeCallingViewImage();\r
-        delete g_multiPhoneView;\r
-        g_multiPhoneView = nullptr;\r
-        return nullptr;\r
-    }\r
-    g_callerDisplay->SetText("正在通话");\r
-    g_callDuration->SetText("");\r
-    g_multiPhoneView->Add(g_imageMicrophone);\r
-    g_multiPhoneView->Add(g_imageHandUp);\r
-    g_multiPhoneView->Add(g_imageHorns);\r
-    g_multiPhoneView->Add(g_callerDisplay);\r
-    g_multiPhoneView->Add(g_callDuration);\r
-    g_multiPhoneView->Add(g_currentTimes);\r
-    g_multiPhoneView->SetDraggable(true);\r
-    g_multiPhoneView->SetTouchable(true);\r
-    UIView::OnClickListener *clickListener = static_cast<UIView::OnClickListener *>\\r
-        (OHOS::CallViewEventListener::GetInstance());\r
-    g_imageMicrophone->SetOnClickListener(clickListener);\r
-    g_imageHandUp->SetOnClickListener(clickListener);\r
-    g_imageHorns->SetOnClickListener(clickListener);\r
-    StartCallTimer(CallTimerType::NOTIFY_PHONE_CURTIME_DISPLAY, NOTIFY_THIRTY_SECONDS);\r
-    NotificationManager::GetInstance()->SetVolumeScreenStatus(false);\r
-    NotificationManager::GetInstance()->RegisterNotifyCleanupFunction(FreeMultiplePhoneCallView);\r
-    return g_multiPhoneView;\r
-}\r
-\r
-void FreeMultiplePhoneCallView(void)\r
-{\r
-    if (g_multiPhoneView != nullptr) {\r
-        DisableCallTimer(CallTimerType::NOTIFY_PHONE_CURTIME_DISPLAY);\r
-        g_multiPhoneView->RemoveAll();\r
-        FreeCallingViewImage();\r
-        FreeCallingViewUILabel();\r
-        RootView::GetInstance()->Remove(g_multiPhoneView);\r
-        delete g_multiPhoneView;\r
-        g_multiPhoneView = nullptr;\r
-    }\r
-    if (g_volumeSetting != nullptr) {\r
-        delete g_volumeSetting;\r
-        g_volumeSetting = nullptr;\r
-    }\r
-}\r
-\r
-UIViewGroup* CreateCallingView(void)\r
-{\r
-    g_callingView = new UIViewGroup();\r
-    if (g_callingView == nullptr) {\r
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "CreateCallingView g_callingView null!");\r
-        return nullptr;\r
-    }\r
-    g_callingView->SetPosition(MATH_ZERO, MATH_ZERO);\r
-    g_callingView->SetWidth(Screen::GetInstance().GetWidth());\r
-    g_callingView->SetHeight(Screen::GetInstance().GetHeight());\r
-    if (!DrawCallingViewImage()) {\r
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "CreateCallingView create image error!");\r
-        delete g_callingView;\r
-        g_callingView = nullptr;\r
-        return nullptr;\r
-    }\r
-    if (!DrawCallingViewUILabel()) {\r
-        FreeCallingViewImage();\r
-        delete g_callingView;\r
-        g_callingView = nullptr;\r
-        return nullptr;\r
-    }\r
-    g_callingView->Add(g_imageMicrophone);\r
-    g_callingView->Add(g_imageHandUp);\r
-    g_callingView->Add(g_imageHorns);\r
-    g_callingView->Add(g_callerDisplay);\r
-    g_callingView->Add(g_callDuration);\r
-    g_callingView->Add(g_currentTimes);\r
-    g_callingView->SetDraggable(true);\r
-    g_callingView->SetTouchable(true);\r
-    UIView::OnClickListener *clickListener = static_cast<UIView::OnClickListener *>\\r
-        (OHOS::CallViewEventListener::GetInstance());\r
-    g_imageMicrophone->SetOnClickListener(clickListener);\r
-    g_imageHandUp->SetOnClickListener(clickListener);\r
-    g_imageHorns->SetOnClickListener(clickListener);\r
-    StartCallTimer(CallTimerType::NOTIFY_PHONE_CALLING_DISPLAY, NOTIFY_ONE_SECOND);\r
-    StartCallTimer(CallTimerType::NOTIFY_PHONE_CURTIME_DISPLAY, NOTIFY_THIRTY_SECONDS);\r
-    NotificationManager::GetInstance()->SetVolumeScreenStatus(false);\r
-    NotificationManager::GetInstance()->RegisterNotifyCleanupFunction(FreeCallingView);\r
-    return g_callingView;\r
-}\r
-\r
-void FreeCallingView(void)\r
-{\r
-    if (g_callingView != nullptr) {\r
-        DisableCallTimer(CallTimerType::NOTIFY_PHONE_CALLING_DISPLAY);\r
-        DisableCallTimer(CallTimerType::NOTIFY_PHONE_CURTIME_DISPLAY);\r
-        g_callingView->RemoveAll();\r
-        FreeCallingViewImage();\r
-        FreeCallingViewUILabel();\r
-        RootView::GetInstance()->Remove(g_callingView);\r
-        delete g_callingView;\r
-        g_callingView = nullptr;\r
-    }\r
-    if (g_volumeSetting != nullptr) {\r
-        delete g_volumeSetting;\r
-        g_volumeSetting = nullptr;\r
-    }\r
-}\r
-\r
-UIViewGroup* CreateWaitingHintsView(void)\r
-{\r
-    g_waitingHintsView = new UIViewGroup();\r
-    if (g_waitingHintsView == nullptr) {\r
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "CreateWaitingHintsView g_waitingHintsView null!");\r
-        return nullptr;\r
-    }\r
-    g_waitingHintsView->SetPosition(MATH_ZERO, MATH_ZERO);\r
-    g_waitingHintsView->SetWidth(Screen::GetInstance().GetWidth());\r
-    g_waitingHintsView->SetHeight(Screen::GetInstance().GetHeight());\r
-    if (!DrawWaitingHintsViewImage()) {\r
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "CreateWaitingHintsView create image error!");\r
-        delete g_waitingHintsView;\r
-        g_waitingHintsView = nullptr;\r
-        return nullptr;\r
-    }\r
-    if (!DrawWaitingHintsViewLabel()) {\r
-        FreeWaitingHintsViewImage();\r
-        delete g_waitingHintsView;\r
-        g_waitingHintsView = nullptr;\r
-        return nullptr;\r
-    }\r
-    g_waitingHintsView->Add(g_imageDissgreeNew);\r
-    g_waitingHintsView->Add(g_newCallNum);\r
-    g_waitingHintsView->Add(g_newCallHints);\r
-    g_waitingHintsView->SetDraggable(true);\r
-    g_waitingHintsView->SetTouchable(true);\r
-    UIView::OnClickListener *clickListener = static_cast<UIView::OnClickListener *>\\r
-        (OHOS::CallViewEventListener::GetInstance());\r
-    g_imageDissgreeNew->SetOnClickListener(clickListener);\r
-    NotificationManager::GetInstance()->RegisterNotifyCleanupFunction(FreeWaitingHintsView);\r
-    return g_waitingHintsView;\r
-}\r
-\r
-void FreeWaitingHintsView(void)\r
-{\r
-    if (g_waitingHintsView != nullptr) {\r
-        g_waitingHintsView->RemoveAll();\r
-        FreeWaitingHintsViewImage();\r
-        FreeWaitingHintsViewLabel();\r
-        RootView::GetInstance()->Remove(g_waitingHintsView);\r
-        delete g_waitingHintsView;\r
-        g_waitingHintsView = nullptr;\r
-    }\r
-}\r
-\r
-void RefreshMicrophoneImageSrc(const char* src)\r
-{\r
-    g_imageMicrophone->SetSrc(src);\r
-}\r
-\r
-void EnableWaitingView(void)\r
-{\r
-    if (g_waitingHintsView == nullptr) {\r
-        CreateWaitingHintsView();\r
-    }\r
-    if (NotificationManager::GetInstance()->screenContainer_ != nullptr) {\r
-        NotificationManager::GetInstance()->screenContainer_->SetVisible(false);\r
-    }\r
-    RootView::GetInstance()->Add(g_waitingHintsView);\r
-    g_waitingHintsView->SetVisible(true);\r
-    RootView::GetInstance()->Invalidate();\r
-}\r
-\r
-void DisableWatingView(void)\r
-{\r
-    if (g_waitingHintsView != nullptr) {\r
-        g_waitingHintsView->SetVisible(false);\r
-        FreeWaitingHintsView();\r
-        if (NotificationManager::GetInstance()->screenContainer_ != nullptr) {\r
-            NotificationManager::GetInstance()->screenContainer_->SetVisible(true);\r
-        }\r
-        RootView::GetInstance()->Invalidate();\r
-    }\r
-}\r
-\r
-bool HintsHandupClick(void)\r
-{\r
-    if (RejectIncomingCall() != 0) {\r
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[HintsHandupClick] RejectIncomingCall error");\r
-        return false;\r
-    }\r
-    CallerLogModel::GetInstance()->SetWaitingStatus(false);\r
-    CallerLogModel::GetInstance()->SetCallStatus(true);\r
-\r
-    return true;\r
-}\r
-\r
-CallViewEventListener::CallViewEventListener()\r
-{\r
-    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "CallViewEventListener :%p", this);\r
-}\r
-\r
-CallViewEventListener::~CallViewEventListener()\r
-{\r
-    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "~CallViewEventListener");\r
-}\r
-\r
-CallViewEventListener *CallViewEventListener::GetInstance(void)\r
-{\r
-    static CallViewEventListener callViewEventListener;\r
-    return &callViewEventListener;\r
-}\r
-\r
-bool CallViewEventListener::OnClick(UIView& view, const ClickEvent& event)\r
-{\r
-    UNUSED(event);\r
-    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MakephoneNotify ClickListener %s", view.GetViewId());\r
-    if (strcmp(view.GetViewId(), "answer") == 0) {\r
-        // watch answer the call\r
-        if (AcceptIncomingCall() != 0) {\r
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "AcceptIncomingCall() fail");\r
-            return false;\r
-        }\r
-        return true;\r
-    } else if (strcmp(view.GetViewId(), "displayHandUp") == 0 ||\r
-        strcmp(view.GetViewId(), "callingHandUp") == 0) {\r
-        if (strcmp(view.GetViewId(), "displayHandUp") == 0) {\r
-            // The watch rejects the call\r
-            if (RejectIncomingCall() != 0) {\r
-                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "RejectIncomingCall() fail");\r
-                return false;\r
-            }\r
-        }\r
-        if (FinishCall() != 0) {\r
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "FinishCall() fail");\r
-            return false;\r
-        }\r
-        return true;\r
-    } else if (strcmp(view.GetViewId(), "microphoneChange") == 0) {\r
-        if (g_changeImage == 0) {\r
-            g_changeImage = 1;\r
-            RefreshMicrophoneImageSrc(PNG_MICROPHONE_CLOSE_IMAGE_PATH);\r
-            SetMicMute(true);\r
-        } else {\r
-            g_changeImage = 0;\r
-            RefreshMicrophoneImageSrc(PNG_MICROPHONE_OPEN_IMAGE_PATH);\r
-            SetMicMute(false);\r
-        }\r
-        return true;\r
-    } else if (strcmp(view.GetViewId(), "volumeSwitch") == 0) {\r
-        HonrsViewChange();\r
-    } else if (strcmp(view.GetViewId(), "newCallHandUp") == 0) {\r
-        if (!HintsHandupClick()) {\r
-            return false;\r
-        }\r
-    }\r
-    if (strcmp(view.GetViewId(), "SOS_FAIL") == 0) {\r
-        NotificationManager::GetInstance()->StopNotify();\r
-    }\r
-    return true;\r
-}\r
-}  // namespace OHOS\r
index 27a529f..ddc3e8f 100644 (file)
@@ -495,8 +495,8 @@ UIViewGroup* SOS_cant_dial(void)
     alarm_labelbutton->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 44);
     alarm_labelbutton->SetStyleForState(STYLE_BORDER_COLOR, 0xff0b1928, UIButton::PRESSED);
 
-    UIView::OnClickListener *button1Click = static_cast<UIView::OnClickListener *>(CallViewEventListener::GetInstance());
-    alarm_labelbutton->SetOnClickListener(button1Click);
+    // UIView::OnClickListener *button1Click = static_cast<UIView::OnClickListener *>(CallViewEventListener::GetInstance());
+    // alarm_labelbutton->SetOnClickListener(button1Click);
 
     SOSView->Add(alarm_labelbutton);
     alarm_labelbutton->SetVisible(true);
index e83fa68..99d7af5 100644 (file)
@@ -1557,12 +1557,12 @@ namespace OHOS
 
     transmittingViewEventListener::transmittingViewEventListener()
     {
-        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "CallViewEventListener :%p", this);
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "transmittingViewEventListener :%p", this);
     }
 
     transmittingViewEventListener::~transmittingViewEventListener()
     {
-        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "~CallViewEventListener");
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "~transmittingViewEventListener");
     }
 
     transmittingViewEventListener *transmittingViewEventListener::GetInstance(void)
index 5f8a450..7af818e 100644 (file)
@@ -52,6 +52,7 @@ errcode_t msg_center_phone_msg_rec(uint8_t cmd_id, uint8_t type, void *usr_data,
 \r
 errcode_t msg_center_update_contacts(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len)\r
 {\r
+    #if 0 // 1201patch 为编译过屏蔽\r
     uint8_t tl_len = msg_center_get_tlv_tl_len(usr_data);\r
     uint16_t payload_len = usr_len - tl_len;\r
     uint8_t *tlv_payload = (uint8_t *)msg_center_get_tlv_payload(usr_data);\r
@@ -69,10 +70,13 @@ errcode_t msg_center_update_contacts(uint8_t cmd_id, uint8_t type, void *usr_dat
         return ERRCODE_FAIL;\r
     }\r
     return ERRCODE_SUCC;\r
+    #endif\r
+    return ERRCODE_SUCC;\r
 }\r
 \r
 errcode_t msg_center_lookup_contacts(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len)\r
 {\r
+    #if 0 // 1201patch 为编译过屏蔽\r
     uint8_t tl_len = msg_center_get_tlv_tl_len(usr_data);\r
     uint16_t payload_len = usr_len - tl_len;\r
     uint8_t *tlv_payload = (uint8_t *)msg_center_get_tlv_payload(usr_data);\r
@@ -90,6 +94,7 @@ errcode_t msg_center_lookup_contacts(uint8_t cmd_id, uint8_t type, void *usr_dat
         WEARABLE_LOGE(WEARABLE_LOG_MODULE_MSG_CENTER, "msg_center_lookup_contacts fail, ret = %d\r\n", ret);\r
         return ERRCODE_FAIL;\r
     }\r
+    #endif\r
     return ERRCODE_SUCC;\r
 }\r
 \r
index 7ccf448..9a2d789 100644 (file)
@@ -41,7 +41,7 @@
 #ifdef SUPPORT_AT_SENSOR
 #include "sensor_sample.h"
 #endif
-#include "monkey/MonkeyModel.h"
+// #include "monkey/MonkeyModel.h"
 
 #define ARRAY_COUNT(array) (sizeof(array) / sizeof(array[0]))
 #define OHOSFWK_MAX_ARGC            8
@@ -162,6 +162,7 @@ static const char *StateInfoToString(int8_t pageInfo)
 
 static uint32_t OhosfwkATCmdAmDfx(uint8_t *para, uint32_t paraLen, char *strCommonCmd)
 {
+    #if 0 // 1201patch 为编译过屏蔽
     unused(strCommonCmd);
 
     uint8_t argv[OHOSFWK_MAX_ARGC][OHOSFWK_MAX_ARGV_LEN] = {0};
@@ -205,6 +206,7 @@ static uint32_t OhosfwkATCmdAmDfx(uint8_t *para, uint32_t paraLen, char *strComm
         PRINTK("pageState: %s\n", pageInfoLog);
         PRINTK("-----------PageState End-----------\n");
     }
+    #endif
     return ERRCODE_SUCC;
 }
 
@@ -648,6 +650,7 @@ static uint32_t OhosfwkATSwitchSlicePage(uint8_t *para, uint32_t paraLen, char *
 
 static uint32_t OhosATMonkeyControl(uint8_t *para, uint32_t paraLen, char *strCommonCmd)
 {
+    #if 0 // 1201patch 为编译过屏蔽
     unused(strCommonCmd);
     uint8_t argv[OHOSFWK_MAX_ARGC][OHOSFWK_MAX_ARGV_LEN] = {0};
     uint32_t argc = 0;
@@ -666,6 +669,7 @@ static uint32_t OhosATMonkeyControl(uint8_t *para, uint32_t paraLen, char *strCo
     uint32_t monkeyControl = atoi(monkeyStr);
     WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "OhosATMonkeyControl(),monkeyControl = %[d]", monkeyControl);
     OHOS::MonkeyModel::GetInstance().SetStart(monkeyControl);
+    #endif
     return ERRCODE_SUCC;
 }
 #endif
diff --git a/code/sdk/interim_binary/brandy/libs/media/evb_standard/libjs_audio_recorder.a b/code/sdk/interim_binary/brandy/libs/media/evb_standard/libjs_audio_recorder.a
new file mode 100644 (file)
index 0000000..514c229
Binary files /dev/null and b/code/sdk/interim_binary/brandy/libs/media/evb_standard/libjs_audio_recorder.a differ
diff --git a/code/sdk/middleware/services/gpu/api/rm/brandy-native-js-fd230-r/libgfx_rm.a b/code/sdk/middleware/services/gpu/api/rm/brandy-native-js-fd230-r/libgfx_rm.a
deleted file mode 100644 (file)
index a731301..0000000
Binary files a/code/sdk/middleware/services/gpu/api/rm/brandy-native-js-fd230-r/libgfx_rm.a and /dev/null differ
diff --git a/code/sdk/middleware/services/gpu/api/rm/brandy-native-js-fd230/libgfx_rm.a b/code/sdk/middleware/services/gpu/api/rm/brandy-native-js-fd230/libgfx_rm.a
deleted file mode 100644 (file)
index 7337ef0..0000000
Binary files a/code/sdk/middleware/services/gpu/api/rm/brandy-native-js-fd230/libgfx_rm.a and /dev/null differ
diff --git a/code/sdk/middleware/services/gpu/api/rm/brandy-native-js-fd230_user-r/libgfx_rm.a b/code/sdk/middleware/services/gpu/api/rm/brandy-native-js-fd230_user-r/libgfx_rm.a
deleted file mode 100644 (file)
index a731301..0000000
Binary files a/code/sdk/middleware/services/gpu/api/rm/brandy-native-js-fd230_user-r/libgfx_rm.a and /dev/null differ
diff --git a/code/sdk/middleware/services/gpu/api/rm/brandy-native-js-fd230_user/libgfx_rm.a b/code/sdk/middleware/services/gpu/api/rm/brandy-native-js-fd230_user/libgfx_rm.a
deleted file mode 100644 (file)
index 7337ef0..0000000
Binary files a/code/sdk/middleware/services/gpu/api/rm/brandy-native-js-fd230_user/libgfx_rm.a and /dev/null differ
diff --git a/code/sdk/middleware/services/gpu/api/rm/brandy-native-js-fd272-r/libgfx_rm.a b/code/sdk/middleware/services/gpu/api/rm/brandy-native-js-fd272-r/libgfx_rm.a
deleted file mode 100644 (file)
index a731301..0000000
Binary files a/code/sdk/middleware/services/gpu/api/rm/brandy-native-js-fd272-r/libgfx_rm.a and /dev/null differ
diff --git a/code/sdk/middleware/services/gpu/api/rm/brandy-native-js-fd272/libgfx_rm.a b/code/sdk/middleware/services/gpu/api/rm/brandy-native-js-fd272/libgfx_rm.a
deleted file mode 100644 (file)
index 7337ef0..0000000
Binary files a/code/sdk/middleware/services/gpu/api/rm/brandy-native-js-fd272/libgfx_rm.a and /dev/null differ
diff --git a/code/sdk/middleware/services/gpu/api/rm/brandy-native-js-ln-r/libgfx_rm.a b/code/sdk/middleware/services/gpu/api/rm/brandy-native-js-ln-r/libgfx_rm.a
deleted file mode 100644 (file)
index a731301..0000000
Binary files a/code/sdk/middleware/services/gpu/api/rm/brandy-native-js-ln-r/libgfx_rm.a and /dev/null differ
diff --git a/code/sdk/middleware/services/gpu/api/rm/brandy-native-js-ln/libgfx_rm.a b/code/sdk/middleware/services/gpu/api/rm/brandy-native-js-ln/libgfx_rm.a
deleted file mode 100644 (file)
index 7337ef0..0000000
Binary files a/code/sdk/middleware/services/gpu/api/rm/brandy-native-js-ln/libgfx_rm.a and /dev/null differ
diff --git a/code/sdk/middleware/services/gpu/api/rm/brandy-native-js-lnppp-r/libgfx_rm.a b/code/sdk/middleware/services/gpu/api/rm/brandy-native-js-lnppp-r/libgfx_rm.a
deleted file mode 100644 (file)
index a731301..0000000
Binary files a/code/sdk/middleware/services/gpu/api/rm/brandy-native-js-lnppp-r/libgfx_rm.a and /dev/null differ
diff --git a/code/sdk/middleware/services/gpu/api/rm/brandy-native-js-lnppp/libgfx_rm.a b/code/sdk/middleware/services/gpu/api/rm/brandy-native-js-lnppp/libgfx_rm.a
deleted file mode 100644 (file)
index 7337ef0..0000000
Binary files a/code/sdk/middleware/services/gpu/api/rm/brandy-native-js-lnppp/libgfx_rm.a and /dev/null differ
index a731301..6977fba 100644 (file)
Binary files a/code/sdk/middleware/services/gpu/api/rm/brandy-native-js-n9-r/libgfx_rm.a and b/code/sdk/middleware/services/gpu/api/rm/brandy-native-js-n9-r/libgfx_rm.a differ
index 7337ef0..1dc614b 100644 (file)
Binary files a/code/sdk/middleware/services/gpu/api/rm/brandy-native-js-n9/libgfx_rm.a and b/code/sdk/middleware/services/gpu/api/rm/brandy-native-js-n9/libgfx_rm.a differ
diff --git a/code/sdk/middleware/services/gpu/api/rm/brandy-native-js-n9ln-r/libgfx_rm.a b/code/sdk/middleware/services/gpu/api/rm/brandy-native-js-n9ln-r/libgfx_rm.a
deleted file mode 100644 (file)
index a731301..0000000
Binary files a/code/sdk/middleware/services/gpu/api/rm/brandy-native-js-n9ln-r/libgfx_rm.a and /dev/null differ
diff --git a/code/sdk/middleware/services/gpu/api/rm/brandy-native-js-n9ln/libgfx_rm.a b/code/sdk/middleware/services/gpu/api/rm/brandy-native-js-n9ln/libgfx_rm.a
deleted file mode 100644 (file)
index 7337ef0..0000000
Binary files a/code/sdk/middleware/services/gpu/api/rm/brandy-native-js-n9ln/libgfx_rm.a and /dev/null differ
index 9d278be..e1bb71d 100644 (file)
Binary files a/code/sdk/middleware/services/gui/uikit/brandy-native-js-n9/libuikit_ext.a and b/code/sdk/middleware/services/gui/uikit/brandy-native-js-n9/libuikit_ext.a differ
index 4b333bd..da46ace 100644 (file)
@@ -489,6 +489,7 @@ void PrintWatchDialInfo(const watch_dial_info &info)
 
 void DebugGetAllWatchFaceInfo(int argc, char *argv[])
 {
+    #if 0 // 1201patch 为编译过屏蔽
     GraphicService::GetInstance()->PostGraphicEvent([]() {
         watch_dial_info *info = nullptr;
         uint8_t num = 0;
@@ -502,6 +503,7 @@ void DebugGetAllWatchFaceInfo(int argc, char *argv[])
         }
         free(info);
     });
+    #endif
 }
 
 void DebugGetWatchFaceInfo(int argc, char *argv[])
@@ -590,6 +592,7 @@ void DebugUninstallWatch(int argc, char *argv[])
 
 void DebugGetUuidByPath(int argc, char *argv[])
 {
+    #if 0 // 1201patch 为编译过屏蔽
     if (argc != 1) {
         printf("fmt: AT^UIKIT_DFX=debug_get_uuid <num>\n");
         return;
@@ -610,6 +613,7 @@ void DebugGetUuidByPath(int argc, char *argv[])
         return;
     }
     printf("Succuss to get file %s, uuid %u\n", path.c_str(), uuid);
+    #endif
 }
 #endif // defined (SUPPORT_DIAL_DEBUG)
 
index 137756c..67b75a0 100644 (file)
@@ -15,7 +15,7 @@
 #include "engines/gfx/lite_m_gfx_engine.h"
 #include "ui_test_cross.h"
 #ifdef SUPPORT_OHOSFWK
-#include "screennotify/ui_screennotify.h"
+#include "screennotify/include/ui_screennotify.h"
 #endif
 
 namespace OHOS {
index 6a7a62b..2b7ebd9 100644 (file)
@@ -138,11 +138,13 @@ namespace OHOS {
 \r
     UITestTransitionModel::UITestTransitionModel()\r
     {\r
+        #if 0 // 1201patch 为编译过屏蔽\r
         for (const auto& entry: g_transitionsMap) {\r
             UITestTransitionSample info(static_cast<uint16_t>(entry.first), entry.second.second,\\r
                                     entry.second.first.c_str(), PNG_TRANSITION_SLICE_SAMPLE);\r
             transitionInfoList_.push_back(info);\r
         }\r
+        #endif\r
     }\r
     UITestTransitionModel::~UITestTransitionModel() {}\r
 \r
index b294a76..203d8c9 100644 (file)
Binary files a/code/sdk/open_source/openharmony/foundation/aafwk/aafwk_lite/brandy-native-js-n9/libams.a and b/code/sdk/open_source/openharmony/foundation/aafwk/aafwk_lite/brandy-native-js-n9/libams.a differ
diff --git a/code/sdk/open_source/openharmony/foundation/ace/ace_engine_lite/brandy-native-js-fd230/libace.a b/code/sdk/open_source/openharmony/foundation/ace/ace_engine_lite/brandy-native-js-fd230/libace.a
deleted file mode 100644 (file)
index e807091..0000000
Binary files a/code/sdk/open_source/openharmony/foundation/ace/ace_engine_lite/brandy-native-js-fd230/libace.a and /dev/null differ
diff --git a/code/sdk/open_source/openharmony/foundation/ace/ace_engine_lite/brandy-native-js-fd230/libace_http.a b/code/sdk/open_source/openharmony/foundation/ace/ace_engine_lite/brandy-native-js-fd230/libace_http.a
deleted file mode 100644 (file)
index cdfdb31..0000000
Binary files a/code/sdk/open_source/openharmony/foundation/ace/ace_engine_lite/brandy-native-js-fd230/libace_http.a and /dev/null differ
diff --git a/code/sdk/open_source/openharmony/foundation/ace/ace_engine_lite/brandy-native-js-fd230/libnetstack_http.a b/code/sdk/open_source/openharmony/foundation/ace/ace_engine_lite/brandy-native-js-fd230/libnetstack_http.a
deleted file mode 100644 (file)
index b9c1bb0..0000000
Binary files a/code/sdk/open_source/openharmony/foundation/ace/ace_engine_lite/brandy-native-js-fd230/libnetstack_http.a and /dev/null differ
diff --git a/code/sdk/open_source/openharmony/foundation/ace/ace_engine_lite/brandy-native-js-fd230/libwebsocket.a b/code/sdk/open_source/openharmony/foundation/ace/ace_engine_lite/brandy-native-js-fd230/libwebsocket.a
deleted file mode 100644 (file)
index 8dfa5e2..0000000
Binary files a/code/sdk/open_source/openharmony/foundation/ace/ace_engine_lite/brandy-native-js-fd230/libwebsocket.a and /dev/null differ
diff --git a/code/sdk/open_source/openharmony/foundation/ace/ace_engine_lite/brandy-native-js-fd230_user/libace.a b/code/sdk/open_source/openharmony/foundation/ace/ace_engine_lite/brandy-native-js-fd230_user/libace.a
deleted file mode 100644 (file)
index e807091..0000000
Binary files a/code/sdk/open_source/openharmony/foundation/ace/ace_engine_lite/brandy-native-js-fd230_user/libace.a and /dev/null differ
diff --git a/code/sdk/open_source/openharmony/foundation/ace/ace_engine_lite/brandy-native-js-fd230_user/libace_http.a b/code/sdk/open_source/openharmony/foundation/ace/ace_engine_lite/brandy-native-js-fd230_user/libace_http.a
deleted file mode 100644 (file)
index cdfdb31..0000000
Binary files a/code/sdk/open_source/openharmony/foundation/ace/ace_engine_lite/brandy-native-js-fd230_user/libace_http.a and /dev/null differ
diff --git a/code/sdk/open_source/openharmony/foundation/ace/ace_engine_lite/brandy-native-js-fd230_user/libnetstack_http.a b/code/sdk/open_source/openharmony/foundation/ace/ace_engine_lite/brandy-native-js-fd230_user/libnetstack_http.a
deleted file mode 100644 (file)
index b9c1bb0..0000000
Binary files a/code/sdk/open_source/openharmony/foundation/ace/ace_engine_lite/brandy-native-js-fd230_user/libnetstack_http.a and /dev/null differ
diff --git a/code/sdk/open_source/openharmony/foundation/ace/ace_engine_lite/brandy-native-js-fd230_user/libwebsocket.a b/code/sdk/open_source/openharmony/foundation/ace/ace_engine_lite/brandy-native-js-fd230_user/libwebsocket.a
deleted file mode 100644 (file)
index 8dfa5e2..0000000
Binary files a/code/sdk/open_source/openharmony/foundation/ace/ace_engine_lite/brandy-native-js-fd230_user/libwebsocket.a and /dev/null differ
diff --git a/code/sdk/open_source/openharmony/foundation/ace/ace_engine_lite/brandy-native-js-fd272/libace.a b/code/sdk/open_source/openharmony/foundation/ace/ace_engine_lite/brandy-native-js-fd272/libace.a
deleted file mode 100644 (file)
index e807091..0000000
Binary files a/code/sdk/open_source/openharmony/foundation/ace/ace_engine_lite/brandy-native-js-fd272/libace.a and /dev/null differ
diff --git a/code/sdk/open_source/openharmony/foundation/ace/ace_engine_lite/brandy-native-js-fd272/libace_http.a b/code/sdk/open_source/openharmony/foundation/ace/ace_engine_lite/brandy-native-js-fd272/libace_http.a
deleted file mode 100644 (file)
index cdfdb31..0000000
Binary files a/code/sdk/open_source/openharmony/foundation/ace/ace_engine_lite/brandy-native-js-fd272/libace_http.a and /dev/null differ
diff --git a/code/sdk/open_source/openharmony/foundation/ace/ace_engine_lite/brandy-native-js-fd272/libnetstack_http.a b/code/sdk/open_source/openharmony/foundation/ace/ace_engine_lite/brandy-native-js-fd272/libnetstack_http.a
deleted file mode 100644 (file)
index b9c1bb0..0000000
Binary files a/code/sdk/open_source/openharmony/foundation/ace/ace_engine_lite/brandy-native-js-fd272/libnetstack_http.a and /dev/null differ
diff --git a/code/sdk/open_source/openharmony/foundation/ace/ace_engine_lite/brandy-native-js-fd272/libwebsocket.a b/code/sdk/open_source/openharmony/foundation/ace/ace_engine_lite/brandy-native-js-fd272/libwebsocket.a
deleted file mode 100644 (file)
index 8dfa5e2..0000000
Binary files a/code/sdk/open_source/openharmony/foundation/ace/ace_engine_lite/brandy-native-js-fd272/libwebsocket.a and /dev/null differ
diff --git a/code/sdk/open_source/openharmony/foundation/ace/ace_engine_lite/brandy-native-js-ln/libace.a b/code/sdk/open_source/openharmony/foundation/ace/ace_engine_lite/brandy-native-js-ln/libace.a
deleted file mode 100644 (file)
index e807091..0000000
Binary files a/code/sdk/open_source/openharmony/foundation/ace/ace_engine_lite/brandy-native-js-ln/libace.a and /dev/null differ
diff --git a/code/sdk/open_source/openharmony/foundation/ace/ace_engine_lite/brandy-native-js-ln/libace_http.a b/code/sdk/open_source/openharmony/foundation/ace/ace_engine_lite/brandy-native-js-ln/libace_http.a
deleted file mode 100644 (file)
index cdfdb31..0000000
Binary files a/code/sdk/open_source/openharmony/foundation/ace/ace_engine_lite/brandy-native-js-ln/libace_http.a and /dev/null differ
diff --git a/code/sdk/open_source/openharmony/foundation/ace/ace_engine_lite/brandy-native-js-ln/libnetstack_http.a b/code/sdk/open_source/openharmony/foundation/ace/ace_engine_lite/brandy-native-js-ln/libnetstack_http.a
deleted file mode 100644 (file)
index b9c1bb0..0000000
Binary files a/code/sdk/open_source/openharmony/foundation/ace/ace_engine_lite/brandy-native-js-ln/libnetstack_http.a and /dev/null differ
diff --git a/code/sdk/open_source/openharmony/foundation/ace/ace_engine_lite/brandy-native-js-ln/libwebsocket.a b/code/sdk/open_source/openharmony/foundation/ace/ace_engine_lite/brandy-native-js-ln/libwebsocket.a
deleted file mode 100644 (file)
index 8dfa5e2..0000000
Binary files a/code/sdk/open_source/openharmony/foundation/ace/ace_engine_lite/brandy-native-js-ln/libwebsocket.a and /dev/null differ
diff --git a/code/sdk/open_source/openharmony/foundation/ace/ace_engine_lite/brandy-native-js-lnppp/libace.a b/code/sdk/open_source/openharmony/foundation/ace/ace_engine_lite/brandy-native-js-lnppp/libace.a
deleted file mode 100644 (file)
index e807091..0000000
Binary files a/code/sdk/open_source/openharmony/foundation/ace/ace_engine_lite/brandy-native-js-lnppp/libace.a and /dev/null differ
diff --git a/code/sdk/open_source/openharmony/foundation/ace/ace_engine_lite/brandy-native-js-lnppp/libace_http.a b/code/sdk/open_source/openharmony/foundation/ace/ace_engine_lite/brandy-native-js-lnppp/libace_http.a
deleted file mode 100644 (file)
index cdfdb31..0000000
Binary files a/code/sdk/open_source/openharmony/foundation/ace/ace_engine_lite/brandy-native-js-lnppp/libace_http.a and /dev/null differ
diff --git a/code/sdk/open_source/openharmony/foundation/ace/ace_engine_lite/brandy-native-js-lnppp/libnetstack_http.a b/code/sdk/open_source/openharmony/foundation/ace/ace_engine_lite/brandy-native-js-lnppp/libnetstack_http.a
deleted file mode 100644 (file)
index b9c1bb0..0000000
Binary files a/code/sdk/open_source/openharmony/foundation/ace/ace_engine_lite/brandy-native-js-lnppp/libnetstack_http.a and /dev/null differ
diff --git a/code/sdk/open_source/openharmony/foundation/ace/ace_engine_lite/brandy-native-js-lnppp/libwebsocket.a b/code/sdk/open_source/openharmony/foundation/ace/ace_engine_lite/brandy-native-js-lnppp/libwebsocket.a
deleted file mode 100644 (file)
index 8dfa5e2..0000000
Binary files a/code/sdk/open_source/openharmony/foundation/ace/ace_engine_lite/brandy-native-js-lnppp/libwebsocket.a and /dev/null differ
index e807091..8d5a592 100644 (file)
Binary files a/code/sdk/open_source/openharmony/foundation/ace/ace_engine_lite/brandy-native-js-n9/libace.a and b/code/sdk/open_source/openharmony/foundation/ace/ace_engine_lite/brandy-native-js-n9/libace.a differ
diff --git a/code/sdk/open_source/openharmony/foundation/ace/ace_engine_lite/brandy-native-js-n9/libace_ble.a b/code/sdk/open_source/openharmony/foundation/ace/ace_engine_lite/brandy-native-js-n9/libace_ble.a
new file mode 100644 (file)
index 0000000..77e74b0
Binary files /dev/null and b/code/sdk/open_source/openharmony/foundation/ace/ace_engine_lite/brandy-native-js-n9/libace_ble.a differ
diff --git a/code/sdk/open_source/openharmony/foundation/ace/ace_engine_lite/brandy-native-js-n9/libace_ext.a b/code/sdk/open_source/openharmony/foundation/ace/ace_engine_lite/brandy-native-js-n9/libace_ext.a
new file mode 100644 (file)
index 0000000..99a6acf
Binary files /dev/null and b/code/sdk/open_source/openharmony/foundation/ace/ace_engine_lite/brandy-native-js-n9/libace_ext.a differ
index cdfdb31..b93d220 100644 (file)
Binary files a/code/sdk/open_source/openharmony/foundation/ace/ace_engine_lite/brandy-native-js-n9/libace_http.a and b/code/sdk/open_source/openharmony/foundation/ace/ace_engine_lite/brandy-native-js-n9/libace_http.a differ
diff --git a/code/sdk/open_source/openharmony/foundation/ace/ace_engine_lite/brandy-native-js-n9/libace_websocket.a b/code/sdk/open_source/openharmony/foundation/ace/ace_engine_lite/brandy-native-js-n9/libace_websocket.a
new file mode 100644 (file)
index 0000000..757832c
Binary files /dev/null and b/code/sdk/open_source/openharmony/foundation/ace/ace_engine_lite/brandy-native-js-n9/libace_websocket.a differ
index b9c1bb0..fcaecba 100644 (file)
Binary files a/code/sdk/open_source/openharmony/foundation/ace/ace_engine_lite/brandy-native-js-n9/libnetstack_http.a and b/code/sdk/open_source/openharmony/foundation/ace/ace_engine_lite/brandy-native-js-n9/libnetstack_http.a differ
index 8dfa5e2..c8de21d 100644 (file)
Binary files a/code/sdk/open_source/openharmony/foundation/ace/ace_engine_lite/brandy-native-js-n9/libwebsocket.a and b/code/sdk/open_source/openharmony/foundation/ace/ace_engine_lite/brandy-native-js-n9/libwebsocket.a differ
diff --git a/code/sdk/open_source/openharmony/foundation/ace/ace_engine_lite/brandy-native-js-n9ln/libace.a b/code/sdk/open_source/openharmony/foundation/ace/ace_engine_lite/brandy-native-js-n9ln/libace.a
deleted file mode 100644 (file)
index e807091..0000000
Binary files a/code/sdk/open_source/openharmony/foundation/ace/ace_engine_lite/brandy-native-js-n9ln/libace.a and /dev/null differ
diff --git a/code/sdk/open_source/openharmony/foundation/ace/ace_engine_lite/brandy-native-js-n9ln/libace_http.a b/code/sdk/open_source/openharmony/foundation/ace/ace_engine_lite/brandy-native-js-n9ln/libace_http.a
deleted file mode 100644 (file)
index cdfdb31..0000000
Binary files a/code/sdk/open_source/openharmony/foundation/ace/ace_engine_lite/brandy-native-js-n9ln/libace_http.a and /dev/null differ
diff --git a/code/sdk/open_source/openharmony/foundation/ace/ace_engine_lite/brandy-native-js-n9ln/libnetstack_http.a b/code/sdk/open_source/openharmony/foundation/ace/ace_engine_lite/brandy-native-js-n9ln/libnetstack_http.a
deleted file mode 100644 (file)
index b9c1bb0..0000000
Binary files a/code/sdk/open_source/openharmony/foundation/ace/ace_engine_lite/brandy-native-js-n9ln/libnetstack_http.a and /dev/null differ
diff --git a/code/sdk/open_source/openharmony/foundation/ace/ace_engine_lite/brandy-native-js-n9ln/libwebsocket.a b/code/sdk/open_source/openharmony/foundation/ace/ace_engine_lite/brandy-native-js-n9ln/libwebsocket.a
deleted file mode 100644 (file)
index 8dfa5e2..0000000
Binary files a/code/sdk/open_source/openharmony/foundation/ace/ace_engine_lite/brandy-native-js-n9ln/libwebsocket.a and /dev/null differ
index c960af1..6c0cff5 100644 (file)
@@ -14,7 +14,9 @@
 #include "cJSON.h"
 #include "calendar_utils.h"
 #include "msg_center_msg.h"
+#if 0 // 1201patch 为编译过屏蔽
 #include "msg_center_client.h"
+#endif
 #include "event_id_manager.h"
 
 namespace OHOS {
@@ -139,6 +141,7 @@ static int64_t GetCurrentTimestamp()
  */
 static void CalendarTimerCallback(void *arg)
 {
+    #if 0 // 1201patch 为编译过屏蔽
     struct timeval tv;
     gettimeofday(&tv, nullptr);
     uint64_t currentTimeMs = GetCurrentTimestamp();
@@ -177,6 +180,7 @@ static void CalendarTimerCallback(void *arg)
             ++it;  // Move to next element
         }
     }
+    #endif
 }
 
 // Check if it's a valid reminder event
index d0da474..27fb829 100644 (file)
@@ -7,7 +7,9 @@
 
 #include <list>
 #include <mutex>
+#if 0 // 1201patch 为编译过屏蔽
 #include "settings/model/SettingBluetoothModel.h"
+#endif
 #include "msg_center_protocol.h"
 #include "connection_manage.h"
 
@@ -117,6 +119,7 @@ void UnregisterConnectListener(uint8_t networkType, NetConnectionCallback callba
 
 uint8_t GetNetConnectState(uint8_t netType)
 {
+    #if 0 // 1201patch 为编译过屏蔽
     uint8_t state = CONNECTION_STATUS_UNKNOWN;
     switch (netType) {
         case NETWORK_TYPE_WIFI:
@@ -140,4 +143,6 @@ uint8_t GetNetConnectState(uint8_t netType)
             break;
     }
     return state;
+    #endif
+    return CONNECTION_STATUS_UNKNOWN;
 }
index 2a446dc..05a628b 100644 (file)
@@ -56,6 +56,7 @@ JSIValue RouterModule::Replace(const JSIValue thisVal, const JSIValue* args, uin
 
 JSIValue RouterModule::ReplaceToNative(const JSIValue thisVal, const JSIValue *args, uint8_t argsNum)
 {
+#if 0 // 1201patch 为编译过屏蔽
     uint16_t sliceId = 0;
     // router.replaceToNative({sliceId: 1}}
     JSIValue jsId = JSI::GetNamedProperty(args[0], "sliceId");
@@ -89,6 +90,7 @@ JSIValue RouterModule::ReplaceToNative(const JSIValue thisVal, const JSIValue *a
 
     OHOS::NativeAbility::GetInstance().ChangeSlice(sliceId);
     return JSI::CreateUndefined();
+#endif
 }
 } // namespace ACELite
 } // namespace OHOS
index f262ad8..599f480 100644 (file)
Binary files a/code/sdk/open_source/openharmony/foundation/appexecfwk/appexecfwk_lite/brandy-native-js-n9/libbms.a and b/code/sdk/open_source/openharmony/foundation/appexecfwk/appexecfwk_lite/brandy-native-js-n9/libbms.a differ
diff --git a/code/sdk/open_source/openharmony/third_party/jerryscript/brandy-native-js-fd230/libjerryscript.a b/code/sdk/open_source/openharmony/third_party/jerryscript/brandy-native-js-fd230/libjerryscript.a
deleted file mode 100644 (file)
index bafd4fc..0000000
Binary files a/code/sdk/open_source/openharmony/third_party/jerryscript/brandy-native-js-fd230/libjerryscript.a and /dev/null differ
diff --git a/code/sdk/open_source/openharmony/third_party/jerryscript/brandy-native-js-fd230_user/libjerryscript.a b/code/sdk/open_source/openharmony/third_party/jerryscript/brandy-native-js-fd230_user/libjerryscript.a
deleted file mode 100644 (file)
index bafd4fc..0000000
Binary files a/code/sdk/open_source/openharmony/third_party/jerryscript/brandy-native-js-fd230_user/libjerryscript.a and /dev/null differ
diff --git a/code/sdk/open_source/openharmony/third_party/jerryscript/brandy-native-js-fd272/libjerryscript.a b/code/sdk/open_source/openharmony/third_party/jerryscript/brandy-native-js-fd272/libjerryscript.a
deleted file mode 100644 (file)
index bafd4fc..0000000
Binary files a/code/sdk/open_source/openharmony/third_party/jerryscript/brandy-native-js-fd272/libjerryscript.a and /dev/null differ
diff --git a/code/sdk/open_source/openharmony/third_party/jerryscript/brandy-native-js-ln/libjerryscript.a b/code/sdk/open_source/openharmony/third_party/jerryscript/brandy-native-js-ln/libjerryscript.a
deleted file mode 100644 (file)
index bafd4fc..0000000
Binary files a/code/sdk/open_source/openharmony/third_party/jerryscript/brandy-native-js-ln/libjerryscript.a and /dev/null differ
diff --git a/code/sdk/open_source/openharmony/third_party/jerryscript/brandy-native-js-lnppp/libjerryscript.a b/code/sdk/open_source/openharmony/third_party/jerryscript/brandy-native-js-lnppp/libjerryscript.a
deleted file mode 100644 (file)
index bafd4fc..0000000
Binary files a/code/sdk/open_source/openharmony/third_party/jerryscript/brandy-native-js-lnppp/libjerryscript.a and /dev/null differ
index bafd4fc..82e598e 100644 (file)
Binary files a/code/sdk/open_source/openharmony/third_party/jerryscript/brandy-native-js-n9/libjerryscript.a and b/code/sdk/open_source/openharmony/third_party/jerryscript/brandy-native-js-n9/libjerryscript.a differ
index 8c7f3a9..067d51a 100644 (file)
@@ -377,7 +377,9 @@ lwip_init(void)
 #endif /* LWIP_DNS */
 
 #if LWIP_SLIP
+#if 0 // 1201patch 为编译过屏蔽
   slip_test_init();
+#endif
 #endif /* LWIP_SLIP */
 #if PPP_SUPPORT
   ppp_init();
index 74ef96d..0bc6dea 100644 (file)
@@ -384,10 +384,12 @@ errcode_t cat1_register_time_ctl_functions(time_ctl_funcs_t *funcs)
 
 void cat1_api_suspend_protocol(void)
 {
+    #if 0 // 1201patch 为编译过屏蔽
     #ifdef SUPPORT_LWIP
         tcpip_thread_suspend();
         slipif_loop_thread_suspend();
     #endif
+    #endif
 }
 
 /**
@@ -403,11 +405,12 @@ void cat1_api_suspend_protocol(void)
  */
 void cat1_api_resume_protocol(void)
 {
+    #if 0 // 1201patch 为编译过屏蔽
     #ifdef SUPPORT_LWIP
         tcpip_thread_resume();
         slipif_loop_thread_resume();
     #endif
-
+    #endif
 }
 
 /**
index bdfdcf0..400a734 100644 (file)
@@ -2264,7 +2264,9 @@ static uint32_t custom_sio_debug_enable(uint8_t *para, uint32_t paraLen, char *s
     UNUSED(strCommonCmd);
     UNUSED(para);
     UNUSED(paraLen);
+    #if 0 // 1201patch 为编译过屏蔽
     sio_set_debug_enabled(true);
+    #endif
     return ERRCODE_SUCC;
 }
 
index 8b2fdb9..a28e29c 100644 (file)
@@ -354,7 +354,8 @@ static void zhihui_ws_recv_thread_func(void *arg)
     
     // 调用关闭回调
     if (client->on_close) {
-        client->on_close(client->client_fd);
+        struct WebSocketErrorResult errorResult = { WEBSOCKET_OK, NULL };
+        client->on_close(client->client_fd, errorResult);
     }
 }