application文件夹下wearable文件夹合并提交
authorluozheng <1732036298@qq.com>
Thu, 24 Jul 2025 06:30:26 +0000 (14:30 +0800)
committerluozheng <1732036298@qq.com>
Thu, 24 Jul 2025 06:30:26 +0000 (14:30 +0800)
735 files changed:
code/sdk/application/wearable/alipay/service/alipay_bluetooth.c
code/sdk/application/wearable/nativeabilityfwk/CMakeLists.txt
code/sdk/application/wearable/nativeabilityfwk/include/Ability.h
code/sdk/application/wearable/nativeabilityfwk/include/AbilitySlice.h
code/sdk/application/wearable/nativeabilityfwk/include/AbilitySliceProxy.h
code/sdk/application/wearable/nativeabilityfwk/include/BackDragListener.h
code/sdk/application/wearable/nativeabilityfwk/include/NativeAbility.h
code/sdk/application/wearable/nativeabilityfwk/include/PageTransitionMgr.h
code/sdk/application/wearable/nativeabilityfwk/include/Presenter.h
code/sdk/application/wearable/nativeabilityfwk/include/RecentManager.h [new file with mode: 0644]
code/sdk/application/wearable/nativeabilityfwk/include/Slice.h
code/sdk/application/wearable/nativeabilityfwk/include/SlicePage.h [new file with mode: 0644]
code/sdk/application/wearable/nativeabilityfwk/include/SlicePageFactory.h [new file with mode: 0644]
code/sdk/application/wearable/nativeabilityfwk/include/SlicePageManager.h [new file with mode: 0644]
code/sdk/application/wearable/nativeabilityfwk/include/SliceProxy.h
code/sdk/application/wearable/nativeabilityfwk/include/View.h
code/sdk/application/wearable/nativeabilityfwk/src/Ability.cpp
code/sdk/application/wearable/nativeabilityfwk/src/AbilitySlice.cpp [new file with mode: 0644]
code/sdk/application/wearable/nativeabilityfwk/src/NativeAbility.cpp
code/sdk/application/wearable/nativeabilityfwk/src/transition/BackToHexagonsTransition.cpp
code/sdk/application/wearable/nativeabilityfwk/src/transition/BackToWaterfallTransition.cpp
code/sdk/application/wearable/nativeapp/CMakeLists.txt
code/sdk/application/wearable/nativeapp/brandy-auto-ota-cli/libuikit_fwk.a
code/sdk/application/wearable/nativeapp/brandy-auto-ota-ser/libuikit_fwk.a
code/sdk/application/wearable/nativeapp/brandy-native-js/libuikit_fwk.a
code/sdk/application/wearable/nativeapp/brandy-xts/libuikit_fwk.a
code/sdk/application/wearable/nativeapp/nativelauncher/include/AppViewIDs.h
code/sdk/application/wearable/nativeapp/nativelauncher/include/NativeLauncher.h
code/sdk/application/wearable/nativeapp/nativelauncher/include/NativeRegisterManager.h
code/sdk/application/wearable/nativeapp/nativelauncher/include/UICardPageFactory.h [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativelauncher/include/UiConfig.h
code/sdk/application/wearable/nativeapp/nativelauncher/include/ui_resource_breath.h [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativelauncher/include/ui_resource_camera.h [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativelauncher/include/ui_resource_date.h [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativelauncher/include/ui_resource_findPhone.h [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativelauncher/include/ui_resource_sleep.h [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativelauncher/include/ui_resource_string.h [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativelauncher/include/ui_resource_timer.h [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativelauncher/include/ui_resource_weather.h [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativelauncher/include/ui_stopwatch_resource.h [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativelauncher/src/NativeLauncher.cpp
code/sdk/application/wearable/nativeapp/nativelauncher/src/NativeRegisterManager.cpp
code/sdk/application/wearable/nativeapp/nativelauncher/src/UICardPageFactory.cpp [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativeui/activity/src/ActivityModel.cpp
code/sdk/application/wearable/nativeapp/nativeui/activity/src/ActivityPresenter.cpp
code/sdk/application/wearable/nativeapp/nativeui/activity/src/ActivityWeekView.cpp
code/sdk/application/wearable/nativeapp/nativeui/activity/src/MainActivityView.cpp
code/sdk/application/wearable/nativeapp/nativeui/add_card/src/AddCardAdapter.cpp
code/sdk/application/wearable/nativeapp/nativeui/add_card/src/AddCardItem.cpp
code/sdk/application/wearable/nativeapp/nativeui/add_card/src/AddCardModel.cpp
code/sdk/application/wearable/nativeapp/nativeui/add_card/src/AddCardPresenter.cpp
code/sdk/application/wearable/nativeapp/nativeui/add_card/src/AddCardView.cpp
code/sdk/application/wearable/nativeapp/nativeui/alarm/src/AlarmClockModel.cpp
code/sdk/application/wearable/nativeapp/nativeui/alarm/src/AlarmCloseRingView.cpp
code/sdk/application/wearable/nativeapp/nativeui/alarm/src/AlarmConfigView.cpp
code/sdk/application/wearable/nativeapp/nativeui/alarm/src/AlarmJudgeView.cpp
code/sdk/application/wearable/nativeapp/nativeui/alarm/src/AlarmMaxClock.cpp
code/sdk/application/wearable/nativeapp/nativeui/alarm/src/AlarmNewTimeView.cpp
code/sdk/application/wearable/nativeapp/nativeui/alarm/src/AlarmPopUpPresenter.cpp
code/sdk/application/wearable/nativeapp/nativeui/alarm/src/AlarmPopUpView.cpp
code/sdk/application/wearable/nativeapp/nativeui/alarm/src/AlarmPresenter.cpp
code/sdk/application/wearable/nativeapp/nativeui/alarm/src/AlarmRingView.cpp
code/sdk/application/wearable/nativeapp/nativeui/alarm/src/AlarmSetTimeView.cpp
code/sdk/application/wearable/nativeapp/nativeui/alarm/src/AlarmSetWeekView.cpp
code/sdk/application/wearable/nativeapp/nativeui/alarm/src/MainAlarmView.cpp
code/sdk/application/wearable/nativeapp/nativeui/alarmclockmanage/src/AlarmClockManage.cpp
code/sdk/application/wearable/nativeapp/nativeui/alarmclocktimerconfig/src/AlarmClockTimerConfig.cpp
code/sdk/application/wearable/nativeapp/nativeui/alipay/src/AlipayBarCode.cpp
code/sdk/application/wearable/nativeapp/nativeui/alipay/src/AlipayBind.cpp
code/sdk/application/wearable/nativeapp/nativeui/alipay/src/AlipayBindAni.cpp
code/sdk/application/wearable/nativeapp/nativeui/alipay/src/AlipayBindRes.cpp
code/sdk/application/wearable/nativeapp/nativeui/alipay/src/AlipayExitBind.cpp
code/sdk/application/wearable/nativeapp/nativeui/alipay/src/AlipayHelp.cpp
code/sdk/application/wearable/nativeapp/nativeui/alipay/src/AlipayList/AlipayListAdapter.cpp
code/sdk/application/wearable/nativeapp/nativeui/alipay/src/AlipayList/AlipayListItemView.cpp
code/sdk/application/wearable/nativeapp/nativeui/alipay/src/AlipayList/AlipayListView.cpp
code/sdk/application/wearable/nativeapp/nativeui/alipay/src/AlipayMainView.cpp
code/sdk/application/wearable/nativeapp/nativeui/alipay/src/AlipayModel.cpp
code/sdk/application/wearable/nativeapp/nativeui/alipay/src/AlipayPayCode.cpp
code/sdk/application/wearable/nativeapp/nativeui/alipay/src/AlipayPresenter.cpp
code/sdk/application/wearable/nativeapp/nativeui/alipay/src/AlipaySetting.cpp
code/sdk/application/wearable/nativeapp/nativeui/alipay/src/AlipayTrans/AlipayGetTransList.cpp
code/sdk/application/wearable/nativeapp/nativeui/alipay/src/AlipayTrans/AlipayTransAni.cpp
code/sdk/application/wearable/nativeapp/nativeui/alipay/src/AlipayTrans/AlipayTransCode.cpp
code/sdk/application/wearable/nativeapp/nativeui/alipay/src/AlipayTrans/AlipayTransEnable.cpp
code/sdk/application/wearable/nativeapp/nativeui/alipay/src/AlipayTrans/AlipayTransListAdapter.cpp
code/sdk/application/wearable/nativeapp/nativeui/alipay/src/AlipayTrans/AlipayTransListItemView.cpp
code/sdk/application/wearable/nativeapp/nativeui/alipay/src/AlipayTrans/AlipayTransListView.cpp
code/sdk/application/wearable/nativeapp/nativeui/alipay/src/AlipayTrans/AlipayTransRes.cpp
code/sdk/application/wearable/nativeapp/nativeui/alipay/src/AlipayTrans/AlipayTransTips.cpp
code/sdk/application/wearable/nativeapp/nativeui/alipay/src/AlipayUnbind.cpp
code/sdk/application/wearable/nativeapp/nativeui/alipay/src/AlipayUnbindFinish.cpp
code/sdk/application/wearable/nativeapp/nativeui/aod_view/src/AodModel.cpp
code/sdk/application/wearable/nativeapp/nativeui/aod_view/src/AodPresenter.cpp
code/sdk/application/wearable/nativeapp/nativeui/aod_view/src/AodView.cpp
code/sdk/application/wearable/nativeapp/nativeui/applist/include/ApplistModel.h [deleted file]
code/sdk/application/wearable/nativeapp/nativeui/applist/src/AppItemView.cpp
code/sdk/application/wearable/nativeapp/nativeui/applist/src/ApplistAdapter.cpp
code/sdk/application/wearable/nativeapp/nativeui/applist/src/ApplistModel.cpp
code/sdk/application/wearable/nativeapp/nativeui/applist/src/ApplistPresenter.cpp
code/sdk/application/wearable/nativeapp/nativeui/applist/src/ApplistView.cpp
code/sdk/application/wearable/nativeapp/nativeui/blood/src/BloodModel.cpp [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativeui/blood/src/BloodPresenter.cpp [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativeui/blood/src/BloodView.cpp [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativeui/bloodoxygen/src/BloodBandoffView.cpp
code/sdk/application/wearable/nativeapp/nativeui/bloodoxygen/src/BloodOxygenModel.cpp
code/sdk/application/wearable/nativeapp/nativeui/bloodoxygen/src/BloodOxygenPresenter.cpp
code/sdk/application/wearable/nativeapp/nativeui/bloodoxygen/src/BloodOxygenView.cpp
code/sdk/application/wearable/nativeapp/nativeui/bluetooth/src/BluetoothCaseListAdapter.cpp
code/sdk/application/wearable/nativeapp/nativeui/bluetooth/src/BluetoothDeviceCaseListAdapter.cpp
code/sdk/application/wearable/nativeapp/nativeui/bluetooth/src/BluetoothDeviceListView.cpp
code/sdk/application/wearable/nativeapp/nativeui/bluetooth/src/BluetoothEarListView.cpp
code/sdk/application/wearable/nativeapp/nativeui/bluetooth/src/BluetoothEarPhoneView.cpp
code/sdk/application/wearable/nativeapp/nativeui/bluetooth/src/BluetoothHeadsetEvent.cpp
code/sdk/application/wearable/nativeapp/nativeui/bluetooth/src/BluetoothItemView.cpp
code/sdk/application/wearable/nativeapp/nativeui/bluetooth/src/BluetoothModel.cpp
code/sdk/application/wearable/nativeapp/nativeui/bluetooth/src/BluetoothOptionsView.cpp
code/sdk/application/wearable/nativeapp/nativeui/bluetooth/src/BluetoothPresenter.cpp
code/sdk/application/wearable/nativeapp/nativeui/bluetooth/src/BluetoothReconnectView.cpp
code/sdk/application/wearable/nativeapp/nativeui/bluetooth/src/BluetoothWrapper.cpp
code/sdk/application/wearable/nativeapp/nativeui/bluetooth/src/MainBluetoothView.cpp
code/sdk/application/wearable/nativeapp/nativeui/bluetooth/src/TipsConnFailMessageView.cpp
code/sdk/application/wearable/nativeapp/nativeui/bluetooth/src/TipsFailMessageView.cpp
code/sdk/application/wearable/nativeapp/nativeui/bluetooth/src/TipsSuccMessageView.cpp
code/sdk/application/wearable/nativeapp/nativeui/breath/src/BreathDurPage.cpp [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativeui/breath/src/BreathExerPage.cpp [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativeui/breath/src/BreathMainPage.cpp [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativeui/breath/src/BreathModel.cpp [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativeui/breath/src/BreathPresenter.cpp [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativeui/breath/src/BreathResultPage.cpp [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativeui/breath/src/BreathRhyPage.cpp [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativeui/breath/src/BreathStartPage.cpp [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativeui/callerlog/src/CallerItemView.cpp
code/sdk/application/wearable/nativeapp/nativeui/callerlog/src/CallerLogModel.cpp
code/sdk/application/wearable/nativeapp/nativeui/callerlog/src/CallerLogPresenter.cpp
code/sdk/application/wearable/nativeapp/nativeui/callerlog/src/CallerLogView.cpp
code/sdk/application/wearable/nativeapp/nativeui/camera/src/CameraMainPage.cpp [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativeui/camera/src/CameraModel.cpp [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativeui/camera/src/CameraPresenter.cpp [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativeui/clock/src/AmbientClockView.cpp
code/sdk/application/wearable/nativeapp/nativeui/clock/src/MainClockView.cpp
code/sdk/application/wearable/nativeapp/nativeui/compass/include/CompassCalibrationView.h [deleted file]
code/sdk/application/wearable/nativeapp/nativeui/compass/include/CompassControlView.h [deleted file]
code/sdk/application/wearable/nativeapp/nativeui/compass/include/CompassModel.h [deleted file]
code/sdk/application/wearable/nativeapp/nativeui/compass/include/CompassPresenter.h [deleted file]
code/sdk/application/wearable/nativeapp/nativeui/compass/include/CompassView.h [deleted file]
code/sdk/application/wearable/nativeapp/nativeui/compass/include/MainCompassPresenter.h [deleted file]
code/sdk/application/wearable/nativeapp/nativeui/compass/include/MainCompassView.h [deleted file]
code/sdk/application/wearable/nativeapp/nativeui/compass/src/CompassCalibrationView.cpp [deleted file]
code/sdk/application/wearable/nativeapp/nativeui/compass/src/CompassControlView.cpp
code/sdk/application/wearable/nativeapp/nativeui/compass/src/CompassFragment.cpp [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativeui/compass/src/CompassModel.cpp
code/sdk/application/wearable/nativeapp/nativeui/compass/src/CompassPresenter.cpp [deleted file]
code/sdk/application/wearable/nativeapp/nativeui/compass/src/CompassView.cpp [deleted file]
code/sdk/application/wearable/nativeapp/nativeui/compass/src/MainCompassPresenter.cpp
code/sdk/application/wearable/nativeapp/nativeui/compass/src/MainCompassView.cpp
code/sdk/application/wearable/nativeapp/nativeui/connectnewphone/src/ConnectOpenView.cpp
code/sdk/application/wearable/nativeapp/nativeui/connectnewphone/src/ConnectPhonePresenter.cpp
code/sdk/application/wearable/nativeapp/nativeui/connectnewphone/src/ConnectPhoneView.cpp
code/sdk/application/wearable/nativeapp/nativeui/connectnewphone/src/ConnectSelectView.cpp
code/sdk/application/wearable/nativeapp/nativeui/date/src/DateAdapter.cpp [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativeui/date/src/DateButtonAdapter.cpp [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativeui/date/src/DateButtonItemView.cpp [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativeui/date/src/DateItemView.cpp [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativeui/date/src/DateMainPage.cpp [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativeui/date/src/DateMessagePage.cpp [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativeui/date/src/DateModel.cpp [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativeui/date/src/DatePresenter.cpp [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativeui/emptypage/src/EmptyPage.cpp [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativeui/emptypage/src/EmptyPresenter.cpp [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativeui/findphone/src/FindPhoneMainPage.cpp [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativeui/findphone/src/FindPhoneModel.cpp [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativeui/findphone/src/FindPhonePresenter.cpp [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativeui/flashlight/src/FlashLightBlinkPage.cpp [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativeui/flashlight/src/FlashLightColorPage.cpp [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativeui/flashlight/src/FlashLightDefaultPage.cpp [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativeui/flashlight/src/FlashLightModel.cpp [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativeui/flashlight/src/FlashLightPage.cpp [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativeui/flashlight/src/FlashLightPlayPage.cpp [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativeui/flashlight/src/FlashLightPresenter.cpp [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativeui/flashlight/src/FlashLightSetItemAdapter.cpp [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativeui/flashlight/src/FlashLightSetItemView.cpp [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativeui/flashlight/src/FlashLightSetPage.cpp [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativeui/heartrate/src/HeartModel.cpp
code/sdk/application/wearable/nativeapp/nativeui/heartrate/src/HeartRateView.cpp
code/sdk/application/wearable/nativeapp/nativeui/include/activity/ActivityModel.h [moved from code/sdk/application/wearable/nativeapp/nativeui/activity/include/ActivityModel.h with 89% similarity]
code/sdk/application/wearable/nativeapp/nativeui/include/activity/ActivityPresenter.h [moved from code/sdk/application/wearable/nativeapp/nativeui/activity/include/ActivityPresenter.h with 89% similarity]
code/sdk/application/wearable/nativeapp/nativeui/include/activity/ActivityWeekView.h [moved from code/sdk/application/wearable/nativeapp/nativeui/activity/include/ActivityWeekView.h with 94% similarity]
code/sdk/application/wearable/nativeapp/nativeui/include/activity/MainActivityView.h [moved from code/sdk/application/wearable/nativeapp/nativeui/activity/include/MainActivityView.h with 81% similarity]
code/sdk/application/wearable/nativeapp/nativeui/include/add_card/AddCardAdapter.h [moved from code/sdk/application/wearable/nativeapp/nativeui/add_card/include/AddCardAdapter.h with 96% similarity]
code/sdk/application/wearable/nativeapp/nativeui/include/add_card/AddCardItem.h [moved from code/sdk/application/wearable/nativeapp/nativeui/add_card/include/AddCardItem.h with 100% similarity]
code/sdk/application/wearable/nativeapp/nativeui/include/add_card/AddCardModel.h [moved from code/sdk/application/wearable/nativeapp/nativeui/add_card/include/AddCardModel.h with 88% similarity]
code/sdk/application/wearable/nativeapp/nativeui/include/add_card/AddCardPresenter.h [moved from code/sdk/application/wearable/nativeapp/nativeui/add_card/include/AddCardPresenter.h with 94% similarity]
code/sdk/application/wearable/nativeapp/nativeui/include/add_card/AddCardView.h [moved from code/sdk/application/wearable/nativeapp/nativeui/add_card/include/AddCardView.h with 93% similarity]
code/sdk/application/wearable/nativeapp/nativeui/include/alarm/AlarmClockModel.h [moved from code/sdk/application/wearable/nativeapp/nativeui/alarm/include/AlarmClockModel.h with 96% similarity]
code/sdk/application/wearable/nativeapp/nativeui/include/alarm/AlarmCloseRingView.h [moved from code/sdk/application/wearable/nativeapp/nativeui/alarm/include/AlarmCloseRingView.h with 91% similarity]
code/sdk/application/wearable/nativeapp/nativeui/include/alarm/AlarmConfigView.h [moved from code/sdk/application/wearable/nativeapp/nativeui/alarm/include/AlarmConfigView.h with 92% similarity]
code/sdk/application/wearable/nativeapp/nativeui/include/alarm/AlarmJudgeView.h [moved from code/sdk/application/wearable/nativeapp/nativeui/alarm/include/AlarmJudgeView.h with 89% similarity]
code/sdk/application/wearable/nativeapp/nativeui/include/alarm/AlarmMaxClock.h [moved from code/sdk/application/wearable/nativeapp/nativeui/alarm/include/AlarmMaxClock.h with 89% similarity]
code/sdk/application/wearable/nativeapp/nativeui/include/alarm/AlarmNewTimeView.h [moved from code/sdk/application/wearable/nativeapp/nativeui/alarm/include/AlarmNewTimeView.h with 86% similarity]
code/sdk/application/wearable/nativeapp/nativeui/include/alarm/AlarmPopUpPresenter.h [moved from code/sdk/application/wearable/nativeapp/nativeui/alarm/include/AlarmPopUpPresenter.h with 86% similarity]
code/sdk/application/wearable/nativeapp/nativeui/include/alarm/AlarmPopUpView.h [moved from code/sdk/application/wearable/nativeapp/nativeui/alarm/include/AlarmPopUpView.h with 87% similarity]
code/sdk/application/wearable/nativeapp/nativeui/include/alarm/AlarmPresenter.h [moved from code/sdk/application/wearable/nativeapp/nativeui/alarm/include/AlarmPresenter.h with 96% similarity]
code/sdk/application/wearable/nativeapp/nativeui/include/alarm/AlarmRingView.h [moved from code/sdk/application/wearable/nativeapp/nativeui/alarm/include/AlarmRingView.h with 92% similarity]
code/sdk/application/wearable/nativeapp/nativeui/include/alarm/AlarmSetTimeView.h [moved from code/sdk/application/wearable/nativeapp/nativeui/alarm/include/AlarmSetTimeView.h with 86% similarity]
code/sdk/application/wearable/nativeapp/nativeui/include/alarm/AlarmSetWeekView.h [moved from code/sdk/application/wearable/nativeapp/nativeui/alarm/include/AlarmSetWeekView.h with 91% similarity]
code/sdk/application/wearable/nativeapp/nativeui/include/alarm/MainAlarmView.h [moved from code/sdk/application/wearable/nativeapp/nativeui/alarm/include/MainAlarmView.h with 89% similarity]
code/sdk/application/wearable/nativeapp/nativeui/include/alarmclockmanage/AlarmClockManage.h [moved from code/sdk/application/wearable/nativeapp/nativeui/alarmclockmanage/include/AlarmClockManage.h with 94% similarity]
code/sdk/application/wearable/nativeapp/nativeui/include/alarmclockmanage/AlmmgrAlarmClockManage.h [moved from code/sdk/application/wearable/nativeapp/nativeui/alarmclockmanage/include/AlmmgrAlarmClockManage.h with 91% similarity]
code/sdk/application/wearable/nativeapp/nativeui/include/alarmclocktimerconfig/AlarmClockTimerConfig.h [moved from code/sdk/application/wearable/nativeapp/nativeui/alarmclocktimerconfig/include/AlarmClockTimerConfig.h with 100% similarity]
code/sdk/application/wearable/nativeapp/nativeui/include/alipay/AlipayBarCode.h [moved from code/sdk/application/wearable/nativeapp/nativeui/alipay/include/AlipayBarCode.h with 93% similarity]
code/sdk/application/wearable/nativeapp/nativeui/include/alipay/AlipayBind.h [moved from code/sdk/application/wearable/nativeapp/nativeui/alipay/include/AlipayBind.h with 90% similarity]
code/sdk/application/wearable/nativeapp/nativeui/include/alipay/AlipayBindAni.h [moved from code/sdk/application/wearable/nativeapp/nativeui/alipay/include/AlipayBindAni.h with 91% similarity]
code/sdk/application/wearable/nativeapp/nativeui/include/alipay/AlipayBindRes.h [moved from code/sdk/application/wearable/nativeapp/nativeui/alipay/include/AlipayBindRes.h with 91% similarity]
code/sdk/application/wearable/nativeapp/nativeui/include/alipay/AlipayExitBind.h [moved from code/sdk/application/wearable/nativeapp/nativeui/alipay/include/AlipayExitBind.h with 91% similarity]
code/sdk/application/wearable/nativeapp/nativeui/include/alipay/AlipayHelp.h [moved from code/sdk/application/wearable/nativeapp/nativeui/alipay/include/AlipayHelp.h with 90% similarity]
code/sdk/application/wearable/nativeapp/nativeui/include/alipay/AlipayList/AlipayListAdapter.h [moved from code/sdk/application/wearable/nativeapp/nativeui/alipay/include/AlipayList/AlipayListAdapter.h with 96% similarity]
code/sdk/application/wearable/nativeapp/nativeui/include/alipay/AlipayList/AlipayListItem.h [moved from code/sdk/application/wearable/nativeapp/nativeui/alipay/include/AlipayList/AlipayListItem.h with 100% similarity]
code/sdk/application/wearable/nativeapp/nativeui/include/alipay/AlipayList/AlipayListItemView.h [moved from code/sdk/application/wearable/nativeapp/nativeui/alipay/include/AlipayList/AlipayListItemView.h with 88% similarity]
code/sdk/application/wearable/nativeapp/nativeui/include/alipay/AlipayList/AlipayListView.h [moved from code/sdk/application/wearable/nativeapp/nativeui/alipay/include/AlipayList/AlipayListView.h with 87% similarity]
code/sdk/application/wearable/nativeapp/nativeui/include/alipay/AlipayMainView.h [moved from code/sdk/application/wearable/nativeapp/nativeui/alipay/include/AlipayMainView.h with 76% similarity]
code/sdk/application/wearable/nativeapp/nativeui/include/alipay/AlipayModel.h [moved from code/sdk/application/wearable/nativeapp/nativeui/alipay/include/AlipayModel.h with 100% similarity]
code/sdk/application/wearable/nativeapp/nativeui/include/alipay/AlipayPayCode.h [moved from code/sdk/application/wearable/nativeapp/nativeui/alipay/include/AlipayPayCode.h with 92% similarity]
code/sdk/application/wearable/nativeapp/nativeui/include/alipay/AlipayPresenter.h [moved from code/sdk/application/wearable/nativeapp/nativeui/alipay/include/AlipayPresenter.h with 96% similarity]
code/sdk/application/wearable/nativeapp/nativeui/include/alipay/AlipayRefreshBindCode.h [moved from code/sdk/application/wearable/nativeapp/nativeui/alipay/include/AlipayRefreshBindCode.h with 91% similarity]
code/sdk/application/wearable/nativeapp/nativeui/include/alipay/AlipaySetting.h [moved from code/sdk/application/wearable/nativeapp/nativeui/alipay/include/AlipaySetting.h with 91% similarity]
code/sdk/application/wearable/nativeapp/nativeui/include/alipay/AlipayTrans/AlipayGetTransList.h [moved from code/sdk/application/wearable/nativeapp/nativeui/alipay/include/AlipayTrans/AlipayGetTransList.h with 92% similarity]
code/sdk/application/wearable/nativeapp/nativeui/include/alipay/AlipayTrans/AlipayTransAni.h [moved from code/sdk/application/wearable/nativeapp/nativeui/alipay/include/AlipayTrans/AlipayTransAni.h with 91% similarity]
code/sdk/application/wearable/nativeapp/nativeui/include/alipay/AlipayTrans/AlipayTransCode.h [moved from code/sdk/application/wearable/nativeapp/nativeui/alipay/include/AlipayTrans/AlipayTransCode.h with 91% similarity]
code/sdk/application/wearable/nativeapp/nativeui/include/alipay/AlipayTrans/AlipayTransEnable.h [moved from code/sdk/application/wearable/nativeapp/nativeui/alipay/include/AlipayTrans/AlipayTransEnable.h with 91% similarity]
code/sdk/application/wearable/nativeapp/nativeui/include/alipay/AlipayTrans/AlipayTransListAdapter.h [moved from code/sdk/application/wearable/nativeapp/nativeui/alipay/include/AlipayTrans/AlipayTransListAdapter.h with 96% similarity]
code/sdk/application/wearable/nativeapp/nativeui/include/alipay/AlipayTrans/AlipayTransListItem.h [moved from code/sdk/application/wearable/nativeapp/nativeui/alipay/include/AlipayTrans/AlipayTransListItem.h with 100% similarity]
code/sdk/application/wearable/nativeapp/nativeui/include/alipay/AlipayTrans/AlipayTransListItemView.h [moved from code/sdk/application/wearable/nativeapp/nativeui/alipay/include/AlipayTrans/AlipayTransListItemView.h with 87% similarity]
code/sdk/application/wearable/nativeapp/nativeui/include/alipay/AlipayTrans/AlipayTransListView.h [moved from code/sdk/application/wearable/nativeapp/nativeui/alipay/include/AlipayTrans/AlipayTransListView.h with 89% similarity]
code/sdk/application/wearable/nativeapp/nativeui/include/alipay/AlipayTrans/AlipayTransRes.h [moved from code/sdk/application/wearable/nativeapp/nativeui/alipay/include/AlipayTrans/AlipayTransRes.h with 92% similarity]
code/sdk/application/wearable/nativeapp/nativeui/include/alipay/AlipayTrans/AlipayTransTips.h [moved from code/sdk/application/wearable/nativeapp/nativeui/alipay/include/AlipayTrans/AlipayTransTips.h with 91% similarity]
code/sdk/application/wearable/nativeapp/nativeui/include/alipay/AlipayUnbind.h [moved from code/sdk/application/wearable/nativeapp/nativeui/alipay/include/AlipayUnbind.h with 91% similarity]
code/sdk/application/wearable/nativeapp/nativeui/include/alipay/AlipayUnbindFinish.h [moved from code/sdk/application/wearable/nativeapp/nativeui/alipay/include/AlipayUnbindFinish.h with 91% similarity]
code/sdk/application/wearable/nativeapp/nativeui/include/aod_view/AodModel.h [moved from code/sdk/application/wearable/nativeapp/nativeui/aod_view/include/AodModel.h with 89% similarity]
code/sdk/application/wearable/nativeapp/nativeui/include/aod_view/AodPresenter.h [moved from code/sdk/application/wearable/nativeapp/nativeui/aod_view/include/AodPresenter.h with 82% similarity]
code/sdk/application/wearable/nativeapp/nativeui/include/aod_view/AodView.h [moved from code/sdk/application/wearable/nativeapp/nativeui/aod_view/include/AodView.h with 87% similarity]
code/sdk/application/wearable/nativeapp/nativeui/include/applist/AppItemView.h [moved from code/sdk/application/wearable/nativeapp/nativeui/applist/include/AppItemView.h with 79% similarity]
code/sdk/application/wearable/nativeapp/nativeui/include/applist/ApplistAdapter.h [moved from code/sdk/application/wearable/nativeapp/nativeui/applist/include/ApplistAdapter.h with 94% similarity]
code/sdk/application/wearable/nativeapp/nativeui/include/applist/ApplistModel.h [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativeui/include/applist/ApplistPresenter.h [moved from code/sdk/application/wearable/nativeapp/nativeui/applist/include/ApplistPresenter.h with 92% similarity]
code/sdk/application/wearable/nativeapp/nativeui/include/applist/ApplistView.h [moved from code/sdk/application/wearable/nativeapp/nativeui/applist/include/ApplistView.h with 96% similarity]
code/sdk/application/wearable/nativeapp/nativeui/include/blood/BloodModel.h [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativeui/include/blood/BloodPresenter.h [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativeui/include/blood/BloodView.h [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativeui/include/bloodoxygen/BloodBandoffView.h [moved from code/sdk/application/wearable/nativeapp/nativeui/bloodoxygen/include/BloodBandoffView.h with 100% similarity]
code/sdk/application/wearable/nativeapp/nativeui/include/bloodoxygen/BloodOxygenModel.h [moved from code/sdk/application/wearable/nativeapp/nativeui/bloodoxygen/include/BloodOxygenModel.h with 100% similarity]
code/sdk/application/wearable/nativeapp/nativeui/include/bloodoxygen/BloodOxygenPresenter.h [moved from code/sdk/application/wearable/nativeapp/nativeui/bloodoxygen/include/BloodOxygenPresenter.h with 93% similarity]
code/sdk/application/wearable/nativeapp/nativeui/include/bloodoxygen/BloodOxygenView.h [moved from code/sdk/application/wearable/nativeapp/nativeui/bloodoxygen/include/BloodOxygenView.h with 89% similarity]
code/sdk/application/wearable/nativeapp/nativeui/include/bluetooth/BluetoothCaseListAdapter.h [moved from code/sdk/application/wearable/nativeapp/nativeui/bluetooth/include/BluetoothCaseListAdapter.h with 88% similarity]
code/sdk/application/wearable/nativeapp/nativeui/include/bluetooth/BluetoothChangeBle.h [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativeui/include/bluetooth/BluetoothDeviceCaseListAdapter.h [moved from code/sdk/application/wearable/nativeapp/nativeui/bluetooth/include/BluetoothDeviceCaseListAdapter.h with 90% similarity]
code/sdk/application/wearable/nativeapp/nativeui/include/bluetooth/BluetoothDeviceListView.h [moved from code/sdk/application/wearable/nativeapp/nativeui/bluetooth/include/BluetoothDeviceListView.h with 89% similarity]
code/sdk/application/wearable/nativeapp/nativeui/include/bluetooth/BluetoothEarListView.h [moved from code/sdk/application/wearable/nativeapp/nativeui/bluetooth/include/BluetoothEarListView.h with 91% similarity]
code/sdk/application/wearable/nativeapp/nativeui/include/bluetooth/BluetoothEarPhoneView.h [moved from code/sdk/application/wearable/nativeapp/nativeui/bluetooth/include/BluetoothEarPhoneView.h with 91% similarity]
code/sdk/application/wearable/nativeapp/nativeui/include/bluetooth/BluetoothHeadsetEvent.h [moved from code/sdk/application/wearable/nativeapp/nativeui/bluetooth/include/BluetoothHeadsetEvent.h with 100% similarity]
code/sdk/application/wearable/nativeapp/nativeui/include/bluetooth/BluetoothItemView.h [moved from code/sdk/application/wearable/nativeapp/nativeui/bluetooth/include/BluetoothItemView.h with 93% similarity]
code/sdk/application/wearable/nativeapp/nativeui/include/bluetooth/BluetoothModel.h [moved from code/sdk/application/wearable/nativeapp/nativeui/bluetooth/include/BluetoothModel.h with 88% similarity]
code/sdk/application/wearable/nativeapp/nativeui/include/bluetooth/BluetoothOptionsView.h [moved from code/sdk/application/wearable/nativeapp/nativeui/bluetooth/include/BluetoothOptionsView.h with 90% similarity]
code/sdk/application/wearable/nativeapp/nativeui/include/bluetooth/BluetoothPresenter.h [moved from code/sdk/application/wearable/nativeapp/nativeui/bluetooth/include/BluetoothPresenter.h with 88% similarity]
code/sdk/application/wearable/nativeapp/nativeui/include/bluetooth/BluetoothReconnectView.h [moved from code/sdk/application/wearable/nativeapp/nativeui/bluetooth/include/BluetoothReconnectView.h with 100% similarity]
code/sdk/application/wearable/nativeapp/nativeui/include/bluetooth/BluetoothWrapper.h [moved from code/sdk/application/wearable/nativeapp/nativeui/bluetooth/include/BluetoothWrapper.h with 100% similarity]
code/sdk/application/wearable/nativeapp/nativeui/include/bluetooth/MainBluetoothView.h [moved from code/sdk/application/wearable/nativeapp/nativeui/bluetooth/include/MainBluetoothView.h with 81% similarity]
code/sdk/application/wearable/nativeapp/nativeui/include/bluetooth/TipsConnFailMessageView.h [moved from code/sdk/application/wearable/nativeapp/nativeui/bluetooth/include/TipsConnFailMessageView.h with 100% similarity]
code/sdk/application/wearable/nativeapp/nativeui/include/bluetooth/TipsFailMessageView.h [moved from code/sdk/application/wearable/nativeapp/nativeui/bluetooth/include/TipsFailMessageView.h with 100% similarity]
code/sdk/application/wearable/nativeapp/nativeui/include/bluetooth/TipsSuccMessageView.h [moved from code/sdk/application/wearable/nativeapp/nativeui/bluetooth/include/TipsSuccMessageView.h with 100% similarity]
code/sdk/application/wearable/nativeapp/nativeui/include/breath/BreathDurPage.h [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativeui/include/breath/BreathExerPage.h [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativeui/include/breath/BreathMainPage.h [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativeui/include/breath/BreathModel.h [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativeui/include/breath/BreathPresenter.h [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativeui/include/breath/BreathResultPage.h [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativeui/include/breath/BreathRhyPage.h [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativeui/include/breath/BreathStartPage.h [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativeui/include/breath/BreathView.h [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativeui/include/callerlog/CallerItemView.h [moved from code/sdk/application/wearable/nativeapp/nativeui/callerlog/include/CallerItemView.h with 89% similarity]
code/sdk/application/wearable/nativeapp/nativeui/include/callerlog/CallerLogModel.h [moved from code/sdk/application/wearable/nativeapp/nativeui/callerlog/include/CallerLogModel.h with 94% similarity]
code/sdk/application/wearable/nativeapp/nativeui/include/callerlog/CallerLogPresenter.h [moved from code/sdk/application/wearable/nativeapp/nativeui/callerlog/include/CallerLogPresenter.h with 91% similarity]
code/sdk/application/wearable/nativeapp/nativeui/include/callerlog/CallerLogView.h [moved from code/sdk/application/wearable/nativeapp/nativeui/callerlog/include/CallerLogView.h with 92% similarity]
code/sdk/application/wearable/nativeapp/nativeui/include/camera/CameraMainPage.h [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativeui/include/camera/CameraModel.h [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativeui/include/camera/CameraPresenter.h [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativeui/include/camera/CameraView.h [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativeui/include/clock/AmbientClockView.h [moved from code/sdk/application/wearable/nativeapp/nativeui/clock/include/AmbientClockView.h with 96% similarity]
code/sdk/application/wearable/nativeapp/nativeui/include/clock/MainClockView.h [moved from code/sdk/application/wearable/nativeapp/nativeui/clock/include/MainClockView.h with 96% similarity]
code/sdk/application/wearable/nativeapp/nativeui/include/compass/CompassControlView.h [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativeui/include/compass/CompassFragment.h [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativeui/include/compass/CompassModel.h [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativeui/include/compass/MainCompassPresenter.h [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativeui/include/compass/MainCompassView.h [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativeui/include/connectnewphone/ConnectOpenView.h [moved from code/sdk/application/wearable/nativeapp/nativeui/connectnewphone/include/ConnectOpenView.h with 100% similarity]
code/sdk/application/wearable/nativeapp/nativeui/include/connectnewphone/ConnectPhonePresenter.h [moved from code/sdk/application/wearable/nativeapp/nativeui/connectnewphone/include/ConnectPhonePresenter.h with 92% similarity]
code/sdk/application/wearable/nativeapp/nativeui/include/connectnewphone/ConnectPhoneView.h [moved from code/sdk/application/wearable/nativeapp/nativeui/connectnewphone/include/ConnectPhoneView.h with 85% similarity]
code/sdk/application/wearable/nativeapp/nativeui/include/connectnewphone/ConnectSelectView.h [moved from code/sdk/application/wearable/nativeapp/nativeui/connectnewphone/include/ConnectSelectView.h with 86% similarity]
code/sdk/application/wearable/nativeapp/nativeui/include/date/DateAdapter.h [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativeui/include/date/DateButtonAdapter.h [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativeui/include/date/DateButtonItemView.h [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativeui/include/date/DateItemView.h [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativeui/include/date/DateMainPage.h [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativeui/include/date/DateMessagePage.h [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativeui/include/date/DateModel.h [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativeui/include/date/DatePresenter.h [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativeui/include/date/DateView.h [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativeui/include/emptypage/EmptyPage.h [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativeui/include/emptypage/EmptyPresenter.h [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativeui/include/emptypage/EmptyView.h [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativeui/include/findphone/FindPhoneMainPage.h [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativeui/include/findphone/FindPhoneModel.h [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativeui/include/findphone/FindPhonePresenter.h [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativeui/include/findphone/FindPhoneView.h [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativeui/include/flashlight/FlashLightBlinkPage.h [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativeui/include/flashlight/FlashLightColorPage.h [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativeui/include/flashlight/FlashLightDefaultPage.h [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativeui/include/flashlight/FlashLightModel.h [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativeui/include/flashlight/FlashLightPage.h [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativeui/include/flashlight/FlashLightPlayPage.h [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativeui/include/flashlight/FlashLightPresenter.h [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativeui/include/flashlight/FlashLightSetItemAdapter.h [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativeui/include/flashlight/FlashLightSetItemView.h [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativeui/include/flashlight/FlashLightSetPage.h [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativeui/include/flashlight/FlashLightView.h [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativeui/include/flashlight/FlashlightUiResourceImage.h [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativeui/include/heartrate/HeartModel.h [moved from code/sdk/application/wearable/nativeapp/nativeui/heartrate/include/HeartModel.h with 94% similarity]
code/sdk/application/wearable/nativeapp/nativeui/include/heartrate/HeartRateView.h [moved from code/sdk/application/wearable/nativeapp/nativeui/heartrate/include/HeartRateView.h with 95% similarity]
code/sdk/application/wearable/nativeapp/nativeui/include/indoorwalk/CustomizationView.h [moved from code/sdk/application/wearable/nativeapp/nativeui/indoorwalk/include/CustomizationView.h with 100% similarity]
code/sdk/application/wearable/nativeapp/nativeui/include/indoorwalk/IndoorWalkEndView.h [moved from code/sdk/application/wearable/nativeapp/nativeui/indoorwalk/include/IndoorWalkEndView.h with 100% similarity]
code/sdk/application/wearable/nativeapp/nativeui/include/indoorwalk/IndoorWalkModel.h [moved from code/sdk/application/wearable/nativeapp/nativeui/indoorwalk/include/IndoorWalkModel.h with 100% similarity]
code/sdk/application/wearable/nativeapp/nativeui/include/indoorwalk/IndoorWalkMotionView.h [moved from code/sdk/application/wearable/nativeapp/nativeui/indoorwalk/include/IndoorWalkMotionView.h with 82% similarity]
code/sdk/application/wearable/nativeapp/nativeui/include/indoorwalk/IndoorWalkPreparedView.h [moved from code/sdk/application/wearable/nativeapp/nativeui/indoorwalk/include/IndoorWalkPreparedView.h with 100% similarity]
code/sdk/application/wearable/nativeapp/nativeui/include/indoorwalk/IndoorWalkPresenter.h [moved from code/sdk/application/wearable/nativeapp/nativeui/indoorwalk/include/IndoorWalkPresenter.h with 100% similarity]
code/sdk/application/wearable/nativeapp/nativeui/include/indoorwalk/IndoorWalkView.h [moved from code/sdk/application/wearable/nativeapp/nativeui/indoorwalk/include/IndoorWalkView.h with 82% similarity]
code/sdk/application/wearable/nativeapp/nativeui/include/indoorwalk/MotionPageFifth.h [moved from code/sdk/application/wearable/nativeapp/nativeui/indoorwalk/include/MotionPageFifth.h with 92% similarity]
code/sdk/application/wearable/nativeapp/nativeui/include/indoorwalk/MotionPageFirst.h [moved from code/sdk/application/wearable/nativeapp/nativeui/indoorwalk/include/MotionPageFirst.h with 95% similarity]
code/sdk/application/wearable/nativeapp/nativeui/include/indoorwalk/MotionPageFourth.h [moved from code/sdk/application/wearable/nativeapp/nativeui/indoorwalk/include/MotionPageFourth.h with 93% similarity]
code/sdk/application/wearable/nativeapp/nativeui/include/indoorwalk/MotionPageSecond.h [moved from code/sdk/application/wearable/nativeapp/nativeui/indoorwalk/include/MotionPageSecond.h with 95% similarity]
code/sdk/application/wearable/nativeapp/nativeui/include/indoorwalk/MotionPageThird.h [moved from code/sdk/application/wearable/nativeapp/nativeui/indoorwalk/include/MotionPageThird.h with 94% similarity]
code/sdk/application/wearable/nativeapp/nativeui/include/key/KeyInputListener.h [moved from code/sdk/application/wearable/nativeapp/nativeui/key/include/KeyInputListener.h with 100% similarity]
code/sdk/application/wearable/nativeapp/nativeui/include/main/AppGroupView.h [moved from code/sdk/application/wearable/nativeapp/nativeui/main/include/AppGroupView.h with 100% similarity]
code/sdk/application/wearable/nativeapp/nativeui/include/main/DialBinParser.h [moved from code/sdk/application/wearable/nativeapp/nativeui/main/include/DialBinParser.h with 90% similarity]
code/sdk/application/wearable/nativeapp/nativeui/include/main/DialBinParserManager.h [moved from code/sdk/application/wearable/nativeapp/nativeui/main/include/DialBinParserManager.h with 81% similarity]
code/sdk/application/wearable/nativeapp/nativeui/include/main/DialBinParserV3.h [moved from code/sdk/application/wearable/nativeapp/nativeui/main/include/DialBinParserV3.h with 82% similarity]
code/sdk/application/wearable/nativeapp/nativeui/include/main/DialBinTypes.h [moved from code/sdk/application/wearable/nativeapp/nativeui/main/include/DialBinTypes.h with 100% similarity]
code/sdk/application/wearable/nativeapp/nativeui/include/main/DialBinTypesV2.h [moved from code/sdk/application/wearable/nativeapp/nativeui/main/include/DialBinTypesV2.h with 99% similarity]
code/sdk/application/wearable/nativeapp/nativeui/include/main/HealthModel.h [moved from code/sdk/application/wearable/nativeapp/nativeui/main/include/HealthModel.h with 94% similarity]
code/sdk/application/wearable/nativeapp/nativeui/include/main/LoadImg.h [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativeui/include/main/MainModel.h [moved from code/sdk/application/wearable/nativeapp/nativeui/main/include/MainModel.h with 100% similarity]
code/sdk/application/wearable/nativeapp/nativeui/include/main/MainPresenterSample.h [moved from code/sdk/application/wearable/nativeapp/nativeui/main/include/MainPresenterSample.h with 91% similarity]
code/sdk/application/wearable/nativeapp/nativeui/include/main/MainViewSample.h [moved from code/sdk/application/wearable/nativeapp/nativeui/main/include/MainViewSample.h with 86% similarity]
code/sdk/application/wearable/nativeapp/nativeui/include/main/MessageAdapter.h [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativeui/include/main/MessageItemView.h [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativeui/include/main/MessageMainView.h [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativeui/include/main/MessageModel.h [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativeui/include/main/ModelListenerSample.h [moved from code/sdk/application/wearable/nativeapp/nativeui/main/include/ModelListenerSample.h with 100% similarity]
code/sdk/application/wearable/nativeapp/nativeui/include/main/PullUpDownView.h [moved from code/sdk/application/wearable/nativeapp/nativeui/main/include/PullUpDownView.h with 100% similarity]
code/sdk/application/wearable/nativeapp/nativeui/include/main/UiServersMsg.h [moved from code/sdk/application/wearable/nativeapp/nativeui/main/include/UiServersMsg.h with 100% similarity]
code/sdk/application/wearable/nativeapp/nativeui/include/main/UiViewId.h [moved from code/sdk/application/wearable/nativeapp/nativeui/main/include/UiViewId.h with 100% similarity]
code/sdk/application/wearable/nativeapp/nativeui/include/main/VolumeSettingPresenter.h [moved from code/sdk/application/wearable/nativeapp/nativeui/main/include/VolumeSettingPresenter.h with 96% similarity]
code/sdk/application/wearable/nativeapp/nativeui/include/main/VolumeSettingView.h [moved from code/sdk/application/wearable/nativeapp/nativeui/main/include/VolumeSettingView.h with 89% similarity]
code/sdk/application/wearable/nativeapp/nativeui/include/main/dial/DialArcLabelView.h [moved from code/sdk/application/wearable/nativeapp/nativeui/main/include/dial/DialArcLabelView.h with 96% similarity]
code/sdk/application/wearable/nativeapp/nativeui/include/main/dial/DialArcProgressView.h [moved from code/sdk/application/wearable/nativeapp/nativeui/main/include/dial/DialArcProgressView.h with 78% similarity]
code/sdk/application/wearable/nativeapp/nativeui/include/main/dial/DialBaseModel.h [moved from code/sdk/application/wearable/nativeapp/nativeui/main/include/dial/DialBaseModel.h with 96% similarity]
code/sdk/application/wearable/nativeapp/nativeui/include/main/dial/DialBoxProgressView.h [moved from code/sdk/application/wearable/nativeapp/nativeui/main/include/dial/DialBoxProgressView.h with 78% similarity]
code/sdk/application/wearable/nativeapp/nativeui/include/main/dial/DialDataBase.h [moved from code/sdk/application/wearable/nativeapp/nativeui/main/include/dial/DialDataBase.h with 96% similarity]
code/sdk/application/wearable/nativeapp/nativeui/include/main/dial/DialDataType.h [moved from code/sdk/application/wearable/nativeapp/nativeui/main/include/dial/DialDataType.h with 100% similarity]
code/sdk/application/wearable/nativeapp/nativeui/include/main/dial/DialDigitalImgView.h [moved from code/sdk/application/wearable/nativeapp/nativeui/main/include/dial/DialDigitalImgView.h with 96% similarity]
code/sdk/application/wearable/nativeapp/nativeui/include/main/dial/DialKaleidoscopeView.h [moved from code/sdk/application/wearable/nativeapp/nativeui/main/include/dial/DialKaleidoscopeView.h with 100% similarity]
code/sdk/application/wearable/nativeapp/nativeui/include/main/dial/DialLabelView.h [moved from code/sdk/application/wearable/nativeapp/nativeui/main/include/dial/DialLabelView.h with 96% similarity]
code/sdk/application/wearable/nativeapp/nativeui/include/main/dial/DialModelHeartRate.h [moved from code/sdk/application/wearable/nativeapp/nativeui/main/include/dial/DialModelHeartRate.h with 94% similarity]
code/sdk/application/wearable/nativeapp/nativeui/include/main/dial/DialModelPower.h [moved from code/sdk/application/wearable/nativeapp/nativeui/main/include/dial/DialModelPower.h with 93% similarity]
code/sdk/application/wearable/nativeapp/nativeui/include/main/dial/DialModelSteps.h [moved from code/sdk/application/wearable/nativeapp/nativeui/main/include/dial/DialModelSteps.h with 94% similarity]
code/sdk/application/wearable/nativeapp/nativeui/include/main/dial/DialModelTime.h [moved from code/sdk/application/wearable/nativeapp/nativeui/main/include/dial/DialModelTime.h with 97% similarity]
code/sdk/application/wearable/nativeapp/nativeui/include/main/dial/DialOHSliceId.h [moved from code/sdk/application/wearable/nativeapp/nativeui/main/include/dial/DialOHSliceId.h with 100% similarity]
code/sdk/application/wearable/nativeapp/nativeui/include/main/dial/DialOptionImgView.h [moved from code/sdk/application/wearable/nativeapp/nativeui/main/include/dial/DialOptionImgView.h with 93% similarity]
code/sdk/application/wearable/nativeapp/nativeui/include/main/dial/DialRotateImgView.h [moved from code/sdk/application/wearable/nativeapp/nativeui/main/include/dial/DialRotateImgView.h with 95% similarity]
code/sdk/application/wearable/nativeapp/nativeui/include/main/dial/DialSequenceImgView.h [moved from code/sdk/application/wearable/nativeapp/nativeui/main/include/dial/DialSequenceImgView.h with 100% similarity]
code/sdk/application/wearable/nativeapp/nativeui/include/main/dial/DialStaticImgView.h [moved from code/sdk/application/wearable/nativeapp/nativeui/main/include/dial/DialStaticImgView.h with 96% similarity]
code/sdk/application/wearable/nativeapp/nativeui/include/main/dial/DialVideoView.h [moved from code/sdk/application/wearable/nativeapp/nativeui/main/include/dial/DialVideoView.h with 100% similarity]
code/sdk/application/wearable/nativeapp/nativeui/include/main/dial/DialView.h [moved from code/sdk/application/wearable/nativeapp/nativeui/main/include/dial/DialView.h with 94% similarity]
code/sdk/application/wearable/nativeapp/nativeui/include/main/dial/DialViewContainer.h [moved from code/sdk/application/wearable/nativeapp/nativeui/main/include/dial/DialViewContainer.h with 94% similarity]
code/sdk/application/wearable/nativeapp/nativeui/include/main/dial/DialViewGroup.h [moved from code/sdk/application/wearable/nativeapp/nativeui/main/include/dial/DialViewGroup.h with 95% similarity]
code/sdk/application/wearable/nativeapp/nativeui/include/main/dial/ModelDialDataFactory.h [moved from code/sdk/application/wearable/nativeapp/nativeui/main/include/dial/ModelDialDataFactory.h with 90% similarity]
code/sdk/application/wearable/nativeapp/nativeui/include/main/dial/OnDialDataUpdateListener.h [moved from code/sdk/application/wearable/nativeapp/nativeui/main/include/dial/OnDialDataUpdateListener.h with 94% similarity]
code/sdk/application/wearable/nativeapp/nativeui/include/main/dial/RegisterDialModel.h [moved from code/sdk/application/wearable/nativeapp/nativeui/main/include/dial/RegisterDialModel.h with 87% similarity]
code/sdk/application/wearable/nativeapp/nativeui/include/main/dial/WatchInterface.h [moved from code/sdk/application/wearable/nativeapp/nativeui/main/include/dial/WatchInterface.h with 59% similarity]
code/sdk/application/wearable/nativeapp/nativeui/include/makephone/CallerDisplayView.h [moved from code/sdk/application/wearable/nativeapp/nativeui/makephone/include/CallerDisplayView.h with 100% similarity]
code/sdk/application/wearable/nativeapp/nativeui/include/makephone/CallingView.h [moved from code/sdk/application/wearable/nativeapp/nativeui/makephone/include/CallingView.h with 100% similarity]
code/sdk/application/wearable/nativeapp/nativeui/include/makephone/DialingScreenView.h [moved from code/sdk/application/wearable/nativeapp/nativeui/makephone/include/DialingScreenView.h with 100% similarity]
code/sdk/application/wearable/nativeapp/nativeui/include/makephone/MainCallingPresenter.h [moved from code/sdk/application/wearable/nativeapp/nativeui/makephone/include/MainCallingPresenter.h with 84% similarity]
code/sdk/application/wearable/nativeapp/nativeui/include/makephone/MainCallingView.h [moved from code/sdk/application/wearable/nativeapp/nativeui/makephone/include/MainCallingView.h with 83% similarity]
code/sdk/application/wearable/nativeapp/nativeui/include/makephone/WaitingHintsView.h [moved from code/sdk/application/wearable/nativeapp/nativeui/makephone/include/WaitingHintsView.h with 100% similarity]
code/sdk/application/wearable/nativeapp/nativeui/include/offlinevoice/MainVocassistView.h [moved from code/sdk/application/wearable/nativeapp/nativeui/offlinevoice/include/MainVocassistView.h with 85% similarity]
code/sdk/application/wearable/nativeapp/nativeui/include/offlinevoice/VocassistModel.h [moved from code/sdk/application/wearable/nativeapp/nativeui/offlinevoice/include/VocassistModel.h with 95% similarity]
code/sdk/application/wearable/nativeapp/nativeui/include/offlinevoice/VocassistPresenter.h [moved from code/sdk/application/wearable/nativeapp/nativeui/offlinevoice/include/VocassistPresenter.h with 87% similarity]
code/sdk/application/wearable/nativeapp/nativeui/include/offlinevoice/VocassistView.h [moved from code/sdk/application/wearable/nativeapp/nativeui/offlinevoice/include/VocassistView.h with 96% similarity]
code/sdk/application/wearable/nativeapp/nativeui/include/phoneservice/PhoneAudio.h [moved from code/sdk/application/wearable/nativeapp/nativeui/phoneservice/include/PhoneAudio.h with 100% similarity]
code/sdk/application/wearable/nativeapp/nativeui/include/phoneservice/PhoneService.h [moved from code/sdk/application/wearable/nativeapp/nativeui/phoneservice/include/PhoneService.h with 99% similarity]
code/sdk/application/wearable/nativeapp/nativeui/include/player/BluetoothView.h [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativeui/include/player/PlayersCaseListAdapter.h [moved from code/sdk/application/wearable/nativeapp/nativeui/player/include/PlayersCaseListAdapter.h with 100% similarity]
code/sdk/application/wearable/nativeapp/nativeui/include/player/PlayersModel.h [moved from code/sdk/application/wearable/nativeapp/nativeui/player/include/PlayersModel.h with 91% similarity]
code/sdk/application/wearable/nativeapp/nativeui/include/player/PlayersPresenter.h [moved from code/sdk/application/wearable/nativeapp/nativeui/player/include/PlayersPresenter.h with 92% similarity]
code/sdk/application/wearable/nativeapp/nativeui/include/player/PlayersView.h [moved from code/sdk/application/wearable/nativeapp/nativeui/player/include/PlayersView.h with 96% similarity]
code/sdk/application/wearable/nativeapp/nativeui/include/qrcode_conn/QrcodeConnModel.h [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativeui/include/qrcode_conn/QrcodeConnPresenter.h [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativeui/include/qrcode_conn/QrcodeConnView.h [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativeui/include/rebootdevice/RebootDeviceView.h [moved from code/sdk/application/wearable/nativeapp/nativeui/rebootdevice/include/RebootDeviceView.h with 100% similarity]
code/sdk/application/wearable/nativeapp/nativeui/include/rebootdevice/RebootModel.h [moved from code/sdk/application/wearable/nativeapp/nativeui/rebootdevice/include/RebootModel.h with 100% similarity]
code/sdk/application/wearable/nativeapp/nativeui/include/rebootdevice/RebootPresenter.h [moved from code/sdk/application/wearable/nativeapp/nativeui/rebootdevice/include/RebootPresenter.h with 100% similarity]
code/sdk/application/wearable/nativeapp/nativeui/include/rebootdevice/RebootView.h [moved from code/sdk/application/wearable/nativeapp/nativeui/rebootdevice/include/RebootView.h with 91% similarity]
code/sdk/application/wearable/nativeapp/nativeui/include/rebootdevice/ShutdownDeviceView.h [moved from code/sdk/application/wearable/nativeapp/nativeui/rebootdevice/include/ShutdownDeviceView.h with 100% similarity]
code/sdk/application/wearable/nativeapp/nativeui/include/recent_app/RecentAppPresenter.h [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativeui/include/recent_app/RecentAppView.h [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativeui/include/restoredefaults/RestoreDefaultsPresenter.h [moved from code/sdk/application/wearable/nativeapp/nativeui/restoredefaults/include/RestoreDefaultsPresenter.h with 100% similarity]
code/sdk/application/wearable/nativeapp/nativeui/include/restoredefaults/RestoreDefaultsView.h [moved from code/sdk/application/wearable/nativeapp/nativeui/restoredefaults/include/RestoreDefaultsView.h with 84% similarity]
code/sdk/application/wearable/nativeapp/nativeui/include/restoredefaults/RestoreSelectView.h [moved from code/sdk/application/wearable/nativeapp/nativeui/restoredefaults/include/RestoreSelectView.h with 86% similarity]
code/sdk/application/wearable/nativeapp/nativeui/include/rtcservice/RtcService.h [moved from code/sdk/application/wearable/nativeapp/nativeui/rtcservice/include/RtcService.h with 86% similarity]
code/sdk/application/wearable/nativeapp/nativeui/include/screennotify/ui_screennotify.h [moved from code/sdk/application/wearable/nativeapp/nativeui/screennotify/include/ui_screennotify.h with 67% similarity]
code/sdk/application/wearable/nativeapp/nativeui/include/screensetting/ScreenModels.h [moved from code/sdk/application/wearable/nativeapp/nativeui/screensetting/include/ScreenModels.h with 100% similarity]
code/sdk/application/wearable/nativeapp/nativeui/include/set_card/SetCardAdapter.h [moved from code/sdk/application/wearable/nativeapp/nativeui/set_card/include/SetCardAdapter.h with 96% similarity]
code/sdk/application/wearable/nativeapp/nativeui/include/set_card/SetCardDeleteView.h [moved from code/sdk/application/wearable/nativeapp/nativeui/set_card/include/SetCardDeleteView.h with 87% similarity]
code/sdk/application/wearable/nativeapp/nativeui/include/set_card/SetCardItem.h [moved from code/sdk/application/wearable/nativeapp/nativeui/set_card/include/SetCardItem.h with 88% similarity]
code/sdk/application/wearable/nativeapp/nativeui/include/set_card/SetCardModel.h [moved from code/sdk/application/wearable/nativeapp/nativeui/set_card/include/SetCardModel.h with 91% similarity]
code/sdk/application/wearable/nativeapp/nativeui/include/set_card/SetCardNoCardView.h [moved from code/sdk/application/wearable/nativeapp/nativeui/set_card/include/SetCardNoCardView.h with 88% similarity]
code/sdk/application/wearable/nativeapp/nativeui/include/set_card/SetCardPresenter.h [moved from code/sdk/application/wearable/nativeapp/nativeui/set_card/include/SetCardPresenter.h with 95% similarity]
code/sdk/application/wearable/nativeapp/nativeui/include/set_card/SetCardView.h [moved from code/sdk/application/wearable/nativeapp/nativeui/set_card/include/SetCardView.h with 89% similarity]
code/sdk/application/wearable/nativeapp/nativeui/include/set_dial/SetDialInfo.h [moved from code/sdk/application/wearable/nativeapp/nativeui/set_dial/include/SetDialInfo.h with 100% similarity]
code/sdk/application/wearable/nativeapp/nativeui/include/set_dial/SetDialModel.h [moved from code/sdk/application/wearable/nativeapp/nativeui/set_dial/include/SetDialModel.h with 94% similarity]
code/sdk/application/wearable/nativeapp/nativeui/include/set_dial/SetDialPresenter.h [moved from code/sdk/application/wearable/nativeapp/nativeui/set_dial/include/SetDialPresenter.h with 75% similarity]
code/sdk/application/wearable/nativeapp/nativeui/include/set_dial/SetDialView.h [moved from code/sdk/application/wearable/nativeapp/nativeui/set_dial/include/SetDialView.h with 100% similarity]
code/sdk/application/wearable/nativeapp/nativeui/include/set_dial_style/SetDialStyleModel.h [moved from code/sdk/application/wearable/nativeapp/nativeui/set_dial_style/include/SetDialStyleModel.h with 96% similarity]
code/sdk/application/wearable/nativeapp/nativeui/include/set_dial_style/SetDialStylePresenter.h [moved from code/sdk/application/wearable/nativeapp/nativeui/set_dial_style/include/SetDialStylePresenter.h with 92% similarity]
code/sdk/application/wearable/nativeapp/nativeui/include/set_dial_style/SetDialStyleView.h [moved from code/sdk/application/wearable/nativeapp/nativeui/set_dial_style/include/SetDialStyleView.h with 96% similarity]
code/sdk/application/wearable/nativeapp/nativeui/include/set_ota/OTACommon.h [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativeui/include/set_ota/OTAModel.h [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativeui/include/set_ota/OTAPresenter.h [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativeui/include/set_ota/OTAView.h [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativeui/include/settings/SetDesktopModel.h [moved from code/sdk/application/wearable/nativeapp/nativeui/set_desktop/include/SetDesktopModel.h with 58% similarity]
code/sdk/application/wearable/nativeapp/nativeui/include/settings/SettingAdapter.h [moved from code/sdk/application/wearable/nativeapp/nativeui/settings/include/SettingAdapter.h with 94% similarity]
code/sdk/application/wearable/nativeapp/nativeui/include/settings/SettingDesktopPage.h [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativeui/include/settings/SettingItem.h [moved from code/sdk/application/wearable/nativeapp/nativeui/settings/include/SettingItem.h with 92% similarity]
code/sdk/application/wearable/nativeapp/nativeui/include/settings/SettingItemView.h [moved from code/sdk/application/wearable/nativeapp/nativeui/settings/include/SettingItemView.h with 93% similarity]
code/sdk/application/wearable/nativeapp/nativeui/include/settings/SettingMainPage.h [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativeui/include/settings/SettingModel.h [moved from code/sdk/application/wearable/nativeapp/nativeui/settings/include/SettingModel.h with 93% similarity]
code/sdk/application/wearable/nativeapp/nativeui/include/settings/SettingPresenter.h [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativeui/include/settings/SettingView.h [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativeui/include/sleep/SleepingDetailsPage.h [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativeui/include/sleep/SleepingMainPage.h [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativeui/include/sleep/SleepingModel.h [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativeui/include/sleep/SleepingPresenter.h [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativeui/include/sleep/SleepingView.h [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativeui/include/sleep/TargetSleepTime.h [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativeui/include/sports/SportsModel.h [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativeui/include/sports/SportsPresenter.h [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativeui/include/sports/SportsView.h [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativeui/include/stopwatch/StopwatchAdapter.h [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativeui/include/stopwatch/StopwatchItemView.h [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativeui/include/stopwatch/StopwatchModel.h [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativeui/include/stopwatch/StopwatchPage.h [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativeui/include/stopwatch/StopwatchPresenter.h [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativeui/include/stopwatch/StopwatchView.h [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativeui/include/temperature/TempClickMea.h [moved from code/sdk/application/wearable/nativeapp/nativeui/temperature/include/TempClickMea.h with 89% similarity]
code/sdk/application/wearable/nativeapp/nativeui/include/temperature/TempContinueWarn.h [moved from code/sdk/application/wearable/nativeapp/nativeui/temperature/include/TempContinueWarn.h with 90% similarity]
code/sdk/application/wearable/nativeapp/nativeui/include/temperature/TempExitInter.h [moved from code/sdk/application/wearable/nativeapp/nativeui/temperature/include/TempExitInter.h with 87% similarity]
code/sdk/application/wearable/nativeapp/nativeui/include/temperature/TempExitPrompt.h [moved from code/sdk/application/wearable/nativeapp/nativeui/temperature/include/TempExitPrompt.h with 89% similarity]
code/sdk/application/wearable/nativeapp/nativeui/include/temperature/TempInitInter.h [moved from code/sdk/application/wearable/nativeapp/nativeui/temperature/include/TempInitInter.h with 87% similarity]
code/sdk/application/wearable/nativeapp/nativeui/include/temperature/TempJoinStudy.h [moved from code/sdk/application/wearable/nativeapp/nativeui/temperature/include/TempJoinStudy.h with 90% similarity]
code/sdk/application/wearable/nativeapp/nativeui/include/temperature/TempLittleTip.h [moved from code/sdk/application/wearable/nativeapp/nativeui/temperature/include/TempLittleTip.h with 89% similarity]
code/sdk/application/wearable/nativeapp/nativeui/include/temperature/TempMainView.h [moved from code/sdk/application/wearable/nativeapp/nativeui/temperature/include/TempMainView.h with 76% similarity]
code/sdk/application/wearable/nativeapp/nativeui/include/temperature/TempMeaProcess.h [moved from code/sdk/application/wearable/nativeapp/nativeui/temperature/include/TempMeaProcess.h with 92% similarity]
code/sdk/application/wearable/nativeapp/nativeui/include/temperature/TempMeasure.h [moved from code/sdk/application/wearable/nativeapp/nativeui/temperature/include/TempMeasure.h with 87% similarity]
code/sdk/application/wearable/nativeapp/nativeui/include/temperature/TempModel.h [moved from code/sdk/application/wearable/nativeapp/nativeui/temperature/include/TempModel.h with 100% similarity]
code/sdk/application/wearable/nativeapp/nativeui/include/temperature/TempPresenter.h [moved from code/sdk/application/wearable/nativeapp/nativeui/temperature/include/TempPresenter.h with 95% similarity]
code/sdk/application/wearable/nativeapp/nativeui/include/temperature/TempPromptWear.h [moved from code/sdk/application/wearable/nativeapp/nativeui/temperature/include/TempPromptWear.h with 90% similarity]
code/sdk/application/wearable/nativeapp/nativeui/include/temperature/TempRemindWear.h [moved from code/sdk/application/wearable/nativeapp/nativeui/temperature/include/TempRemindWear.h with 89% similarity]
code/sdk/application/wearable/nativeapp/nativeui/include/temperature/TempReport.h [moved from code/sdk/application/wearable/nativeapp/nativeui/temperature/include/TempReport.h with 87% similarity]
code/sdk/application/wearable/nativeapp/nativeui/include/temperature/TempStudyAbout.h [moved from code/sdk/application/wearable/nativeapp/nativeui/temperature/include/TempStudyAbout.h with 89% similarity]
code/sdk/application/wearable/nativeapp/nativeui/include/temperature/TempWarn.h [moved from code/sdk/application/wearable/nativeapp/nativeui/temperature/include/TempWarn.h with 90% similarity]
code/sdk/application/wearable/nativeapp/nativeui/include/timers/TimerMainPage.h [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativeui/include/timers/TimerModel.h [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativeui/include/timers/TimerPresenter.h [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativeui/include/timers/TimerSettingPage.h [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativeui/include/timers/TimerTimingPage.h [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativeui/include/timers/TimerView.h [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativeui/include/training/DataView.h [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativeui/include/training/MenuView.h [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativeui/include/training/PauseView.h [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativeui/include/training/PrepareView.h [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativeui/include/training/PromptView.h [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativeui/include/training/TargetAdapter.h [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativeui/include/training/TargetItemView.h [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativeui/include/training/TargetSettingView.h [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativeui/include/training/TargetView.h [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativeui/include/training/TrainingAdapter.h [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativeui/include/training/TrainingItemView.h [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativeui/include/training/TrainingModel.h [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativeui/include/training/TrainingPresenter.h [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativeui/include/training/TrainingSettingAdapter.h [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativeui/include/training/TrainingSettingItemView.h [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativeui/include/training/TrainingSettingView.h [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativeui/include/training/TrainingView.h [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativeui/include/uisample/UISampleModel.h [moved from code/sdk/application/wearable/nativeapp/nativeui/uisample/include/UISampleModel.h with 89% similarity]
code/sdk/application/wearable/nativeapp/nativeui/include/uisample/UISamplePresenter.h [moved from code/sdk/application/wearable/nativeapp/nativeui/uisample/include/UISamplePresenter.h with 100% similarity]
code/sdk/application/wearable/nativeapp/nativeui/include/uisample/UISampleView.h [moved from code/sdk/application/wearable/nativeapp/nativeui/uisample/include/UISampleView.h with 100% similarity]
code/sdk/application/wearable/nativeapp/nativeui/include/uiservice/ui_language.h [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativeui/include/uiservice/ui_service.h [moved from code/sdk/application/wearable/nativeapp/nativeui/uiservice/include/ui_service.h with 97% similarity]
code/sdk/application/wearable/nativeapp/nativeui/include/videocard/VideoCard.h [moved from code/sdk/application/wearable/nativeapp/nativeui/videocard/include/VideoCard.h with 91% similarity]
code/sdk/application/wearable/nativeapp/nativeui/include/weather/WeatherAdapter.h [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativeui/include/weather/WeatherItemView.h [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativeui/include/weather/WeatherMainPage.h [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativeui/include/weather/WeatherModel.h [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativeui/include/weather/WeatherPageSecond.h [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativeui/include/weather/WeatherPageThird.h [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativeui/include/weather/WeatherPresenter.h [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativeui/include/weather/WeatherView.h [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativeui/indoorwalk/src/CustomizationView.cpp
code/sdk/application/wearable/nativeapp/nativeui/indoorwalk/src/IndoorWalkEndView.cpp
code/sdk/application/wearable/nativeapp/nativeui/indoorwalk/src/IndoorWalkModel.cpp
code/sdk/application/wearable/nativeapp/nativeui/indoorwalk/src/IndoorWalkMotionView.cpp
code/sdk/application/wearable/nativeapp/nativeui/indoorwalk/src/IndoorWalkPreparedView.cpp
code/sdk/application/wearable/nativeapp/nativeui/indoorwalk/src/IndoorWalkPresenter.cpp
code/sdk/application/wearable/nativeapp/nativeui/indoorwalk/src/IndoorWalkView.cpp
code/sdk/application/wearable/nativeapp/nativeui/indoorwalk/src/MotionPageFifth.cpp
code/sdk/application/wearable/nativeapp/nativeui/indoorwalk/src/MotionPageFirst.cpp
code/sdk/application/wearable/nativeapp/nativeui/indoorwalk/src/MotionPageFourth.cpp
code/sdk/application/wearable/nativeapp/nativeui/indoorwalk/src/MotionPageSecond.cpp
code/sdk/application/wearable/nativeapp/nativeui/indoorwalk/src/MotionPageThird.cpp
code/sdk/application/wearable/nativeapp/nativeui/key/src/KeyInputListener.cpp
code/sdk/application/wearable/nativeapp/nativeui/main/src/HealthModel.cpp
code/sdk/application/wearable/nativeapp/nativeui/main/src/LoadImg.cpp [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativeui/main/src/MainModel.cpp
code/sdk/application/wearable/nativeapp/nativeui/main/src/MainPresenterSample.cpp
code/sdk/application/wearable/nativeapp/nativeui/main/src/MainViewSample.cpp
code/sdk/application/wearable/nativeapp/nativeui/main/src/MessageAdapter.cpp [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativeui/main/src/MessageItemView.cpp [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativeui/main/src/MessageMainView.cpp [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativeui/main/src/MessageModel.cpp [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativeui/main/src/ModelListenerSample.cpp
code/sdk/application/wearable/nativeapp/nativeui/main/src/PullUpDownView.cpp
code/sdk/application/wearable/nativeapp/nativeui/main/src/VolumeSettingPresenter.cpp
code/sdk/application/wearable/nativeapp/nativeui/main/src/VolumeSettingView.cpp
code/sdk/application/wearable/nativeapp/nativeui/main/src/dial/DialArcLabelView.cpp
code/sdk/application/wearable/nativeapp/nativeui/main/src/dial/DialArcProgressView.cpp
code/sdk/application/wearable/nativeapp/nativeui/main/src/dial/DialBoxProgressView.cpp
code/sdk/application/wearable/nativeapp/nativeui/main/src/dial/DialDataBase.cpp
code/sdk/application/wearable/nativeapp/nativeui/main/src/dial/DialDigitalImgView.cpp
code/sdk/application/wearable/nativeapp/nativeui/main/src/dial/DialLabelView.cpp
code/sdk/application/wearable/nativeapp/nativeui/main/src/dial/DialModelHeartRate.cpp
code/sdk/application/wearable/nativeapp/nativeui/main/src/dial/DialModelPower.cpp
code/sdk/application/wearable/nativeapp/nativeui/main/src/dial/DialModelSteps.cpp
code/sdk/application/wearable/nativeapp/nativeui/main/src/dial/DialModelTime.cpp
code/sdk/application/wearable/nativeapp/nativeui/main/src/dial/DialOptionImgView.cpp
code/sdk/application/wearable/nativeapp/nativeui/main/src/dial/DialRotateImgView.cpp
code/sdk/application/wearable/nativeapp/nativeui/main/src/dial/DialSequenceImgView.cpp
code/sdk/application/wearable/nativeapp/nativeui/main/src/dial/DialStaticImgView.cpp
code/sdk/application/wearable/nativeapp/nativeui/main/src/dial/DialVideoView.cpp
code/sdk/application/wearable/nativeapp/nativeui/main/src/dial/DialViewContainer.cpp
code/sdk/application/wearable/nativeapp/nativeui/main/src/dial/DialViewGroup.cpp
code/sdk/application/wearable/nativeapp/nativeui/main/src/dial/ModelDialDataFactory.cpp
code/sdk/application/wearable/nativeapp/nativeui/main/src/dial/WatchInterface.cpp
code/sdk/application/wearable/nativeapp/nativeui/makephone/src/CallerDisplayView.cpp
code/sdk/application/wearable/nativeapp/nativeui/makephone/src/CallingView.cpp
code/sdk/application/wearable/nativeapp/nativeui/makephone/src/DialingScreenView.cpp
code/sdk/application/wearable/nativeapp/nativeui/makephone/src/MainCallingPresenter.cpp
code/sdk/application/wearable/nativeapp/nativeui/makephone/src/MainCallingView.cpp
code/sdk/application/wearable/nativeapp/nativeui/makephone/src/WaitingHintsView.cpp
code/sdk/application/wearable/nativeapp/nativeui/offlinevoice/src/MainVocassistView.cpp
code/sdk/application/wearable/nativeapp/nativeui/offlinevoice/src/VocassistModel.cpp
code/sdk/application/wearable/nativeapp/nativeui/offlinevoice/src/VocassistPresenter.cpp
code/sdk/application/wearable/nativeapp/nativeui/offlinevoice/src/VocassistView.cpp
code/sdk/application/wearable/nativeapp/nativeui/phoneservice/src/PhoneAudio.cpp
code/sdk/application/wearable/nativeapp/nativeui/phoneservice/src/PhoneService.cpp
code/sdk/application/wearable/nativeapp/nativeui/player/src/BluetoothView.cpp
code/sdk/application/wearable/nativeapp/nativeui/player/src/PlayersCaseListAdapter.cpp
code/sdk/application/wearable/nativeapp/nativeui/player/src/PlayersModel.cpp
code/sdk/application/wearable/nativeapp/nativeui/player/src/PlayersPresenter.cpp
code/sdk/application/wearable/nativeapp/nativeui/player/src/PlayersView.cpp
code/sdk/application/wearable/nativeapp/nativeui/qrcode_conn/src/QrcodeConnModel.cpp [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativeui/qrcode_conn/src/QrcodeConnPresenter.cpp [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativeui/qrcode_conn/src/QrcodeConnView.cpp [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativeui/rebootdevice/src/RebootDeviceView.cpp
code/sdk/application/wearable/nativeapp/nativeui/rebootdevice/src/RebootModel.cpp
code/sdk/application/wearable/nativeapp/nativeui/rebootdevice/src/RebootPresenter.cpp
code/sdk/application/wearable/nativeapp/nativeui/rebootdevice/src/RebootView.cpp
code/sdk/application/wearable/nativeapp/nativeui/rebootdevice/src/ShutdownDeviceView.cpp
code/sdk/application/wearable/nativeapp/nativeui/recent_app/src/RecentAppPresenter.cpp [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativeui/recent_app/src/RecentAppView.cpp [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativeui/restoredefaults/src/RestoreDefaultsView.cpp
code/sdk/application/wearable/nativeapp/nativeui/restoredefaults/src/RestorePresenter.cpp
code/sdk/application/wearable/nativeapp/nativeui/restoredefaults/src/RestoreSelectView.cpp
code/sdk/application/wearable/nativeapp/nativeui/rtcservice/src/RtcService.cpp
code/sdk/application/wearable/nativeapp/nativeui/screennotify/src/ui_screennotify.cpp
code/sdk/application/wearable/nativeapp/nativeui/screensetting/src/ScreenModels.cpp
code/sdk/application/wearable/nativeapp/nativeui/set_card/src/SetCardAdapter.cpp
code/sdk/application/wearable/nativeapp/nativeui/set_card/src/SetCardDeleteView.cpp
code/sdk/application/wearable/nativeapp/nativeui/set_card/src/SetCardItem.cpp
code/sdk/application/wearable/nativeapp/nativeui/set_card/src/SetCardModel.cpp
code/sdk/application/wearable/nativeapp/nativeui/set_card/src/SetCardNoCardView.cpp
code/sdk/application/wearable/nativeapp/nativeui/set_card/src/SetCardPresenter.cpp
code/sdk/application/wearable/nativeapp/nativeui/set_card/src/SetCardView.cpp
code/sdk/application/wearable/nativeapp/nativeui/set_desktop/include/SetDesktopPresenter.h [deleted file]
code/sdk/application/wearable/nativeapp/nativeui/set_desktop/include/SetDesktopView.h [deleted file]
code/sdk/application/wearable/nativeapp/nativeui/set_desktop/src/SetDesktopPresenter.cpp [deleted file]
code/sdk/application/wearable/nativeapp/nativeui/set_dial/src/SetDialModel.cpp
code/sdk/application/wearable/nativeapp/nativeui/set_dial/src/SetDialPresenter.cpp
code/sdk/application/wearable/nativeapp/nativeui/set_dial/src/SetDialView.cpp
code/sdk/application/wearable/nativeapp/nativeui/set_dial_style/src/SetDialStyleModel.cpp
code/sdk/application/wearable/nativeapp/nativeui/set_dial_style/src/SetDialStylePresenter.cpp
code/sdk/application/wearable/nativeapp/nativeui/set_dial_style/src/SetDialStyleView.cpp
code/sdk/application/wearable/nativeapp/nativeui/set_ota/src/OTAModel.cpp [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativeui/set_ota/src/OTAPresenter.cpp [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativeui/set_ota/src/OTAView.cpp [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativeui/settings/include/SettingPresenter.h [deleted file]
code/sdk/application/wearable/nativeapp/nativeui/settings/include/SettingView.h [deleted file]
code/sdk/application/wearable/nativeapp/nativeui/settings/src/SetDesktopModel.cpp [moved from code/sdk/application/wearable/nativeapp/nativeui/set_desktop/src/SetDesktopModel.cpp with 83% similarity]
code/sdk/application/wearable/nativeapp/nativeui/settings/src/SettingAdapter.cpp
code/sdk/application/wearable/nativeapp/nativeui/settings/src/SettingDesktopPage.cpp [moved from code/sdk/application/wearable/nativeapp/nativeui/set_desktop/src/SetDesktopView.cpp with 55% similarity]
code/sdk/application/wearable/nativeapp/nativeui/settings/src/SettingItemView.cpp
code/sdk/application/wearable/nativeapp/nativeui/settings/src/SettingMainPage.cpp [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativeui/settings/src/SettingModel.cpp
code/sdk/application/wearable/nativeapp/nativeui/settings/src/SettingPresenter.cpp
code/sdk/application/wearable/nativeapp/nativeui/settings/src/SettingView.cpp [deleted file]
code/sdk/application/wearable/nativeapp/nativeui/sleep/src/SleepingDetailsPage.cpp [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativeui/sleep/src/SleepingMainPage.cpp [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativeui/sleep/src/SleepingModel.cpp [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativeui/sleep/src/SleepingPresenter.cpp [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativeui/sleep/src/TargetSleepTime.cpp [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativeui/sports/src/SportsModel.cpp [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativeui/sports/src/SportsPresenter.cpp [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativeui/sports/src/SportsView.cpp [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativeui/stopwatch/src/StopwatchAdapter.cpp [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativeui/stopwatch/src/StopwatchItemView.cpp [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativeui/stopwatch/src/StopwatchModel.cpp [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativeui/stopwatch/src/StopwatchPage.cpp [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativeui/stopwatch/src/StopwatchPresenter.cpp [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativeui/temperature/src/TempClickMea.cpp
code/sdk/application/wearable/nativeapp/nativeui/temperature/src/TempContinueWarn.cpp
code/sdk/application/wearable/nativeapp/nativeui/temperature/src/TempExitInter.cpp
code/sdk/application/wearable/nativeapp/nativeui/temperature/src/TempExitPrompt.cpp
code/sdk/application/wearable/nativeapp/nativeui/temperature/src/TempInitInter.cpp
code/sdk/application/wearable/nativeapp/nativeui/temperature/src/TempJoinStudy.cpp
code/sdk/application/wearable/nativeapp/nativeui/temperature/src/TempLittleTip.cpp
code/sdk/application/wearable/nativeapp/nativeui/temperature/src/TempMainView.cpp
code/sdk/application/wearable/nativeapp/nativeui/temperature/src/TempMeaProcess.cpp
code/sdk/application/wearable/nativeapp/nativeui/temperature/src/TempMeasure.cpp
code/sdk/application/wearable/nativeapp/nativeui/temperature/src/TempModel.cpp
code/sdk/application/wearable/nativeapp/nativeui/temperature/src/TempPresenter.cpp
code/sdk/application/wearable/nativeapp/nativeui/temperature/src/TempPromptWear.cpp
code/sdk/application/wearable/nativeapp/nativeui/temperature/src/TempRemindWear.cpp
code/sdk/application/wearable/nativeapp/nativeui/temperature/src/TempReport.cpp
code/sdk/application/wearable/nativeapp/nativeui/temperature/src/TempStudyAbout.cpp
code/sdk/application/wearable/nativeapp/nativeui/temperature/src/TempWarn.cpp
code/sdk/application/wearable/nativeapp/nativeui/timers/src/TimerMainPage.cpp [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativeui/timers/src/TimerModel.cpp [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativeui/timers/src/TimerPresenter.cpp [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativeui/timers/src/TimerSettingPage.cpp [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativeui/timers/src/TimerTimingPage.cpp [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativeui/training/src/DataView.cpp [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativeui/training/src/MenuView.cpp [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativeui/training/src/PauseView.cpp [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativeui/training/src/PrepareView.cpp [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativeui/training/src/PromptView.cpp [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativeui/training/src/TargetAdapter.cpp [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativeui/training/src/TargetItemView.cpp [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativeui/training/src/TargetSettingView.cpp [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativeui/training/src/TargetView.cpp [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativeui/training/src/TrainingAdapter.cpp [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativeui/training/src/TrainingItemView.cpp [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativeui/training/src/TrainingModel.cpp [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativeui/training/src/TrainingPresenter.cpp [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativeui/training/src/TrainingSettingAdapter.cpp [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativeui/training/src/TrainingSettingItemView.cpp [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativeui/training/src/TrainingSettingView.cpp [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativeui/training/src/TrainingView.cpp [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativeui/uisample/src/UISampleModel.cpp
code/sdk/application/wearable/nativeapp/nativeui/uisample/src/UISamplePresenter.cpp
code/sdk/application/wearable/nativeapp/nativeui/uisample/src/UISampleView.cpp
code/sdk/application/wearable/nativeapp/nativeui/uisample/uitest/framework/src/test_case_list_adapter.cpp
code/sdk/application/wearable/nativeapp/nativeui/uisample/uitest/framework/src/ui_test_group.cpp
code/sdk/application/wearable/nativeapp/nativeui/uiservice/src/ui_language.cpp [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativeui/uiservice/src/ui_service.cpp
code/sdk/application/wearable/nativeapp/nativeui/videocard/src/VideoCard.cpp
code/sdk/application/wearable/nativeapp/nativeui/weather/src/WeatherAdapter.cpp [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativeui/weather/src/WeatherItemView.cpp [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativeui/weather/src/WeatherMainPage.cpp [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativeui/weather/src/WeatherModel.cpp [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativeui/weather/src/WeatherPageSecond.cpp [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativeui/weather/src/WeatherPageThird.cpp [new file with mode: 0644]
code/sdk/application/wearable/nativeapp/nativeui/weather/src/WeatherPresenter.cpp [new file with mode: 0644]
code/sdk/application/wearable/ohos_deps/CMakeLists.txt
code/sdk/application/wearable/ohos_deps/wearable_log.h
code/sdk/application/wearable/ohos_deps/wearable_onlinelog.c [new file with mode: 0644]
code/sdk/application/wearable/ohos_deps/wearable_onlinelog.h [new file with mode: 0644]
code/sdk/application/wearable/ohos_startup/CMakeLists.txt
code/sdk/application/wearable/ohos_startup/ohosfwk_startup.c
code/sdk/application/wearable/service/CMakeLists.txt
code/sdk/application/wearable/service/app_store/CMakeLists.txt
code/sdk/application/wearable/service/app_store/app_store.cpp
code/sdk/application/wearable/service/app_store/app_store.h
code/sdk/application/wearable/service/app_store/app_store_msg.cpp
code/sdk/application/wearable/service/broadcast/include/broadcast_feature.h
code/sdk/application/wearable/service/broadcast/src/broadcast_implement.c
code/sdk/application/wearable/service/device_msg/CMakeLists.txt [new file with mode: 0644]
code/sdk/application/wearable/service/device_msg/device_location.cpp [new file with mode: 0644]
code/sdk/application/wearable/service/device_msg/device_location.h [new file with mode: 0644]
code/sdk/application/wearable/service/device_msg/device_msg.cpp [new file with mode: 0644]
code/sdk/application/wearable/service/device_msg/device_proxy.cpp [new file with mode: 0644]
code/sdk/application/wearable/service/device_msg/device_proxy.h [new file with mode: 0644]
code/sdk/application/wearable/service/device_msg/msg_center_device.cpp [new file with mode: 0644]
code/sdk/application/wearable/service/device_msg/msg_center_device.h [new file with mode: 0644]
code/sdk/application/wearable/service/dial_market/CMakeLists.txt
code/sdk/application/wearable/service/dial_market/dial_market.cpp [new file with mode: 0644]
code/sdk/application/wearable/service/dial_market/dial_market_msg.cpp [new file with mode: 0644]
code/sdk/application/wearable/service/msg_center/CMakeLists.txt
code/sdk/application/wearable/service/msg_center/brandy-auto-ota-cli/libmsg_center.a
code/sdk/application/wearable/service/msg_center/brandy-auto-ota-ser/libmsg_center.a
code/sdk/application/wearable/service/msg_center/brandy-native-js/libmsg_center.a
code/sdk/application/wearable/service/msg_center/brandy-xts/libmsg_center.a
code/sdk/application/wearable/service/msg_center/include/msg_center_protocol.h
code/sdk/application/wearable/service/msg_center/include/notify/notification_manager.h
code/sdk/application/wearable/service/msg_center/include/notify/phone_msg_notification.h [new file with mode: 0644]
code/sdk/application/wearable/service/msg_center/src/common/msg_center_self_cmd.cpp [new file with mode: 0644]
code/sdk/application/wearable/service/msg_center/src/msg_center_customer.cpp
code/sdk/application/wearable/service/msg_center/src/notify/alarm_notification.cpp
code/sdk/application/wearable/service/msg_center/src/notify/ketinput/src/NotifyOnKeyListener.cpp
code/sdk/application/wearable/service/msg_center/src/notify/makephone_notification.cpp
code/sdk/application/wearable/service/msg_center/src/notify/phone_msg_notification.cpp [new file with mode: 0644]
code/sdk/application/wearable/service/power_manager/src/actions/display_action.c
code/sdk/application/wearable/service/remote_msg/CMakeLists.txt [new file with mode: 0644]
code/sdk/application/wearable/service/remote_msg/remote_msg.cpp [new file with mode: 0644]
code/sdk/application/wearable/service/remote_msg/remote_msg.h [new file with mode: 0644]
code/sdk/application/wearable/service/xiaodu_voice/xiaodu_voice.cpp
code/sdk/application/wearable/service/xiaodu_voice/xiaodu_voice_msg.cpp

index 65aafbd..c394f7c 100644 (file)
@@ -17,7 +17,7 @@
 #include "securec.h"\r
 #include "cmsis_os2.h"\r
 #ifdef SUPPORT_OHOSFWK\r
-#include "BluetoothWrapper.h"\r
+#include "bluetooth/BluetoothWrapper.h"\r
 #endif\r
 \r
 /* Gatt service UUID */\r
index e98bcf6..63e56e8 100644 (file)
@@ -19,12 +19,12 @@ set(PRIVATE_HEADER
     ${ROOT_DIR}/middleware/services/gui/uikit/surface/interfaces/kits
     ${ROOT_DIR}/middleware/services/gui/uikit/ui/interfaces/innerkits
     ${ROOT_DIR}/middleware/services/gui/uikit/ui/frameworks
-    ${ROOT_DIR}/application/wearable/nativeapp/nativeui/applist/include/
     ${ROOT_DIR}/open_source/openharmony/drivers/peripheral/display/interfaces/include
 )
 
 set(SOURCES
     ${CMAKE_CURRENT_SOURCE_DIR}/src/Ability.cpp
+    ${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/ZoomTransition.cpp
index 9606728..f6a6877 100644 (file)
 #ifndef NATIVEABILITYFWK_ABILITY_H
 #define NATIVEABILITYFWK_ABILITY_H
 #include <cstdint>
-#include "SliceProxy.h"
-#include "Slice.h"
 #include "wearable_log.h"
 #include "TransitionType.h"
 #include "soc_osal.h"
 #include "gfx_utils/vector.h"
 #include "graphic_mutex.h"
+#include "Slice.h"
+#include "SliceProxy.h"
+#include "SlicePageManager.h"
 
 namespace OHOS {
 const static uint16_t gSliceInvalid = 0;
+const static uint16_t gPageInvalid = 0;
 const static uint16_t gSliceDefaultPriority = 4;  // 页面默认是最低优先级
+
 class Ability {
 public:
-    void AddSliceProxy(const uint16_t sliceId, SliceProxy* proxy);
-    void ChangeSlice(const uint16_t targetSliceId, TransitionType type = TransitionType::TRANSITION_INVALID,
-        const uint16_t priority = gSliceDefaultPriority, bool enableSlideBack = false);
-    void SetDefaultSliceId(const uint16_t defaultSliceId) {
-        defaultSliceId_ = defaultSliceId;
+    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
+     * @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
+     * @return Returns <b>true</b> if the pages is switched successfully, returns <b>false</b> otherwise.
+     */
+    bool SwitchPageInSlice(uint16_t pageId, void* data = nullptr,
+        TransitionType type = TransitionType::TRANSITION_INVALID, bool canBack = false);
+
+    /**
+     * @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
+     *         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.
+     * @param type Indicates Transition animation type, which is declared in TransitionType.h
+     * @param enableSliceBack Indicates whether can return to current slice from target slice by sliding
+     */
+    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 default page is exist, default page will also be created
+     *         2. If slices is being switched, this operation will be cached and run later.
+     *        Note: Method SwitchSlice is recommended, this method is reserved for compatibility.
+     * @param sliceId Indicates the specified id of the slice
+     * @param type Indicates Transition animation type, which is declared in TransitionType.h
+     * @param priority Indicates the priority of slice, default value is used currently. if needed, config it in
+     *        XXXPresenter::OnResume using method SetCurSlicePriority
+     * @param enableSliceBack Indicates whether can return to current slice from target slice by sliding
+     */
+    void ChangeSlice(uint16_t sliceId, TransitionType type = TransitionType::TRANSITION_INVALID,
+        uint16_t priority = gSliceDefaultPriority, bool enableSlideBack = false);
+
+    /**
+     * @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
+     */
+    SlicePageManager* GetCurSlicePageManager();
+
+    void SetDefaultSliceId(uint16_t defaultSliceId, uint16_t pageId = gPageInvalid)
+    {
+        defaultTargetId_ = defaultSliceId | (static_cast<uint32_t>(pageId) << PAGE_OFFSET);
     }
-    uint16_t GetCurSliceId(void) {
+
+    /**
+     * @brief Get current slice id
+     * @return Returns <b>0</b> if js ability is running, detail refer to comments of variable allSlices_
+     */
+    uint16_t GetCurSliceId(void)
+    {
+        if (allSlices_.IsEmpty()) {
+            return gSliceInvalid;
+        }
+        return static_cast<uint16_t>(allSlices_[allSlices_.Size() - 1] & SLICE_MASK);
+    }
+
+    /**
+     * @brief Get prevoius slice id in the slice vector, detail refer to comments of variable allSlices_
+     */
+    uint16_t GetPreSliceId(void)
+    {
+        if (allSlices_.Size() < 2) {
+            return gSliceInvalid;
+        }
+        return static_cast<uint16_t>(allSlices_[allSlices_.Size() - 2] & SLICE_MASK);
+    }
+
+    void UpdateCurSlicePageId(uint16_t pageId);
+
+    uint32_t GetCurTargetId(void)
+    {
         if (allSlices_.IsEmpty()) {
             return gSliceInvalid;
         }
@@ -43,30 +118,35 @@ public:
         return allSlices_[allSlices_.Size() - 1];
     }
 
-    uint16_t GetPreSliceId(void) {
-        if (allSlices_.Size() < 2) {
+    uint32_t GetPreTargetId(void)
+    {
+        if (allSlices_.Size() < 2) { // 2, minimum count if contains previous target
             return gSliceInvalid;
         }
-        return allSlices_[allSlices_.Size() - 2];
+
+        return allSlices_[allSlices_.Size() - 2]; // 2, index offset
     }
 
-    void SetCurSlicePriority(const uint16_t priority) {
+    void SetCurSlicePriority(uint16_t priority)
+    {
         curSlicePriority_ = priority;
     }
 
-    uint16_t GetCurSlicePriority(void) {
+    uint16_t GetCurSlicePriority(void)
+    {
         return curSlicePriority_;
     }
-    void StartSlice(const uint16_t sliceId, const uint16_t priority);
-    void ResumeSliceWithoutJS();
+
     void ResumeSlice();
     void PauseSlice();
-    void StopSlice();
-    void StopPrevSlice();
     void StopSliceTransition();
     void BackToPreSlice();
 
 protected:
+    // targetId consists of slice id and page id
+    void StartSlice(uint32_t targetId);
+    void ResumeSliceWithoutJS();
+    void StopSlice();
     Ability() = default;
     virtual ~Ability() = default;
     struct ProxyStruct {
@@ -82,17 +162,20 @@ protected:
     // 预加载的所有slices
     Graphic::Vector<ProxyStruct> allSlicesProxy_{16};
 
-    // 历史记录的所有slices, 当前只使用了id
-    // TODO:: 整页面的能力恢复功能待考虑扩展
-    Graphic::Vector<uint16_t> allSlices_;
+    /** Processing rule of allSlices_, its item value consists of slice and page. slice | page << 16.
+     *    1. When switch slice A to main slice, clear slice vector, and then push back main slice into slice vector
+     *    2. When switch slice A to slice B (not main), push back slice B into slice vector
+     *    3. When switch js to slice A, clear slice vector, and then push back slice A into slice vector
+     *    4. When switch slice A to js, push back 0 into slice vector. You Can get slice A by method GetPreSliceId()
+     */
+    Graphic::Vector<uint32_t> allSlices_;
 
     SliceStruct curSlice_;
-    SliceStruct prevSlice_;
-    uint16_t targetSliceIdFromJS_ = 0;
-    uint16_t defaultSliceId_ = gSliceInvalid;
+    SliceStruct nextSlice_;
+    uint32_t targetIdFromJS_ = 0;
+    uint32_t defaultTargetId_ = gSliceInvalid;
     uint16_t curSlicePriority_ = gSliceDefaultPriority;
-    void PostChangeSlice(const uint16_t targetSliceId, TransitionType type,
-        const uint16_t priority, bool enableSlideBack);
+    void PostChangeSlice(uint32_t targetId, TransitionType type);
     Ability::ProxyStruct* Find(const uint16_t sliceId);
 };
 }
index a4acb09..09a8c81 100644 (file)
@@ -17,7 +17,9 @@
 #define NATIVEABILITYFWK_ABILITY_SLICE_H
 #include <typeinfo>
 #include "Slice.h"
-#include "wearable_log.h"
+#include "Presenter.h"
+#include "View.h"
+#include "SlicePageManager.h"
 
 namespace OHOS {
 enum class SliceState : uint8_t {
@@ -27,93 +29,33 @@ enum class SliceState : uint8_t {
     PAUSE,
     STOP
 };
-template<class V, class P, class M = void>
 class AbilitySlice : public Slice {
 public:
-    AbilitySlice<V, P, M>()
-        :view_(nullptr), presenter_(nullptr), state_(SliceState::UNINITIALIZED) {}
-    ~AbilitySlice() {}
+    AbilitySlice(ViewBase* viewBase, PresenterBase* presenterBase, uint32_t targetId)
+        : sliceId_(targetId & SLICE_MASK), view_(viewBase), presenter_(presenterBase),
+          slicePageMgr_(targetId), state_(SliceState::UNINITIALIZED) {}
 
-    void OnStart() override
-    {
-        if ((presenter_ != nullptr) || (view_ != nullptr)) {
-            return;
-        }
+    void OnStart() override;
 
-        presenter_ = new P();
-        view_ = new V();
+    void OnResume() override;
 
-        presenter_->Attach(view_);
-        view_->Attach(presenter_);
+    void OnPause() override;
 
-        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Slice %s OnStart", typeid(view_).name());
-        view_->SetupView();
-        view_->OnStart();
-        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Slice %s OnStart", typeid(presenter_).name());
-        presenter_->OnStart();
-        state_ = SliceState::START;
-    }
+    void OnStop() override;
 
-    void OnResume() override
-    {
-        if ((state_ != SliceState::START) && (state_ != SliceState::PAUSE)) { // avoid repeated resume
-            return;
-        }
-        if (presenter_ != nullptr) {
-            WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Slice %s OnResume", typeid(presenter_).name());
-            presenter_->OnResume();
-        }
-        if (view_ != nullptr) {
-            view_->Draw();
-        }
-        state_ = SliceState::RESUME;
-    }
+    UIViewGroup* GetSliceContainer() override;
 
-    void OnPause() override
-    {
-        if (state_ != SliceState::RESUME) { // avoid repeated pause
-            return;
-        }
-        if (presenter_ != nullptr) {
-            WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Slice %s OnPause", typeid(presenter_).name());
-            presenter_->OnPause();
-        }
-        state_ = SliceState::PAUSE;
-    }
+    bool ChangeSlicePage(uint16_t pageId, void* data, TransitionType type, bool canBack);
 
-    void OnStop() override
+    SlicePageManager* GetSlicePageManger()
     {
-        if (view_ != nullptr) {
-            view_->TearDownView();
-            WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Slice %s OnStop", typeid(view_).name());
-            view_->OnStop();
-            delete view_;
-            view_ = nullptr;
-        }
-        if (presenter_ != nullptr) {
-            WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Slice %s OnStop", typeid(presenter_).name());
-            presenter_->OnStop();
-            delete presenter_;
-            presenter_ = nullptr;
-        }
-        state_ = SliceState::STOP;
+        return &slicePageMgr_;
     }
-
-    UIViewGroup* GetSliceContainer() override
-    {
-        if (view_ != nullptr) {
-            return view_->GetRootContainer();
-        } else {
-            return nullptr;
-        }
-    }
-
 private:
-    AbilitySlice(const AbilitySlice &);
-    AbilitySlice &operator=(const AbilitySlice &);
-
-    V* view_;
-    P* presenter_;
+    uint16_t sliceId_;
+    ViewBase* view_;
+    PresenterBase* presenter_;
+    SlicePageManager slicePageMgr_;
     SliceState state_;
 };
 } // namespace OHOS
index d942f0c..1cb8f89 100644 (file)
 #define NATIVEABILITYFWK_ABILITY_SLICE_PROXY_H
 
 #include "AbilitySlice.h"
-
 #include "wearable_log.h"
+#include "Presenter.h"
 
 namespace OHOS {
 template <class V, class P>
-
 class AbilitySliceProxy : public SliceProxy {
 public:
-    AbilitySliceProxy<V, P>() {}
-    ~AbilitySliceProxy() {}
-
-    Slice* CreateSlice() override
+    Slice* CreateSlice(uint32_t targetId) override
     {
-        return new AbilitySlice<V, P>();
+        V* v = new V();
+        if (v == nullptr) {
+            return nullptr;
+        }
+        P* p = new P();
+        if (p == nullptr) {
+            delete v;
+            return nullptr;
+        }
+        return new AbilitySlice(v, p, targetId);
     }
-
-private:
-    AbilitySliceProxy(const AbilitySliceProxy &);
-    AbilitySliceProxy &operator=(const AbilitySliceProxy &);
 };
 } // namespace OHOS
 #endif // NATIVEABILITYFWK_ABILITY_SLICE_PROXY_H
index a851b55..4cca1df 100644 (file)
@@ -9,16 +9,21 @@
 #define BACK_DRAG_LISTENER_H
 #include <functional>
 #include "animator/animator.h"
-#include "components/ui_view.h"
+#include "components/ui_view_group.h"
 
 namespace OHOS {
 class BackDragListener : public UIView::OnDragListener {
 public:
-    static BackDragListener* GetInstance();
+    BackDragListener() = default;
+    ~BackDragListener() override;
     bool OnDragStart(UIView& view, const DragEvent& event) override;
     bool OnDrag(UIView& view, const DragEvent& event) override;
     bool OnDragEnd(UIView& view, const DragEvent& event) override;
-    void ClearStatus();
+    void ClearDragState();
+    void SetParentView(UIViewGroup* view)
+    {
+        parentView_ = view;
+    }
     void SetCurrentAndTargetView(UIView *cur, UIView *tar)
     {
         curView_ = cur;
@@ -39,74 +44,46 @@ public:
     {
         time_ = time;
     }
+    BackDragListener(const BackDragListener &) = delete;
+    BackDragListener &operator=(const BackDragListener &) = delete;
+    BackDragListener(BackDragListener &&) = delete;
+    BackDragListener &operator=(BackDragListener &&) = delete;
 
 private:
-    BackDragListener() {};
-    ~BackDragListener() {};
     class BackAnimatorCallback : public AnimatorCallback {
     public:
+        BackAnimatorCallback(BackDragListener* listener, uint16_t duration)
+            : dragListener_(listener), curtTime_(0), duration_(duration) {}
         void Callback(UIView* view) override;
-        void OnStop(UIView& view) override;
-        void SetDragParam(int16_t startX, int16_t endX, uint16_t dragTimes)
-        {
-            startValueX_ = startX;
-            endValueX_ = endX;
-            dragTimes_ = dragTimes;
-        }
-
-        void SetAnimator(Animator *ani)
-        {
-            ani_ = ani;
-        }
-
-        void SetGoToTarget(bool goToTarget)
-        {
-            goToTarget_ = goToTarget;
-        }
-
-        void SetStopAction(const std::function<void()> &action)
-        {
-            stopAct_ = action;
-        }
-
-        void SetTargetView(UIView *target)
-        {
-            targetView_ = target;
-        }
-
-        void ResetStatus()
+        void OnStop(UIView& view) override
         {
             curtTime_ = 0;
-            dragTimes_ = 0;
-            startValueX_ = 0;
-            endValueX_ = 0;
-            ani_ = nullptr;
-            stopAct_ = nullptr;
-            targetView_ = nullptr;
-            goToTarget_ = false;
         }
-    private:
 
-        Animator *ani_ = nullptr;
-        UIView *targetView_ = nullptr;
-        uint16_t curtTime_ = 0;
-        uint16_t dragTimes_ = 0;
-        int16_t startValueX_ = 0;
-        int16_t endValueX_ = 0;
-        bool goToTarget_ = false;
-        std::function<void()> stopAct_;
+    private:
+        BackDragListener* dragListener_;
+        uint16_t curtTime_;
+        uint16_t duration_;
     };
 
+    bool StartAnimator();
+    void StopDragging();
     Animator *backAnimator_ = nullptr;
-    BackAnimatorCallback backCallback_;
+    BackAnimatorCallback* backCallback_ = nullptr;
     UIView *targetView_ = nullptr;
     UIView *curView_ = nullptr;
+    UIViewGroup* parentView_ = nullptr;
     int16_t left_ = 0;
     int16_t right_ = 0;
     std::function<void()> targetAction_;
     std::function<void()> curAction_;
     const static uint16_t DEFAULT_TIME = 200;
     uint16_t time_ = DEFAULT_TIME;
+    bool goToTarget_ = false;
+    int16_t animStartX_ = 0;
+    int16_t animEndX_ = 0;
+    bool isDragging_ = false;
+    bool isTargetViewAdded_ = false;
 }; // BackDragListener
 
 } // namespace OHOS
index 2b1a268..5ccd53d 100644 (file)
@@ -41,14 +41,9 @@ class NativeAbility : public Ability
 {
 public:
     static NativeAbility &GetInstance(void);
-
 #ifdef JS_ENABLE
     void InstallAbility(void);
 #endif
-    void ResumeAbility(uint16_t targetSliceId, uint16_t priority);
-    void PauseAbility();
-    void StopAbility();
-
     // SliteAbility, AMS控制的应用生命周期
     void OnStart(const Want &want) OVERRIDE;
     void OnActive(const Want &want) OVERRIDE;
@@ -57,7 +52,12 @@ public:
 
     void OnStop() OVERRIDE;
     int GetNativeAbilityState() const;
+
 private:
+    // targetId consists of slice id and page id
+    void ResumeAbility(uint32_t targetId);
+    void PauseAbility();
+    void StopAbility();
     NativeAbility() {}
     void ResumeSliceWithJS();
     ~NativeAbility() override {}
index 39e6954..5b58fec 100644 (file)
@@ -14,6 +14,7 @@
 #include "graphic_mutex.h"
 #include "TransitionCallback.h"
 #include "TransitionType.h"
+#include "gfx_utils/image_info.h"
 
 namespace OHOS {
 using TransitionAnimatorStopCallback = std::function<void()>;
@@ -75,6 +76,15 @@ public:
     // this function is called by application when slice is on pause phase if it need to custom its slideback snapshot
     void SaveSlideBackSnapShotIfNecessary(UIView* view);
     UIImageView* GetTopSlideBackImage();
+    /**
+     * @brief Check whether slide back is enabled currently, equivalent to:
+     *             View::GetBackDragListener()
+     *        Note: Don't use canSlideBack_ because it will be reset after transition
+     */
+    bool CanSlideBack()
+    {
+        return (GetTopSlideBackImage() != nullptr);
+    }
     // remove top slice back image from rootview and delete it
     void ClearTopSlideBackImage();
     void SaveCurrentSourceIfNecessary(UIView* view);
@@ -105,6 +115,16 @@ public:
         return transitionCaller_ == TransitionCaller::BACK_TRANSITION;
     }
 
+    /**
+     * @brief   Set current app's recent img source. Should be invoked in OnResume method.
+     */
+    void SetRecentAppImg(uint32_t resId, std::string file);
+
+    /**
+     * @brief   Set min lasting period of an app so that it could be added to recent manager.
+     */
+    void SetRecentMinPeriod(uint32_t minPeriod);
+
 private:
     PageTransitionMgr() {};
     ~PageTransitionMgr() {};
@@ -112,11 +132,17 @@ private:
     void SaveSlideBackSnapShotInner(UIView* view, bool custom);
     void SaveCurrentSnapShotInner(UIView* view);
     void ClearSlideBackHistory();
+    bool SnapshotRecentSource(UIView* view);
+    void AddRecentAppIfNecessary();
+    bool FillRecentSnapshot(bool& needToFreeSnapshot);
     Animator* animator_ = nullptr;
     PageTransAnimCallback* animatorCallback_ = nullptr;
     std::shared_ptr<UIImageViewWithInfo> currentSlideBackSnapshot_ = nullptr;
     std::shared_ptr<UIImageViewWithInfo> currentSnapshot_ = nullptr;
     std::shared_ptr<UIImageViewWithInfo> targetSnapshot_ = nullptr;
+    ImageInfo recentSnapshot_ = {0};
+    uint32_t recentAppResId_ = 0;
+    std::string recentAppFile_ = "";
     std::shared_ptr<UIImageViewWithInfo> slideBackHistroy_[MAX_SLIDE_BACK_NUM] = {nullptr};
     uint8_t curSlideBackNum_ = 0;
     UIViewGroup* currentView_ = nullptr;
@@ -137,6 +163,12 @@ private:
     GraphicMutex operationLock_;
     void ClearTransitionResource();
     ImageInfo RectifySnapshot(ImageInfo& dstInfo);
+    uint32_t lastTransitionTime_ = 0;
+    uint32_t recentMinPeriod_ = 0;
+    bool recentMinPeriodSatisfied_ = true;
+    bool isSnapshotRecent_ = false;
+    uint16_t recentSliceId_ = 0; // invalid slice
+    uint32_t recentTargetId_ = 0; // invalid slice
 };
 } // namespace OHOS
-#endif // PAGE_TRANSITION_MGR_H
+#endif // PAGE_TRANSITION_MGR_H
\ No newline at end of file
index 76276cc..b8cbc7a 100644 (file)
 #ifndef APPFWK_PRESENTER_H
 #define APPFWK_PRESENTER_H
 
-#include "components/root_view.h"
-#include "KeyInputListener.h"
-#include "dock/focus_manager.h"
-#include "PageTransitionMgr.h"
-#include "NativeAbility.h"
-#include "BackDragListener.h"
+#include "View.h"
 
 namespace OHOS {
-template<class V, class M = void>
-
-class Presenter {
+class PresenterBase {
 public:
-    Presenter() : view_(nullptr), model_(nullptr) {}
-    virtual ~Presenter() {}
+    PresenterBase() : viewBase_(nullptr) {}
+    virtual ~PresenterBase() = default;
 
     /**
      * @brief Scheduled by slice when it is started and before transition animator starts if exsit
@@ -42,39 +35,15 @@ public:
      * @brief Scheduled by slice when it will be visiable and after transition animator ends if exsit
      *
      *        You can set custom input event listener, request focus, and start its own animator here.
-     *        Please call Presenter::OnResume in your implemention
      */
-    virtual void OnResume()
-    {
-        // make sure root container was added because it maybe removed during transition when current snap is false
-        if (view_->GetRootContainer()->GetParent() == nullptr) {
-            RootView::GetInstance()->Add(view_->GetRootContainer());
-        }
-        // Reset the default key listener
-        RootView::GetInstance()->SetOnKeyActListener(KeyInputListener::GetInstance());
-        UIView* backView = PageTransitionMgr::GetInstance().GetTopSlideBackImage();
-        if (backView == nullptr) {
-            return;
-        }
-        BackDragListener::GetInstance()->ClearStatus();
-        BackDragListener::GetInstance()->SetCurrentAndTargetView(view_->GetRootContainer(), backView);
-        BackDragListener::GetInstance()->SetDragToTargetAction([]() { NativeAbility::GetInstance().BackToPreSlice(); });
-        view_->GetRootContainer()->SetOnDragListener(BackDragListener::GetInstance());
-    }
+    virtual void OnResume() {}
 
     /**
      * @brief Scheduled by slice when another slice will be started and before slice transition animator starts if exsit
      *
      *        You can clear input event listener, clear focus, and stop animator here.
-     *        Please call Presenter::OnPause in your implemention if default key listener need to be cleared.
      */
-    virtual void OnPause()
-    {
-        // Ensure that key listener is disabled during transition if exist
-        RootView::GetInstance()->ClearOnKeyActListener();
-        view_->GetRootContainer()->SetOnDragListener(nullptr);
-        FocusManager::GetInstance()->ClearFocus();
-    }
+    virtual void OnPause() {}
 
     /**
      * @brief Presenter lifecycle scheduled by slice when it will be invisible and another slice will be visible
@@ -82,14 +51,39 @@ public:
      *        You can destroy non-ui resources here
      */
     virtual void OnStop() {}
+
+    /**
+     * @brief This function will attach view to this presenter
+     *
+     * @param view view pointer defined by developer
+     */
+    virtual void Attach(ViewBase* view)
+    {
+        viewBase_ = view;
+    }
+
+    PresenterBase(const PresenterBase&) = delete;
+    PresenterBase& operator=(const PresenterBase&) = delete;
+    PresenterBase(PresenterBase&&) = delete;
+    PresenterBase& operator=(PresenterBase&&) = delete;
+protected:
+    ViewBase* viewBase_;
+};
+
+template<class V, class M = void>
+class Presenter : public PresenterBase {
+public:
+    Presenter() : model_(nullptr) {}
+
     /**
      * @brief This function will attach view to this presenter
      *
      * @param view view pointer defined by developer
      */
-    void Attach(V* view)
+    void Attach(ViewBase* view) override
     {
-        view_ = view;
+        PresenterBase::Attach(view);
+        view_ = dynamic_cast<V*>(viewBase_);
     }
 
     /**
@@ -105,13 +99,6 @@ public:
 protected:
     V* view_;
     M* model_;
-    BackDragListener* backDragListener_ = nullptr;
-
-private:
-    Presenter(const Presenter&) = delete;
-    Presenter& operator=(const Presenter&) = delete;
-    Presenter(Presenter&&) = delete;
-    Presenter& operator=(Presenter&&) = delete;
 };
 }
 #endif
diff --git a/code/sdk/application/wearable/nativeabilityfwk/include/RecentManager.h b/code/sdk/application/wearable/nativeabilityfwk/include/RecentManager.h
new file mode 100644 (file)
index 0000000..76e9598
--- /dev/null
@@ -0,0 +1,192 @@
+/*
+ * Copyright (c) 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.
+ */
+
+#ifndef RECENT_MANAGER_H
+#define RECENT_MANAGER_H
+
+#include <cstdio>
+#include <string>
+#include "gfx_utils/image_info.h"
+#include "gfx_utils/list.h"
+#include "graphic_mutex.h"
+
+namespace OHOS {
+#define RECENT_APP_BUNDLE_NAME_MAX_LEN 127
+
+typedef struct {
+    bool isNativeSlice; // true: native; false: js
+    union {
+        uint32_t targetId;
+        char bundleName[RECENT_APP_BUNDLE_NAME_MAX_LEN];
+    };
+    ImageInfo* snapshot;
+} RecentAppInfo;
+
+class RecentManager {
+public:
+
+    /**
+     * @brief   Get <b>RecentManager*</b> instance.
+     */
+    static RecentManager* GetInstance();
+
+    /**
+     * @brief   Set max recent app size. Once current size > max, the oldest will be removed.
+     *          Default value is 0, and it will not record any recent app.
+     */
+    void SetMaxSize(uint32_t max);
+
+    /**
+     * @brief   Get max recent app size.
+     */
+    uint32_t GetMaxSize();
+
+    /**
+     * @brief   Get current recent app size.
+     */
+    uint32_t GetCurrentSize();
+
+    /**
+     * @brief   Add a native app to recent manager with its snapshot to be cached.
+     */
+    void AddRecentApp(uint32_t targetId, const ImageInfo* snapshot);
+
+    /**
+     * @brief   Add a js app to recent manager with its snapshot to be cached.
+     */
+    void AddRecentApp(const char* bundleName, const ImageInfo* snapshot);
+
+    /**
+     * @brief   Remove a native app with given targetId.
+     */
+    bool RemoveRecentApp(uint32_t targetId, bool deleteFile = true);
+
+    /**
+     * @brief   Remove a js app with given bundleName.
+     */
+    bool RemoveRecentApp(const char* bundleName, bool deleteFile = true);
+
+    /**
+     * @brief   Remove all recent apps.
+     */
+    void RemoveAllRecentApps();
+
+    /**
+     * @brief   Get a list of RecentAppInfo.
+     */
+    const List<RecentAppInfo*>& GetRecentApps();
+
+    /**
+     * @brief   Set scale ratio. When an app is added, its snapshot could be scaled and cached. Default value is 0.5f.
+     */
+    void SetScaleRatio(float ratio);
+
+    /**
+     * @brief   Get scale ratio.
+     */
+    float GetScaleRatio();
+
+    /**
+     * @brief   Add a sliceId to black list so that it will not be saved as a recent app.
+     */
+    void AddToBlackList(uint32_t sliceId);
+
+    /**
+     * @brief   Remove a sliceId from black list so that it can be saved as a recent app.
+     */
+    void RemoveFromBlackList(uint32_t sliceId);
+
+    /**
+     * @brief   Clear black list.
+     */
+    void ClearBlackList();
+
+    /**
+     * @brief   Return whether the sliceId is on black list.
+     */
+    bool IsOnBlackList(uint32_t sliceId);
+
+    /**
+     * @brief   Return whether it is updated.
+     */
+    bool IsUpdateCompleted();
+
+    /**
+     * @brief   Set dir path to save recent snapshots.
+     */
+    void SetDirPath(std::string path);
+
+    /**
+     * @brief   Return dir path to save recent snapshots.
+     */
+    std::string GetDirPath();
+
+    /**
+     * @brief   Return whether it is enabled. It is enabled when max size is a valid value and dir path is set.
+     */
+    bool IsEnabled();
+
+    /**
+     * @brief   Used internally.
+     */
+    void PushRecentApp(RecentAppInfo* info);
+
+    /**
+     * @brief   Used internally.
+     */
+    void RemoveOldest();
+
+    /**
+     * @brief   Used internally.
+     */
+    void DecLoadingCnt();
+
+    /**
+     * @brief   Used internally.
+     */
+    uint32_t GetLoadingCnt();
+
+private:
+    RecentManager();
+    virtual ~RecentManager();
+
+    void AddRecentAppWithSourceInfo(RecentAppInfo* appInfo, const ImageInfo* snapshot);
+    void AddRecentAppInner(RecentAppInfo* appInfo, const ImageInfo* snapshot);
+    void RemoveRecentAppNode(ListNode<RecentAppInfo*>* node, bool deleteFile);
+    bool ScaleSnapshot(const ImageInfo* src, ImageInfo* dst);
+    ListNode<RecentAppInfo*>* FindRecentAppInfo(List<RecentAppInfo*>& list,
+        bool isNativeSlice, uint32_t sliceId, const char* bundleName);
+    void AddPersistingTask(RecentAppInfo* info);
+    static void AsyncPersisterRunnable(void* args);
+    static void FreeRecentAppInfo(void* data);
+    void AsyncFreeRecentAppInfo(RecentAppInfo* info);
+    void ProcessPersistingTasks();
+    void ProcessTask(RecentAppInfo* info);
+    static void LoadRecentApp(void* data);
+    List<RecentAppInfo*> recentApps_;
+    List<RecentAppInfo*> persistingTasks_;
+    List<uint32_t> blackList_;
+    static GraphicMutex recentAppsMutex_;
+    static GraphicMutex persistingTaskMutex_;
+    static GraphicCond newPersistingTaskCond_;
+    static GraphicCond persistingTaskDoneCond_;
+    uint32_t maxSize_ = 0;
+    float scaleRatio_ = 0.5f;
+    std::string dirPath_;
+    uint32_t loadingCnt_ = 0;
+};
+} // namespace OHOS
+
+#endif // RECENT_MANAGER_H
index 9e87062..047cc60 100644 (file)
 #include "components/ui_view_group.h"
 
 namespace OHOS {
+extern const uint16_t SLICE_MASK;
+extern const uint32_t PAGE_OFFSET;
 class Slice {
 public:
-    Slice() {}
-    virtual ~Slice() {}
+    Slice() = default;
+    virtual ~Slice() = default;
     /**
      * @brief Called when the Slice is started and before transition animator starts if exits.
      *
@@ -54,9 +56,10 @@ public:
     virtual void OnStop() = 0;
     virtual UIViewGroup* GetSliceContainer() = 0;
 
-private:
-    Slice(const Slice &);
-    Slice &operator=(const Slice &);
+    Slice(const Slice &) = delete;
+    Slice &operator=(const Slice &) = delete;
+    Slice(Slice &&) = delete;
+    Slice &operator=(Slice &&) = delete;
 };
 } // namespace OHOS
 
diff --git a/code/sdk/application/wearable/nativeabilityfwk/include/SlicePage.h b/code/sdk/application/wearable/nativeabilityfwk/include/SlicePage.h
new file mode 100644 (file)
index 0000000..127f329
--- /dev/null
@@ -0,0 +1,66 @@
+/*
+ * Copyright (c) CompanyNameMagicTag 2025. All rights reserved.
+ * Description: Slice Page
+ * Author: Hisi Graphic Team
+ * Create: 2025-4
+ */
+#ifndef SLICE_PAGE_H
+#define SLICE_PAGE_H
+#include "components/ui_view_group.h"
+#include "Presenter.h"
+
+namespace OHOS {
+class SlicePageBase {
+public:
+    SlicePageBase() : pageContainer_(nullptr), backDragListener_(nullptr) {}
+
+    virtual ~SlicePageBase() = default;
+
+    virtual void OnStart(void* data) = 0;
+
+    virtual void OnResume() {}
+
+    virtual void OnPause() {}
+
+    virtual void OnStop() {}
+
+    UIViewGroup* GetSlicePageContainer()
+    {
+        return pageContainer_;
+    }
+
+    BackDragListener* GetBackDragListener()
+    {
+        return backDragListener_;
+    }
+
+    void AddViewToPageContainer(UIView* view);
+
+    virtual void AttachPresenter(PresenterBase* p) = 0;
+
+    SlicePageBase(const SlicePageBase&) = delete;
+    SlicePageBase& operator=(const SlicePageBase&) = delete;
+    SlicePageBase(SlicePageBase&&) = delete;
+    SlicePageBase& operator=(SlicePageBase&&) = delete;
+    uint16_t pageId_;
+
+private:
+    friend class SlicePageManager;
+    void SetupView(bool canBack);
+    void TearDownView();
+    UIViewGroup* pageContainer_;
+    BackDragListener* backDragListener_;
+};
+
+template<class P>
+class SlicePage : public SlicePageBase {
+public:
+    void AttachPresenter(PresenterBase* p) override
+    {
+        presenter_ = dynamic_cast<P*>(p);
+    }
+protected:
+    P* presenter_ = nullptr;
+};
+}
+#endif
\ No newline at end of file
diff --git a/code/sdk/application/wearable/nativeabilityfwk/include/SlicePageFactory.h b/code/sdk/application/wearable/nativeabilityfwk/include/SlicePageFactory.h
new file mode 100644 (file)
index 0000000..49dd1c7
--- /dev/null
@@ -0,0 +1,69 @@
+/*
+ * Copyright (c) CompanyNameMagicTag 2025. All rights reserved.
+ * Description: SlicePageFactory
+ * Author: Hisi Graphic Team
+ * Create: 2025-4
+ */
+#ifndef SLICE_PAGE_FACTORY_H
+#define SLICE_PAGE_FACTORY_H
+#include <unordered_map>
+#include "SlicePage.h"
+
+namespace OHOS {
+class SlicePageProxyInterface;
+class SlicePageFactory : public HeapBase {
+public:
+    static SlicePageFactory& GetInstance()
+    {
+        static SlicePageFactory instance;
+        return instance;
+    }
+
+    bool IsSlicePageExist(uint16_t sliceId, uint16_t pageId);
+
+    SlicePageBase* CreateSlicePage(uint16_t sliceId, uint16_t pageId);
+
+    SlicePageBase* GetDefaultSlicePage(uint16_t sliceId, uint16_t& defaultPageId);
+
+    void RegisterPage(uint16_t sliceId, uint16_t pageId, SlicePageProxyInterface* proxy, bool isMainPage);
+
+private:
+    SlicePageFactory() {};
+    ~SlicePageFactory() {};
+    SlicePageFactory(const SlicePageFactory &) = delete;
+    SlicePageFactory &operator=(const SlicePageFactory &) = delete;
+    std::unordered_map<uint32_t, SlicePageProxyInterface*> pageProxyMap_;
+    std::unordered_map<uint16_t, SlicePageProxyInterface*> mainPageMap_;
+    std::unordered_map<uint16_t, uint16_t> mainPageIdMap_;
+};
+
+class SlicePageProxyInterface : public HeapBase {
+public:
+    virtual SlicePageBase* CreateSlicePage(uint16_t pageId) = 0;
+};
+
+class SlicePageRegister : public HeapBase {
+public:
+    SlicePageRegister(uint16_t sliceId, uint16_t pageId, SlicePageProxyInterface* proxy, bool isMainPage);
+};
+
+template<class V>
+class SlicePageProxy : public SlicePageProxyInterface {
+public:
+    SlicePageBase* CreateSlicePage(uint16_t pageId) override
+    {
+        V* v = new V();
+        SlicePageBase* page = dynamic_cast<SlicePageBase*>(v);
+        if (page == nullptr) {
+            delete v;
+        } else {
+            page->pageId_ = pageId;
+        }
+        return page;
+    }
+};
+}
+
+#define REGIST_SLICE_PAGE(sliceId, pageId, V, isMainPage) \
+    const static OHOS::SlicePageRegister (STATIC_VAR)(sliceId, pageId, new OHOS::SlicePageProxy<V>(), isMainPage)
+#endif
\ No newline at end of file
diff --git a/code/sdk/application/wearable/nativeabilityfwk/include/SlicePageManager.h b/code/sdk/application/wearable/nativeabilityfwk/include/SlicePageManager.h
new file mode 100644 (file)
index 0000000..c69ef48
--- /dev/null
@@ -0,0 +1,102 @@
+/*
+ * Copyright (c) CompanyNameMagicTag 2025. All rights reserved.
+ * Description: SlicePageManager
+ * Author: Hisi Graphic Team
+ * Create: 2025-4
+ */
+#ifndef SLICE_PAGE_MANAGER_H
+#define SLICE_PAGE_MANAGER_H
+#include "animator/animator.h"
+#include "Presenter.h"
+#include "Slice.h"
+#include "SlicePage.h"
+#include "gfx_utils/vector.h"
+#include "TransitionType.h"
+#include "TransitionCallback.h"
+
+namespace OHOS {
+class SlicePageManager;
+class SlicePageSwitchCallback : public AnimatorCallback {
+public:
+    SlicePageSwitchCallback(SlicePageManager* transMgr)
+        : isStarted_(false), startTime_(0), pageTransMgr_(transMgr) {}
+    void Callback(UIView* view) override;
+    void OnStop(UIView& view) override;
+
+private:
+    bool isStarted_;
+    uint32_t startTime_;
+    SlicePageManager* pageTransMgr_;
+};
+
+class SlicePageManager : public HeapBase {
+public:
+    SlicePageManager(uint32_t targetId)
+        : isPageBeingSwitched_(false), sliceId_(static_cast<uint16_t>(targetId & SLICE_MASK)),
+          targetPageId_(static_cast<uint16_t>(targetId >> PAGE_OFFSET)),
+          curPage_(nullptr), nextPage_(nullptr), pagesInBackQueue_(4), // 4, default queue size
+          presenter_(nullptr), view_{nullptr}, transitionCallback_(nullptr), canBack_(false) {}
+
+    ~SlicePageManager();
+
+    // Get current page which is display on the screen
+    SlicePageBase* GetCurSlicePage()
+    {
+        return curPage_;
+    }
+
+    // Get specified page in the back queue
+    SlicePageBase* GetSlicePageInBackQueue(uint16_t sliceId);
+
+    // Get previous page before current page in the back queue
+    SlicePageBase* GetLastPageInBackQueue()
+    {
+        return pagesInBackQueue_.Back();
+    }
+
+    void ClearBackQueue();
+
+    bool ChangeSlicePage(uint16_t pageId, void* data, TransitionType type, bool canBack);
+
+    bool IsAnimatorRunning()
+    {
+        return ((animator_ != nullptr) && (animator_->GetState() != Animator::STOP));
+    }
+
+    void BackToPrevSlicePage();
+
+    SlicePageManager(const SlicePageManager&) = delete;
+    SlicePageManager& operator=(const SlicePageManager&) = delete;
+    SlicePageManager(SlicePageManager&&) = delete;
+    SlicePageManager& operator=(SlicePageManager&&) = delete;
+
+private:
+    friend class AbilitySlice;
+    friend class SlicePageSwitchCallback;
+    void AttachVP(PresenterBase* p, ViewBase* v)
+    {
+        presenter_ = p;
+        view_ = v;
+    }
+    void StartSlicePage(void* data = nullptr);
+    void ResumeSlicePage();
+    void PauseSlicePage();
+    void StopSlicePage(bool clearBackQueue = true);
+    void StartSwitchAnimator();
+    void StopSwitchAnimator();
+
+    Animator* animator_ = nullptr;
+    SlicePageSwitchCallback* switchCallback_ = nullptr;
+    bool isPageBeingSwitched_;
+    uint16_t sliceId_;
+    uint16_t targetPageId_;
+    SlicePageBase* curPage_;
+    SlicePageBase* nextPage_;
+    Graphic::Vector<SlicePageBase*> pagesInBackQueue_;
+    PresenterBase* presenter_;
+    ViewBase* view_;
+    TransitionCallback* transitionCallback_;
+    bool canBack_;
+};
+}
+#endif
\ No newline at end of file
index 7d1cc3b..ccbf2be 100644 (file)
 namespace OHOS {
 class SliceProxy {
 public:
-    SliceProxy() {}
-    ~SliceProxy() {}
-    virtual Slice* CreateSlice() = 0;
-
-private:
-    SliceProxy(const SliceProxy &);
-    SliceProxy &operator=(const SliceProxy &);
+    virtual Slice* CreateSlice(uint32_t targetId) = 0;
+    SliceProxy() = default;
+    virtual ~SliceProxy() = default;
+    SliceProxy(const SliceProxy&) = delete;
+    SliceProxy& operator=(const SliceProxy&) = delete;
+    SliceProxy(SliceProxy&&) = delete;
+    SliceProxy& operator=(SliceProxy&&) = delete;
 };
 } // namespace OHOS
 #endif // SLICE_PROXY_H
index 1243e46..2079266 100644 (file)
 #define APPFWK_VIEW_H
 
 #include "components/ui_view_group.h"
-#include "components/root_view.h"
-#include "common/screen.h"
+#include "BackDragListener.h"
 
 namespace OHOS {
-template<class P>
-class View {
+class PresenterBase;
+class ViewBase {
 public:
-    View() : presenter_(nullptr), rootContainer_(nullptr) {}
-    virtual ~View() {}
+    ViewBase() : rootContainer_(nullptr), backDragListener_(nullptr) {}
+    virtual ~ViewBase() = default;
 
     /**
-     * @brief get container view
-     *
-     * @returns container
+     * @brief Get container view
+     * @returns rootContainer_
      */
-    UIViewGroup* GetRootContainer() const
+    UIViewGroup* GetRootContainer()
     {
         return rootContainer_;
     }
 
+    /**
+     * @brief Get back drag listener
+     *        This method can be used in AbilitySlice.cpp, and also can be used in XXXView.cpp
+     *        If used in XXXView.cpp, you can use it to check whether default OnDragListener is configured.
+     * @returns backDragListener_
+     */
+    BackDragListener* GetBackDragListener()
+    {
+        return backDragListener_;
+    }
+
     /**
      * @brief Scheduled by slice after funtion SetupView and before transition animator starts if exits.
      *
@@ -65,76 +74,50 @@ public:
     virtual void OnStop() {}
 
     /**
-     * @brief Scheduled by slice to create root container add it to root view
+     * @brief draw container
      *
-     *        This method is called by system class AbilitySlice, you should not override it.
      */
-    void SetupView()
-    {
-        if (rootContainer_ != nullptr) {
-            printf("OnStart Error: rootContainer_ already exist");
-        } else {
-            rootContainer_ = new UIViewGroup();
-        }
-        rootContainer_->SetPosition(0, 0, RootView::GetInstance()->GetWidth(), RootView::GetInstance()->GetHeight());
-        RootView::GetInstance()->Add(rootContainer_);
-    }
+    void Draw();
 
     /**
-     * @brief Scheduled by slice to remove and delete root container from root view
+     * @brief This function will attach presenter to this view
      *
-     *        This method is called by by system class AbilitySlice, you should not override it.
+     * @param presenter presenter pointer defined by developer
      */
-    void TearDownView()
-    {
-        // Todo: Only remove root container, and application should remove other children in its own implemention
-        RootView::GetInstance()->Remove(rootContainer_);
-        if (rootContainer_ != nullptr) {
-            rootContainer_->RemoveAll();
-            delete rootContainer_;
-            rootContainer_ = nullptr;
-        } else {
-            printf("TearDownView Error: rootContainer_ was not initialized !!!");
-        }
-    }
+    virtual void Attach(PresenterBase* presenter) = 0;
 
-    /**
-     * @brief draw container
-     *
-     */
-    void Draw()
-    {
-        RootView::GetInstance()->Invalidate();
-    }
+    void AddViewToRootContainer(UIView* view);
+
+    ViewBase(const ViewBase&) = delete;
+    ViewBase& operator=(const ViewBase&) = delete;
+    ViewBase(ViewBase&&) = delete;
+    ViewBase& operator=(ViewBase&&) = delete;
+
+private:
+    friend class AbilitySlice;
+    void SetupView();
+    void TearDownView();
+    UIViewGroup* rootContainer_;
+    BackDragListener* backDragListener_;
+};
+
+template<class P>
+class View : public ViewBase {
+public:
+    View() : presenter_(nullptr) {}
 
     /**
      * @brief This function will attach presenter to this view
      *
      * @param presenter presenter pointer defined by developer
      */
-    void Attach(P* presenter)
-    {
-        presenter_ = presenter;
-    }
-
-    void AddViewToRootContainer(UIView* view)
+    void Attach(PresenterBase* presenter) override
     {
-        if (rootContainer_ == nullptr) {
-            printf("AddViewToContainer Error: rootContainer_ is nullptr");
-            return;
-        }
-        rootContainer_->Add(view);
+        presenter_ = dynamic_cast<P*>(presenter);
     }
 
 protected:
     P* presenter_;
-
-private:
-    UIViewGroup* rootContainer_ = nullptr;
-    View(const View&) = delete;
-    View& operator=(const View&) = delete;
-    View(View&&) = delete;
-    View& operator=(View&&) = delete;
 };
 }
 #endif
index 8be4e97..82e0d03 100644 (file)
 #include "common/graphic_utils.h"
 #include "PageTransitionMgr.h"
 #include "gfx_utils/list.h"
+#include "AbilitySlice.h"
 
 namespace OHOS {
-const uint8_t MAX_SLICE_ID_LENGTH = 16;
-struct SliceOperation {
-    uint16_t targetSliceId;
-    TransitionType type;
-};
-
 void Ability::AddSliceProxy(const uint16_t sliceId, SliceProxy* proxy)
 {
     WEARABLE_LOGD(WEARABLE_LOG_MODULE_LAUNCHER_FWK, "Ability AddSliceProxy sliceId = %d", sliceId);
@@ -47,49 +42,39 @@ void Ability::AddSliceProxy(const uint16_t sliceId, SliceProxy* proxy)
     allSlicesProxy_.PushBack(proxyPair);
 }
 
-void Ability::StartSlice(const uint16_t sliceId, const uint16_t priority)
+void Ability::StartSlice(uint32_t targetId)
 {
-    WEARABLE_LOGI(WEARABLE_LOG_MODULE_LAUNCHER_FWK, "Ability StartSlice %d", sliceId);
-    if (sliceId <= gSliceInvalid) {
+    if (targetId <= gSliceInvalid) {
         return;
     }
-
+    uint16_t sliceId = static_cast<uint16_t>(targetId & SLICE_MASK);
     Ability::ProxyStruct* proxyStruct = Find(sliceId);
     if (proxyStruct == nullptr) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_LAUNCHER_FWK, "no slice %d was found", sliceId);
         return;
     }
     InputDeviceManager::GetInstance()->ClearInputDeviceState();
-    Slice* nextSlice = proxyStruct->proxy->CreateSlice();
-    if (nextSlice == nullptr) {
+
+    Slice* newSlice = proxyStruct->proxy->CreateSlice(targetId);
+    if (newSlice == nullptr) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_LAUNCHER_FWK, "create slice %u failed", sliceId);
         return;
     }
-    WEARABLE_LOGD(WEARABLE_LOG_MODULE_LAUNCHER_FWK, "Ability::StartSlice Size = %d", allSlices_.Size());
-    // 记录最多gMaxHistorySlices个页面id
 
-    if (PageTransitionMgr::GetInstance().IsBackTransitionRunning()) {
-        PageTransitionMgr::GetInstance().ClearTopSlideBackImage();
-    }
-    if (sliceId == defaultSliceId_) {
-        allSlices_.Clear(); // clear slice history when return to home
-        allSlices_.PushBack(defaultSliceId_);
+    if (sliceId == defaultTargetId_) {
+        allSlices_.Clear(); // clear slice history when return to main slice
+        allSlices_.PushBack(defaultTargetId_);
     } else if (PageTransitionMgr::GetInstance().IsBackTransitionRunning()) {
         allSlices_.PopBack();
     } else {
-        allSlices_.PushBack(sliceId);
-    }
-    if (curSlice_.slice != nullptr) {
-        prevSlice_.sliceId = curSlice_.sliceId;
-        prevSlice_.slice = curSlice_.slice;
-    } else {
-        prevSlice_.sliceId = gSliceInvalid;
-        prevSlice_.slice = nullptr;
+        allSlices_.PushBack(targetId);
     }
 
-    curSlice_.sliceId = sliceId;
-    curSlice_.slice = nextSlice;
-    curSlicePriority_ = priority;
-
-    nextSlice->OnStart();
+    WEARABLE_LOGI(WEARABLE_LOG_MODULE_LAUNCHER_FWK, "Ability StartSlice %d page %d size:%d", sliceId,
+        targetId >> PAGE_OFFSET, allSlices_.Size());
+    nextSlice_.sliceId = sliceId;
+    nextSlice_.slice = newSlice;
+    newSlice->OnStart();
 }
 
 Ability::ProxyStruct* Ability::Find(const uint16_t sliceId)
@@ -110,46 +95,102 @@ Ability::ProxyStruct* Ability::Find(const uint16_t sliceId)
     return nullptr;
 }
 
-void Ability::ChangeSlice(const uint16_t targetSliceId, TransitionType type,
-    const uint16_t priority, bool enableSlideBack)
+SlicePageManager* Ability::GetCurSlicePageManager()
+{
+    if (PageTransitionMgr::GetInstance().IsTransitionRunning())
+    {
+        WEARABLE_LOGW(WEARABLE_LOG_MODULE_LAUNCHER_FWK, "No valid SlicePageManager during slice switching");
+        return nullptr;
+    }
+    AbilitySlice* slice = dynamic_cast<AbilitySlice*>(curSlice_.slice);
+    if (slice == nullptr) {
+        WEARABLE_LOGW(WEARABLE_LOG_MODULE_LAUNCHER_FWK, "No valid SlicePageManager when js is running");
+        return nullptr;
+    }
+    return slice->GetSlicePageManger();
+}
+
+void Ability::UpdateCurSlicePageId(uint16_t pageId)
+{
+    if (allSlices_.IsEmpty()) {
+        return;
+    }
+    uint32_t sliceId = allSlices_[allSlices_.Size() - 1] & SLICE_MASK;
+    allSlices_[allSlices_.Size() - 1] = sliceId | (static_cast<uint32_t>(pageId) << PAGE_OFFSET);
+}
+
+bool Ability::SwitchPageInSlice(uint16_t pageId, void* data, TransitionType type, bool canBack)
+{
+    if (pageId == 0) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_LAUNCHER_FWK, "page id should be valid but no zero");
+        return false;
+    }
+    if (PageTransitionMgr::GetInstance().IsTransitionRunning()) {
+        WEARABLE_LOGW(WEARABLE_LOG_MODULE_LAUNCHER_FWK, "page can't be switched during transition");
+        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);
+}
+
+void Ability::SwitchSlice(uint16_t sliceId, uint16_t pageId, TransitionType type, bool enableSlideBack)
 {
+    if (Find(sliceId) == nullptr) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_LAUNCHER_FWK, "slice %d is not registered", sliceId);
+        return;
+    }
 #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);
-        targetSliceIdFromJS_ = targetSliceId;
+        targetIdFromJS_ = sliceId | (static_cast<uint32_t>(pageId) << PAGE_OFFSET);
         FreeElement(elementName);
         return;
     }
     FreeElement(elementName);
 #endif
     TransitionTarget target;
-    target.sliceInfo = targetSliceId | (priority << 16);
+    target.sliceInfo = sliceId | (static_cast<uint32_t>(pageId) << PAGE_OFFSET);
     bool runImmed = PageTransitionMgr::GetInstance().BeginTransition(TransitionCaller::CHANGE_SLICE, target,
         type, enableSlideBack);
     if (!runImmed) {
-        printf("pending change slice id:%d type:%d enableSlideBack:%d\n", targetSliceId, type, enableSlideBack);
+        printf("pending change slice id:%d type:%d enableSlideBack:%d\n", target.sliceInfo, type, enableSlideBack);
         return;
     }
-    GraphicService::GetInstance()->PostGraphicEvent(std::bind(&Ability::PostChangeSlice, this, targetSliceId,
-        type, priority, enableSlideBack));
+    GraphicService::GetInstance()->PostGraphicEvent(std::bind(&Ability::PostChangeSlice, this, target.sliceInfo, type));
 }
 
-void Ability::PostChangeSlice(const uint16_t targetSliceId, TransitionType type,
+void Ability::ChangeSlice(uint16_t sliceId, TransitionType type,
     const uint16_t priority, bool enableSlideBack)
+{
+    (void)(priority);
+    SwitchSlice(sliceId, gPageInvalid, type, enableSlideBack);
+}
+
+void Ability::PostChangeSlice(uint32_t targetId, TransitionType type)
 {
     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();
+        }
+    }
     PageTransitionMgr::GetInstance().SaveCurrentSourceIfNecessary(curSlice_.slice->GetSliceContainer());
     if (!PageTransitionMgr::GetInstance().IsTransAnimNeeded() ||
         PageTransitionMgr::GetInstance().IsCurrentSnapshotEnabled()) {
         StopSlice();
     }
-    StartSlice(targetSliceId, priority);
+    StartSlice(targetId);
 
     if (!PageTransitionMgr::GetInstance().IsTransAnimNeeded()) {
         ResumeSliceWithoutJS();
     } else {
-        PageTransitionMgr::GetInstance().SaveTargetSource(curSlice_.slice->GetSliceContainer());
+        PageTransitionMgr::GetInstance().SaveTargetSource(nextSlice_.slice->GetSliceContainer());
         PageTransitionMgr::GetInstance().StartTransAnim(std::bind(&Ability::ResumeSliceWithoutJS, this));
     }
 }
@@ -158,7 +199,7 @@ void Ability::ResumeSliceWithoutJS()
 {
     if (PageTransitionMgr::GetInstance().IsTransAnimNeeded() &&
         !PageTransitionMgr::GetInstance().IsCurrentSnapshotEnabled()) {
-        StopPrevSlice();
+        StopSlice();
     }
     ResumeSlice();
     PageTransitionMgr::GetInstance().EndTransition(true);
@@ -166,6 +207,17 @@ void Ability::ResumeSliceWithoutJS()
 
 void Ability::ResumeSlice()
 {
+    // if new slice was created, set is as current slice and resume it
+    if (nextSlice_.slice != nullptr) {
+        if (curSlice_.slice != nullptr) {
+            GRAPHIC_LOGE("Both slice %d and %d is valid during resume", curSlice_.sliceId, nextSlice_.sliceId);
+        }
+        curSlice_.sliceId = nextSlice_.sliceId;
+        curSlice_.slice = nextSlice_.slice;
+        nextSlice_.sliceId = gSliceInvalid;
+        nextSlice_.slice = nullptr;
+    }
+
     if (curSlice_.slice != nullptr) {
         WEARABLE_LOGI(WEARABLE_LOG_MODULE_LAUNCHER_FWK, "Ability ResumeSlice %d", curSlice_.sliceId);
         curSlice_.slice->OnResume();
@@ -177,8 +229,8 @@ void Ability::ResumeSlice()
 void Ability::PauseSlice()
 {
     if (curSlice_.slice != nullptr) {
-        WEARABLE_LOGI(WEARABLE_LOG_MODULE_LAUNCHER_FWK, "Ability PauseSlice %d", curSlice_.sliceId);
         InputDeviceManager::GetInstance()->ClearInputDeviceState();
+        WEARABLE_LOGI(WEARABLE_LOG_MODULE_LAUNCHER_FWK, "Ability PauseSlice %d", curSlice_.sliceId);
         curSlice_.slice->OnPause();
     } else {
         GRAPHIC_LOGE("No valid slice to pause");
@@ -199,21 +251,6 @@ void Ability::StopSlice()
     }
 }
 
-void Ability::StopPrevSlice()
-{
-    if (prevSlice_.slice != nullptr) {
-        WEARABLE_LOGI(WEARABLE_LOG_MODULE_LAUNCHER_FWK, "Ability StopPrevSlice %d", prevSlice_.sliceId);
-        prevSlice_.slice->OnStop();
-        if (prevSlice_.slice != nullptr) {
-            prevSlice_.sliceId = gSliceInvalid;
-            delete prevSlice_.slice;
-            prevSlice_.slice = nullptr;
-        }
-    } else {
-        GRAPHIC_LOGE("No valid prev slice to stop");
-    }
-}
-
 void Ability::StopSliceTransition()
 {
     PageTransitionMgr::GetInstance().SyncStopAnimator();
@@ -221,15 +258,17 @@ void Ability::StopSliceTransition()
 
 void Ability::BackToPreSlice()
 {
-    uint16_t targetSliceId = GetPreSliceId();
-    WEARABLE_LOGI(WEARABLE_LOG_MODULE_LAUNCHER_FWK, "Ability BackToPreSlice %d", targetSliceId);
-    if (targetSliceId == gSliceInvalid) {
+    uint32_t targetId = GetPreTargetId();
+    WEARABLE_LOGI(WEARABLE_LOG_MODULE_LAUNCHER_FWK, "Ability BackToPreSlice %d", targetId);
+    if (targetId == gSliceInvalid) {
         WEARABLE_LOGE(WEARABLE_LOG_MODULE_LAUNCHER_FWK, "previous slice is invalid");
         return;
     }
     TransitionTarget target;
-    target.sliceInfo = targetSliceId | (gSliceDefaultPriority << 16);
+    target.sliceInfo = targetId;
+    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);
-    ChangeSlice(targetSliceId);
+    SwitchSlice(sliceId, pageId);
 }
 } // namespace OHOS
diff --git a/code/sdk/application/wearable/nativeabilityfwk/src/AbilitySlice.cpp b/code/sdk/application/wearable/nativeabilityfwk/src/AbilitySlice.cpp
new file mode 100644 (file)
index 0000000..37810c7
--- /dev/null
@@ -0,0 +1,134 @@
+/*
+ * Copyright (c) CompanyNameMagicTag 2025. All rights reserved.
+ * Description: AbilitySlice
+ * Author: Hisi Graphic Team
+ * Create: 2025-4
+ */
+
+#include "AbilitySlice.h"
+#include "components/root_view.h"
+#include "dock/focus_manager.h"
+#include "wearable_log.h"
+#include "PageTransitionMgr.h"
+#include "NativeAbility.h"
+#include "View.h"
+#include "Presenter.h"
+#include "key/KeyInputListener.h"
+
+namespace OHOS {
+const uint16_t SLICE_MASK = 0xFFFF;
+const uint32_t PAGE_OFFSET = 16;
+
+void AbilitySlice::OnStart()
+{
+    if ((presenter_ == nullptr) || (view_ == nullptr)) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_LAUNCHER_FWK, "Presenter or View  was nullptr for slice %s", sliceId_);
+        return;
+    }
+
+    // if back to current slice, delete slide back ImageView of current slice firstly
+    if (PageTransitionMgr::GetInstance().IsBackTransitionRunning()) {
+        PageTransitionMgr::GetInstance().ClearTopSlideBackImage();
+    }
+    presenter_->Attach(view_);
+    view_->Attach(presenter_);
+    slicePageMgr_.AttachVP(presenter_, view_);
+
+    view_->SetupView();
+    view_->OnStart();
+    slicePageMgr_.StartSlicePage();
+    presenter_->OnStart();
+    state_ = SliceState::START;
+}
+
+void AbilitySlice::OnResume()
+{
+    if ((state_ != SliceState::START) && (state_ != SliceState::PAUSE)) { // avoid repeated resume
+        return;
+    }
+    if ((presenter_ == nullptr) || (view_ == nullptr)) {
+        return;
+    }
+
+    if (view_->GetRootContainer()->GetParent() == nullptr) {
+        RootView::GetInstance()->Add(view_->GetRootContainer());
+    }
+    // Reset the default key listener
+    RootView::GetInstance()->SetOnKeyActListener(KeyInputListener::GetInstance());
+    NativeAbility::GetInstance().SetCurSlicePriority(gSliceDefaultPriority);
+
+    UIView* backView = PageTransitionMgr::GetInstance().GetTopSlideBackImage();
+    BackDragListener* backDragListener = view_->GetBackDragListener();
+    if ((backView != nullptr) && ((backDragListener != nullptr))) {
+        backDragListener->SetCurrentAndTargetView(view_->GetRootContainer(), backView);
+        backDragListener->SetParentView(RootView::GetInstance());
+        backDragListener->SetDragToTargetAction([]() { NativeAbility::GetInstance().BackToPreSlice(); });
+        view_->GetRootContainer()->SetTouchable(true);
+        view_->GetRootContainer()->SetDraggable(true);
+        view_->GetRootContainer()->SetOnDragListener(backDragListener);
+    }
+
+    slicePageMgr_.ResumeSlicePage();
+    presenter_->OnResume();
+    view_->Draw();
+    state_ = SliceState::RESUME;
+}
+
+void AbilitySlice::OnPause()
+{
+    if (state_ != SliceState::RESUME) { // avoid repeated pause
+        return;
+    }
+    if ((presenter_ == nullptr) || (view_ == nullptr)) {
+        return;
+    }
+
+    if (slicePageMgr_.IsAnimatorRunning()) {
+        slicePageMgr_.StopSwitchAnimator();
+    }
+    slicePageMgr_.PauseSlicePage();
+    RootView::GetInstance()->ClearOnKeyActListener();
+    BackDragListener* backDragListener = view_->GetBackDragListener();
+    if (backDragListener != nullptr) {
+        backDragListener->ClearDragState();
+    }
+    view_->GetRootContainer()->SetOnDragListener(nullptr);
+
+    FocusManager::GetInstance()->ClearFocus();
+    presenter_->OnPause();
+    state_ = SliceState::PAUSE;
+}
+
+void AbilitySlice::OnStop()
+{
+    if ((presenter_ == nullptr) || (view_ == nullptr)) {
+        return;
+    }
+
+    slicePageMgr_.StopSlicePage();
+    view_->TearDownView();
+    view_->OnStop();
+    delete view_;
+    view_ = nullptr;
+
+    presenter_->OnStop();
+    delete presenter_;
+    presenter_ = nullptr;
+
+    state_ = SliceState::STOP;
+}
+
+UIViewGroup* AbilitySlice::GetSliceContainer()
+{
+    if (view_ != nullptr) {
+        return view_->GetRootContainer();
+    } else {
+        return nullptr;
+    }
+}
+
+bool AbilitySlice::ChangeSlicePage(uint16_t pageId, void* data, TransitionType type, bool canBack)
+{
+    return slicePageMgr_.ChangeSlicePage(pageId, data, type, canBack);
+}
+}
\ No newline at end of file
index 12a9cb1..1b5ae82 100644 (file)
@@ -78,37 +78,40 @@ void NativeAbility::ResumeSliceWithJS()
 #endif
 }
 
-void NativeAbility::ResumeAbility(uint16_t targetSliceId, uint16_t priority)
+void NativeAbility::ResumeAbility(uint32_t targetId)
 {
     GraphicService::GetInstance()->SetNativeUIRunning(true);
     NotificationManager::GetInstance()->SetNativeUIRunning(true);
-    if (curSlice_.slice == nullptr) {
+    if ((targetId & SLICE_MASK) != VIEW_AOD) {
         allSlices_.Clear(); // clear slice history when jump from js to native
-        StartSlice(targetSliceId, priority);
     } else {
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_LAUNCHER_FWK, "NativeAbility ResumeAbility with slice %d", curSlice_.sliceId);
+        allSlices_.PopBack(); // clear invalid slice id
+    }
+    StartSlice(targetId);
+    if (nextSlice_.slice == nullptr) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_LAUNCHER_FWK, "NativeAbility ResumeAbility %d failed", targetId);
+        return;
     }
-
     if (!PageTransitionMgr::GetInstance().IsTransAnimNeeded()) {
         ResumeSliceWithJS();
     } else {
-        PageTransitionMgr::GetInstance().SaveTargetSource(curSlice_.slice->GetSliceContainer());
+        PageTransitionMgr::GetInstance().SaveTargetSource(nextSlice_.slice->GetSliceContainer());
         PageTransitionMgr::GetInstance().StartTransAnim(std::bind(&NativeAbility::ResumeSliceWithJS, this));
     }
 }
 
 void NativeAbility::OnActive(const Want &want)
 {
-    uint16_t targetSliceId = gSliceInvalid;
-    if (targetSliceIdFromJS_ != gSliceInvalid) {
-        targetSliceId = targetSliceIdFromJS_;
-        targetSliceIdFromJS_ = gSliceInvalid;
-    } else if (GetPreSliceId() != gSliceInvalid) {
-        targetSliceId = GetPreSliceId();
-    } else if (GetCurSliceId() != gSliceInvalid) {
-        targetSliceId = GetCurSliceId();
+    uint32_t targetId = gSliceInvalid;
+    if (targetIdFromJS_ != gSliceInvalid) {
+        targetId = targetIdFromJS_;
+        targetIdFromJS_ = gSliceInvalid;
+    } else if (GetPreTargetId() != gSliceInvalid) {
+        targetId = GetPreTargetId(); // for forcestop or ternimate js
+    } else if (GetCurTargetId() != gSliceInvalid) {
+        targetId = GetCurTargetId();
     }
-    targetSliceId = (targetSliceId == gSliceInvalid) ? defaultSliceId_ : targetSliceId;
+    targetId = (targetId == gSliceInvalid) ? defaultTargetId_ : targetId;
 
 #ifdef JS_ENABLE
     if ((GetState() == STATE_ACTIVE)) {
@@ -117,7 +120,7 @@ void NativeAbility::OnActive(const Want &want)
 #endif
     WEARABLE_LOGI(WEARABLE_LOG_MODULE_LAUNCHER_FWK, "NativeAbility OnActive");
     GraphicService::GetInstance()->PostGraphicEvent(std::bind(&NativeAbility::ResumeAbility, this,
-        targetSliceId, gSliceDefaultPriority));
+        targetId));
 }
 
 void NativeAbility::PauseAbility()
@@ -153,6 +156,9 @@ void NativeAbility::StopAbility()
         !PageTransitionMgr::GetInstance().IsCurrentSnapshotEnabled()) {
         StopSlice();
     }
+    if (allSlices_.Size() > 0 && allSlices_[allSlices_.Size() - 1] == VIEW_AOD) {
+        allSlices_.PopBack();
+    }
     allSlices_.PushBack(gSliceInvalid);
     nativeAbilityState_ = STATE_UNINITIALIZED;
 #ifdef JS_ENABLE
index afe3c79..da9c421 100644 (file)
@@ -9,7 +9,7 @@
 #include "TransitionManager.h"
 #include "NativeAbility.h"
 #include "components/root_view.h"
-#include "AppItemView.h"
+#include "applist/AppItemView.h"
 #include "hal_tick.h"
 #include "wearable_log.h"
 #ifdef JS_ENABLE
index 18331af..a5bb730 100644 (file)
@@ -9,7 +9,7 @@
 #include "TransitionManager.h"
 #include "NativeAbility.h"
 #include "components/root_view.h"
-#include "AppItemView.h"
+#include "applist/AppItemView.h"
 #include "hal_tick.h"
 #include "wearable_log.h"
 #ifdef JS_ENABLE
@@ -47,6 +47,12 @@ void BackToWaterfallTransition::OnTransitionStart(UIImageView* current, UIViewGr
             focusView_ = itemView;
             break;
         }
+#else
+        if (itemView->GetViewId() == sliceId) {
+            focusIndex_ = itemView->GetViewIndex();
+            focusView_ = itemView;
+            break;
+        }
 #endif
         childView = childView->GetNextSibling();
     }
index 852d5a3..779b0cc 100644 (file)
@@ -7,54 +7,12 @@ set(UI_SAMPLE_ROOT ${ROOT_DIR}/middleware/services/gui/uikit/sample/uitest)
 
 set(PUBLIC_HEADER
     ${NativeApp}/nativelauncher/include
-    ${NativeApp}/nativeui/screennotify/include
-    ${NativeApp}/nativeui/bluetooth/include
+    ${NativeApp}/nativeui/include
 )
 
 set(PRIVATE_HEADER
     ${NativeApp}/nativeui/
-    ${NativeApp}/nativeui/main/include
-    ${NativeApp}/nativeui/clock/include
-    ${NativeApp}/nativeui/bloodoxygen/include
-    ${NativeApp}/nativeui/bluetooth/include
-    ${NativeApp}/nativeui/indoorwalk/include
-    ${NativeApp}/nativeui/rebootdevice/include
-    ${NativeApp}/nativeui/activity/include
-    ${NativeApp}/nativeui/heartrate/include
-    ${NativeApp}/nativeui/callerlog/include
-    ${NativeApp}/nativeui/makephone/include
-    ${NativeApp}/nativeui/rtcservice/include
-    ${NativeApp}/nativeui/compass/include
-    ${NativeApp}/nativeui/connectnewphone/include
-    ${NativeApp}/nativeui/alarmclockmanage/include
-    ${NativeApp}/nativeui/alarmclocktimerconfig/include
-    ${NativeApp}/nativeui/alarm/include
-    ${NativeApp}/nativeui/temperature/include
-    ${NativeApp}/nativeui/offlinevoice/include
-    ${NativeApp}/nativeui/settings/include
-    ${NativeApp}/nativeui/set_desktop/include
-    ${NativeApp}/nativeui/set_card/include
-    ${NativeApp}/nativeui/add_card/include
-    ${NativeApp}/nativeui/set_dial/include
-    ${NativeApp}/nativeui/set_dial_style/include
-    ${NativeApp}/nativeui/key/include
-    ${NativeApp}/nativeui/player/include
-    ${NativeApp}/nativeui/applist/include
-    ${NativeApp}/nativeui/phoneservice/include
-    ${NativeApp}/nativeui/screensetting/include
-    ${NativeApp}/nativeui/uiservice/include
-    ${NativeApp}/nativeui/uisample/include
     ${NativeApp}/nativeui/uisample/uitest/framework/include
-    ${NativeApp}/nativeui/aod_view/include
-
-    ${NativeApp}/nativeui/alipay/include
-    ${NativeApp}/nativeui/alipay/include/AlipayList
-
-    ${NativeApp}/nativeui/alipay/include/AlipayTrans
-    ${NativeApp}/nativeui/restoredefaults/include
-
-    ${NativeApp}/nativeui/videocard/include
-
     ${UI_SAMPLE_ROOT}/components
     ${NativeApp}/../service/smart_voice/smart_voice_service/interfaces/innerkits/native_c/include
     ${NativeApp}/../service/smart_voice/voice_engine_hal/interfaces/innerkits/native_c/include
@@ -79,14 +37,15 @@ set(PRIVATE_HEADER
     ${ROOT_DIR}/include/middleware/services/bts/common
     ${ROOT_DIR}/include/middleware/services/bts/ble
     ${ROOT_DIR}/include/middleware/services/bts/br
+    ${ROOT_DIR}/middleware/chips/brandy/nv/
 
     ${ROOT_DIR}/open_source/openharmony/drivers/peripheral/display/interfaces/include
     ${ROOT_DIR}/open_source/openharmony/foundation/distributedschedule/samgr_lite/interfaces/kits/samgr
 
-    ${NativeApp}/nativeui/main/include/dial
     ${ROOT_DIR}/middleware/services/media/foundation/sample/wrapper
     ${ROOT_DIR}/application/wearable/service/msg_center/include
     ${ROOT_DIR}/application/wearable/nativeabilityfwk/include
+    ${ROOT_DIR}/application/wearable/service/device_msg
     ${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
@@ -98,6 +57,12 @@ set(PRIVATE_HEADER
     ${UIKIT_ROOT_DIR}/proprietary/src/ui/innerkits
     ${ROOT_DIR}/application/wearable/service/dial_market
     ${ROOT_DIR}/open_source/openharmony/third_party/cJSON
+    ${ROOT_DIR}/middleware/utils/dfx/diag/
+    ${ROOT_DIR}/middleware/utils/dfx/diag/diag_cmd_router/include
+    ${ROOT_DIR}/open_source/openharmony/hiviewdfx/hilog/lite/interfaces/native/kits/hilog_lite
+    ${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
 )
 
 file(GLOB_RECURSE SOURCES "${NativeApp}/nativeui/*.cpp")
@@ -105,6 +70,8 @@ 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
@@ -215,9 +182,14 @@ set(COMPONENT_NAME "uikit_fwk")
 set(UIKIT_NATIVE_FWK ${ROOT_DIR}/application/wearable/nativeabilityfwk)
 set(UIKIT_NATIVE_DIAL ${NativeApp}/nativeui/main)
 set(COMPONENT_SRC
+    ${UIKIT_NATIVE_FWK}/src/View.cpp
+    ${UIKIT_NATIVE_FWK}/src/SlicePage.cpp
     ${UIKIT_NATIVE_FWK}/src/BackDragListener.cpp
     ${UIKIT_NATIVE_FWK}/src/PageTransitionMgr.cpp
     ${UIKIT_NATIVE_FWK}/src/TransitionManager.cpp
+    ${UIKIT_NATIVE_FWK}/src/RecentManager.cpp
+    ${UIKIT_NATIVE_FWK}/src/SlicePageManager.cpp
+    ${UIKIT_NATIVE_FWK}/src/SlicePageFactory.cpp
     ${UIKIT_NATIVE_FWK}/src/TransitionRecord.cpp
     ${UIKIT_NATIVE_DIAL}/src/dial/parser/DialBinParser.cpp
     ${UIKIT_NATIVE_DIAL}/src/dial/parser/DialBinParserManager.cpp
@@ -244,13 +216,13 @@ set(PRIVATE_HEADER
     ${ROOT_DIR}/middleware/services/gui/uikit/surface/interfaces/kits
     ${ROOT_DIR}/middleware/services/gui/uikit/ui/interfaces/innerkits
     ${ROOT_DIR}/middleware/services/gui/uikit/ui/frameworks
-    ${ROOT_DIR}/application/wearable/nativeapp/nativeui/applist/include/
     ${ROOT_DIR}/open_source/openharmony/drivers/peripheral/display/interfaces/include
     ${ROOT_DIR}/open_source/openharmony/drivers/peripheral/format/interfaces/include
     ${UIKIT_NATIVE_DIAL}/include/dial
     ${ROOT_DIR}/middleware/services/media/foundation/sample/wrapper
     ${ROOT_DIR}/middleware/services/media/foundation/player/interfaces/kits
     ${UIKIT_ROOT_DIR}/proprietary/src/ui/innerkits
+    ${ROOT_DIR}/open_source/openharmony/base/security/appverify/include
 )
 
 set(PRIVATE_DEFINES
index f8834ae..eede3b3 100644 (file)
Binary files a/code/sdk/application/wearable/nativeapp/brandy-auto-ota-cli/libuikit_fwk.a and b/code/sdk/application/wearable/nativeapp/brandy-auto-ota-cli/libuikit_fwk.a differ
index 9c513d8..40a9458 100644 (file)
Binary files a/code/sdk/application/wearable/nativeapp/brandy-auto-ota-ser/libuikit_fwk.a and b/code/sdk/application/wearable/nativeapp/brandy-auto-ota-ser/libuikit_fwk.a differ
index b1ab9d2..e3ce469 100644 (file)
Binary files a/code/sdk/application/wearable/nativeapp/brandy-native-js/libuikit_fwk.a and b/code/sdk/application/wearable/nativeapp/brandy-native-js/libuikit_fwk.a differ
index 7864f09..337b034 100644 (file)
Binary files a/code/sdk/application/wearable/nativeapp/brandy-xts/libuikit_fwk.a and b/code/sdk/application/wearable/nativeapp/brandy-xts/libuikit_fwk.a differ
index 9774ce9..6c6b38f 100644 (file)
@@ -45,16 +45,32 @@ typedef enum : uint16_t {
     VIEW_INDOORWALK,
     VIEW_REBOOT,
     VIEW_UISAMPLE,
+    VIEW_MAIN_BREATHEASE,
+    VIEW_FLASHLIGHT,  // 手电筒;
+    VIEW_STOPWATCH,  // 秒表;
+    VIEW_WEATHER, // 天气
+    VIEW_TIMER, // 计时器
+    VIEW_BLOOD, // 血氧
+    VIEW_CAMERA, // 相机
+    VIEW_FIND_PHONE, // 寻找手机
+    VIEW_DATE, // 日期
+    VIEW_QRCODE_CONN,  // 二维码连接;
+    VIEW_SPORTS,
+    VIEW_SLEEPING,
+    VIEW_TRAINING,
+    VIEW_EMPTY,
 #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,
     VIEW_MAX_INTER_ARRY_APP = 0x7FFF, // 在此之前添加内部数组native应用ID.
     VIEW_MAX_INTER_APP = 0xFFFD, // 在此之前添加内部静态注册native应用ID,此ID在NativeRegisterType.h里单独管理
     VIEW_EXTERN_APP = 0xFFFE, // 三方应用
index 1fc741d..cfcecf0 100644 (file)
@@ -23,8 +23,6 @@ public:
     static NativeLauncher &GetInstance(void);
     void InitNativeLauncher(void);
 private:
-    void InitAllNativeSlices(void);
-
     NativeLauncher();
     NativeLauncher(const NativeLauncher &);
     NativeLauncher &operator=(const NativeLauncher &);
index b8d7f19..2079112 100644 (file)
@@ -13,7 +13,7 @@
 #include "NativeRegisterType.h"
 #include "SliceProxy.h"
 #include "AbilitySliceProxy.h"
-#include "ApplistModel.h"
+#include "applist/ApplistModel.h"
 #include "NativeAbility.h"
 #include "wearable_log.h"
 #include "UiConfig.h"
@@ -27,11 +27,6 @@ public:
     virtual void InitSlice() {};
 };
 
-struct NativeMap {
-    NativeRegisterType type;
-    NativeRegisterCallback* native;
-};
-
 struct SliceMap {
     uint16_t id;
     SliceProxy* slice;
@@ -45,31 +40,21 @@ public:
         return instance;
     }
     void InitAllNativesSlices();
-    Graphic::Vector<NativeMap>& GetNatives();
     List<AppItem>& GetNativeAppLists();
-    void RegisterNative(const AppItem &nativeAppList, NativeRegisterCallback* native);
     void RegisterSlice(const uint16_t id, SliceProxy* slice);
     void RegisterMenu(const uint16_t id, const char *icon, const char *iconHexagon, const char *label);
+    void RegisterMenu(const AppItem &item);
     bool IsSliceIdExist(AppViewId id);
 
 private:
     NativeRegisterManager() {};
-    ~NativeRegisterManager();
+    ~NativeRegisterManager() {};
     NativeRegisterManager(const NativeRegisterManager&) = delete;
     NativeRegisterManager &operator=(const NativeRegisterManager&) = delete;
-    Graphic::Vector<NativeMap> natives_;
     Graphic::Vector<SliceMap> slices_;
     List<AppItem> nativeAppLists_;
 };
 
-class NativeRegister {
-public:
-    NativeRegister(const AppItem &nativeAppList, NativeRegisterCallback* native)
-    {
-        NativeRegisterManager::GetInstance().RegisterNative(nativeAppList, native);
-    }
-};
-
 class SliceRegister {
 public:
     SliceRegister(const uint16_t id, SliceProxy* sliceProxy)
@@ -82,14 +67,26 @@ public:
         NativeRegisterManager::GetInstance().RegisterSlice(id, sliceProxy);
         NativeRegisterManager::GetInstance().RegisterMenu(id, icon, iconHexagon, label);
     }
+    SliceRegister(const AppItem &item, SliceProxy* sliceProxy)
+    {
+        NativeRegisterManager::GetInstance().RegisterSlice(item.id, sliceProxy);
+        NativeRegisterManager::GetInstance().RegisterMenu(item);
+    }
 };
 } // namespace OHOS
 
-#define REGIST_NATIVE(nativeAppList, func) \
-    const static OHOS::NativeRegister (STATIC_VAR)(nativeAppList, new func())
 #define REGIST_SLICE(id, V, P) \
     const static OHOS::SliceRegister (STATIC_VAR)(static_cast<uint16_t>(id), new AbilitySliceProxy<V, P>())
 #define REGIST_MENU(id, V, P, icon, iconHexagon, label) \
     const static OHOS::SliceRegister (STATIC_VAR)(static_cast<uint16_t>(id), new AbilitySliceProxy<V, P>(), \
                                                   icon, iconHexagon, label)
+/*
+ * 目前支持两种模式的注册,如果需要扩展,请自行扩展AppItem的构造方法
+ * 支持多语言注册以及多图标打包功能的注册示例:REGIST_MENU_EXT((AppItem{VIEW_OFFLINEVOICE, VOICE_RES_ID,
+ * VOICE_HEXAGON_ID, RES_PATH, HEXAGON_PATH, VOICE_LANGUAGE_ID, nullptr}), MainVocassistView, VocassistPresenter);
+ * 不支持多语言,一个图标使用一个文件的注册示例:REGIST_MENU_EXT((AppItem{VIEW_OFFLINEVOICE, PNG_APPLIST_VOCASSIST_IMAGE,
+ * PNG_APPLIST_DEFAULT_IMG, "语音助手", nullptr}), MainVocassistView, VocassistPresenter);
+ */
+#define REGIST_MENU_EXT(item, V, P) \
+    const static OHOS::SliceRegister (STATIC_VAR)(item, new AbilitySliceProxy<V, P>())
 #endif // NATIVE_MANAGER_H
\ No newline at end of file
diff --git a/code/sdk/application/wearable/nativeapp/nativelauncher/include/UICardPageFactory.h b/code/sdk/application/wearable/nativeapp/nativelauncher/include/UICardPageFactory.h
new file mode 100644 (file)
index 0000000..761e137
--- /dev/null
@@ -0,0 +1,73 @@
+/*
+ * Copyright (c) CompanyNameMagicTag 2025. All rights reserved.
+ * Description: UICardPageFactory
+ * Author:
+ * Create: 2025-06
+ */
+
+#ifndef UI_CARD_PAGE_FACTORY_H
+#define UI_CARD_PAGE_FACTORY_H
+
+#include <unordered_map>
+#include "components/ui_card_page.h"
+#include "UiConfig.h"
+
+namespace OHOS {
+class UICardPageProxyInterface;
+class UICardPageFactory {
+public:
+    static UICardPageFactory& GetInstance()
+    {
+        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);
+
+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)];
+};
+
+class WatchDialRegister {
+public:
+    WatchDialRegister(const uint16_t mode, const uint16_t id, UICardPageProxyInterface* uiCardPage)
+    {
+        UICardPageFactory::GetInstance().RegisterWatchDial(mode, id, uiCardPage);
+    }
+};
+
+class UICardPageProxyInterface {
+public:
+    virtual UICardPage* CreateUICardPage() = 0;
+    UICardPageProxyInterface() = default;
+    virtual ~UICardPageProxyInterface() = default;
+    UICardPageProxyInterface(const UICardPageProxyInterface&) = delete;
+    UICardPageProxyInterface& operator=(const UICardPageProxyInterface&) = delete;
+    UICardPageProxyInterface(UICardPageProxyInterface&&) = delete;
+    UICardPageProxyInterface& operator=(UICardPageProxyInterface&&) = delete;
+};
+
+template <class U>
+class WatchDialProxy : public UICardPageProxyInterface {
+public:
+    UICardPage* CreateUICardPage() override
+    {
+        U* u = new U();
+        UICardPage* page = dynamic_cast<UICardPage*>(u);
+        if (page == nullptr) {
+            delete u;
+        }
+        return page;
+    }
+};
+} // 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>())
+
+#endif // UI_CARD_PAGE_FACTORY_H
\ No newline at end of file
index ffecde6..b04a143 100644 (file)
@@ -31,6 +31,12 @@ namespace OHOS {
         DIAL_MAX,
     } DialId;
 
+    typedef enum {
+        DIAL_DISPLAY_MODE_MAIN = 0,
+        DIAL_DISPLAY_MODE_AOD,
+        DIAL_DISPLAY_MODE_MAX,
+    } DialDispayMode;
+
     #ifndef UNUSED
     #define UNUSED(x) ((void)(x))
     #endif
@@ -379,6 +385,25 @@ namespace OHOS {
     static constexpr const char *PNG_PREVIEW_CARD_VIDEO = APP_RES_PATH"/noaudio_05.bin";
 
     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 *WEATHER_IMAGE = APP_RES_PATH"/WEATHER.bin";
+    static constexpr const char *WEATHER_MAIN_ICON = APP_RES_PATH"/WEATHER_LOGO.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 *DATE_IMAGE = APP_RES_PATH"/DATE.bin";
+    static constexpr const char *DATE_MAIN_ICON = APP_RES_PATH"/DATE_LOGO.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 *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 *FINDPHONE_IMAGE = APP_RES_PATH"/FINDPHONE.bin";
+    static constexpr const char *FINDPHONE_MAIN_ICON = APP_RES_PATH"/FINDPHONE_LOGO.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";
 }
 
 #endif // UI_CONFIG_H
diff --git a/code/sdk/application/wearable/nativeapp/nativelauncher/include/ui_resource_breath.h b/code/sdk/application/wearable/nativeapp/nativelauncher/include/ui_resource_breath.h
new file mode 100644 (file)
index 0000000..ca66834
--- /dev/null
@@ -0,0 +1,102 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: UIBreathResource\r
+ * Create: 2025-06-05\r
+ */\r
+#ifndef UI_RESOURCE_BREATH_IMAGE_H\r
+#define UI_RESOURCE_BREATH_IMAGE_H\r
+#include <cstdint>\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
diff --git a/code/sdk/application/wearable/nativeapp/nativelauncher/include/ui_resource_camera.h b/code/sdk/application/wearable/nativeapp/nativelauncher/include/ui_resource_camera.h
new file mode 100644 (file)
index 0000000..022ddfc
--- /dev/null
@@ -0,0 +1,17 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: UICameraResource\r
+ * Create: 2025-06-05\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
diff --git a/code/sdk/application/wearable/nativeapp/nativelauncher/include/ui_resource_date.h b/code/sdk/application/wearable/nativeapp/nativelauncher/include/ui_resource_date.h
new file mode 100644 (file)
index 0000000..0bccb8b
--- /dev/null
@@ -0,0 +1,21 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: UIWeatherResource\r
+ * Create: 2025-06-10\r
+ */\r
+#ifndef UI_RESOURCE_DATE_H\r
+#define UI_RESOURCE_DATE_H\r
+#include <cstdint>\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
diff --git a/code/sdk/application/wearable/nativeapp/nativelauncher/include/ui_resource_findPhone.h b/code/sdk/application/wearable/nativeapp/nativelauncher/include/ui_resource_findPhone.h
new file mode 100644 (file)
index 0000000..9a51cdf
--- /dev/null
@@ -0,0 +1,46 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: UIFindPhoneResource\r
+ * Create: 2025-2-13\r
+ */\r
+#ifndef UI_RESOURCE_FINDPHONE_H\r
+#define UI_RESOURCE_FINDPHONE_H\r
+#include <cstdint>\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
diff --git a/code/sdk/application/wearable/nativeapp/nativelauncher/include/ui_resource_sleep.h b/code/sdk/application/wearable/nativeapp/nativelauncher/include/ui_resource_sleep.h
new file mode 100644 (file)
index 0000000..c5d369d
--- /dev/null
@@ -0,0 +1,28 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: UISleepResource\r
+ * Create: 2025-06-05\r
+ */\r
+#ifndef UI_RESOURCE_SLEEP_H\r
+#define UI_RESOURCE_SLEEP_H\r
+#include <cstdint>\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
diff --git a/code/sdk/application/wearable/nativeapp/nativelauncher/include/ui_resource_string.h b/code/sdk/application/wearable/nativeapp/nativelauncher/include/ui_resource_string.h
new file mode 100644 (file)
index 0000000..d7ca185
--- /dev/null
@@ -0,0 +1,23 @@
+/*\r
+* Copyright (c) xxxxxxxx Technologies Co., Ltd. 2021-2021. All rights reserved.\r
+* Description: language\r
+* Author: Graphic develop team\r
+* Create: 2021-07-06\r
+*/\r
+\r
+#ifndef UI_RESOURCE_STRING_H\r
+#define UI_RESOURCE_STRING_H\r
+#include <cstdint>\r
+namespace OHOS {\r
+enum UIResourceTextId : uint16_t {\r
+    STR_LANGUAGE = 0,\r
+    STR_MAX_ID = 1,\r
+}; // UIResourceTextId\r
+\r
+enum FontLanguageId : uint8_t {\r
+    LANGUAGE_ID_ZH,\r
+    LANGUAGE_ID_EN,\r
+    LANGUAGE_ID_MAX\r
+}; // UITextLanguageTextId\r
+}\r
+#endif  /* UI_RESOURCE_STRING_H */\r
diff --git a/code/sdk/application/wearable/nativeapp/nativelauncher/include/ui_resource_timer.h b/code/sdk/application/wearable/nativeapp/nativelauncher/include/ui_resource_timer.h
new file mode 100644 (file)
index 0000000..b9a4629
--- /dev/null
@@ -0,0 +1,27 @@
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: UITimerResource\r
+ * Create: 2025-06-05\r
+ */\r
+#ifndef UI_RESOURCE_TIMER_H\r
+#define UI_RESOURCE_TIMER_H\r
+#include <cstdint>\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
diff --git a/code/sdk/application/wearable/nativeapp/nativelauncher/include/ui_resource_weather.h b/code/sdk/application/wearable/nativeapp/nativelauncher/include/ui_resource_weather.h
new file mode 100644 (file)
index 0000000..874ba3f
--- /dev/null
@@ -0,0 +1,89 @@
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: UIWeatherResource\r
+ * Create: 2025-06-05\r
+ */\r
+#ifndef UI_RESOURCE_WEATHER_IMAGE_H\r
+#define UI_RESOURCE_WEATHER_IMAGE_H\r
+#include <cstdint>\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
+}  // OHOS\r
+#endif  // UI_RESOURCE_IMAGE_H\r
diff --git a/code/sdk/application/wearable/nativeapp/nativelauncher/include/ui_stopwatch_resource.h b/code/sdk/application/wearable/nativeapp/nativelauncher/include/ui_stopwatch_resource.h
new file mode 100644 (file)
index 0000000..56019f1
--- /dev/null
@@ -0,0 +1,25 @@
+/*\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 4f38046..be0ab58 100644 (file)
 #include "SliceProxy.h"
 #include "AbilitySliceProxy.h"
 #include "wearable_log.h"
-#include "CallerLogModel.h"
-#include "ActivityModel.h"
-#include "HeartModel.h"
-#include "PlayersModel.h"
-#include "HealthModel.h"
-#include "VocassistModel.h"
-#include "ScreenModels.h"
-#include "BluetoothHeadsetEvent.h"
+#include "callerlog/CallerLogModel.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
+#include "RecentManager.h"
+#include "PageTransitionMgr.h"
 
 namespace OHOS {
 
@@ -48,13 +51,15 @@ void NativeLauncher::InitNativeLauncher()
 {
 #ifdef JS_ENABLE
     ACELite::ProductAdapter::SetScreenSize(HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);
+    ACELite::ProductAdapter::SetDefaultFontStyle(
+        DEFAULT_VECTOR_FONT_FILENAME, ACELite::ProductAdapter::GetDefaultFontSize());
 #endif
     GraphicStartUp::InitFontEngine(MEM_POOL_UI_FONT, MEM_POOL_UI_FONT_SIZE,
         OHOS::VECTOR_FONT_DIR, DEFAULT_VECTOR_FONT_FILENAME);
     WEARABLE_LOGI(WEARABLE_LOG_MODULE_LAUNCHER_FWK, "NativeLauncher::InitNativeLauncher");
     // 初始化所有预加载slice
     InitBtHeadsetEvent(); // 蓝牙ct和tg适配初始化
-    InitAllNativeSlices();
+    NativeRegisterManager::GetInstance().InitAllNativesSlices();
     CallerLogModel::GetInstance()->InitPhoneService();
     PlayersModel::GetInstance()->AudioInit();
     ActivityModel::GetInstance()->Init();
@@ -62,22 +67,18 @@ void NativeLauncher::InitNativeLauncher()
     VocassistModel::GetInstance()->Init();
     HeartModel::GetInstance()->Init();
     BluetoothModel::GetInstance()->Init();
+    SportsModel::GetInstance()->Init();
     // 初始化默认首页
     ScreenModels::GetInstance()->PreLoadAppimages();
     NativeAbility::GetInstance().SetDefaultSliceId(VIEW_MAIN_SAMPLE);
-}
 
-void NativeLauncher::InitAllNativeSlices(void)
-{
-    Graphic::Vector<NativeMap>& natives = NativeRegisterManager::GetInstance().GetNatives();
-    for(uint16_t index =0; index < natives.Size(); index++) {
-        if (static_cast<uint16_t>(natives[index].type) >= VIEW_MAX_INTER_APP) {
-            continue;
-        }
-        natives[index].native->InitSlice();
-    }
-    NativeRegisterManager::GetInstance().InitAllNativesSlices();
-    return;
+    RecentManager::GetInstance()->SetDirPath("system/recent/");
+    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
 }
 
 }
index 6ea82dd..bfd2119 100644 (file)
@@ -8,15 +8,6 @@
 #include "NativeRegisterManager.h"
 
 namespace OHOS {
-NativeRegisterManager::~NativeRegisterManager()
-{
-    for(uint16_t i =0; i < natives_.Size(); i++) {
-        if (natives_[i].native != nullptr) {
-            delete natives_[i].native;
-            natives_[i].native = nullptr;
-        }
-    }
-}
 
 void NativeRegisterManager::InitAllNativesSlices()
 {
@@ -26,34 +17,11 @@ void NativeRegisterManager::InitAllNativesSlices()
     }
 }
 
-Graphic::Vector<NativeMap>& NativeRegisterManager::GetNatives()
-{
-    return natives_;
-}
-
 List<AppItem>& NativeRegisterManager::GetNativeAppLists()
 {
     return nativeAppLists_;
 }
 
-void NativeRegisterManager::RegisterNative(const AppItem &nativeAppList, NativeRegisterCallback* native)
-{
-    if (native == nullptr) {
-        GRAPHIC_LOGE("native can't be nullptr");
-        return;
-    }
-    for(uint16_t i = 0; i < natives_.Size(); i++) {
-        if (natives_[i].type == (NativeRegisterType)nativeAppList.id) {
-            GRAPHIC_LOGE("RegisterNative failed because type %d already registered", nativeAppList.id);
-            return;
-        }
-    }
-    GRAPHIC_LOGI("register native %d", nativeAppList.id);
-    NativeMap map = {(NativeRegisterType)nativeAppList.id, native};
-    natives_.PushBack(map);
-    nativeAppLists_.PushBack(nativeAppList);
-}
-
 void NativeRegisterManager::RegisterSlice(const uint16_t id, SliceProxy* sliceProxy)
 {
     if (sliceProxy == nullptr) {
@@ -72,7 +40,7 @@ void NativeRegisterManager::RegisterSlice(const uint16_t id, SliceProxy* slicePr
 
 void NativeRegisterManager::RegisterMenu(const uint16_t id, const char *icon, const char *iconHexagon, const char *label)
 {
-    AppItem item = {id, icon, icon, iconHexagon, label, nullptr};
+    AppItem item = {id, icon, iconHexagon, label, nullptr};
     ListNode<AppItem>* appNode = nativeAppLists_.Head();
     while (appNode != nativeAppLists_.End()) {
         if (id == appNode->data_.id) {
@@ -88,6 +56,23 @@ void NativeRegisterManager::RegisterMenu(const uint16_t id, const char *icon, co
     nativeAppLists_.PushBack(item);
 }
 
+void NativeRegisterManager::RegisterMenu(const AppItem &item)
+{
+    ListNode<AppItem>* appNode = nativeAppLists_.Head();
+    while (appNode != nativeAppLists_.End()) {
+        if (item.id == appNode->data_.id) {
+            GRAPHIC_LOGE("Register menu failed because id %d already registered.", item.id);
+            return;
+        }
+        if (item.id < appNode->data_.id) {
+            nativeAppLists_.Insert(appNode, item);
+            return;
+        }
+        appNode = appNode->next_;
+    }
+    nativeAppLists_.PushBack(item);
+}
+
 bool NativeRegisterManager::IsSliceIdExist(AppViewId id)
 {
     for (uint16_t index = 0; index < slices_.Size(); index++) {
diff --git a/code/sdk/application/wearable/nativeapp/nativelauncher/src/UICardPageFactory.cpp b/code/sdk/application/wearable/nativeapp/nativelauncher/src/UICardPageFactory.cpp
new file mode 100644 (file)
index 0000000..649aa2f
--- /dev/null
@@ -0,0 +1,43 @@
+/*
+ * Copyright (c) CompanyNameMagicTag 2025. All rights reserved.
+ * Description: UICardPageFactory
+ * Author:
+ * Create: 2025-06
+ */
+
+#include "UICardPageFactory.h"
+#include "wearable_log.h"
+
+namespace OHOS {
+
+void UICardPageFactory::RegisterWatchDial(const uint16_t mode, 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);
+        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);
+        return;
+    } else {
+        watchDials_[mode].insert({id, uiCardPage});
+    }
+}
+
+UICardPage* UICardPageFactory::CreateWatchDial(uint16_t mode, 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()) {
+        return it->second->CreateUICardPage();
+    } else {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Watch dial mode %d id:%d was not registered", mode, id);
+        return nullptr;
+    }
+}
+} // namespace OHOS
index a47bb9a..a68a6c7 100644 (file)
@@ -5,7 +5,7 @@
  * Create: 2022-03-02
  */
 
-#include "ActivityModel.h"
+#include "activity/ActivityModel.h"
 #include <fstream>
 #include "iostream"
 #include <sstream>
@@ -17,9 +17,9 @@
 #include "graphic_timer.h"
 #include "securec.h"
 #include "broadcast_service.h"
-#include "MainClockView.h"
-#include "IndoorWalkPresenter.h"
-#include "ActivityWeekView.h"
+#include "clock/MainClockView.h"
+#include "indoorwalk/IndoorWalkPresenter.h"
+#include "activity/ActivityWeekView.h"
 #include "graphic_service.h"
 
 #ifdef __cplusplus
@@ -76,32 +76,50 @@ static void RefreshStepControls(const uint32_t &value, const uint16 &msgId)
 {
     MainClockView *mainClockView = OHOS::MainClockView::GetInstance();
     if (mainClockView != nullptr) {
-        GraphicService::GetInstance()->PostGraphicEvent(
-            std::bind(&MainClockView::RefreshStep, mainClockView, value));
+        GraphicService::GetInstance()->PostGraphicEvent([value]() {
+            if (OHOS::MainClockView::GetInstance() != nullptr) {
+                OHOS::MainClockView::GetInstance()->RefreshStep(value);
+            }
+        });
     }
 
     IndoorWalkPresenter *indoorWalkPresenter = OHOS::IndoorWalkPresenter::GetInstance();
     if (indoorWalkPresenter != nullptr) {
-        GraphicService::GetInstance()->PostGraphicEvent(
-            std::bind(&IndoorWalkPresenter::ModifiesSteps, indoorWalkPresenter, value));
+        GraphicService::GetInstance()->PostGraphicEvent([value]() {
+            if (OHOS::IndoorWalkPresenter::GetInstance() != nullptr) {
+                OHOS::IndoorWalkPresenter::GetInstance()->ModifiesSteps(value);
+            }
+        });
     }
 
     ActivityWeekView *activityWeekView = OHOS::ActivityWeekView::GetInstance();
     if (activityWeekView == nullptr) {
         return;
     }
-    GraphicService::GetInstance()->PostGraphicEvent(
-        std::bind(&ActivityWeekView::RefreshSteps, activityWeekView, value));
+    GraphicService::GetInstance()->PostGraphicEvent([value]() {
+        if (OHOS::ActivityWeekView::GetInstance() != nullptr) {
+            OHOS::ActivityWeekView::GetInstance()->RefreshSteps(value);
+        }
+    });
 
     if (msgId == TOPIC_EVENT_STEPDATA_UPDATE) {
-        GraphicService::GetInstance()->PostGraphicEvent(
-            std::bind(&ActivityWeekView::RefreshTodayView, activityWeekView, value));
+        GraphicService::GetInstance()->PostGraphicEvent([value]() {
+            if (OHOS::ActivityWeekView::GetInstance() != nullptr) {
+                OHOS::ActivityWeekView::GetInstance()->RefreshTodayView(value);
+            }
+        });
     } else if (msgId == TOPIC_EVENT_NEXTDAY_UPDATE) {
-        GraphicService::GetInstance()->PostGraphicEvent(
-            std::bind(&ActivityWeekView::InitAvgStep, activityWeekView));
+        GraphicService::GetInstance()->PostGraphicEvent([]() {
+            if (OHOS::ActivityWeekView::GetInstance() != nullptr) {
+                OHOS::ActivityWeekView::GetInstance()->InitAvgStep();
+            }
+        });
         if (OHOS::ActivityModel::GetInstance()->GetWeekToday() == MONDAY_STEP_COUNTER) {
-            GraphicService::GetInstance()->PostGraphicEvent(
-                std::bind(&ActivityWeekView::InitWeekView, activityWeekView));
+            GraphicService::GetInstance()->PostGraphicEvent([]() {
+                if (OHOS::ActivityWeekView::GetInstance() != nullptr) {
+                    OHOS::ActivityWeekView::GetInstance()->InitWeekView();
+                }
+            });
         }
     }
 }
@@ -123,8 +141,11 @@ static void Notify(void *args, const Topic topic, Request* request)
         counter += *(uint32_t *)request->data;
         OHOS::ActivityModel::GetInstance()->ReviseStepCounter(counter);
 
-        GraphicService::GetInstance()->PostGraphicEvent(
-            std::bind(&ActivityModel::SetStepData, ActivityModel::GetInstance(), counter));
+        GraphicService::GetInstance()->PostGraphicEvent([counter]() {
+            if (ActivityModel::GetInstance() != nullptr) {
+                ActivityModel::GetInstance()->SetStepData(counter);
+            }
+        });
         RefreshStepControls(counter, TOPIC_EVENT_STEPDATA_UPDATE);
     }
 
@@ -216,7 +237,7 @@ void SaveEveryMinCallback(void* data)
     GraphicService::GetInstance()->PostGraphicEvent(std::bind(SaveEveryMinCallbackProc, data));
 }
 
-void ActivityModel::SetStepData(uint32_t &value)
+void ActivityModel::SetStepData(const uint32_t &value)
 {
     g_stepData1.weekSteps[weekToday] = value;
     // 第一次上报数据后打开定时器
index c381e72..4603a46 100644 (file)
@@ -9,13 +9,13 @@
 #include "gfx_utils/graphic_types.h"\r
 #include "components/ui_checkbox.h"\r
 #include "UiConfig.h"\r
-#include "ActivityPresenter.h"\r
+#include "activity/ActivityPresenter.h"\r
 #include "NativeRegisterManager.h"\r
 \r
 namespace OHOS {\r
 \r
 REGIST_SLICE(VIEW_MAIN_ACTIVITY, MainActivityView, ActivityPresenter);\r
-    \r
+\r
 static ActivityPresenter *g_pActivityPresenter = nullptr;\r
 ActivityPresenter::ActivityPresenter()\r
 {\r
@@ -36,7 +36,7 @@ ActivityPresenter *ActivityPresenter::GetInstance()
 \r
 bool ActivityPresenter::OnDrag(UIView& view, const DragEvent& event)\r
 {\r
-    WEARABLE_LOGD("WEARABLE_LOG_MODULE_APP", "ActivityPresenter::OnDrag");\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ActivityPresenter::OnDrag");\r
     if (event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT) {\r
         if (strcmp(view.GetViewId(), ACTIVITY_WEEK_VIEW) == 0) {\r
             WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ActivityPresenter::OnDrag on ACTIVITY_WEEK_VIEW");\r
index 3e880d4..dfafe79 100644 (file)
@@ -5,8 +5,8 @@
  * Create: 2021-10-18\r
  */\r
 \r
-#include "ActivityWeekView.h"\r
-#include "ActivityPresenter.h"\r
+#include "activity/ActivityWeekView.h"\r
+#include "activity/ActivityPresenter.h"\r
 #include "common/image_cache_manager.h"\r
 \r
 namespace OHOS {\r
index 67e287e..c6453a4 100644 (file)
@@ -1,5 +1,5 @@
-#include "AddCardItem.h"\r
-#include "AddCardPresenter.h"\r
+#include "add_card/AddCardItem.h"\r
+#include "add_card/AddCardPresenter.h"\r
 #include "wearable_log.h"\r
 \r
 namespace OHOS {\r
index b72e0dc..59474f5 100644 (file)
@@ -5,9 +5,9 @@
  * Create: 2021-11-23
  */
 
-#include "AddCardView.h"
-#include "AddCardModel.h"
-#include "AddCardPresenter.h"
+#include "add_card/AddCardView.h"
+#include "add_card/AddCardModel.h"
+#include "add_card/AddCardPresenter.h"
 #include "hal_tick.h"
 #include "NativeRegisterManager.h"
 
index abb1a63..4828ac3 100644 (file)
@@ -6,8 +6,8 @@
  */
 
 #include <string>
-#include "AddCardView.h"
-#include "AddCardPresenter.h"
+#include "add_card/AddCardView.h"
+#include "add_card/AddCardPresenter.h"
 
 namespace OHOS {
 AddCardView::AddCardView()
index 4edb214..e2863a5 100644 (file)
 #include "samgr_lite.h"
 #include "graphic_mutex.h"
 #include "UiConfig.h"
-#include "AlarmClockModel.h"
-#include "AlarmPopUpPresenter.h"
+#include "alarm/AlarmClockModel.h"
+#include "alarm/AlarmPopUpPresenter.h"
 #include "graphic_service.h"
-#include "PlayersModel.h"
-#include "PhoneService.h"
-#include "ui_service.h"
+#include "player/PlayersModel.h"
+#include "phoneservice/PhoneService.h"
+#include "uiservice/ui_service.h"
 
 #ifdef __cplusplus
 extern "C" {
@@ -456,8 +456,7 @@ void AlarmClockModel::SetDelayAlarm(uint8_t alarm)
     }
     currentAlarm[clockListener]->delayNum++;
     clockQueueMsg->eventType = EVENT_ALARM_RING_DELAY;
-    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "AlarmClockModel::ButtonStatusRing clockQueueMsg->eventType is %u",
-        clockQueueMsg->eventType);
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "AlarmClockModel::SetDelayAlarm %u %u", clockQueueMsg->eventType, alarm);
     (clockQueueMsg->data).value = alarm;
     AlmmgrAlarmClockEventProcess(clockQueueMsg);
     return;
@@ -471,8 +470,7 @@ void AlarmClockModel::SetCancelAlarm(uint8_t alarm)
         return;
     }
     clockQueueMsg->eventType = EVENT_ALARM_RING_CANCEL;
-    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "AlarmClockModel::ButtonStatusRing clockQueueMsg->eventType is %u",
-        clockQueueMsg->eventType);
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "AlarmClockModel::SetCancelAlarm %u %u", clockQueueMsg->eventType, alarm);
     (clockQueueMsg->data).value = alarm;
     AlmmgrAlarmClockEventProcess(clockQueueMsg);
     return;
@@ -805,8 +803,9 @@ int AlarmClockModel::AlarmPlayerStart(void)
 
 void AlarmPlayerCallbackImpl::OnPlaybackComplete()
 {
-    GraphicService::GetInstance()->PostGraphicEvent(
-        std::bind(&OHOS::AlarmClockModel::DeactAudioInter, OHOS::AlarmClockModel::GetInstance()));
+    /* msg center已处理,此处注释 */
+    // GraphicService::GetInstance()->PostGraphicEvent(
+    //     std::bind(&OHOS::AlarmClockModel::DeactAudioInter, OHOS::AlarmClockModel::GetInstance()));
 }
 
 uint16_t AlarmClockModel::JudgePreSlice(void)
index e69e8b6..c10fa48 100644 (file)
@@ -5,7 +5,7 @@
  * Create: 2021-09-11\r
  */\r
 \r
-#include "AlarmCloseRingView.h"\r
+#include "alarm/AlarmCloseRingView.h"\r
 #include "common/screen.h"\r
 #include "components/ui_label.h"\r
 #include "components/ui_label_button.h"\r
@@ -13,8 +13,8 @@
 #include "ohos_timer.h"\r
 #include "graphic_timer.h"\r
 \r
-#include "AlarmPopUpPresenter.h"\r
-#include "PhoneService.h"\r
+#include "alarm/AlarmPopUpPresenter.h"\r
+#include "phoneservice/PhoneService.h"\r
 \r
 namespace OHOS {\r
 #define CLOSE "关闭"\r
index 171caef..97141e6 100644 (file)
@@ -5,10 +5,10 @@
  * Create: 2021-09-11\r
  */\r
 \r
-#include "AlarmConfigView.h"\r
+#include "alarm/AlarmConfigView.h"\r
 #include "UiConfig.h"\r
 #include <string>\r
-#include "AlarmPresenter.h"\r
+#include "alarm/AlarmPresenter.h"\r
 #include <sstream>\r
 #include "color.h"\r
 \r
index 9e6c2ea..3ec474d 100644 (file)
@@ -5,10 +5,10 @@
  * Create: 2021-09-11\r
  */\r
 \r
-#include "AlarmJudgeView.h"\r
+#include "alarm/AlarmJudgeView.h"\r
 #include "UiConfig.h"\r
 #include <string>\r
-#include "AlarmPresenter.h"\r
+#include "alarm/AlarmPresenter.h"\r
 \r
 namespace OHOS {\r
 #define DELETE_INETERFACES "是否删除此闹钟?"\r
index ed0e5ae..5bc2c39 100644 (file)
@@ -5,14 +5,14 @@
  * Create: 2021-09-11\r
  */\r
 \r
-#include "AlarmMaxClock.h"\r
+#include "alarm/AlarmMaxClock.h"\r
 #include "UiConfig.h"\r
 #include <string>\r
 #include "ohos_timer.h"\r
 #include "graphic_timer.h"\r
 \r
-#include "AlarmPresenter.h"\r
-#include "MainAlarmView.h"\r
+#include "alarm/AlarmPresenter.h"\r
+#include "alarm/MainAlarmView.h"\r
 \r
 namespace OHOS {\r
 #define MAX_INETERFACES "当前闹钟个数已达上限"\r
index 93a205b..d13509d 100644 (file)
@@ -5,7 +5,7 @@
  * Create: 2021-09-11\r
  */\r
 \r
-#include "AlarmNewTimeView.h"\r
+#include "alarm/AlarmNewTimeView.h"\r
 #include "common/screen.h"\r
 #include "components/ui_label.h"\r
 #include "components/ui_label_button.h"\r
index 2ae51d2..972cc0e 100644 (file)
@@ -6,11 +6,11 @@
  */\r
 \r
 \r
-#include "AlarmPopUpPresenter.h"\r
-#include "MainAlarmView.h"\r
+#include "alarm/AlarmPopUpPresenter.h"\r
+#include "alarm/MainAlarmView.h"\r
 #include "ChangeSliceListener.h"\r
-#include "PhoneService.h"\r
-#include "PlayersModel.h"\r
+#include "phoneservice/PhoneService.h"\r
+#include "player/PlayersModel.h"\r
 #include "NativeRegisterManager.h"\r
 \r
 namespace OHOS {\r
index 29ad7f6..3d54a5c 100644 (file)
@@ -5,8 +5,8 @@
  * Create: 2021-09-11\r
  */\r
 \r
-#include "AlarmPopUpView.h"\r
-#include "AlarmPopUpPresenter.h"\r
+#include "alarm/AlarmPopUpView.h"\r
+#include "alarm/AlarmPopUpPresenter.h"\r
 #include "common/screen.h"\r
 #include "components/ui_label.h"\r
 #include "components/ui_label_button.h"\r
index 29b88dd..c0e1985 100644 (file)
@@ -6,8 +6,8 @@
  */\r
 \r
 \r
-#include "AlarmPresenter.h"\r
-#include "MainAlarmView.h"\r
+#include "alarm/AlarmPresenter.h"\r
+#include "alarm/MainAlarmView.h"\r
 #include "NativeRegisterManager.h"\r
 #include "ChangeSliceListener.h"\r
 #include "string"\r
index bb44932..26c94cd 100644 (file)
@@ -5,15 +5,15 @@
  * Create: 2021-09-11\r
  */\r
 \r
-#include "AlarmRingView.h"\r
+#include "alarm/AlarmRingView.h"\r
 #include "common/screen.h"\r
 #include "components/ui_label.h"\r
 #include "components/ui_label_button.h"\r
 #include <string>\r
-#include "AlarmPopUpPresenter.h"\r
+#include "alarm/AlarmPopUpPresenter.h"\r
 #include "ohos_timer.h"\r
 #include "graphic_timer.h"\r
-#include "PhoneService.h"\r
+#include "phoneservice/PhoneService.h"\r
 \r
 namespace OHOS {\r
 #define RING_AGAIN "响铃将在十分钟后再次响起"\r
index 6d04e32..bf5f07d 100644 (file)
@@ -5,7 +5,7 @@
  * Create: 2021-09-11\r
  */\r
 \r
-#include "AlarmSetTimeView.h"\r
+#include "alarm/AlarmSetTimeView.h"\r
 #include "common/screen.h"\r
 #include "components/ui_label.h"\r
 #include "components/ui_label_button.h"\r
index 397430b..6733177 100644 (file)
@@ -5,7 +5,7 @@
  * Create: 2021-09-11\r
  */\r
 \r
-#include "AlarmSetWeekView.h"\r
+#include "alarm/AlarmSetWeekView.h"\r
 #include "common/screen.h"\r
 #include "components/ui_digital_clock.h"\r
 \r
index 430334b..1f56be3 100644 (file)
@@ -5,10 +5,10 @@
  * Create: 2021-09-11
  */
 
-#include "MainAlarmView.h"
+#include "alarm/MainAlarmView.h"
 #include "UiConfig.h"
 #include "ui_label_button.h"
-#include "PhoneService.h"
+#include "phoneservice/PhoneService.h"
 
 namespace OHOS {
 static MainAlarmView *g_MainAlarmView = nullptr;
index 5ce9f86..a87b03a 100644 (file)
@@ -19,9 +19,9 @@
 #include "broadcast_service.h"
 #include "samgr_lite.h"
 
-#include "RtcService.h"
-#include "AlarmClockTimerConfig.h"
-#include "AlarmClockManage.h"
+#include "rtcservice/RtcService.h"
+#include "alarmclocktimerconfig/AlarmClockTimerConfig.h"
+#include "alarmclockmanage/AlarmClockManage.h"
 
 #ifdef __cplusplus
 extern "C" {
index 135ebd7..c5c0228 100644 (file)
@@ -16,7 +16,7 @@
 #include "thread_adapter.h"\r
 #include "graphic_service.h"\r
 \r
-#include "AlarmClockTimerConfig.h"\r
+#include "alarmclocktimerconfig/AlarmClockTimerConfig.h"\r
 \r
 #ifdef __cplusplus\r
 extern "C" {\r
@@ -102,8 +102,9 @@ void AlarmScan(void *arg)
         if ((g_alarmCtrA.callback != nullptr) &&\r
             (g_alarmCtrA.info.hour == curTime.tm_hour) &&\r
             (g_alarmCtrA.info.minute == curTime.tm_min)) {\r
-            g_alarmCtrA.callback();\r
+            WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "AlarmA Called %d %d", curTime.tm_hour, curTime.tm_min);\r
             g_alarmCtrA.state = ALARM_STATUS_CREATED;\r
+            g_alarmCtrA.callback();\r
         }\r
     }\r
 \r
@@ -112,8 +113,9 @@ void AlarmScan(void *arg)
             (g_alarmCtrB.info.week == curTime.tm_wday) &&\r
             (g_alarmCtrB.info.hour == curTime.tm_hour) &&\r
             (g_alarmCtrB.info.minute == curTime.tm_min)) {\r
-            g_alarmCtrB.callback();\r
+            WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "AlarmB Called %d %d", curTime.tm_hour, curTime.tm_min);\r
             g_alarmCtrB.state = ALARM_STATUS_CREATED;\r
+            g_alarmCtrB.callback();\r
         }\r
     }\r
 }\r
index 5e8723d..8ecfc16 100644 (file)
@@ -8,8 +8,8 @@
 #include "UiConfig.h"\r
 #include <string>\r
 #include "cmsis_os.h"\r
-#include "AlipayBarCode.h"\r
-#include "AlipayModel.h"\r
+#include "alipay/AlipayBarCode.h"\r
+#include "alipay/AlipayModel.h"\r
 \r
 namespace OHOS {\r
 #define ALIPAY_BARCODE_SPACE 32\r
index 7809495..ec5e447 100644 (file)
@@ -6,8 +6,8 @@
  */\r
 #include "UiConfig.h"\r
 #include <string>\r
-#include "AlipayBind.h"\r
-#include "AlipayModel.h"\r
+#include "alipay/AlipayBind.h"\r
+#include "alipay/AlipayModel.h"\r
 \r
 namespace OHOS {\r
 static const char *BIND_TITLE = (char *)"使用支付宝扫码绑定";\r
index 4574cb9..3a1b70f 100644 (file)
@@ -9,7 +9,7 @@
 #include "layout/grid_layout.h"\r
 #include "font/ui_font.h"\r
 #include <string>\r
-#include "AlipayBindAni.h"\r
+#include "alipay/AlipayBindAni.h"\r
 #include "common/image_cache_manager.h"\r
 #include "graphic_service.h"\r
 \r
index 0a33198..04d7758 100644 (file)
@@ -10,8 +10,8 @@
 #include "font/ui_font.h"\r
 #include <string>\r
 #include "cmsis_os.h"\r
-#include "AlipayBindRes.h"\r
-#include "AlipayModel.h"\r
+#include "alipay/AlipayBindRes.h"\r
+#include "alipay/AlipayModel.h"\r
 \r
 namespace OHOS {\r
 static const int16 EXIT_LABEL_X_FIRST = 151;\r
index edf88e3..3d86a93 100644 (file)
@@ -9,7 +9,7 @@
 #include "layout/grid_layout.h"\r
 #include "font/ui_font.h"\r
 #include <string>\r
-#include "AlipayExitBind.h"\r
+#include "alipay/AlipayExitBind.h"\r
 \r
 namespace OHOS {\r
 static const int16 EXIT_LABEL_X_FIRST = 132;\r
index a772a5c..6e1ff16 100644 (file)
@@ -8,8 +8,8 @@
 #include "UiConfig.h"\r
 #include <string>\r
 #include "cmsis_os.h"\r
-#include "AlipayHelp.h"\r
-#include "AlipayModel.h"\r
+#include "alipay/AlipayHelp.h"\r
+#include "alipay/AlipayModel.h"\r
 \r
 namespace OHOS {\r
 static const char *HELP_TITLE = (char*)"使用支付宝扫码求助";\r
index 75b2d2d..3ac28ad 100644 (file)
@@ -5,8 +5,8 @@
  * Create:
  */
 
-#include "AlipayListAdapter.h"
-#include "AlipayListItemView.h"
+#include "alipay/AlipayList/AlipayListAdapter.h"
+#include "alipay/AlipayList/AlipayListItemView.h"
 
 namespace OHOS {
 AlipayListAdapter::AlipayListAdapter()
index e96e470..292c48b 100644 (file)
@@ -6,8 +6,8 @@
  */
 
 #include <string>
-#include "AlipayListView.h"
-#include "AlipayListItem.h"
+#include "alipay/AlipayList/AlipayListView.h"
+#include "alipay/AlipayList/AlipayListItem.h"
 #include "cmsis_os2.h"
 
 namespace OHOS {
index 76c9385..d45093f 100644 (file)
@@ -5,7 +5,7 @@
  * Create:\r
  */\r
 \r
-#include "AlipayMainView.h"\r
+#include "alipay/AlipayMainView.h"\r
 #include "UiConfig.h"\r
 #include "alipay_feature.h"\r
 \r
index 0414fd4..cc906cb 100644 (file)
@@ -7,8 +7,8 @@
 \r
 #include "UiConfig.h"\r
 #include "alipay_feature.h"\r
-#include "AlipayModel.h"\r
-#include "AlipayMainView.h"\r
+#include "alipay/AlipayModel.h"\r
+#include "alipay/AlipayMainView.h"\r
 #include "graphic_service.h"\r
 \r
 namespace OHOS {\r
index 79e738f..0fea31b 100644 (file)
@@ -8,8 +8,8 @@
 #include "UiConfig.h"\r
 #include <string>\r
 #include "cmsis_os.h"\r
-#include "AlipayPayCode.h"\r
-#include "AlipayModel.h"\r
+#include "alipay/AlipayPayCode.h"\r
+#include "alipay/AlipayModel.h"\r
 \r
 namespace OHOS {\r
 static AlipayPayCode *g_alipayPayCode = nullptr;\r
index a58470e..4909bd0 100644 (file)
@@ -5,8 +5,8 @@
  * Create:\r
  */\r
 \r
-#include "AlipayPresenter.h"\r
-#include "AlipayMainView.h"\r
+#include "alipay/AlipayPresenter.h"\r
+#include "alipay/AlipayMainView.h"\r
 #include "ChangeSliceListener.h"\r
 #include "graphic_service.h"\r
 #include "string"\r
 #include "sstream"\r
 #include "errcode.h"\r
 #include "pm_definition.h"\r
-#include "AlipayListView.h"\r
-#include "AlipayListItemView.h"\r
-#include "AlipayTransListItemView.h"\r
-#include "AlipayTransListView.h"\r
+#include "alipay/AlipayList/AlipayListView.h"\r
+#include "alipay/AlipayList/AlipayListItemView.h"\r
+#include "alipay/AlipayTrans/AlipayTransListItemView.h"\r
+#include "alipay/AlipayTrans/AlipayTransListView.h"\r
 #include "NativeRegisterManager.h"\r
 \r
 namespace OHOS {\r
@@ -61,7 +61,6 @@ void AlipayPresenter::OnStart()
 \r
 void AlipayPresenter::OnResume(void)\r
 {\r
-    Presenter<AlipayMainView>::OnResume();\r
     svr_alipay_create_task();\r
 }\r
 \r
index c889eff..8c97740 100644 (file)
@@ -8,8 +8,8 @@
 #include "UiConfig.h"\r
 #include <string>\r
 #include "cmsis_os.h"\r
-#include "AlipaySetting.h"\r
-#include "AlipayModel.h"\r
+#include "alipay/AlipaySetting.h"\r
+#include "alipay/AlipayModel.h"\r
 \r
 namespace OHOS {\r
 static const char *SETTING_TITLE = (char *)"设置";\r
index 0bdadd0..b17032a 100644 (file)
@@ -10,7 +10,7 @@
 #include "font/ui_font.h"\r
 #include <string>\r
 #include "cmsis_os.h"\r
-#include "AlipayGetTransList.h"\r
+#include "alipay/AlipayTrans/AlipayGetTransList.h"\r
 \r
 namespace OHOS {\r
 static const int16 EXIT_LABEL_X_FIRST = 60;\r
index 37adb66..1ef552a 100644 (file)
@@ -10,7 +10,7 @@
 #include "font/ui_font.h"\r
 #include <string>\r
 #include "cmsis_os.h"\r
-#include "AlipayTransAni.h"\r
+#include "alipay/AlipayTrans/AlipayTransAni.h"\r
 #include "common/image_cache_manager.h"\r
 #include "graphic_service.h"\r
 \r
index 2f04595..072b53b 100644 (file)
@@ -8,8 +8,8 @@
 #include "UiConfig.h"\r
 #include <string>\r
 #include "cmsis_os.h"\r
-#include "AlipayTransCode.h"\r
-#include "AlipayModel.h"\r
+#include "alipay/AlipayTrans/AlipayTransCode.h"\r
+#include "alipay/AlipayModel.h"\r
 \r
 namespace OHOS {\r
 static const char *TRANSCODE_BUTTON = (char *)"切换交通卡";\r
index 8b42995..9178437 100644 (file)
@@ -8,8 +8,8 @@
 #include "UiConfig.h"\r
 #include <string>\r
 #include "cmsis_os.h"\r
-#include "AlipayTransEnable.h"\r
-#include "AlipayModel.h"\r
+#include "alipay/AlipayTrans/AlipayTransEnable.h"\r
+#include "alipay/AlipayModel.h"\r
 \r
 namespace OHOS {\r
 static const char *TRANSCODE_TITLE = (char *)"乘车码未开通";\r
index 703c4b2..54ddc91 100644 (file)
@@ -5,8 +5,8 @@
  * Create:
  */
 
-#include "AlipayTransListAdapter.h"
-#include "AlipayTransListItemView.h"
+#include "alipay/AlipayTrans/AlipayTransListAdapter.h"
+#include "alipay/AlipayTrans/AlipayTransListItemView.h"
 
 namespace OHOS {
 AlipayTransListAdapter::AlipayTransListAdapter()
index aa4b0f0..ad049da 100644 (file)
@@ -6,7 +6,7 @@
  */
 
 #include "wearable_log.h"
-#include "AlipayTransListItemView.h"
+#include "alipay/AlipayTrans/AlipayTransListItemView.h"
 
 namespace OHOS {
 static constexpr int16_t ALIPAY_TRANS_LIST_ITEM_BUTTON_HEIGHT = 95;
index b777521..d811a1e 100644 (file)
@@ -6,9 +6,9 @@
  */
 
 #include <string>
-#include "AlipayTransListView.h"
-#include "AlipayTransListItem.h"
-#include "AlipayModel.h"
+#include "alipay/AlipayTrans/AlipayTransListView.h"
+#include "alipay/AlipayTrans/AlipayTransListItem.h"
+#include "alipay/AlipayModel.h"
 #include "cmsis_os2.h"
 #include "common_def.h"
 
index c7b5558..573415e 100644 (file)
@@ -10,8 +10,8 @@
 #include "font/ui_font.h"\r
 #include <string>\r
 #include "cmsis_os.h"\r
-#include "AlipayTransRes.h"\r
-#include "AlipayModel.h"\r
+#include "alipay/AlipayTrans/AlipayTransRes.h"\r
+#include "alipay/AlipayModel.h"\r
 \r
 namespace OHOS {\r
 static const int16 EXIT_LABEL_X_FIRST = 38;\r
index 1170666..a59f99f 100644 (file)
@@ -10,8 +10,8 @@
 #include "font/ui_font.h"\r
 #include <string>\r
 #include "cmsis_os.h"\r
-#include "AlipayTransTips.h"\r
-#include "AlipayModel.h"\r
+#include "alipay/AlipayTrans/AlipayTransTips.h"\r
+#include "alipay/AlipayModel.h"\r
 \r
 namespace OHOS {\r
 static const int16 TIPS_LABEL_X_FIRST = 38;\r
index 2c081ca..a716545 100644 (file)
@@ -10,7 +10,7 @@
 #include "font/ui_font.h"\r
 #include <string>\r
 #include "cmsis_os.h"\r
-#include "AlipayUnbind.h"\r
+#include "alipay/AlipayUnbind.h"\r
 \r
 namespace OHOS {\r
 static const int16 EXIT_LABEL_X_FIRST = 132;\r
index 817d90b..bd259f2 100644 (file)
@@ -8,7 +8,7 @@
 #include "UiConfig.h"\r
 #include <string>\r
 #include "cmsis_os.h"\r
-#include "AlipayUnbindFinish.h"\r
+#include "alipay/AlipayUnbindFinish.h"\r
 \r
 namespace OHOS {\r
 static AlipayUnbindFinish *g_alipayUnbindFinish = nullptr;\r
index e06b38c..a32c984 100644 (file)
@@ -5,7 +5,9 @@
  * Create: 2024-10-30
  */
 
-#include "AodModel.h"
+#include "aod_view/AodModel.h"
+#include <unistd.h>
+#include "securec.h"
 #include "kv_store.h"
 
 namespace OHOS {
index 9040519..6bb9f8c 100644 (file)
@@ -5,14 +5,15 @@
  * Create: 2024-10-30
  */
 
-#include "AodView.h"
-#include "AodPresenter.h"
-#include "AodModel.h"
+#include "aod_view/AodView.h"
+#include "aod_view/AodPresenter.h"
+#include "aod_view/AodModel.h"
 #include "common/graphic_utils.h"
-#include "DialBinParser.h"
-#include "DialViewGroup.h"
-#include "AmbientClockView.h"
-#include "DialModelTime.h"
+#include "UICardPageFactory.h"
+#include "main/DialBinParser.h"
+#include "main/dial/DialViewGroup.h"
+#include "clock/AmbientClockView.h"
+#include "main/dial/DialModelTime.h"
 
 namespace OHOS {
 AodView::~AodView()
@@ -67,13 +68,7 @@ void AodView::OnStop()
 
 UIViewGroup *AodView::InitAodDial(DialSetting &setting)
 {
-    switch (setting.dialId) {
-        case DIAL_CLOCK:
-            return new AmbientClockView;
-        default:
-            return nullptr;
-    }
-    return nullptr;
+    return UICardPageFactory::GetInstance().CreateWatchDial(DIAL_DISPLAY_MODE_AOD, setting.dialId);
 }
 
 UIViewGroup *AodView::InitAodOffDial(DialSetting &setting)
@@ -84,7 +79,7 @@ UIViewGroup *AodView::InitAodOffDial(DialSetting &setting)
     if (fp == nullptr) {
         return nullptr;
     }
-    bool ret = DialBinParserManager::GetInstance()->GetDialPreviewInfo(fp, &preview);
+    bool ret = DialBinParserManager::GetInstance()->GetDialPreviewInfo(setting.dialFullName, fp, &preview);
     fclose(fp);
     if (!ret) {
         return nullptr;
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/applist/include/ApplistModel.h b/code/sdk/application/wearable/nativeapp/nativeui/applist/include/ApplistModel.h
deleted file mode 100644 (file)
index fdf1a34..0000000
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved.
- * Description: ApplistModel.h
- * Author:
- * Create: 2021-09-18
- */
-
-#ifndef APPLIST_MODEL_H
-#define APPLIST_MODEL_H
-
-#include "bundle_info.h"
-#include "AppViewIDs.h"
-#include "ohos_types.h"
-
-#define APP_MAX_NUM 50
-
-namespace OHOS {
-typedef struct {
-    uint16_t id;
-    const char *iconLarge;
-    const char *iconSmall;
-    const char *iconHexagon;
-    const char *label;
-    const char *uid;
-} AppItem;
-
-enum AppListStyle {
-    APPLIST_STYLE,
-    HEXAGONS_STYLE,
-    FOOTBALL_STYLE,
-    WATERFALL_STYLE
-};
-
-class ApplistPresenter;
-class ApplistModel {
-public:
-    static ApplistModel &GetInstance(void);
-
-    void Init();
-    const AppItem *GetApplistItems() const;
-    uint8 GetAppListNum() const;
-    void ResolvingJSAppItems(void);
-    void SetStartIndex(uint16_t index);
-    uint16_t GetStartIndex(void);
-    void SetHeadItemY(int index);
-    int GetHeadItemY(void);
-    void ApplistUpdate(void);
-    void SetPresenter(ApplistPresenter *p);
-    AppListStyle GetCurrentStyle(void);
-    void SetInitFlag(bool flag);
-
-private:
-    ApplistModel();
-    ApplistModel(const ApplistModel &);
-    ApplistModel &operator=(const ApplistModel &);
-    virtual ~ApplistModel();
-    ApplistPresenter *presenter{nullptr};
-
-    AppItem applist[APP_MAX_NUM] = { VIEW_INVALID, nullptr, nullptr, nullptr, nullptr, nullptr };
-    BundleInfo *bundleInfos = nullptr;
-    int32 bundleLen = 0;
-    uint8 appLen = 0;
-
-    uint16_t startIndex = 0;
-    int headItemY = 0;
-    bool initFlag{false};
-};
-}
-
-#endif
index e4193a9..f5dca80 100644 (file)
@@ -5,7 +5,8 @@
  * Create: 2021-09-18
  */
 
-#include "AppItemView.h"
+#include "applist/AppItemView.h"
+#include "common/image_cache_manager.h"
 #include "wearable_log.h"
 
 namespace OHOS {
@@ -33,6 +34,9 @@ namespace OHOS {
     {
         Remove(&icon_);
         Remove(&label_);
+        if (itemInfo_.iconSmall == nullptr && itemInfo_.resPath != nullptr) {
+            ImageCacheManager::GetInstance().UnloadOneInMultiRes(itemInfo_.resId, itemInfo_.resPath);
+        }
     }
 
     void AppItemView::SetUpChild()
@@ -56,8 +60,25 @@ namespace OHOS {
     void AppItemView::SetItemInfo(const AppItem &itemInfo)
     {
         itemInfo_ = itemInfo;
-        icon_.SetSrc(itemInfo.iconSmall);
-        label_.SetText(itemInfo.label);
+        if (itemInfo.label == nullptr) {
+            if (itemInfo.labelId != STR_MAX_ID) {
+                label_.SetTextId(itemInfo.labelId);
+            } else {
+                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "AppItemView::SetItemInfo label is null and labelId equal STR_MAX_ID!");
+            }
+        } else {
+            label_.SetText(itemInfo.label);
+        }
+        if (itemInfo.iconSmall == nullptr && itemInfo_.resPath != nullptr) {
+            ImageInfo* image = ImageCacheManager::GetInstance().LoadOneInMultiRes(itemInfo.resId, itemInfo.resPath);
+            if (image != nullptr) {
+                icon_.SetSrc(image);
+            } else {
+                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "AppItemView::SetItemInfo image get failed!");
+            }
+        } else {
+            icon_.SetSrc(itemInfo.iconSmall);
+        }
     }
 
     AppViewId AppItemView::GetViewId()
@@ -88,6 +109,9 @@ namespace OHOS {
 
     HexagonsItemView::~HexagonsItemView()
     {
+        if (itemInfo_.iconSmall == nullptr && itemInfo_.resPath != nullptr) {
+            ImageCacheManager::GetInstance().UnloadOneInMultiRes(itemInfo_.resId, itemInfo_.resPath);
+        }
     }
 
     void HexagonsItemView::SetItemInfo(const AppItem &itemInfo)
@@ -105,6 +129,13 @@ namespace OHOS {
         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;
@@ -119,6 +150,13 @@ namespace OHOS {
     {
         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)
     {
index c5a7339..b3eabbb 100644 (file)
 #include "utils.h"
 #include "bundlems_slite_client.h"
 #include "wearable_log.h"
-
 #include "UiConfig.h"
-#include "ApplistModel.h"
-#include "ApplistPresenter.h"
-#include "SetDesktopView.h"
+#include "applist/ApplistModel.h"
+#include "applist/ApplistPresenter.h"
+#include "font/font_global_manager.h"
+#include "settings/SetDesktopModel.h"
 #include "NativeRegisterManager.h"
 
 namespace OHOS {
@@ -96,7 +96,6 @@ namespace OHOS {
                 applist[appLen] = {
                     VIEW_EXTERN_APP,
                     bundleInfos[len].smallIconPath,
-                    bundleInfos[len].smallIconPath,
                     bundleInfos[len].bigIconPath,
                     bundleInfos[len].label,
                     bundleInfos[len].bundleName
@@ -163,15 +162,6 @@ namespace OHOS {
 
     AppListStyle ApplistModel::GetCurrentStyle(void)
     {
-        uint8_t currenStyle = SetDesktopView::GetInstance()->GetCurrentSelectedStyle();
-        if (currenStyle == 1) { // 1: hexagons desktop style
-            return HEXAGONS_STYLE;
-        } else if (currenStyle == 2) { // 2: football desktop style
-            return FOOTBALL_STYLE;
-        } else if (currenStyle == 3) { // 3: waterfall desktop style
-            return WATERFALL_STYLE;
-        } else {
-            return APPLIST_STYLE;
-        }
+        return static_cast<AppListStyle>(SetDesktopModel::GetInstance().GetDesktopStyle());
     }
 }
index 3442b14..382786a 100644 (file)
@@ -5,7 +5,7 @@
  * Create: 2021-09-18
  */
 
-#include "ApplistPresenter.h"
+#include "applist/ApplistPresenter.h"
 #include "ability_manager.h"
 #include "securec.h"
 #include "components/ui_hexagons_list.h"
@@ -44,7 +44,6 @@ REGIST_SLICE(VIEW_APPLIST, ApplistView, ApplistPresenter);
 
     void ApplistPresenter::OnResume()
     {
-        Presenter::OnResume();
         if (GetCurrentStyle() == AppListStyle::FOOTBALL_STYLE) {
             view_->StartFootBallAnimator();
         } else if  (GetCurrentStyle() == AppListStyle::WATERFALL_STYLE) {
index 11876d2..fbb1880 100644 (file)
@@ -6,10 +6,11 @@
  */
 
 #include "components/ui_view_group.h"
-#include "ApplistView.h"
-#include "ApplistPresenter.h"
-#include "AppItemView.h"
+#include "applist/ApplistView.h"
+#include "applist/ApplistPresenter.h"
+#include "applist/AppItemView.h"
 #include "common/image_cache_manager.h"
+#include "common/screen.h"
 #include "hal_tick.h"
 
 namespace OHOS {
@@ -264,13 +265,27 @@ void ApplistView::ListStyleOnStop()
     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);
+        return;
+    }
+    view->SetSrc(image);
+}
+
 void ApplistView::AddAppItemToList(const AppItem &item)
 {
     AppListStyle style = presenter_->GetCurrentStyle();
     if (style == AppListStyle::FOOTBALL_STYLE) {
         FootballItemView *itemView = new FootballItemView();
         itemView->SetItemInfo(item);
-        itemView->SetSrc(item.iconHexagon);
+        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);
@@ -278,7 +293,11 @@ void ApplistView::AddAppItemToList(const AppItem &item)
     } else if (style == AppListStyle::HEXAGONS_STYLE) {
         HexagonsItemView *itemView = new HexagonsItemView();
         itemView->SetItemInfo(item);
-        itemView->SetSrc(item.iconSmall);
+        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);
@@ -286,7 +305,11 @@ void ApplistView::AddAppItemToList(const AppItem &item)
     } else if (style == AppListStyle::WATERFALL_STYLE) {
         WaterfallItemView *itemView = new WaterfallItemView();
         itemView->SetItemInfo(item);
-        itemView->SetSrc(item.iconSmall);
+        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);
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/blood/src/BloodModel.cpp b/code/sdk/application/wearable/nativeapp/nativeui/blood/src/BloodModel.cpp
new file mode 100644 (file)
index 0000000..692d2d9
--- /dev/null
@@ -0,0 +1,133 @@
+/*\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
+ * 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
+\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
+\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
+\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
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/blood/src/BloodPresenter.cpp b/code/sdk/application/wearable/nativeapp/nativeui/blood/src/BloodPresenter.cpp
new file mode 100644 (file)
index 0000000..5e98671
--- /dev/null
@@ -0,0 +1,89 @@
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SettingPresenter.cpp\r
+ * Author:\r
+ * Create: 2025-03-23\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
+\r
+}\r
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/blood/src/BloodView.cpp b/code/sdk/application/wearable/nativeapp/nativeui/blood/src/BloodView.cpp
new file mode 100644 (file)
index 0000000..05a7801
--- /dev/null
@@ -0,0 +1,603 @@
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SettingView.cpp\r
+ * Author:\r
+ * Create: 2025-03-23\r
+ */\r
+\r
+#include <string>\r
+\r
+#include "blood/BloodView.h"\r
+#include "blood/BloodPresenter.h"\r
+#include "ui_test_group.h"\r
+\r
+namespace OHOS {\r
+static BloodView *g_pBloodView = nullptr;\r
+static const char *BLOOD_LABEL_TWO = (char *)"本功能用于18岁以上健康人群测量运动过程,及之后腕部皮肤温度和体温的变化,"\r
+                                             "请加入研究,以便及时观察运动前后身体的变化。";\r
+static const char *BLOOD_LABEL_THREE = (char *)"测量需佩戴10分钟以上,且容易受到环境因素影响。目前达不到水银体温计的精"\r
+                                               "度,测量结果仅供参考,不作为医疗诊断依据。";\r
+static constexpr uint16_t BLOOD_FIRST_LABEL_FONT = 35;\r
+static constexpr uint16_t BLOOD_LABEL_FIRST_X = 45;\r
+static constexpr uint16_t BLOOD_LABEL_FIRST_Y = 120;\r
+static constexpr uint16_t BLOOD_LABEL_SECOND_Y = 350;\r
+static constexpr uint16_t BLOOD_LABEL_THIRD_Y = 650;\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_IMAGE_POSITION_X = 92;\r
+static constexpr uint16_t BLOOD_IMAGE_POSITION_y = 127;\r
+static constexpr uint16_t BLOOD_IMAGE_WIDTH = 276;\r
+static constexpr uint16_t BLOOD_IMAGE_HEIGHT = 125;\r
+static const char *BLOOD_LABEL_ONE =\r
+    (char *)"本功能通过内置温度传感器测量腕部皮肤温度,主要研究腕部皮肤温度和体温的关系。";\r
+static constexpr uint16_t WATCH_TIME_LABEL_CURTIME_XPOS = 188;\r
+static constexpr uint16_t WATCH_TIME_LABEL_CURTIME_YPOS = 12;\r
+static constexpr uint16_t WATCH_TIME_LABEL_CURTIME_WIDTH = 361;\r
+static constexpr uint16_t WATCH_TIME_LABEL_CURTIME_HEIGHT = 80;\r
+static constexpr uint16_t WATCH_TIME_LABEL_CURTIME_FONT_SIZE = 40;\r
+static constexpr uint16_t BLOOD_LAYOUT_POSITION_X = 370;\r
+static constexpr uint16_t BLOOD_LAYOUT_WIDTH = 320;\r
+static constexpr uint16_t BLOOD_BUTTON_POSITION_X = 188;\r
+static constexpr uint16_t BLOOD_BUTTON_POSITION_Y = 320;\r
+static constexpr uint16_t BLOOD_BUTTON_WIDTH = 180;\r
+static constexpr uint16_t BLOOD_BUTTON_HEIGHT = 80;\r
+static constexpr uint16_t BLOOD_BUTTON_TWO_POSITION_Y = 330;\r
+static constexpr uint16_t BLOOD_BUTTON_TWO_WIDTH = 120;\r
+static constexpr uint16_t BLOOD_LABEL_FRONT = 25;\r
+static constexpr uint16_t BLOOD_LABEL1_POSITION_X = 150;\r
+static constexpr uint16_t BLOOD_LABEL1_POSITION_Y = 161;\r
+static constexpr uint16_t BLOOD_LABEL1_WIDTH = 200;\r
+static constexpr uint16_t BLOOD_LABEL1_HEIGHT = 60;\r
+static constexpr uint16_t BLOOD_LABEL_FRONT1 = 60;\r
+static constexpr uint16_t BLOOD_LABEL2_POSITION_X = 150;\r
+static constexpr uint16_t BLOOD_LABEL2_POSITION_Y = 132;\r
+static constexpr uint16_t BLOOD_LABEL2_WIDTH = 200;\r
+static constexpr uint16_t BLOOD_LABEL2_HEIGHT = 60;\r
+static constexpr uint16_t BLOOD_IMAGEANIMATOR_POSITION_X = 84;\r
+static constexpr uint16_t BLOOD_IMAGEANIMATOR_POSITION_Y = 108;\r
+static constexpr uint16_t BLOOD_IMAGEANIMATOR_WIDTH = 100;\r
+static constexpr uint16_t BLOOD_IMAGEANIMATOR_HEIGHT = 100;\r
+\r
+static ImageAnimatorInfo g_imageAnimatorInfo[4] = {\r
+    {PNG_SETTTING_BUTTON_IMAGE, {84, 108}, 116, 116, IMG_SRC_FILE_PATH},\r
+    {PNG_NEW_DEVICE, {84, 108}, 116, 116, IMG_SRC_FILE_PATH},\r
+    {PNG_BT_LIST, {84, 108}, 116, 116, IMG_SRC_FILE_PATH},\r
+    {PNG_GANTAN, {84, 108}, 116, 116, IMG_SRC_FILE_PATH},\r
+};\r
+\r
+BloodView::BloodView()\r
+{\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BloodView::BloodView");\r
+    g_pBloodView = this;\r
+    findPhoneModel = &BloodModel::GetInstance();\r
+}\r
+\r
+BloodView::~BloodView()\r
+{\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BloodView::~BloodView");\r
+    g_pBloodView = nullptr;\r
+    if (currentTime_ != nullptr) {\r
+        delete currentTime_;\r
+        currentTime_ = nullptr;\r
+    }\r
+    if (button != nullptr) {\r
+        delete button;\r
+        button = nullptr;\r
+    }\r
+    if (buttonMore != nullptr) {\r
+        delete buttonMore;\r
+        buttonMore = nullptr;\r
+    }\r
+    if (label1_ != nullptr) {\r
+        delete label1_;\r
+        label1_ = nullptr;\r
+    }\r
+    if (label2_ != nullptr) {\r
+        delete label2_;\r
+        label2_ = nullptr;\r
+    }\r
+    if (layout_ != nullptr) {\r
+        delete layout_;\r
+        layout_ = nullptr;\r
+    }\r
+    if (currentTime_ != nullptr) {\r
+        delete currentTime_;\r
+        currentTime_ = nullptr;\r
+    }\r
+    if (group != nullptr) {\r
+        delete group;\r
+        group = nullptr;\r
+    }\r
+    if (groupTest != nullptr) {\r
+        delete groupTest;\r
+        groupTest = nullptr;\r
+    }\r
+    if (scrollGroup != nullptr) {\r
+        delete scrollGroup;\r
+        scrollGroup = nullptr;\r
+    }\r
+    for (int16_t numGroup = SET_ZERO; numGroup <= MAX_BLOOD_PAGE; numGroup++) {\r
+        if (container[numGroup] != nullptr) {\r
+            container[numGroup] = nullptr;\r
+        }\r
+    }\r
+}\r
+\r
+BloodView *BloodView::GetInstance()\r
+{\r
+    return g_pBloodView;\r
+}\r
+\r
+void BloodView::OnStart()\r
+{\r
+    SetupCurrentTime();\r
+    InitStart();\r
+}\r
+\r
+void BloodView::OnStop()\r
+{\r
+    if (dragListener_ != nullptr) {\r
+        delete dragListener_;\r
+        dragListener_ = nullptr;\r
+    }\r
+    return;\r
+}\r
+\r
+void BloodView::SetupCurrentTime()\r
+{\r
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BloodView::SetupCurrentTime new Label");\r
+    currentTime_ = new UILabel();\r
+    if (currentTime_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BloodView::SetupCurrentTime new Label currentTime_ fail");\r
+        return;\r
+    }\r
+    currentTime_->SetPosition(WATCH_TIME_LABEL_CURTIME_XPOS, WATCH_TIME_LABEL_CURTIME_YPOS);\r
+    currentTime_->Resize(WATCH_TIME_LABEL_CURTIME_WIDTH, WATCH_TIME_LABEL_CURTIME_HEIGHT);\r
+    std::string curtime = BloodModel::GetInstance().GetCurrentTimeString();\r
+    currentTime_->SetText(curtime.c_str());\r
+    currentTime_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, WATCH_TIME_LABEL_CURTIME_FONT_SIZE);\r
+    currentTime_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+    currentTime_->SetLineBreakMode(UILabel::LINE_BREAK_ADAPT);\r
+    currentTime_->SetRollSpeed(0);\r
+    currentTime_->SetVisible(true);\r
+}\r
+\r
+void BloodView::SetUpImageAnimator()\r
+{\r
+    imageAnimator_ = new UIImageAnimatorView();\r
+    if (imageAnimator_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BloodView::UIImageAnimatorView new Label currentTime_ fail");\r
+        return;\r
+    }\r
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BloodView::SetUpImageAnimator ");\r
+    imageAnimator_ = new UIImageAnimatorView();\r
+    imageAnimator_->SetPosition(BLOOD_IMAGE_POSITION_X, BLOOD_IMAGE_POSITION_y, BLOOD_IMAGE_WIDTH,\r
+                                BLOOD_IMAGE_HEIGHT);  // 50 : offset 50 : offset 200 : offset 200: offset\r
+    int imageNumber = 4;\r
+    int ImageUpdate = 300;\r
+    imageAnimator_->SetImageAnimatorSrc(g_imageAnimatorInfo, imageNumber,\r
+                                        ImageUpdate);  // 4: the number of images, 100: updating time\r
+    imageAnimator_->Stop();\r
+    imageAnimator_->LayoutCenterOfParent();\r
+    imageAnimator_->SetDraggable(true);\r
+    UIView::OnDragListener *listener = static_cast<UIView::OnDragListener *>(BloodPresenter::GetInstance());\r
+    imageAnimator_->SetOnDragListener(listener);\r
+    container[BLOOD_START]->Add(imageAnimator_);\r
+    if (layout_ == nullptr) {\r
+        layout_ = new GridLayout();\r
+        uint16_t height = Screen::GetInstance().GetHeight();\r
+\r
+        int heightOffset = 50;\r
+        layout_->SetPosition(BLOOD_LAYOUT_POSITION_X, 0, BLOOD_LAYOUT_WIDTH,\r
+                             height - heightOffset);  // 370: x , 320: width, 50: offset\r
+        container[BLOOD_START]->Add(layout_);\r
+        layout_->SetLayoutDirection(LAYOUT_VER);\r
+        layout_->SetRows(SET_NINE);  // 9 : rows\r
+        layout_->SetCols(SET_TWO);   // 2 : columns\r
+    }\r
+    InitImageInfo();\r
+}\r
+\r
+void BloodView::InitStart()\r
+{\r
+    if (group == nullptr) {\r
+        group = new UIViewGroup();\r
+    }\r
+    group->SetPosition(0, 0);\r
+    group->Resize(VERTICAL_RESOLUTION, HORIZONTAL_RESOLUTION);\r
+    UIView::OnDragListener *dragListener = static_cast<UIView::OnDragListener *>(BloodPresenter::GetInstance());\r
+    if (dragListener == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "start dragListener = nullptr");\r
+    }\r
+    group->SetOnDragListener(dragListener);\r
+    group->SetViewId("startPage");\r
+    group->SetDraggable(true);\r
+    group->SetTouchable(true);\r
+\r
+    if (button == nullptr) {\r
+        button = new UILabelButton();\r
+    }\r
+    button->SetPosition(BLOOD_BUTTON_POSITION_X,\r
+                        BLOOD_BUTTON_TWO_POSITION_Y);             // widget's left position and top position\r
+    button->Resize(BLOOD_BUTTON_TWO_WIDTH, BLOOD_BUTTON_HEIGHT);  // widget's width and height\r
+    button->SetViewId("button1");                                 // Set style\r
+    UIView::OnClickListener *clickListener = (UIView::OnClickListener *)(BloodPresenter::GetInstance());\r
+    button->SetOnClickListener(clickListener);\r
+    button->SetStyleForState(STYLE_BORDER_COLOR, 0xff0b1928, UIButton::PRESSED);\r
+    button->SetVisible(true);\r
+    button->SetText("开始");\r
+\r
+    group->Add(currentTime_);\r
+    group->Add(button);\r
+    container[BLOOD_START] = group;\r
+\r
+    AddViewToRootContainer(container[BLOOD_START]);\r
+    GetRootContainer()->Invalidate();\r
+}\r
+\r
+void BloodView::InitTest()\r
+{\r
+    if (groupTest == nullptr) {\r
+        groupTest = new UIViewGroup();\r
+    }\r
+    groupTest->SetPosition(0, 0);\r
+    groupTest->Resize(VERTICAL_RESOLUTION, HORIZONTAL_RESOLUTION);\r
+\r
+    UIView::OnDragListener *dragListener = static_cast<UIView::OnDragListener *>(BloodPresenter::GetInstance());\r
+    if (dragListener == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "init test dragListener = nullptr");\r
+    }\r
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "init test dragListener successful");\r
+\r
+    groupTest->SetOnDragListener(dragListener);\r
+    groupTest->SetViewId("testPage");\r
+    groupTest->SetDraggable(true);\r
+    groupTest->SetTouchable(true);\r
+\r
+    if (label1_ == nullptr) {\r
+        label1_ = new UILabel();\r
+    }\r
+\r
+    label1_->SetPosition(BLOOD_LABEL1_POSITION_X, BLOOD_LABEL1_POSITION_Y);  // widget's left position and top position\r
+    label1_->Resize(BLOOD_LABEL1_WIDTH, BLOOD_LABEL1_HEIGHT);                // widget's width and height\r
+    label1_->SetViewId("label1");                                            // Set style\r
+    label1_->SetStyle(STYLE_TEXT_FONT, BLOOD_LABEL_FRONT1);\r
+\r
+    // Set additional property\r
+    label1_->SetText("99%");\r
+    label1_->SetLineBreakMode(UILabel::LINE_BREAK_ADAPT);\r
+    label1_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+    label1_->SetRollSpeed(0);\r
+    label1_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, BLOOD_LABEL_FRONT1);\r
+\r
+    // Add to rootView\r
+    label1_->SetVisible(true);\r
+\r
+    // Add Label to App\r
+    if (label2_ == nullptr) {\r
+        label2_ = new UILabel();\r
+    }\r
+\r
+    label2_->SetPosition(BLOOD_LABEL2_POSITION_X, BLOOD_LABEL2_POSITION_Y);  // widget's left position and top position\r
+    label2_->Resize(BLOOD_LABEL2_WIDTH, BLOOD_LABEL2_HEIGHT);                // widget's width and height\r
+    label2_->SetViewId("label1");                                            // Set style\r
+    label2_->SetStyle(STYLE_TEXT_FONT, BLOOD_LABEL_FRONT);\r
+\r
+    // Set additional property\r
+    label2_->SetText("血氧");\r
+    label2_->SetLineBreakMode(UILabel::LINE_BREAK_ADAPT);\r
+    label2_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+    label2_->SetRollSpeed(0);\r
+    label2_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, BLOOD_LABEL_FRONT);\r
+    label2_->SetVisible(true);\r
+\r
+    // Add to rootView\r
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "init test label successful");\r
+\r
+    if (buttonMore == nullptr) {\r
+        buttonMore = new UILabelButton();\r
+    }\r
+\r
+    buttonMore->SetPosition(BLOOD_BUTTON_POSITION_X,\r
+                            BLOOD_BUTTON_POSITION_Y);             // widget's left position and top position\r
+    buttonMore->Resize(BLOOD_BUTTON_WIDTH, BLOOD_BUTTON_HEIGHT);  // widget's width and height\r
+    buttonMore->SetViewId("button2");                             // Set style\r
+    UIView::OnClickListener *clickListener = (UIView::OnClickListener *)(BloodPresenter::GetInstance());\r
+    buttonMore->SetOnClickListener(clickListener);\r
+    buttonMore->SetStyleForState(STYLE_BORDER_COLOR, 0xff0b1928, UIButton::PRESSED);\r
+    buttonMore->SetVisible(true);\r
+    buttonMore->SetText("了解更多");\r
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "init test button successful");\r
+\r
+    groupTest->Add(label1_);\r
+    groupTest->Add(label2_);\r
+    groupTest->Add(currentTime_);\r
+    groupTest->Add(buttonMore);\r
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "init test add button successful");\r
+}\r
+\r
+void BloodView::InitMore()\r
+{\r
+    if (scrollGroup == nullptr) {\r
+        scrollGroup = new UIScrollView();\r
+    }\r
+    scrollGroup->Add(currentTime_);\r
+\r
+    scrollGroup->SetViewId("moreGroup");\r
+    scrollGroup->SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);\r
+    scrollGroup->SetThrowDrag(true);\r
+    scrollGroup->SetScrollBlankSize(50);  // 50:font size\r
+    UIView::OnDragListener *listener = static_cast<UIView::OnDragListener *>(BloodPresenter::GetInstance());\r
+    scrollGroup->SetOnDragListener(listener);\r
+    scrollGroup->SetDraggable(true);\r
+    scrollGroup->SetTouchable(true);\r
+    if (!InitSimilarLabel(SET_ZERO, BLOOD_LABEL_FIRST_Y, BLOOD_LABEL_ONE)) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "TempJoinStudy::TempInitLabel new tempLabel[SET_ZERO] error");\r
+    }\r
+    if (!InitSimilarLabel(SET_ONE, BLOOD_LABEL_SECOND_Y, BLOOD_LABEL_TWO)) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "TempJoinStudy::TempInitLabel new tempLabel[SET_ONE] error");\r
+    }\r
+    if (!InitSimilarLabel(SET_TWO, BLOOD_LABEL_THIRD_Y, BLOOD_LABEL_THREE)) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "TempJoinStudy::TempInitLabel new tempLabel[SET_ONE] error");\r
+    }\r
+}\r
+\r
+bool BloodView::InitSimilarLabel(int16 num, int16 labelY, const char *labelText)\r
+{\r
+    tempLabel[num] = new UILabel();\r
+    if (tempLabel[num] == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "TempJoinStudy::TempInitLabel new tempLabel[%d] error", num);\r
+        return false;\r
+    }\r
+    tempLabel[num]->SetPosition(BLOOD_LABEL_FIRST_X, labelY, BLOOD_LABEL_FIRST_WIDTH, BLOOD_LABEL_FIRST_HEIGHT);\r
+    tempLabel[num]->SetLineBreakMode(UILabel::LINE_BREAK_WRAP);\r
+    tempLabel[num]->SetText(labelText);\r
+    tempLabel[num]->SetFont(DEFAULT_VECTOR_FONT_FILENAME, BLOOD_FIRST_LABEL_FONT);\r
+    scrollGroup->Add(tempLabel[num]);\r
+\r
+    return true;\r
+}\r
+\r
+bool BloodView::TempInitLabel(void)\r
+{\r
+    scrollGroup->Add(currentTime_);\r
+    UIView::OnDragListener *dragListener = static_cast<UIView::OnDragListener *>(BloodPresenter::GetInstance());\r
+    if (dragListener == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "init more dragListener = nullptr");\r
+    }\r
+    if (!InitSimilarLabel(SET_ZERO, BLOOD_LABEL_FIRST_Y, BLOOD_LABEL_ONE)) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "TempJoinStudy::TempInitLabel new tempLabel[SET_ZERO] error");\r
+        return false;\r
+    }\r
+    if (!InitSimilarLabel(SET_ONE, BLOOD_LABEL_SECOND_Y, BLOOD_LABEL_TWO)) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "TempJoinStudy::TempInitLabel new tempLabel[SET_ONE] error");\r
+        return false;\r
+    }\r
+    if (!InitSimilarLabel(SET_TWO, BLOOD_LABEL_THIRD_Y, BLOOD_LABEL_THREE)) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "TempJoinStudy::TempInitLabel new tempLabel[SET_ONE] error");\r
+        return false;\r
+    }\r
+    return true;\r
+}\r
+\r
+void BloodView::InitImageInfo()\r
+{\r
+    const uint16_t pixelByteSize = 4;  // 4: bytes per pixel\r
+    const uint16_t width = 100;        // 100: image's width\r
+    const uint16_t height = 100;       // 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
+        return;\r
+    }\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 + 2] = 0;           // 2: set red channel\r
+        srcData1[i + 3] = OPA_OPAQUE;  // 3: set alpha channel\r
+    }\r
+    imageInfo1_ = static_cast<ImageInfo *>(UIMalloc(sizeof(ImageInfo)));\r
+    if (imageInfo1_ == nullptr) {\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
+        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 + 2] = 0;           // 2: set red channel\r
+        srcData2[i + 3] = OPA_OPAQUE;  // 3: set alpha channel\r
+    }\r
+\r
+    imageInfo2_ = static_cast<ImageInfo *>(UIMalloc(sizeof(ImageInfo)));\r
+    if (imageInfo2_ == nullptr) {\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
+        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 + 2] = SET_INT_MAX;         // 2: set red channel 255: pixel value\r
+        srcData3[i + 3] = OPA_OPAQUE;  // 3: set alpha channel\r
+    }\r
+\r
+    imageInfo3_ = static_cast<ImageInfo *>(UIMalloc(sizeof(ImageInfo)));\r
+    if (imageInfo3_ == nullptr) {\r
+        UIFree(srcData3);\r
+        UIFree(imageInfo2_);\r
+        UIFree(srcData2);\r
+        UIFree(imageInfo1_);\r
+        UIFree(srcData1);\r
+        return;\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 = {BLOOD_IMAGEANIMATOR_POSITION_X, BLOOD_IMAGEANIMATOR_POSITION_Y};\r
+    imageAnimatorImageInfo_[0].width = BLOOD_IMAGEANIMATOR_WIDTH;   // 100: width value\r
+    imageAnimatorImageInfo_[0].height = BLOOD_IMAGEANIMATOR_HEIGHT;  // 100: height value\r
+    imageAnimatorImageInfo_[0].imageType = IMG_SRC_IMAGE_INFO;\r
+\r
+    imageAnimatorImageInfo_[1].imageInfo = imageInfo2_;\r
+    imageAnimatorImageInfo_[1].pos = {BLOOD_IMAGEANIMATOR_POSITION_X, BLOOD_IMAGEANIMATOR_POSITION_Y};\r
+    imageAnimatorImageInfo_[1].width = BLOOD_IMAGEANIMATOR_WIDTH;   // 100: width value\r
+    imageAnimatorImageInfo_[1].height = BLOOD_IMAGEANIMATOR_HEIGHT;  // 100: height value\r
+    imageAnimatorImageInfo_[1].imageType = IMG_SRC_IMAGE_INFO;\r
+\r
+    imageAnimatorImageInfo_[2].imageInfo = imageInfo3_;         // 2: image index\r
+    imageAnimatorImageInfo_[2].pos = {BLOOD_IMAGEANIMATOR_POSITION_X, BLOOD_IMAGEANIMATOR_POSITION_Y};                 // 2: image index\r
+    imageAnimatorImageInfo_[2].width = BLOOD_IMAGEANIMATOR_WIDTH;                     // 2: image index, 100: width value\r
+    imageAnimatorImageInfo_[2].height = BLOOD_IMAGEANIMATOR_HEIGHT;                    // 2: image index, 100: height value\r
+    imageAnimatorImageInfo_[2].imageType = IMG_SRC_IMAGE_INFO;  // 2: image index\r
+}\r
+\r
+void BloodView::UpdateCurrentTimeLabel(const char *currentTime)\r
+{\r
+    currentTime_->SetText(currentTime);\r
+    currentTime_->Invalidate();\r
+}\r
+\r
+bool BloodView::IsCurrentTimeLabelValid()\r
+{\r
+    return currentTime_ != nullptr ? true : false;\r
+}\r
+\r
+void BloodView::DropView(UIView &view, int type)\r
+{\r
+    if (type == 0) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BloodView::DropView::container[WEATHER_ondrop]-0");\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BloodView::DropView::container[WEATHER_ondrop] view name :%s",\r
+                      view.GetViewId());\r
+        if (&view == container[BLOOD_START]) {\r
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BloodView::DropView::container[CHANGE_INTERFACE_CONFIG]-0");\r
+            NativeAbility::GetInstance().ChangeSlice(VIEW_APPLIST);\r
+        } else if (&view == container[BLOOD_TEST]) {\r
+            ChangeView(BLOOD_TEST, BLOOD_START);\r
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BloodView::DropView::container[BLOOD_START]-0");\r
+        } else if (&view == container[BLOOD_MORE]) {\r
+            ChangeView(BLOOD_MORE, BLOOD_TEST);\r
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BloodView::DropView::container[WEATHER_SCROLL]-0");\r
+        }\r
+    } else if (type == 1) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BloodView::DropView::container[WEATHER_ondrop] view name :%s",\r
+                      view.GetViewId());\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BloodView::DropView::container[WEATHER_ondrop]-1");\r
+        if (&view == button || view.GetViewId() == "button1") {\r
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BloodView::DropView::container[WEATHER_SWIPE]-1");\r
+            ChangeView(BLOOD_START, BLOOD_TEST);\r
+        } else if (&view == buttonMore || view.GetViewId() == "button1") {\r
+            ChangeView(BLOOD_TEST, BLOOD_MORE);\r
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BloodView::DropView::container[WEATHER_SCROLL]-1");\r
+        } else if (&view == container[BLOOD_MORE]) {\r
+        }\r
+    }\r
+}\r
+\r
+bool BloodView::ChangeBloodStart(int16_t thisView)\r
+{\r
+    if (container[thisView] == nullptr) {\r
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BloodView::WeatherGroupView");\r
+        AddViewToRootContainer(container[thisView]);\r
+    }\r
+    return true;\r
+}\r
+\r
+bool BloodView::ChangeBloodTest(int16_t thisView)\r
+{\r
+    if (container[thisView] == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BloodView::ChangeBloodTest");\r
+        InitTest();\r
+        container[thisView] = groupTest;\r
+        AddViewToRootContainer(container[thisView]);\r
+    }\r
+    return true;\r
+}\r
+\r
+bool BloodView::ChangeBloodMore(int16_t thisView)\r
+{\r
+    if (container[thisView] == nullptr) {\r
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BloodView::WeatherScrollView");\r
+        InitMore();\r
+        container[thisView] = scrollGroup;\r
+        AddViewToRootContainer(container[thisView]);\r
+    }\r
+    return true;\r
+}\r
+\r
+struct BloodViewMapper {\r
+    uint16_t viewId;\r
+    bool (BloodView::*func)(int16 thisView);\r
+};\r
+\r
+static const BloodViewMapper ViewMapper[] = {\r
+    {BLOOD_START, &BloodView::ChangeBloodStart},\r
+    {BLOOD_TEST, &BloodView::ChangeBloodTest},\r
+    {BLOOD_MORE, &BloodView::ChangeBloodMore},\r
+};\r
+\r
+bool BloodView::ClickFunc(int16 interf)\r
+{\r
+    int funcSize = sizeof(ViewMapper) / sizeof(ViewMapper[0]);\r
+    for (int i = 0; i < funcSize; i++) {\r
+        if (interf == ViewMapper[i].viewId) {\r
+            bool jug = (this->*(ViewMapper[i].func))(interf);\r
+            if (!jug) {\r
+                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BloodView:: ChangeInterFace[%d] false", interf);\r
+                return false;\r
+            }\r
+            return true;\r
+        }\r
+    }\r
+    return false;\r
+}\r
+\r
+void BloodView::ChangeView(int16 hideView, int16 showView)\r
+{\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BloodView::ChangeView hideView = %d, showView = %d", hideView, showView);\r
+    if (hideView > MAX_BLOOD_PAGE) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BloodView::ChangeView Overstep ones bounds");\r
+        return;\r
+    }\r
+    if (!ClickFunc(showView)) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BloodView::ChangeView ClickFunc ercror");\r
+        return;\r
+    }\r
+    container[hideView]->SetVisible(false);\r
+    container[showView]->SetVisible(true);\r
+    Draw();\r
+    return;\r
+}\r
+}\r
index 656cf1b..894ffd6 100644 (file)
@@ -6,8 +6,8 @@
  */\r
 #include "UiConfig.h"\r
 #include "wearable_log.h"\r
-#include "BloodBandoffView.h"\r
-#include "BloodOxygenModel.h"\r
+#include "bloodoxygen/BloodBandoffView.h"\r
+#include "bloodoxygen/BloodOxygenModel.h"\r
 \r
 namespace OHOS {\r
 // 动态显示图片设置\r
index c6f083a..edad793 100644 (file)
@@ -5,7 +5,7 @@
  * Create: 2021-08-01\r
  */\r
 \r
-#include "BloodOxygenModel.h"\r
+#include "bloodoxygen/BloodOxygenModel.h"\r
 \r
 namespace OHOS {\r
 BloodOxygenModel::BloodOxygenModel()\r
index c7bcfe3..84d8e08 100644 (file)
@@ -5,14 +5,14 @@
  * Create: 2021-08-01\r
  */\r
 \r
-#include "BloodOxygenPresenter.h"\r
+#include "bloodoxygen/BloodOxygenPresenter.h"\r
 #include "common/task_manager.h"\r
-#include "BloodOxygenView.h"\r
-#include "BloodOxygenModel.h"\r
+#include "bloodoxygen/BloodOxygenView.h"\r
+#include "bloodoxygen/BloodOxygenModel.h"\r
 #include "components/ui_label.h"\r
-#include "BloodBandoffView.h"\r
+#include "bloodoxygen/BloodBandoffView.h"\r
 #include "ChangeSliceListener.h"\r
-#include "ui_service.h"\r
+#include "uiservice/ui_service.h"\r
 #include "NativeRegisterManager.h"\r
 \r
 namespace OHOS {\r
index d6ee39a..5b2ade8 100644 (file)
@@ -5,8 +5,8 @@
  * Create: 2021-08-01\r
  */\r
 \r
-#include "BloodOxygenView.h"\r
-#include "BloodOxygenModel.h"\r
+#include "bloodoxygen/BloodOxygenView.h"\r
+#include "bloodoxygen/BloodOxygenModel.h"\r
 \r
 namespace OHOS {\r
 // 按钮设置\r
index 763f631..06dc76b 100644 (file)
@@ -5,13 +5,13 @@
  * Create: 2021-07-26
  */
 #include <string>
-#include "BluetoothCaseListAdapter.h"
-#include "BluetoothEarPhoneView.h"
+#include "bluetooth/BluetoothCaseListAdapter.h"
+#include "bluetooth/BluetoothEarPhoneView.h"
 #include "gfx_utils/list.h"
-#include "PlayersPresenter.h"
+#include "player/PlayersPresenter.h"
 #include "wearable_log.h"
 #include "UiConfig.h"
-#include "BluetoothModel.h"
+#include "bluetooth/BluetoothModel.h"
 
 namespace OHOS {
 BluetoothCaseListAdapter::~BluetoothCaseListAdapter()
index f2950ec..ed234cc 100644 (file)
@@ -5,13 +5,13 @@
  * Create: 2021-07-26
  */
 #include <string>
-#include "BluetoothDeviceCaseListAdapter.h"
-#include "BluetoothOptionsView.h"
+#include "bluetooth/BluetoothDeviceCaseListAdapter.h"
+#include "bluetooth/BluetoothOptionsView.h"
 #include "gfx_utils/list.h"
-#include "BluetoothModel.h"
+#include "bluetooth/BluetoothModel.h"
 #include "wearable_log.h"
 #include "UiConfig.h"
-#include "BluetoothPresenter.h"
+#include "bluetooth/BluetoothPresenter.h"
 
 namespace OHOS {
 BluetoothDeviceCaseListAdapter::~BluetoothDeviceCaseListAdapter()
index 94ef720..abcad46 100644 (file)
@@ -4,12 +4,12 @@
  * Author:\r
  * Create: 2021-10-13\r
  */\r
-#include "BluetoothDeviceListView.h"\r
+#include "bluetooth/BluetoothDeviceListView.h"\r
 #include "wearable_log.h"\r
 #include "UiConfig.h"\r
-#include "PlayersPresenter.h"\r
-#include "BluetoothPresenter.h"\r
-#include "BluetoothModel.h"\r
+#include "player/PlayersPresenter.h"\r
+#include "bluetooth/BluetoothPresenter.h"\r
+#include "bluetooth/BluetoothModel.h"\r
 \r
 namespace OHOS {\r
 static BluetoothDeviceListView *g_pBluetoothDeviceListView{nullptr};\r
index daf4cf8..190747b 100644 (file)
@@ -4,13 +4,13 @@
  * Author:\r
  * Create: 2021-10-13\r
  */\r
-#include "BluetoothModel.h"\r
-#include "BluetoothEarListView.h"\r
+#include "bluetooth/BluetoothModel.h"\r
+#include "bluetooth/BluetoothEarListView.h"\r
 #include "wearable_log.h"\r
 #include "UiConfig.h"\r
-#include "PlayersPresenter.h"\r
-#include "BluetoothPresenter.h"\r
-#include "SettingModel.h"\r
+#include "player/PlayersPresenter.h"\r
+#include "bluetooth/BluetoothPresenter.h"\r
+#include "settings/SettingModel.h"\r
 \r
 namespace OHOS {\r
 static BluetoothEarListView *g_pBluetoothEarListView{nullptr};\r
index 7253ed7..5c85b6d 100644 (file)
@@ -5,13 +5,13 @@
  * Create: 2021-10-13\r
  */\r
 #include <functional>\r
-#include "BluetoothEarPhoneView.h"\r
+#include "bluetooth/BluetoothEarPhoneView.h"\r
 #include "wearable_log.h"\r
 #include "UiConfig.h"\r
-#include "BluetoothPresenter.h"\r
-#include "PlayersPresenter.h"\r
-#include "BluetoothItemView.h"\r
-#include "SettingModel.h"\r
+#include "bluetooth/BluetoothPresenter.h"\r
+#include "player/PlayersPresenter.h"\r
+#include "bluetooth/BluetoothItemView.h"\r
+#include "settings/SettingModel.h"\r
 #include "common/image_cache_manager.h"\r
 #include "graphic_service.h"\r
 \r
index 6ac112d..a036e76 100644 (file)
@@ -5,10 +5,10 @@
  * Create: 2022-3-22\r
  */\r
 \r
-#include "BluetoothHeadsetEvent.h"\r
+#include "bluetooth/BluetoothHeadsetEvent.h"\r
 #include "bts_avrcp_target.h"\r
 #include "bts_avrcp_controller.h"\r
-#include "PlayersModel.h"\r
+#include "player/PlayersModel.h"\r
 #include "graphic_service.h"\r
 \r
 using namespace OHOS;\r
index 676c018..a05ca85 100644 (file)
@@ -5,7 +5,7 @@
  * Create: 2021-10-13\r
  */\r
 \r
-#include "BluetoothItemView.h"\r
+#include "bluetooth/BluetoothItemView.h"\r
 #include "wearable_log.h"\r
 #include "UiConfig.h"\r
 #include "common/image_cache_manager.h"\r
index abea09a..cf54e84 100644 (file)
@@ -5,14 +5,14 @@
  * Create: 2021-10-13\r
  */\r
 #include <cstdint>\r
-#include "BluetoothModel.h"\r
-#include "BluetoothWrapper.h"\r
-#include "BluetoothPresenter.h"\r
-#include "ConnectPhonePresenter.h"\r
-#include "BluetoothView.h"\r
-#include "BluetoothItemView.h"\r
-#include "PlayersModel.h"\r
-#include "PhoneAudio.h"\r
+#include "bluetooth/BluetoothModel.h"\r
+#include "bluetooth/BluetoothWrapper.h"\r
+#include "bluetooth/BluetoothPresenter.h"\r
+#include "connectnewphone/ConnectPhonePresenter.h"\r
+#include "player/BluetoothView.h"\r
+#include "bluetooth/BluetoothItemView.h"\r
+#include "player/PlayersModel.h"\r
+#include "phoneservice/PhoneAudio.h"\r
 #include "graphic_service.h"\r
 #include "msg_center.h"\r
 #include "bts_def.h"\r
 #include "msg_center_protocol.h"\r
 #include "dfx_channel.h"\r
 #include "tcxo.h"\r
-#include "ui_service.h"\r
+#include "uiservice/ui_service.h"\r
 #include "network/network_listener.h"\r
+#if defined(SUPPORT_LWIP) && defined(SUPPORT_BREDR)\r
+#include "lwip_driver_adapter.h"\r
+#endif\r
 namespace OHOS {\r
 \r
 #define BT_SPP_TASK_STACK_SIZE 2048\r
@@ -849,6 +852,36 @@ void BluetoothModel::BtGapAclStateChangedHandle(gap_acl_state_t state, unsigned
     }\r
 }\r
 \r
+void ChangeBleConnectToMax()\r
+{\r
+    if (msg_center_get_trans_channel() == DIAG_FRAME_FID_BT) {\r
+        gap_conn_param_update_t conn_param = { 0 };\r
+        conn_param.conn_handle = BLUETOOTH_CONN_HANDLE;\r
+        conn_param.interval_min = BLUETOOTH_INTERVAL_TOMAX_MIN;\r
+        conn_param.interval_max = BLUETOOTH_INTERVAL_TOMAX_MAX;\r
+        conn_param.slave_latency = BLUETOOTH_LATENCY;\r
+        conn_param.timeout_multiplier = BLUETOOTH_TIMEOUT_MUTIPLIER;\r
+        errcode_t ret = gap_ble_connect_param_update(&conn_param);\r
+        WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "BleConnectCallback change to max interval ret:%d : latency-min:%u latency-max:%u\n", \r
+                        ret, conn_param.interval_min, conn_param.interval_max);\r
+    }\r
+}\r
+\r
+void ChangeBleConnectToDefault()\r
+{\r
+    if (msg_center_get_trans_channel() == DIAG_FRAME_FID_BT) {\r
+        gap_conn_param_update_t conn_param = { 0 };\r
+        conn_param.conn_handle = BLUETOOTH_CONN_HANDLE;\r
+        conn_param.interval_min = BLUETOOTH_INTERVAL_TODEFAULT_MIN;\r
+        conn_param.interval_max = BLUETOOTH_INTERVAL_TODEFAULT_MAX;\r
+        conn_param.slave_latency = BLUETOOTH_LATENCY;\r
+        conn_param.timeout_multiplier = BLUETOOTH_TIMEOUT_MUTIPLIER;\r
+        errcode_t ret = gap_ble_connect_param_update(&conn_param);\r
+        WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "BleConnectCallback change to default interval ret:%d : latency-min:%u latency-max:%u\n", \r
+                        ret, conn_param.interval_min, conn_param.interval_max);\r
+    }\r
+}\r
+\r
 // 回调:ACL连接状态上报\r
 void GapAclStateChangedCallback(const bd_addr_t *bdAddr, gap_acl_state_t state, unsigned int reason)\r
 {\r
@@ -872,6 +905,9 @@ void GapAclStateChangedCallback(const bd_addr_t *bdAddr, gap_acl_state_t state,
             SendMsgToUIService(BT_CONNECTED_TO_UI, 0, nullptr, 0);\r
             // send to ace network\r
             // SetAclConnected(true);\r
+#if defined(SUPPORT_LWIP) && defined(SUPPORT_BREDR)\r
+            bt_pan_open();\r
+#endif\r
             net_connect_status_change(NETWORK_TYPE_BLUETOOTH, CONNECTION_STATUS_CONNECTED);\r
         }\r
         return;\r
@@ -1299,6 +1335,11 @@ static a2dp_snk_callbacks_t g_a2dp_snk_callbacks = {
     BtA2dpSnkConfigChangedCb\r
 };\r
 \r
+static void BleConnectCallback(uint16_t conn_id, errcode_t status, const gap_ble_conn_param_update_t *param)\r
+{\r
+    WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "BleConnectCallback conn_id:%u, interval-1:%u latency:%u timeout:%u\n",conn_id, param->interval, param->latency, param->timeout);\r
+}\r
+\r
 void BtInitCallBacks()\r
 {\r
     g_btGapCallBacks.discovery_result_callback = BtGapDiscoveryResultCallback;\r
@@ -1327,6 +1368,7 @@ void BtInitCallBacksEx()
     g_gapBleCallbacks.start_adv_cb = BleAdvStartCallback;\r
     g_gapBleCallbacks.stop_adv_cb = BleAdvStopCallback;\r
     g_gapBleCallbacks.terminate_adv_cb = BleAdvTerminateCallback;\r
+    g_gapBleCallbacks.conn_param_update_cb = BleConnectCallback;\r
     wrapper_gap_ble_register_callbacks(&g_gapBleCallbacks);\r
 \r
     g_btGattsCallbacks.add_service_cb = BtGattsServiceAddCallback;\r
@@ -1411,10 +1453,6 @@ void BtSppServerCreate(const char *spp_uuid, const char *name, uint8_t name_len)
     param.socket_type = SPP_SOCKET_RFCOMM;\r
     param.is_encrypt = true;\r
 \r
-    WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "uuid: %s uuid_len: %u\n", spp_uuid, param.uuid.uuid_len);\r
-    WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "socket_type: %x is_encrypt: %d name: %s nameLen: %u\n", param.socket_type,\r
-        param.is_encrypt, name, name_len);\r
-\r
     int ret = spp_server_create(&param, name, name_len);\r
     WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "spp_server_create ret: %x\n", ret);\r
 }\r
@@ -1422,12 +1460,9 @@ void BtSppServerCreate(const char *spp_uuid, const char *name, uint8_t name_len)
 static int BtSppServerAcceptTaskBody(void *data)\r
 {\r
     int server_id = (int)(intptr_t)data;\r
-    WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "server_id: %x\n", server_id);\r
-\r
     int ret = spp_server_accept(server_id);\r
 \r
-    WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "spp_server_accept ret: %x\n", ret);\r
-\r
+    WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "spp_server_accept ret: %x, server_id: %d\r\n", ret, server_id);\r
     return OSAL_SUCCESS;\r
 }\r
 \r
@@ -1445,8 +1480,6 @@ void BtSppServerAccept(uint8_t server_id)
     if (ret != OSAL_SUCCESS) {\r
         WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "set pri error: %08x\n", ret);\r
     }\r
-\r
-    WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "create task success.\n");\r
 }\r
 \r
 void BtInitSpp(void)\r
index a2c3671..ae254ea 100644 (file)
@@ -4,12 +4,12 @@
  * Author:\r
  * Create: 2021-10-13\r
  */\r
-#include "BluetoothOptionsView.h"\r
-#include "BluetoothModel.h"\r
+#include "bluetooth/BluetoothOptionsView.h"\r
+#include "bluetooth/BluetoothModel.h"\r
 #include "wearable_log.h"\r
 #include "UiConfig.h"\r
-#include "PlayersPresenter.h"\r
-#include "BluetoothPresenter.h"\r
+#include "player/PlayersPresenter.h"\r
+#include "bluetooth/BluetoothPresenter.h"\r
 \r
 namespace OHOS {\r
 static BluetoothOptionsView *g_pBluetoothOptionsView{nullptr};\r
index bcb1aa3..e3e4724 100644 (file)
@@ -7,9 +7,9 @@
 \r
 #include "wearable_log.h"\r
 #include "UiConfig.h"\r
-#include "BluetoothPresenter.h"\r
-#include "BluetoothReconnectView.h"\r
-#include "MainBluetoothView.h"\r
+#include "bluetooth/BluetoothPresenter.h"\r
+#include "bluetooth/BluetoothReconnectView.h"\r
+#include "bluetooth/MainBluetoothView.h"\r
 #include "NativeRegisterManager.h"\r
 #include "UiConfig.h"\r
 \r
index ad23342..c1bea75 100644 (file)
@@ -4,12 +4,12 @@
  * Create: 2021-10-13\r
  */\r
 \r
-#include "BluetoothReconnectView.h"\r
-#include "BluetoothModel.h"\r
+#include "bluetooth/BluetoothReconnectView.h"\r
+#include "bluetooth/BluetoothModel.h"\r
 #include "wearable_log.h"\r
 #include "UiConfig.h"\r
-#include "PlayersPresenter.h"\r
-#include "BluetoothPresenter.h"\r
+#include "player/PlayersPresenter.h"\r
+#include "bluetooth/BluetoothPresenter.h"\r
 #include "common/image_cache_manager.h"\r
 \r
 namespace OHOS {\r
index 5e1ca89..a7a2425 100644 (file)
@@ -4,8 +4,8 @@
  * Author:\r
  * Create: 2021-10-13\r
  */\r
-#include "MainBluetoothView.h"\r
-#include "BluetoothModel.h"\r
+#include "bluetooth/MainBluetoothView.h"\r
+#include "bluetooth/BluetoothModel.h"\r
 #include "wearable_log.h"\r
 \r
 namespace OHOS {\r
index 552f968..21fb3c4 100644 (file)
@@ -4,12 +4,12 @@
  * Author:\r
  * Create: 2021-10-13\r
  */\r
-#include "TipsConnFailMessageView.h"\r
-#include "BluetoothModel.h"\r
+#include "bluetooth/TipsConnFailMessageView.h"\r
+#include "bluetooth/BluetoothModel.h"\r
 #include "wearable_log.h"\r
 #include "UiConfig.h"\r
-#include "PlayersPresenter.h"\r
-#include "BluetoothPresenter.h"\r
+#include "player/PlayersPresenter.h"\r
+#include "bluetooth/BluetoothPresenter.h"\r
 \r
 namespace OHOS {\r
 static TipsConnFailMessageView *g_pConnFailMessageView{nullptr};\r
index 4d732b8..ad592dc 100644 (file)
@@ -4,12 +4,12 @@
  * Author:\r
  * Create: 2021-10-13\r
  */\r
-#include "TipsFailMessageView.h"\r
-#include "BluetoothModel.h"\r
+#include "bluetooth/TipsFailMessageView.h"\r
+#include "bluetooth/BluetoothModel.h"\r
 #include "wearable_log.h"\r
 #include "UiConfig.h"\r
-#include "PlayersPresenter.h"\r
-#include "BluetoothPresenter.h"\r
+#include "player/PlayersPresenter.h"\r
+#include "bluetooth/BluetoothPresenter.h"\r
 \r
 namespace OHOS {\r
 static TipsFailMessageView *g_pFailMessageView{nullptr};\r
index 9bab50f..99b0a7f 100644 (file)
@@ -4,12 +4,12 @@
  * Author:\r
  * Create: 2021-10-13\r
  */\r
-#include "TipsSuccMessageView.h"\r
-#include "BluetoothModel.h"\r
+#include "bluetooth/TipsSuccMessageView.h"\r
+#include "bluetooth/BluetoothModel.h"\r
 #include "wearable_log.h"\r
 #include "UiConfig.h"\r
-#include "PlayersPresenter.h"\r
-#include "BluetoothPresenter.h"\r
+#include "player/PlayersPresenter.h"\r
+#include "bluetooth/BluetoothPresenter.h"\r
 \r
 namespace OHOS {\r
 static TipsSuccMessageView *g_pSuccMessageView{nullptr};\r
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/breath/src/BreathDurPage.cpp b/code/sdk/application/wearable/nativeapp/nativeui/breath/src/BreathDurPage.cpp
new file mode 100644 (file)
index 0000000..fd888e5
--- /dev/null
@@ -0,0 +1,171 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: BreathDurPage\r
+ * Create: 2025-5-13\r
+ */\r
+#include "components/root_view.h"\r
+#include "gfx_utils/graphic_math.h"\r
+#include "UiConfig.h"\r
+#include "AppViewIDs.h"\r
+#include "wearable_log.h"\r
+#include "NativeAbility.h"\r
+#include "alarm/MainAlarmView.h"\r
+#include "TransitionType.h"\r
+#include "SlicePageFactory.h"\r
+#include "ui_resource_breath.h"\r
+#include "main/LoadImg.h"\r
+#include "breath/BreathView.h"\r
+#include "breath/BreathDurPage.h"\r
+\r
+namespace OHOS {\r
+REGIST_SLICE_PAGE(VIEW_MAIN_BREATHEASE, BrearhView::BREATH_DUR_VIEW, BreathDurPage, false);\r
+\r
+#define WND_BTHDUR_BTN_OK_ID "BTH_DUR_OK"\r
+#define WND_BTHDUR_TITLE_X 100\r
+#define WND_BTHDUR_TITLE_Y 38\r
+#define WND_BTHDUR_TITLE_W 253\r
+#define WND_BTHDUR_TITLE_H 53\r
+#define WND_BTHDUR_TITLE_FONT_SIZE 38\r
+#define WND_BTHDUR_PICKER_X 64\r
+#define WND_BTHDUR_PICKER_Y 109\r
+#define WND_BTHDUR_PICKER_W 321\r
+#define WND_BTHDUR_PICKER_H 218\r
+#define WND_BTHDUR_PICKER_B_FONT_SIZE 44\r
+#define WND_BTHDUR_PICKER_H_FONT_SIZE 44\r
+#define WND_BTHDUR_PICKER_ITEM_H 80\r
+#define WND_BTHDUR_OK_X 61\r
+#define WND_BTHDUR_OK_Y 362\r
+#define WND_BTHDUR_OK_W 331\r
+#define WND_BTHDUR_OK_H 98\r
+#define BREATH_GROUP_SIZE 466\r
+\r
+BreathDurPage::BreathDurPage() {}\r
+\r
+BreathDurPage::~BreathDurPage()\r
+{\r
+    group->RemoveAll();\r
+    if (lableTitle != nullptr) {\r
+        delete lableTitle;\r
+        lableTitle = 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 (group != nullptr) {\r
+        delete group;\r
+        group = nullptr;\r
+    }\r
+    if (center != nullptr) {\r
+        delete center;\r
+        center = nullptr;\r
+    }\r
+}\r
+\r
+void BreathDurPage::OnStart(void *data)\r
+{\r
+    if (group == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BreathDurPage::OnStart new Group ERROR");\r
+        group = new UIViewGroup();\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
+    if (lableTitle == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BreathDurPage::OnStart new lableTitle ERROR");\r
+        lableTitle = new UILabel();\r
+    }\r
+    lableTitle->SetPosition(WND_BTHDUR_TITLE_X, WND_BTHDUR_TITLE_Y);\r
+    lableTitle->Resize(WND_BTHDUR_TITLE_W, WND_BTHDUR_TITLE_H);\r
+    lableTitle->SetText("时间设置");\r
+    lableTitle->SetTextColor(Color::White());\r
+    lableTitle->SetFont(DEFAULT_VECTOR_FONT_FILENAME, WND_BTHDUR_TITLE_FONT_SIZE);\r
+    lableTitle->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+    group->Add(lableTitle);\r
+\r
+    if (pickerTime == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BreathDurPage::OnStart new pickerTime ERROR");\r
+        pickerTime = new UIPicker();\r
+    }\r
+    pickerTime->SetPosition(WND_BTHDUR_PICKER_X, WND_BTHDUR_PICKER_Y);\r
+    pickerTime->Resize(WND_BTHDUR_PICKER_W, WND_BTHDUR_PICKER_H);\r
+    pickerTime->SetStyle(STYLE_BACKGROUND_OPA, OPA_OPAQUE);\r
+    pickerTime->SetBackgroundFont(DEFAULT_VECTOR_FONT_FILENAME, WND_BTHDUR_PICKER_B_FONT_SIZE);\r
+    pickerTime->SetHighlightFont(DEFAULT_VECTOR_FONT_FILENAME, WND_BTHDUR_PICKER_H_FONT_SIZE);\r
+    pickerTime->SetItemHeight(WND_BTHDUR_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().GetSelectTime();\r
+    pickerTime->SetSelected(selectTime);\r
+    pickerTime->SetOnDragListener(this);\r
+    pickerTime->SetLoopState(false);\r
+    group->Add(pickerTime);\r
+\r
+    if (center == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BreathDurPage::OnStart new center ERROR");\r
+        center = new UIImageView();\r
+    }\r
+    center->SetPosition(WND_BTHDUR_PICKER_X, WND_BTHDUR_PICKER_Y);\r
+    center->Resize(WND_BTHDUR_PICKER_W, WND_BTHDUR_PICKER_H);\r
+    LOADIMG::LoadImageViewImg(center, BREATH_IMAGE, IMAGE_CONVERTER_TOOL_BREATH013);\r
+    group->Add(center);\r
+\r
+    if (buttonOk == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BreathDurPage::OnStart new buttonOk ERROR");\r
+        buttonOk = new UIButton();\r
+    }\r
+    buttonOk->SetPosition(WND_BTHDUR_OK_X, WND_BTHDUR_OK_Y);\r
+    buttonOk->Resize(WND_BTHDUR_OK_W, WND_BTHDUR_OK_H);\r
+    buttonOk->SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
+    buttonOk->SetViewId(WND_BTHDUR_BTN_OK_ID);\r
+    LOADIMG::LoadBtnImage(buttonOk, BREATH_IMAGE, IMAGE_CONVERTER_TOOL_BREATH005, IMAGE_CONVERTER_TOOL_BREATH005);\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 BreathDurPage::OnStop() {}\r
+\r
+void BreathDurPage::OnResume()\r
+{\r
+    pickerTime->SetValues(BreathModel::GetInstance().GetDurListData(), BreathModel::GetInstance().GetDurListSize());\r
+    GetSlicePageContainer()->SetIntercept(true);\r
+    GetSlicePageContainer()->SetOnDragListener(nullptr);\r
+}\r
+\r
+void BreathDurPage::OnPause() {}\r
+\r
+bool BreathDurPage::OnClick(UIView &view, const ClickEvent &event)\r
+{\r
+    if (strcmp(view.GetViewId(), WND_BTHDUR_BTN_OK_ID) == 0) {\r
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BreathDurPage OnClick...ChangeTo DUR");\r
+        BreathModel::GetInstance().SetTimeDuration(pickerTime->GetSelected());\r
+        NativeAbility::GetInstance().SwitchPageInSlice(BREATH_MAIN_VIEW, nullptr, TransitionType::TRANSITION_INVALID,\r
+                                                       true);\r
+    } else {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BreathDurPage OnClick...ChangeTo unknow");\r
+        return false;\r
+    }\r
+    return true;\r
+}\r
+\r
+bool BreathDurPage::OnDrag(UIView &view, const DragEvent &event)\r
+{\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BreathDurPage::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, "BreathDurPage::OnDrag ChangeSlice(VIEW_APPLIST)");\r
+        NativeAbility::GetInstance().SwitchPageInSlice(BREATH_MAIN_VIEW, nullptr, TransitionType::TRANSITION_INVALID,\r
+                                                       true);\r
+    }\r
+    return true;\r
+}\r
+}  // namespace OHOS
\ No newline at end of file
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/breath/src/BreathExerPage.cpp b/code/sdk/application/wearable/nativeapp/nativeui/breath/src/BreathExerPage.cpp
new file mode 100644 (file)
index 0000000..92c689b
--- /dev/null
@@ -0,0 +1,323 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: BreathExerPage\r
+ * Create: 2025-5-13\r
+ */\r
+#include <string>\r
+#include <sys/time.h>\r
+#include "gfx_utils/graphic_math.h"\r
+#include "common/image_cache_manager.h"\r
+#include "components/ui_image_animator.h"\r
+#include "components/root_view.h"\r
+#include "UiConfig.h"\r
+#include "ohos_timer.h"\r
+#include "AppViewIDs.h"\r
+#include "wearable_log.h"\r
+#include "NativeAbility.h"\r
+#include "SlicePageFactory.h"\r
+#include "PageTransitionMgr.h"\r
+#include "ui_resource_breath.h"\r
+#include "main/LoadImg.h"\r
+#include "breath/BreathView.h"\r
+#include "breath/BreathExerPage.h"\r
+\r
+namespace OHOS {\r
+REGIST_SLICE_PAGE(VIEW_MAIN_BREATHEASE, BrearhView::BREATH_EXER_VIEW, BreathExerPage, false);\r
+\r
+#define BREATH_GROUP_SIZE 454\r
+#define BREATH_ZERO 0\r
+#define BREATH_ONE 1\r
+#define BREATH_TWO 2\r
+#define BREATH_THREE 3\r
+static constexpr uint16_t BREATH_PHONE_IMAGE_POSITION_X = 0;\r
+static constexpr uint16_t BREATH_PHONE_IMAGE_POSITION_y = 0;\r
+static constexpr uint16_t BREATH_PHONE_IMAGE_WIDTH = 400;\r
+static constexpr uint16_t BREATH_PHONE_IMAGE_HEIGHT = 400;\r
+static constexpr uint16_t BREATH_PHONE_IMAGEANIMATOR_POSITION_X = 170;\r
+static constexpr uint16_t BREATH_PHONE_IMAGEANIMATOR_POSITION_Y = 170;\r
+static constexpr uint16_t BREATH_PHONE_IMAGEANIMATOR_WIDTH = 100;\r
+static constexpr uint16_t BREATH_PHONE_IMAGEANIMATOR_HEIGHT = 100;\r
+static constexpr uint16_t IMAGE_SIZE = 454;\r
+static constexpr uint16_t IMAGEANIMATOERVIEW_SIZE = 80;\r
+static constexpr uint16_t FIND_PHONE_IMAGE_X = 1;\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 END_TIME = 20;\r
+\r
+const int g_imageAnimatorInfo[IMAGEANIMATOERVIEW_SIZE] = {\r
+    IMAGE_CONVERTER_TOOL_INOREX_HALE001, IMAGE_CONVERTER_TOOL_INOREX_HALE002, IMAGE_CONVERTER_TOOL_INOREX_HALE003,\r
+    IMAGE_CONVERTER_TOOL_INOREX_HALE004, IMAGE_CONVERTER_TOOL_INOREX_HALE005, IMAGE_CONVERTER_TOOL_INOREX_HALE006,\r
+    IMAGE_CONVERTER_TOOL_INOREX_HALE007, IMAGE_CONVERTER_TOOL_INOREX_HALE008, IMAGE_CONVERTER_TOOL_INOREX_HALE009,\r
+    IMAGE_CONVERTER_TOOL_INOREX_HALE010, IMAGE_CONVERTER_TOOL_INOREX_HALE011, IMAGE_CONVERTER_TOOL_INOREX_HALE012,\r
+    IMAGE_CONVERTER_TOOL_INOREX_HALE013, IMAGE_CONVERTER_TOOL_INOREX_HALE014, IMAGE_CONVERTER_TOOL_INOREX_HALE015,\r
+    IMAGE_CONVERTER_TOOL_INOREX_HALE016, IMAGE_CONVERTER_TOOL_INOREX_HALE017, IMAGE_CONVERTER_TOOL_INOREX_HALE018,\r
+    IMAGE_CONVERTER_TOOL_INOREX_HALE019, IMAGE_CONVERTER_TOOL_INOREX_HALE020, IMAGE_CONVERTER_TOOL_INOREX_HALE021,\r
+    IMAGE_CONVERTER_TOOL_INOREX_HALE022, IMAGE_CONVERTER_TOOL_INOREX_HALE023, IMAGE_CONVERTER_TOOL_INOREX_HALE024,\r
+    IMAGE_CONVERTER_TOOL_INOREX_HALE025, IMAGE_CONVERTER_TOOL_INOREX_HALE026, IMAGE_CONVERTER_TOOL_INOREX_HALE027,\r
+    IMAGE_CONVERTER_TOOL_INOREX_HALE028, IMAGE_CONVERTER_TOOL_INOREX_HALE029, IMAGE_CONVERTER_TOOL_INOREX_HALE030,\r
+    IMAGE_CONVERTER_TOOL_INOREX_HALE031, IMAGE_CONVERTER_TOOL_INOREX_HALE032, IMAGE_CONVERTER_TOOL_INOREX_HALE033,\r
+    IMAGE_CONVERTER_TOOL_INOREX_HALE034, IMAGE_CONVERTER_TOOL_INOREX_HALE035, IMAGE_CONVERTER_TOOL_INOREX_HALE036,\r
+    IMAGE_CONVERTER_TOOL_INOREX_HALE037, IMAGE_CONVERTER_TOOL_INOREX_HALE038, IMAGE_CONVERTER_TOOL_INOREX_HALE039,\r
+    IMAGE_CONVERTER_TOOL_INOREX_HALE040, IMAGE_CONVERTER_TOOL_INOREX_HALE041, IMAGE_CONVERTER_TOOL_INOREX_HALE042,\r
+    IMAGE_CONVERTER_TOOL_INOREX_HALE043, IMAGE_CONVERTER_TOOL_INOREX_HALE044, IMAGE_CONVERTER_TOOL_INOREX_HALE045,\r
+    IMAGE_CONVERTER_TOOL_INOREX_HALE046, IMAGE_CONVERTER_TOOL_INOREX_HALE047, IMAGE_CONVERTER_TOOL_INOREX_HALE048,\r
+    IMAGE_CONVERTER_TOOL_INOREX_HALE049, IMAGE_CONVERTER_TOOL_INOREX_HALE050, IMAGE_CONVERTER_TOOL_INOREX_HALE051,\r
+    IMAGE_CONVERTER_TOOL_INOREX_HALE052, IMAGE_CONVERTER_TOOL_INOREX_HALE053, IMAGE_CONVERTER_TOOL_INOREX_HALE054,\r
+    IMAGE_CONVERTER_TOOL_INOREX_HALE055, IMAGE_CONVERTER_TOOL_INOREX_HALE056, IMAGE_CONVERTER_TOOL_INOREX_HALE057,\r
+    IMAGE_CONVERTER_TOOL_INOREX_HALE058, IMAGE_CONVERTER_TOOL_INOREX_HALE059, IMAGE_CONVERTER_TOOL_INOREX_HALE060,\r
+    IMAGE_CONVERTER_TOOL_INOREX_HALE061, IMAGE_CONVERTER_TOOL_INOREX_HALE062, IMAGE_CONVERTER_TOOL_INOREX_HALE063,\r
+    IMAGE_CONVERTER_TOOL_INOREX_HALE064, IMAGE_CONVERTER_TOOL_INOREX_HALE065, IMAGE_CONVERTER_TOOL_INOREX_HALE066,\r
+    IMAGE_CONVERTER_TOOL_INOREX_HALE067, IMAGE_CONVERTER_TOOL_INOREX_HALE068, IMAGE_CONVERTER_TOOL_INOREX_HALE068,\r
+    IMAGE_CONVERTER_TOOL_INOREX_HALE069, IMAGE_CONVERTER_TOOL_INOREX_HALE070, IMAGE_CONVERTER_TOOL_INOREX_HALE071,\r
+    IMAGE_CONVERTER_TOOL_INOREX_HALE072, IMAGE_CONVERTER_TOOL_INOREX_HALE073, IMAGE_CONVERTER_TOOL_INOREX_HALE074,\r
+    IMAGE_CONVERTER_TOOL_INOREX_HALE075, IMAGE_CONVERTER_TOOL_INOREX_HALE076, IMAGE_CONVERTER_TOOL_INOREX_HALE077,\r
+    IMAGE_CONVERTER_TOOL_INOREX_HALE078, IMAGE_CONVERTER_TOOL_INOREX_HALE078,\r
+};\r
+\r
+BreathExerPage::BreathExerPage() {}\r
+\r
+BreathExerPage::~BreathExerPage()\r
+{\r
+    group->RemoveAll();\r
+    if (group != nullptr) {\r
+        delete group;\r
+        group = nullptr;\r
+    }\r
+    if (imageAnimator_ != nullptr) {\r
+        delete imageAnimator_;\r
+        imageAnimator_ = nullptr;\r
+    }\r
+    if (animatorCallBack != nullptr) {\r
+        delete animatorCallBack;\r
+        animatorCallBack = nullptr;\r
+    }\r
+    ImageCacheManager::GetInstance().UnloadAllInMultiRes(BREATH_IMAGE);\r
+}\r
+\r
+void BreathExerPage::OnStart(void *data)\r
+{\r
+    if (group == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BreathExerPage::OnStart new group ERROR");\r
+        group = new UIViewGroup();\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
+    palyNumber = BreathModel::GetInstance().GetTheNumberOfPlays();\r
+    SetUpImageAnimator();\r
+\r
+    imageAnimator_->Start();\r
+    imageAnimator_->SetVisible(true);\r
+    animatorCallBack = new BreathExerPageCallback(this);\r
+    if (animatorCallBack == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BreathExerPage::OnStart new animatorCallBack ERROR");\r
+        return;\r
+    }\r
+    animation = new Animator(animatorCallBack, nullptr, 0, true);\r
+    if (animation == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BreathExerPage::OnStart new animation ERROR");\r
+        return;\r
+    }\r
+    animation->Start();\r
+\r
+    AddViewToPageContainer(group);\r
+}\r
+void BreathExerPage::OnStop() {}\r
+\r
+void BreathExerPage::SetUpImageAnimator()\r
+{\r
+    imageAnimator_ = new UIImageAnimatorView();\r
+    if (imageAnimator_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BreathExerPage::UIImageAnimatorView new Label SetUpImageAnimator fail");\r
+        return;\r
+    }\r
+\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BreathExerPage::SetUpImageAnimator ");\r
+    imageAnimator_ = new UIImageAnimatorView();\r
+    for (uint32_t DATA = 0; DATA < IMAGEANIMATOERVIEW_SIZE; DATA++) {\r
+        searchImageInfo[DATA].imageInfo =\r
+            ImageCacheManager::GetInstance().LoadOneInMultiRes(g_imageAnimatorInfo[DATA], BREATH_IMAGE);\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(BREATH_PHONE_IMAGE_POSITION_X, BREATH_PHONE_IMAGE_POSITION_y, BREATH_PHONE_IMAGE_WIDTH,\r
+                                BREATH_PHONE_IMAGE_HEIGHT);\r
+    int imageNumber = IMAGEANIMATOERVIEW_SIZE;\r
+    int ImageUpdate = BreathModel::GetInstance().GetStatusRespiratory();\r
+    imageAnimator_->SetImageAnimatorSrc(searchImageInfo, imageNumber, ImageUpdate);\r
+    imageAnimator_->LayoutCenterOfParent();\r
+    imageAnimator_->SetDraggable(true);\r
+    imageAnimator_->SetRepeat(false);\r
+    imageAnimator_->SetRepeatTimes(palyNumber);\r
+    imageAnimator_->SetOnDragListener(this);\r
+    group->Add(imageAnimator_);\r
+    InitImageInfo();\r
+}\r
+\r
+void BreathExerPage::BreathExerPageCallback::Callback(UIView *view)\r
+{\r
+    UNUSED(view);\r
+    static int count = 0;\r
+    struct timeval currentTime;\r
+    uint32_t breathingTime;\r
+\r
+    breathingTime = BreathModel::GetInstance().GetTimeBreathing();\r
+    gettimeofday(&currentTime, nullptr);\r
+    int32_t StartTime = BreathModel::GetInstance().GetBeginsTime();\r
+    int32_t remTime = breathingTime - (currentTime.tv_sec - StartTime);\r
+    if (remTime <= END_TIME) {\r
+        if (BreathExerPage->imageAnimator_->GetState() == false) {\r
+            BreathExerPage->animation->Stop();\r
+            BreathExerPage->imageAnimator_->Stop();\r
+            BreathExerPage->imageAnimator_->SetVisible(false);\r
+            NativeAbility::GetInstance().SwitchPageInSlice(BREATH_RESULT_VIEW, nullptr,\r
+                                                           TransitionType::TRANSITION_INVALID, true);\r
+        }\r
+    }\r
+}\r
+\r
+void BreathExerPage::OnPause()\r
+{\r
+    animation->Stop();\r
+    imageAnimator_->Stop();\r
+    imageAnimator_->SetVisible(false);\r
+}\r
+\r
+bool BreathExerPage::OnDrag(UIView &view, const DragEvent &event)\r
+{\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BreathExerPage::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, "BreathExerPage::OnDrag ChangeSlice(VIEW_APPLIST)");\r
+        animation->Stop();\r
+        imageAnimator_->Stop();\r
+        imageAnimator_->SetVisible(false);\r
+        NativeAbility::GetInstance().SwitchPageInSlice(BREATH_MAIN_VIEW, nullptr, TransitionType::TRANSITION_INVALID,\r
+                                                       true);\r
+    }\r
+    return true;\r
+}\r
+void BreathExerPage::OnTimer() {}\r
+\r
+void BreathExerPage::InitImageInfo()\r
+{\r
+    const uint16_t pixelByteSize = FIND_PHONE_PIXELBYTE_SIZE;\r
+    const uint16_t width = FIND_PHONE_PIXELBYTEH;\r
+    const uint16_t height = FIND_PHONE_PIXELBYTEH;\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, "BreathExerPage::InitImageInfo new srcData1 ERROR");\r
+        return;\r
+    }\r
+\r
+    for (uint32_t i = 0; i < dataSize; i += pixelByteSize) {\r
+        srcData1[i] = SET_INT_MAX_;\r
+        srcData1[i + BREATH_ONE] = 0;\r
+        srcData1[i + BREATH_TWO] = 0;\r
+        srcData1[i + BREATH_THREE] = OPA_OPAQUE;\r
+    }\r
+    imageInfoOen = static_cast<ImageInfo *>(UIMalloc(sizeof(ImageInfo)));\r
+    if (imageInfoOen == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BreathExerPage::InitImageInfo new imageInfoOen ERROR");\r
+        UIFree(srcData1);\r
+        return;\r
+    }\r
+\r
+    imageInfoOen->header.width = width;\r
+    imageInfoOen->header.height = height;\r
+    imageInfoOen->header.colorMode = ColorMode::ARGB8888;\r
+    imageInfoOen->dataSize = dataSize;\r
+    imageInfoOen->data = srcData1;\r
+\r
+    uint8_t *srcData2 = static_cast<uint8_t *>(UIMalloc(dataSize));\r
+    if (srcData2 == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BreathExerPage::InitImageInfo new srcData2 ERROR");\r
+        UIFree(imageInfoOen);\r
+        UIFree(srcData1);\r
+        return;\r
+    }\r
+    for (uint32_t i = 0; i < dataSize; i += pixelByteSize) {\r
+        srcData2[i] = 0;\r
+        srcData2[i + BREATH_ONE] = SET_INT_MAX_;\r
+        srcData2[i + BREATH_TWO] = 0;\r
+        srcData2[i + BREATH_THREE] = OPA_OPAQUE;\r
+    }\r
+\r
+    imageInfoTwo = static_cast<ImageInfo *>(UIMalloc(sizeof(ImageInfo)));\r
+    if (imageInfoTwo == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BreathExerPage::InitImageInfo new imageInfoTwo ERROR");\r
+        UIFree(srcData2);\r
+        UIFree(imageInfoOen);\r
+        UIFree(srcData1);\r
+        return;\r
+    }\r
+    imageInfoTwo->header.width = width;\r
+    imageInfoTwo->header.height = height;\r
+    imageInfoTwo->header.colorMode = ARGB8888;\r
+    imageInfoTwo->dataSize = dataSize;\r
+    imageInfoTwo->data = srcData2;\r
+\r
+    uint8_t *srcData3 = static_cast<uint8_t *>(UIMalloc(dataSize));\r
+    if (srcData3 == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BreathExerPage::InitImageInfo new srcData3 ERROR");\r
+        UIFree(imageInfoTwo);\r
+        UIFree(srcData2);\r
+        UIFree(imageInfoOen);\r
+        UIFree(srcData1);\r
+        return;\r
+    }\r
+    for (uint32_t i = 0; i < dataSize; i += pixelByteSize) {\r
+        srcData3[i] = 0;\r
+        srcData3[i + BREATH_ONE] = 0;\r
+        srcData3[i + BREATH_TWO] = SET_INT_MAX_;\r
+        srcData3[i + BREATH_THREE] = OPA_OPAQUE;\r
+    }\r
+\r
+    imageInfoThree = static_cast<ImageInfo *>(UIMalloc(sizeof(ImageInfo)));\r
+    if (imageInfoThree == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BreathExerPage::InitImageInfo new imageInfoThree ERROR");\r
+        UIFree(srcData3);\r
+        UIFree(imageInfoTwo);\r
+        UIFree(srcData2);\r
+        UIFree(imageInfoOen);\r
+        UIFree(srcData1);\r
+        return;\r
+    }\r
+    imageInfoThree->header.width = width;\r
+    imageInfoThree->header.height = height;\r
+    imageInfoThree->header.colorMode = ARGB8888;\r
+    imageInfoThree->dataSize = dataSize;\r
+    imageInfoThree->data = srcData3;\r
+\r
+    imageAnimatorImageInfo[BREATH_ZERO].imageInfo = imageInfoOen;\r
+    imageAnimatorImageInfo[BREATH_ZERO].pos = {BREATH_PHONE_IMAGEANIMATOR_POSITION_X,\r
+                                               BREATH_PHONE_IMAGEANIMATOR_POSITION_Y};\r
+    imageAnimatorImageInfo[BREATH_ZERO].width = BREATH_PHONE_IMAGEANIMATOR_WIDTH;\r
+    imageAnimatorImageInfo[BREATH_ZERO].height = BREATH_PHONE_IMAGEANIMATOR_HEIGHT;\r
+    imageAnimatorImageInfo[BREATH_ZERO].imageType = IMG_SRC_IMAGE_INFO;\r
+\r
+    imageAnimatorImageInfo[BREATH_ONE].imageInfo = imageInfoTwo;\r
+    imageAnimatorImageInfo[BREATH_ONE].pos = {BREATH_PHONE_IMAGEANIMATOR_POSITION_X,\r
+                                              BREATH_PHONE_IMAGEANIMATOR_POSITION_Y};\r
+    imageAnimatorImageInfo[BREATH_ONE].width = BREATH_PHONE_IMAGEANIMATOR_WIDTH;\r
+    imageAnimatorImageInfo[BREATH_ONE].height = BREATH_PHONE_IMAGEANIMATOR_HEIGHT;\r
+    imageAnimatorImageInfo[BREATH_ONE].imageType = IMG_SRC_IMAGE_INFO;\r
+\r
+    imageAnimatorImageInfo[BREATH_TWO].imageInfo = imageInfoThree;\r
+    imageAnimatorImageInfo[BREATH_TWO].pos = {BREATH_PHONE_IMAGEANIMATOR_POSITION_X,\r
+                                              BREATH_PHONE_IMAGEANIMATOR_POSITION_Y};\r
+    imageAnimatorImageInfo[BREATH_TWO].width = BREATH_PHONE_IMAGEANIMATOR_WIDTH;\r
+    imageAnimatorImageInfo[BREATH_TWO].height = BREATH_PHONE_IMAGEANIMATOR_HEIGHT;\r
+    imageAnimatorImageInfo[BREATH_TWO].imageType = IMG_SRC_IMAGE_INFO;\r
+}\r
+}  // namespace OHOS
\ No newline at end of file
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/breath/src/BreathMainPage.cpp b/code/sdk/application/wearable/nativeapp/nativeui/breath/src/BreathMainPage.cpp
new file mode 100644 (file)
index 0000000..3b12ef7
--- /dev/null
@@ -0,0 +1,253 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: BreathMainPage\r
+ * Create: 2025-5-13\r
+ */\r
+#include "gfx_utils/graphic_math.h"\r
+#include "UiConfig.h"\r
+#include "AppViewIDs.h"\r
+#include "AppViewIDs.h"\r
+#include "wearable_log.h"\r
+#include "alarm/MainAlarmView.h"\r
+#include "NativeAbility.h"\r
+#include "TransitionType.h"\r
+#include "SlicePageFactory.h"\r
+#include "PageTransitionMgr.h"\r
+#include "ui_resource_breath.h"\r
+#include "main/LoadImg.h"\r
+#include "breath/BreathModel.h"\r
+#include "breath/BreathMainPage.h"\r
+\r
+namespace OHOS {\r
+\r
+#define WND_BTHMAIN_BTN_DUR_ID "BTH_MAIN_DUR"\r
+#define WND_BTHMAIN_BTN_RHY_ID "BTH_MAIN_RHY"\r
+#define WND_BTHMAIN_BTN_START_ID "BTH_MAIN_START"\r
+#define WND_BTHMAIN_TITLE_X 97\r
+#define WND_BTHMAIN_TITLE_Y 34\r
+#define WND_BTHMAIN_TITLE_W 260\r
+#define WND_BTHMAIN_TITLE_H 53\r
+#define WND_BTHMAIN_TITLE_FONT_SIZE 38\r
+#define WND_BTHMAIN_DURBTN_X 16\r
+#define WND_BTHMAIN_DURBTN_Y 190\r
+#define WND_BTHMAIN_DURBTN_W 74\r
+#define WND_BTHMAIN_DURBTN_H 74\r
+#define WND_BTHMAIN_RHYBTN_X 364\r
+#define WND_BTHMAIN_RHYBTN_Y 190\r
+#define WND_BTHMAIN_RHYBTN_W 74\r
+#define WND_BTHMAIN_RHYBTN_H 74\r
+#define WND_BTHMAIN_STARTBTN_X 60\r
+#define WND_BTHMAIN_STARTBTN_Y 358\r
+#define WND_BTHMAIN_STARTBTN_W 333\r
+#define WND_BTHMAIN_STARTBTN_H 96\r
+#define WND_BTHMAIN_DURLAB_X 20\r
+#define WND_BTHMAIN_DURLAB_Y 275\r
+#define WND_BTHMAIN_DURLAB_W 65\r
+#define WND_BTHMAIN_DURLAB_H 30\r
+#define WND_BTHMAIN_RHYLAB_X 376\r
+#define WND_BTHMAIN_RHYLAB_Y 275\r
+#define WND_BTHMAIN_RHYLAB_W 50\r
+#define WND_BTHMAIN_RHYLAB_H 30\r
+#define WND_BTHMAIN_CENTER_XY 127\r
+#define WND_BTHMAIN_CENTER_WH 200\r
+#define WND_BTHMAIN_lableSetting_FONT_SIZE 24\r
+#define WND_BTHMAIN_lableTime_FONT_SIZE 20\r
+#define BREATH_GROUP_SIZE 466\r
+\r
+REGIST_SLICE_PAGE(VIEW_MAIN_BREATHEASE, BrearhView::BREATH_MAIN_VIEW, BreathMainPage, true);\r
+\r
+BreathMainPage::~BreathMainPage()\r
+{\r
+    group->RemoveAll();\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 (lableBreathing != nullptr) {\r
+        delete lableBreathing;\r
+        lableBreathing = nullptr;\r
+    }\r
+    if (lableTime != nullptr) {\r
+        delete lableTime;\r
+        lableTime = nullptr;\r
+    }\r
+    if (group != nullptr) {\r
+        delete group;\r
+        group = nullptr;\r
+    }\r
+    if (background != nullptr) {\r
+        delete background;\r
+        background = nullptr;\r
+    }\r
+    if (center != nullptr) {\r
+        delete center;\r
+        center = nullptr;\r
+    }\r
+}\r
+\r
+void BreathMainPage::OnStart(void *data)\r
+{\r
+    if (group == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BreathMainPage::OnStart new group ERROR");\r
+        group = new UIViewGroup();\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
+    if (background == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BreathMainPage::OnStart new Background ERROR");\r
+        background = new UIImageView();\r
+    }\r
+    background->SetPosition(0, 0);\r
+    background->Resize(BREATH_GROUP_SIZE, BREATH_GROUP_SIZE);\r
+    LOADIMG::LoadImageViewImg(background, BREATH_IMAGE, IMAGE_CONVERTER_TOOL_BREATH001);\r
+    group->Add(background);\r
+\r
+    if (center == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BreathMainPage::OnStart new Center ERROR");\r
+        center = new UIImageView();\r
+    }\r
+    center->SetPosition(WND_BTHMAIN_CENTER_XY, WND_BTHMAIN_CENTER_XY);\r
+    center->Resize(WND_BTHMAIN_CENTER_WH, WND_BTHMAIN_CENTER_WH);\r
+    LOADIMG::LoadImageViewImg(center, BREATH_IMAGE, IMAGE_CONVERTER_TOOL_BREATH012);\r
+    group->Add(center);\r
+\r
+    if (lableBreathing == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BreathMainPage::OnStart new lableBreathing ERROR");\r
+        lableBreathing = new UILabel();\r
+    }\r
+    lableBreathing->SetPosition(WND_BTHMAIN_TITLE_X, WND_BTHMAIN_TITLE_Y);\r
+    lableBreathing->Resize(WND_BTHMAIN_TITLE_W, WND_BTHMAIN_TITLE_H);\r
+    lableBreathing->SetText("呼吸");\r
+    lableBreathing->SetTextColor(Color::White());\r
+    lableBreathing->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+    lableBreathing->SetFont(DEFAULT_VECTOR_FONT_FILENAME, WND_BTHMAIN_TITLE_FONT_SIZE);\r
+    group->Add(lableBreathing);\r
+\r
+    if (buttonTime == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BreathMainPage::OnStart new buttonTime ERROR");\r
+        buttonTime = new UIButton();\r
+    }\r
+    buttonTime->SetPosition(WND_BTHMAIN_DURBTN_X, WND_BTHMAIN_DURBTN_Y);\r
+    buttonTime->Resize(WND_BTHMAIN_DURBTN_W, WND_BTHMAIN_DURBTN_H);\r
+    buttonTime->SetViewId(WND_BTHMAIN_BTN_DUR_ID);\r
+    buttonTime->SetOnClickListener(this);\r
+    LOADIMG::LoadBtnImage(buttonTime, BREATH_IMAGE, IMAGE_CONVERTER_TOOL_BREATH002, IMAGE_CONVERTER_TOOL_BREATH002);\r
+    buttonTime->SetStyleForState(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT, UIButton::PRESSED);\r
+    buttonTime->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+    group->Add(buttonTime);\r
+\r
+    if (buttonSetting == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BreathMainPage::OnStart new buttonSetting ERROR");\r
+        buttonSetting = new UIButton();\r
+    }\r
+    buttonSetting->SetPosition(WND_BTHMAIN_RHYBTN_X, WND_BTHMAIN_RHYBTN_Y);\r
+    buttonSetting->Resize(WND_BTHMAIN_RHYBTN_W, WND_BTHMAIN_RHYBTN_H);\r
+    buttonSetting->SetViewId(WND_BTHMAIN_BTN_RHY_ID);\r
+    buttonSetting->SetOnClickListener(this);\r
+    LOADIMG::LoadBtnImage(buttonSetting, BREATH_IMAGE, IMAGE_CONVERTER_TOOL_BREATH004, IMAGE_CONVERTER_TOOL_BREATH004);\r
+    buttonSetting->SetStyleForState(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT, UIButton::PRESSED);\r
+    buttonSetting->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+    group->Add(buttonSetting);\r
+\r
+    if (buttonStart == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BreathMainPage::OnStart new buttonStart ERROR");\r
+        buttonStart = new UIButton();\r
+    }\r
+    buttonStart->SetPosition(WND_BTHMAIN_STARTBTN_X, WND_BTHMAIN_STARTBTN_Y);\r
+    buttonStart->Resize(WND_BTHMAIN_STARTBTN_W, WND_BTHMAIN_STARTBTN_H);\r
+    buttonStart->SetViewId(WND_BTHMAIN_BTN_START_ID);\r
+    buttonStart->SetOnClickListener(this);\r
+    LOADIMG::LoadBtnImage(buttonStart, BREATH_IMAGE, IMAGE_CONVERTER_TOOL_BREATH006, IMAGE_CONVERTER_TOOL_BREATH006);\r
+    buttonStart->SetStyleForState(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT, UIButton::PRESSED);\r
+    buttonStart->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+    group->Add(buttonStart);\r
+\r
+    if (lableSetting == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BreathMainPage::OnStart new lableSetting ERROR");\r
+        lableSetting = new UILabel();\r
+    }\r
+    lableSetting->SetPosition(WND_BTHMAIN_RHYLAB_X, WND_BTHMAIN_RHYLAB_Y);\r
+    lableSetting->Resize(WND_BTHMAIN_RHYLAB_W, WND_BTHMAIN_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, WND_BTHMAIN_lableSetting_FONT_SIZE);\r
+    group->Add(lableSetting);\r
+\r
+    if (lableTime == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BreathMainPage::OnStart new lableTime ERROR");\r
+        lableTime = new UILabel();\r
+    }\r
+    lableTime->SetPosition(WND_BTHMAIN_DURLAB_X, WND_BTHMAIN_DURLAB_Y);\r
+    lableTime->Resize(WND_BTHMAIN_DURLAB_W, WND_BTHMAIN_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, WND_BTHMAIN_lableTime_FONT_SIZE);\r
+    group->Add(lableTime);\r
+\r
+    AddViewToPageContainer(group);\r
+}\r
+\r
+void BreathMainPage::OnStop(void) {}\r
+\r
+void BreathMainPage::OnResume(void)\r
+{\r
+    lableTime->SetText(BreathModel::GetInstance().GetTimeDuration());\r
+}\r
+\r
+bool BreathMainPage::OnClick(UIView &view, const ClickEvent &event)\r
+{\r
+    if (strcmp(view.GetViewId(), WND_BTHMAIN_BTN_DUR_ID) == 0) {\r
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BreathMainPage OnClick...ChangeTo DUR");\r
+        NativeAbility::GetInstance().SwitchPageInSlice(BREATH_DUR_VIEW, nullptr, TransitionType::TRANSITION_INVALID,\r
+                                                       true);\r
+    } else if (strcmp(view.GetViewId(), WND_BTHMAIN_BTN_RHY_ID) == 0) {\r
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BreathMainPage OnClick...ChangeTo RHY");\r
+        NativeAbility::GetInstance().SwitchPageInSlice(BREATH_RHY_VIEW, nullptr, TransitionType::TRANSITION_INVALID,\r
+                                                       true);\r
+    } else if (strcmp(view.GetViewId(), WND_BTHMAIN_BTN_START_ID) == 0) {\r
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BreathMainPage OnClick...ChangeTo START");\r
+        NativeAbility::GetInstance().SwitchPageInSlice(BREATH_START_VIEW, nullptr, TransitionType::TRANSITION_INVALID,\r
+                                                       true);\r
+        struct timeval current_time;\r
+        gettimeofday(&current_time, nullptr);\r
+        uint32_t remTime = current_time.tv_sec;\r
+        BreathModel::GetInstance().SetSaveTime(remTime);\r
+    } else {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BreathMainPage OnClick...ChangeTo unknow");\r
+        return false;\r
+    }\r
+    return true;\r
+}\r
+\r
+bool BreathMainPage::OnDrag(UIView &view, const DragEvent &event)\r
+{\r
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BreathMainPage::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, "BreathMainPage::OnDrag ChangeSlice(VIEW_APPLIST)");\r
+        NativeAbility::GetInstance().ChangeSlice(VIEW_APPLIST);\r
+    }\r
+    return true;\r
+}\r
+}  // namespace OHOS
\ No newline at end of file
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/breath/src/BreathModel.cpp b/code/sdk/application/wearable/nativeapp/nativeui/breath/src/BreathModel.cpp
new file mode 100644 (file)
index 0000000..ef067f2
--- /dev/null
@@ -0,0 +1,259 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: BreathModel\r
+ * Create: 2025-5-13\r
+ */\r
+#include "uiservice/ui_service.h"\r
+#include "main/HealthModel.h"\r
+#include "breath/BreathDurPage.h"\r
+#include "breath/BreathModel.h"\r
+\r
+namespace OHOS {\r
+#define MINUTE_IDX_1 0\r
+#define MINUTE_IDX_2 1\r
+#define MINUTE_IDX_3 2\r
+#define SPEED_IDX_1 0\r
+#define SPEED_IDX_2 1\r
+#define SPEED_IDX_3 2\r
+#define MINUTE_1 "1 分钟"\r
+#define MINUTE_2 "2 分钟"\r
+#define MINUTE_3 "3 分钟"\r
+#define SPEED_FAST_8 "稍快 8次/分"\r
+#define SPEED_SLOW_7 "舒缓 7次/分"\r
+#define SPEED_SLOW_6 "缓慢 6次/分"\r
+#define TIME_1 "1"\r
+#define TIME_2 "2"\r
+#define TIME_3 "3"\r
+#define SPEED_FASTER_LITTLE "稍快"\r
+#define SPEED_SOOTHING "舒缓"\r
+#define SPEED_SLOWING "缓慢"\r
+#define MINUTE_0_DATA 0\r
+#define MINUTE_1_DATA 1\r
+#define MINUTE_2_DATA 2\r
+#define MINUTE_3_DATA 3\r
+#define NUMBLE_PLAY_8_DATA 8\r
+#define NUMBLE_PLAY_7_DATA 7\r
+#define NUMBLE_PLAY_6_DATA 6\r
+#define NUMBLE_PLAY_16_DATA 16\r
+#define NUMBLE_PLAY_14_DATA 14\r
+#define NUMBLE_PLAY_12_DATA 12\r
+#define NUMBLE_PLAY_24_DATA 24\r
+#define NUMBLE_PLAY_21_DATA 21\r
+#define NUMBLE_PLAY_18_DATA 18\r
+#define Frequency_Score_LOWER 60\r
+#define Frequency_Score_RANGE 40\r
+#define Heart_Rate_LOWER 90\r
+#define Heart_Rate_RANGE 10\r
+#define ONE_MINUTE 60\r
+#define TWO_MINUTES 120\r
+#define THREE_MINUTES 180\r
+#define SIX_POINTS_FOR_ONE 125\r
+#define SEVEN_POINTS_FOR_ONE 106\r
+#define EIGHT_POINTS_FOR_ONE 98\r
+uint8_t g_frequencyScore;\r
+uint8_t g_heartRate;\r
+\r
+BreathModel::BreathModel()\r
+{\r
+    DefaultData();\r
+}\r
+\r
+BreathModel::~BreathModel() {}\r
+\r
+void BreathModel::DefaultData()\r
+{\r
+    durList[MINUTE_IDX_1] = MINUTE_1;\r
+    durList[MINUTE_IDX_2] = MINUTE_2;\r
+    durList[MINUTE_IDX_3] = MINUTE_3;\r
+    rhyList[SPEED_IDX_1] = SPEED_FAST_8;\r
+    rhyList[SPEED_IDX_2] = SPEED_SLOW_7;\r
+    rhyList[SPEED_IDX_3] = SPEED_SLOW_6;\r
+    durListVal[MINUTE_IDX_1] = MINUTE_1_DATA;\r
+    durListVal[MINUTE_IDX_2] = MINUTE_2_DATA;\r
+    durListVal[MINUTE_IDX_3] = MINUTE_3_DATA;\r
+}\r
+\r
+BreathModel &BreathModel::GetInstance()\r
+{\r
+    static BreathModel instance;\r
+    return instance;\r
+}\r
+\r
+const char **BreathModel::GetDurListData()\r
+{\r
+    return durList;\r
+}\r
+\r
+const char **BreathModel::GetRhyListData()\r
+{\r
+    return rhyList;\r
+}\r
+\r
+uint8_t BreathModel::GetDurListSize()\r
+{\r
+    return sizeof(durList) / sizeof(durList[0]);\r
+}\r
+\r
+uint8_t BreathModel::GetRhyListSize()\r
+{\r
+    return sizeof(rhyList) / sizeof(rhyList[0]);\r
+}\r
+\r
+void BreathModel::SetTimeDuration(uint16_t idx)\r
+{\r
+    data = idx;\r
+}\r
+\r
+void BreathModel::SetTimeRhyation(uint16_t idx)\r
+{\r
+    date = idx;\r
+}\r
+\r
+uint8_t BreathModel::GetSelectTime()\r
+{\r
+    if (data == MINUTE_0_DATA) {\r
+        return MINUTE_IDX_1;\r
+    } else if (data == MINUTE_1_DATA) {\r
+        return MINUTE_IDX_2;\r
+    } else if (data == MINUTE_2_DATA) {\r
+        return MINUTE_IDX_3;\r
+    }\r
+    return 0;\r
+}\r
+\r
+uint8_t BreathModel::GetSelectTempo()\r
+{\r
+    if (date == MINUTE_0_DATA) {\r
+        return SPEED_IDX_1;\r
+    } else if (date == MINUTE_1_DATA) {\r
+        return SPEED_IDX_2;\r
+    } else if (date == MINUTE_2_DATA) {\r
+        return SPEED_IDX_3;\r
+    }\r
+    return 0;\r
+}\r
+\r
+char *BreathModel::GetTimeDuration()\r
+{\r
+    if (data == MINUTE_0_DATA) {\r
+        return MINUTE_1;\r
+    } else if (data == MINUTE_1_DATA) {\r
+        return MINUTE_2;\r
+    } else if (data == MINUTE_2_DATA) {\r
+        return MINUTE_3;\r
+    }\r
+    return nullptr;\r
+}\r
+\r
+char *BreathModel::GetDuration()\r
+{\r
+    if (data == MINUTE_0_DATA) {\r
+        return TIME_1;\r
+    } else if (data == MINUTE_1_DATA) {\r
+        return TIME_2;\r
+    } else if (data == MINUTE_2_DATA) {\r
+        return TIME_3;\r
+    }\r
+    return nullptr;\r
+}\r
+\r
+char *BreathModel::GetRhythm()\r
+{\r
+    if (date == MINUTE_0_DATA) {\r
+        return SPEED_FASTER_LITTLE;\r
+    } else if (date == MINUTE_1_DATA) {\r
+        return SPEED_SOOTHING;\r
+    } else if (date == MINUTE_2_DATA) {\r
+        return SPEED_SLOWING;\r
+    }\r
+    return nullptr;\r
+}\r
+\r
+void BreathModel::SetSaveTime(int32_t idx)\r
+{\r
+    saveTime = idx;\r
+}\r
+\r
+int32_t BreathModel::GetSaveTime()\r
+{\r
+    return saveTime;\r
+}\r
+\r
+void BreathModel::SetBeginsTime(int32_t idx)\r
+{\r
+    beginsTime = idx;\r
+}\r
+\r
+int32_t BreathModel::GetBeginsTime()\r
+{\r
+    return beginsTime;\r
+}\r
+\r
+uint32_t BreathModel::GetTimeBreathing()\r
+{\r
+    if (data == MINUTE_0_DATA) {\r
+        return ONE_MINUTE;\r
+    } else if (data == MINUTE_1_DATA) {\r
+        return TWO_MINUTES;\r
+    } else if (data == MINUTE_2_DATA) {\r
+        return THREE_MINUTES;\r
+    }\r
+    return 0;\r
+}\r
+\r
+uint32_t BreathModel::GetStatusRespiratory()\r
+{\r
+    if (date == MINUTE_0_DATA) {\r
+        return EIGHT_POINTS_FOR_ONE;\r
+    } else if (date == MINUTE_1_DATA) {\r
+        return SEVEN_POINTS_FOR_ONE;\r
+    } else if (date == MINUTE_2_DATA) {\r
+        return SIX_POINTS_FOR_ONE;\r
+    }\r
+    return 0;\r
+}\r
+\r
+void BreathModel::SetFrequencyScore()\r
+{\r
+    g_frequencyScore = Frequency_Score_LOWER + rand() % Frequency_Score_RANGE;\r
+}\r
+\r
+uint8_t BreathModel::GetFrequencyScore()\r
+{\r
+    return g_frequencyScore;\r
+}\r
+\r
+void BreathModel::SetHeartRate()\r
+{\r
+    g_heartRate = Heart_Rate_LOWER + rand() % Heart_Rate_RANGE;\r
+}\r
+\r
+uint8_t BreathModel::GetHeartRate()\r
+{\r
+    return g_heartRate;\r
+}\r
+\r
+uint32_t BreathModel::GetTheNumberOfPlays()\r
+{\r
+    if (date == MINUTE_0_DATA && data == MINUTE_0_DATA) {\r
+        return NUMBLE_PLAY_8_DATA;\r
+    } else if (date == MINUTE_1_DATA && data == MINUTE_0_DATA) {\r
+        return NUMBLE_PLAY_7_DATA;\r
+    } else if (date == MINUTE_2_DATA && data == MINUTE_0_DATA) {\r
+        return NUMBLE_PLAY_6_DATA;\r
+    } else if (date == MINUTE_0_DATA && data == MINUTE_1_DATA) {\r
+        return NUMBLE_PLAY_16_DATA;\r
+    } else if (date == MINUTE_1_DATA && data == MINUTE_1_DATA) {\r
+        return NUMBLE_PLAY_14_DATA;\r
+    } else if (date == MINUTE_2_DATA && data == MINUTE_1_DATA) {\r
+        return NUMBLE_PLAY_12_DATA;\r
+    } else if (date == MINUTE_0_DATA && data == MINUTE_2_DATA) {\r
+        return NUMBLE_PLAY_24_DATA;\r
+    } else if (date == MINUTE_1_DATA && data == MINUTE_2_DATA) {\r
+        return NUMBLE_PLAY_21_DATA;\r
+    } else if (date == MINUTE_2_DATA && data == MINUTE_2_DATA) {\r
+        return NUMBLE_PLAY_18_DATA;\r
+    }\r
+    return 0;\r
+}\r
+}  // namespace OHOS
\ No newline at end of file
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/breath/src/BreathPresenter.cpp b/code/sdk/application/wearable/nativeapp/nativeui/breath/src/BreathPresenter.cpp
new file mode 100644 (file)
index 0000000..61c31fb
--- /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 "breath/BreathView.h"\r
+#include "breath/BreathPresenter.h"\r
+\r
+namespace OHOS {\r
+REGIST_MENU(VIEW_MAIN_BREATHEASE, BreathView, BreathPresenter, BREATH_MAIN_ICON, BREATH_MAIN_ICON, "呼吸训练");\r
+}
\ No newline at end of file
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/breath/src/BreathResultPage.cpp b/code/sdk/application/wearable/nativeapp/nativeui/breath/src/BreathResultPage.cpp
new file mode 100644 (file)
index 0000000..1f47966
--- /dev/null
@@ -0,0 +1,353 @@
+/*\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 "gfx_utils/graphic_math.h"\r
+#include "components/root_view.h"\r
+#include "UiConfig.h"\r
+#include "AppViewIDs.h"\r
+#include "wearable_log.h"\r
+#include "NativeAbility.h"\r
+#include "TransitionType.h"\r
+#include "SlicePageFactory.h"\r
+#include "main/LoadImg.h"\r
+#include "ui_resource_breath.h"\r
+#include "breath/BreathView.h"\r
+#include "breath/BreathResultPage.h"\r
+\r
+namespace OHOS {\r
+REGIST_SLICE_PAGE(VIEW_MAIN_BREATHEASE, BrearhView::BREATH_RESULT_VIEW, BreathResultPage, false);\r
+#define WND_BTHMAIN_RESULTS_X 97\r
+#define WND_BTHMAIN_RESULTS_Y 34\r
+#define WND_BTHMAIN_RESULTS_W 260\r
+#define WND_BTHMAIN_RESULTS_H 53\r
+#define WND_BTHMAIN_MAX_FONT_SIZE 38\r
+#define WND_BTHMAIN_FREQUENCIES_X 140\r
+#define WND_BTHMAIN_FREQUENCIES_Y 133\r
+#define WND_BTHMAIN_FREQUENCIES_W 164\r
+#define WND_BTHMAIN_FREQUENCIES_H 30\r
+#define WND_BTHMAIN_MIN_FONT_SIZE 24\r
+#define WND_BTHMAIN_HEARTRATE_X 149\r
+#define WND_BTHMAIN_HEARTRATE_Y 233\r
+#define WND_BTHMAIN_HEARTRATE_W 120\r
+#define WND_BTHMAIN_HEARTRATE_H 30\r
+#define WND_BTHMAIN_FREQUEBCY_TIMES_X 204\r
+#define WND_BTHMAIN_FREQUEBCY_TIMES_Y 179\r
+#define WND_BTHMAIN_FREQUEBCY_TIMES_W 29\r
+#define WND_BTHMAIN_FREQUEBCY_TIMES_H 29\r
+#define WND_BTHMAIN_HEARTRATE_TIMES_X 204\r
+#define WND_BTHMAIN_HEARTRATE_TIMES_Y 279\r
+#define WND_BTHMAIN_HEARTRATE_TIMES_W 58\r
+#define WND_BTHMAIN_HEARTRATE_TIMES_H 29\r
+#define WND_BTHMAIN_DURATION_X 149\r
+#define WND_BTHMAIN_DURATION_Y 333\r
+#define WND_BTHMAIN_DURATION_W 96\r
+#define WND_BTHMAIN_DURATION_H 30\r
+#define WND_BTHMAIN_FREQUENCIES_SCOUT_X 149\r
+#define WND_BTHMAIN_FREQUENCIES_SCOUT_Y 165\r
+#define WND_BTHMAIN_FREQUENCIES_SCOUT_W 49\r
+#define WND_BTHMAIN_FREQUENCIES_SCOUT_H 49\r
+#define WND_BTHMAIN_SCOUT_FONT_SIZE 40\r
+#define WND_BTHMAIN_HEARTRATE_SCOUT_X 149\r
+#define WND_BTHMAIN_HEARTRATE_SCOUT_Y 265\r
+#define WND_BTHMAIN_HEARTRATE_SCOUT_W 49\r
+#define WND_BTHMAIN_HEARTRATE_SCOUT_H 49\r
+#define WND_BTHMAIN_RHYTHM_X 161\r
+#define WND_BTHMAIN_RHYTHM_Y 83\r
+#define WND_BTHMAIN_RHYTHM_W 132\r
+#define WND_BTHMAIN_RHYTHM_H 30\r
+#define WND_BTHMAIN_TIME_X 149\r
+#define WND_BTHMAIN_TIME_Y 365\r
+#define WND_BTHMAIN_TIME_W 25\r
+#define WND_BTHMAIN_TIME_H 48\r
+#define WND_BTHMAIN_TIME_UNIT_X 180\r
+#define WND_BTHMAIN_TIME_UNIT_Y 379\r
+#define WND_BTHMAIN_TIME_UNIT_W 58\r
+#define WND_BTHMAIN_TIME_UNIT_H 29\r
+#define WND_BTHMAIN_SCORES_X 241\r
+#define WND_BTHMAIN_SCORES_Y 177\r
+#define WND_BTHMAIN_SCORES_W 72\r
+#define WND_BTHMAIN_SCORES_H 32\r
+#define BREATH_GROUP_SIZE 466\r
+#define BREATH_GUINEAS_SIZE 100\r
+#define BREATH_NINETY_SIZE 90\r
+#define BREATH_EIGHTY_NINE_SIZE 89\r
+#define BREATH_EIGHTY_SIZE 80\r
+#define BREATH_SEVENTY_NINE_SIZE 79\r
+#define BREATH_SEVENTY_SIZE 70\r
+#define BREATH_SIXTY_NINE_SIZE 69\r
+#define BREATH_SIXTY_SIZE 60\r
+#define TEXT_OPACITY 147\r
+#define TEXT_SIZE 5\r
+\r
+BreathResultPage::BreathResultPage() {}\r
+\r
+BreathResultPage::~BreathResultPage()\r
+{\r
+    group->RemoveAll();\r
+    if (trainingResults != nullptr) {\r
+        delete trainingResults;\r
+        trainingResults = nullptr;\r
+    }\r
+    if (trainingFrequencies != nullptr) {\r
+        delete trainingFrequencies;\r
+        trainingFrequencies = nullptr;\r
+    }\r
+    if (trainingHeartRate != nullptr) {\r
+        delete trainingHeartRate;\r
+        trainingHeartRate = nullptr;\r
+    }\r
+    if (trainingDuration != nullptr) {\r
+        delete trainingDuration;\r
+        trainingDuration = nullptr;\r
+    }\r
+    if (frequenciesScout != nullptr) {\r
+        delete frequenciesScout;\r
+        frequenciesScout = nullptr;\r
+    }\r
+    if (heartRateScout != nullptr) {\r
+        delete heartRateScout;\r
+        heartRateScout = nullptr;\r
+    }\r
+    if (descriptionBreathing != nullptr) {\r
+        delete descriptionBreathing;\r
+        descriptionBreathing = nullptr;\r
+    }\r
+    if (time != nullptr) {\r
+        delete time;\r
+        time = nullptr;\r
+    }\r
+    if (timeUnit != nullptr) {\r
+        delete timeUnit;\r
+        timeUnit = nullptr;\r
+    }\r
+    if (heartRateTimes != nullptr) {\r
+        delete heartRateTimes;\r
+        heartRateTimes = nullptr;\r
+    }\r
+    if (frequencyTimes != nullptr) {\r
+        delete frequencyTimes;\r
+        frequencyTimes = nullptr;\r
+    }\r
+    if (group != nullptr) {\r
+        delete group;\r
+        group = nullptr;\r
+    }\r
+    if (scores != nullptr) {\r
+        delete scores;\r
+        scores = nullptr;\r
+    }\r
+}\r
+\r
+void BreathResultPage::OnStart(void *data)\r
+{\r
+    if (group == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BreathResultPage::OnStart new group ERROR");\r
+        group = new UIViewGroup();\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
+    if (trainingResults == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BreathResultPage::OnStart new trainingResults ERROR");\r
+        trainingResults = new UILabel();\r
+    }\r
+    trainingResults->SetPosition(WND_BTHMAIN_RESULTS_X, WND_BTHMAIN_RESULTS_Y);\r
+    trainingResults->Resize(WND_BTHMAIN_RESULTS_W, WND_BTHMAIN_RESULTS_H);\r
+    trainingResults->SetText("训练结果");\r
+    trainingResults->SetTextColor(Color::White());\r
+    trainingResults->SetFont(DEFAULT_VECTOR_FONT_FILENAME, WND_BTHMAIN_MAX_FONT_SIZE);\r
+    trainingResults->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+    group->Add(trainingResults);\r
+\r
+    if (trainingFrequencies == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BreathResultPage::OnStart new trainingFrequencies ERROR");\r
+        trainingFrequencies = new UILabel();\r
+    }\r
+    trainingFrequencies->SetPosition(WND_BTHMAIN_FREQUENCIES_X, WND_BTHMAIN_FREQUENCIES_Y);\r
+    trainingFrequencies->Resize(WND_BTHMAIN_FREQUENCIES_W, WND_BTHMAIN_FREQUENCIES_H);\r
+    trainingFrequencies->SetText("呼吸频率得分");\r
+    trainingFrequencies->SetTextColor(Color::White());\r
+    trainingFrequencies->SetFont(DEFAULT_VECTOR_FONT_FILENAME, WND_BTHMAIN_MIN_FONT_SIZE);\r
+    trainingFrequencies->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+    trainingFrequencies->SetStyle(STYLE_TEXT_OPA, TEXT_OPACITY);\r
+    group->Add(trainingFrequencies);\r
+\r
+    if (trainingHeartRate == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BreathResultPage::OnStart new trainingHeartRate ERROR");\r
+        trainingHeartRate = new UILabel();\r
+    }\r
+    trainingHeartRate->SetPosition(WND_BTHMAIN_HEARTRATE_X, WND_BTHMAIN_HEARTRATE_Y);\r
+    trainingHeartRate->Resize(WND_BTHMAIN_HEARTRATE_W, WND_BTHMAIN_HEARTRATE_H);\r
+    trainingHeartRate->SetText("呼吸前心率");\r
+    trainingHeartRate->SetTextColor(Color::White());\r
+    trainingHeartRate->SetFont(DEFAULT_VECTOR_FONT_FILENAME, WND_BTHMAIN_MIN_FONT_SIZE);\r
+    trainingHeartRate->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+    trainingHeartRate->SetStyle(STYLE_TEXT_OPA, TEXT_OPACITY);\r
+    group->Add(trainingHeartRate);\r
+\r
+    if (frequencyTimes == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BreathResultPage::OnStart new frequencyTimes ERROR");\r
+        frequencyTimes = new UILabel();\r
+    }\r
+    frequencyTimes->SetPosition(WND_BTHMAIN_FREQUEBCY_TIMES_X, WND_BTHMAIN_FREQUEBCY_TIMES_Y);\r
+    frequencyTimes->Resize(WND_BTHMAIN_FREQUEBCY_TIMES_W, WND_BTHMAIN_FREQUEBCY_TIMES_H);\r
+    frequencyTimes->SetText("分");\r
+    frequencyTimes->SetTextColor(Color::White());\r
+    frequencyTimes->SetFont(DEFAULT_VECTOR_FONT_FILENAME, WND_BTHMAIN_MIN_FONT_SIZE);\r
+    frequencyTimes->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+    frequencyTimes->SetStyle(STYLE_TEXT_OPA, TEXT_OPACITY);\r
+    group->Add(frequencyTimes);\r
+\r
+    if (heartRateTimes == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BreathResultPage::OnStart new HeartRate_Times ERROR");\r
+        heartRateTimes = new UILabel();\r
+    }\r
+    heartRateTimes->SetPosition(WND_BTHMAIN_HEARTRATE_TIMES_X, WND_BTHMAIN_HEARTRATE_TIMES_Y);\r
+    heartRateTimes->Resize(WND_BTHMAIN_HEARTRATE_TIMES_W, WND_BTHMAIN_HEARTRATE_TIMES_H);\r
+    heartRateTimes->SetText("次/分");\r
+    heartRateTimes->SetTextColor(Color::White());\r
+    heartRateTimes->SetFont(DEFAULT_VECTOR_FONT_FILENAME, WND_BTHMAIN_MIN_FONT_SIZE);\r
+    heartRateTimes->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+    heartRateTimes->SetStyle(STYLE_TEXT_OPA, TEXT_OPACITY);\r
+    group->Add(heartRateTimes);\r
+\r
+    if (trainingDuration == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BreathResultPage::OnStart new trainingDuration ERROR");\r
+        trainingDuration = new UILabel();\r
+    }\r
+    trainingDuration->SetPosition(WND_BTHMAIN_DURATION_X, WND_BTHMAIN_DURATION_Y);\r
+    trainingDuration->Resize(WND_BTHMAIN_DURATION_W, WND_BTHMAIN_DURATION_H);\r
+    trainingDuration->SetText("训练时长");\r
+    trainingDuration->SetTextColor(Color::White());\r
+    trainingDuration->SetFont(DEFAULT_VECTOR_FONT_FILENAME, WND_BTHMAIN_MIN_FONT_SIZE);\r
+    trainingDuration->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+    trainingDuration->SetStyle(STYLE_TEXT_OPA, TEXT_OPACITY);\r
+    group->Add(trainingDuration);\r
+\r
+    if (frequenciesScout == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BreathResultPage::OnStart new Frequencies_scout ERROR");\r
+        frequenciesScout = new UILabel();\r
+    }\r
+    frequenciesScout->SetPosition(WND_BTHMAIN_FREQUENCIES_SCOUT_X, WND_BTHMAIN_FREQUENCIES_SCOUT_Y);\r
+    frequenciesScout->Resize(WND_BTHMAIN_FREQUENCIES_SCOUT_W, WND_BTHMAIN_FREQUENCIES_SCOUT_H);\r
+    frequenciesScout->SetTextColor(Color::White());\r
+    frequenciesScout->SetFont(DEFAULT_VECTOR_FONT_FILENAME, WND_BTHMAIN_SCOUT_FONT_SIZE);\r
+    frequenciesScout->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+    group->Add(frequenciesScout);\r
+\r
+    if (heartRateScout == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BreathResultPage::OnStart new HeartRate_scout ERROR");\r
+        heartRateScout = new UILabel();\r
+    }\r
+    heartRateScout->SetPosition(WND_BTHMAIN_HEARTRATE_SCOUT_X, WND_BTHMAIN_HEARTRATE_SCOUT_Y);\r
+    heartRateScout->Resize(WND_BTHMAIN_HEARTRATE_SCOUT_W, WND_BTHMAIN_HEARTRATE_SCOUT_H);\r
+    heartRateScout->SetTextColor(Color::White());\r
+    heartRateScout->SetFont(DEFAULT_VECTOR_FONT_FILENAME, WND_BTHMAIN_SCOUT_FONT_SIZE);\r
+    heartRateScout->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+    group->Add(heartRateScout);\r
+\r
+    if (descriptionBreathing == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BreathResultPage::OnStart new Rhythm ERROR");\r
+        descriptionBreathing = new UILabel();\r
+    }\r
+    descriptionBreathing->SetPosition(WND_BTHMAIN_RHYTHM_X, WND_BTHMAIN_RHYTHM_Y);\r
+    descriptionBreathing->Resize(WND_BTHMAIN_RHYTHM_W, WND_BTHMAIN_RHYTHM_H);\r
+    descriptionBreathing->SetTextColor(Color::Green());\r
+    descriptionBreathing->SetFont(DEFAULT_VECTOR_FONT_FILENAME, WND_BTHMAIN_MIN_FONT_SIZE);\r
+    descriptionBreathing->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+    group->Add(descriptionBreathing);\r
+\r
+    if (time == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BreathResultPage::OnStart new Time ERROR");\r
+        time = new UILabel();\r
+    }\r
+    time->SetPosition(WND_BTHMAIN_TIME_X, WND_BTHMAIN_TIME_Y);\r
+    time->Resize(WND_BTHMAIN_TIME_W, WND_BTHMAIN_TIME_H);\r
+    time->SetTextColor(Color::White());\r
+    time->SetFont(DEFAULT_VECTOR_FONT_FILENAME, WND_BTHMAIN_SCOUT_FONT_SIZE);\r
+    time->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+    group->Add(time);\r
+\r
+    if (timeUnit == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BreathResultPage::OnStart new Time_Unit ERROR");\r
+        timeUnit = new UILabel();\r
+    }\r
+    timeUnit->SetPosition(WND_BTHMAIN_TIME_UNIT_X, WND_BTHMAIN_TIME_UNIT_Y);\r
+    timeUnit->Resize(WND_BTHMAIN_TIME_UNIT_W, WND_BTHMAIN_TIME_UNIT_H);\r
+    timeUnit->SetText("分钟");\r
+    timeUnit->SetTextColor(Color::White());\r
+    timeUnit->SetFont(DEFAULT_VECTOR_FONT_FILENAME, WND_BTHMAIN_MIN_FONT_SIZE);\r
+    timeUnit->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+    timeUnit->SetStyle(STYLE_TEXT_OPA, TEXT_OPACITY);\r
+    group->Add(timeUnit);\r
+\r
+    if (scores == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BreathResultPage::OnStart new Scores ERROR");\r
+        scores = new UIImageView();\r
+    }\r
+    scores->SetPosition(WND_BTHMAIN_SCORES_X, WND_BTHMAIN_SCORES_Y);\r
+    scores->Resize(WND_BTHMAIN_SCORES_W, WND_BTHMAIN_SCORES_H);\r
+    group->Add(scores);\r
+\r
+    AddViewToPageContainer(group);\r
+}\r
+void BreathResultPage::OnStop() {}\r
+void BreathResultPage::OnResume(void)\r
+{\r
+    std::ostringstream oss;\r
+    oss << BreathModel::GetInstance().GetTimeDuration() << " | " << BreathModel::GetInstance().GetRhythm();\r
+    std::string weatherHumidity = oss.str();\r
+    descriptionBreathing->SetText(weatherHumidity.c_str());\r
+    time->SetText(BreathModel::GetInstance().GetDuration());\r
+\r
+    BreathModel::GetInstance().SetFrequencyScore();\r
+    BreathModel::GetInstance().SetHeartRate();\r
+\r
+    frequencyScore = BreathModel::GetInstance().GetFrequencyScore();\r
+    char szFrequencyScore[TEXT_SIZE] = "";\r
+    sprintf_s(szFrequencyScore, sizeof(szFrequencyScore), "%d", frequencyScore);\r
+    frequenciesScout->SetText(szFrequencyScore);\r
+\r
+    if (frequencyScore >= BREATH_NINETY_SIZE && frequencyScore <= BREATH_GUINEAS_SIZE) {\r
+        LOADIMG::LoadImageViewImg(scores, BREATH_IMAGE, IMAGE_CONVERTER_TOOL_BREATH008);\r
+    } else if (frequencyScore >= BREATH_EIGHTY_SIZE && frequencyScore <= BREATH_EIGHTY_NINE_SIZE) {\r
+        LOADIMG::LoadImageViewImg(scores, BREATH_IMAGE, IMAGE_CONVERTER_TOOL_BREATH007);\r
+    } else if (frequencyScore >= BREATH_SEVENTY_SIZE && frequencyScore <= BREATH_SEVENTY_NINE_SIZE) {\r
+        LOADIMG::LoadImageViewImg(scores, BREATH_IMAGE, IMAGE_CONVERTER_TOOL_BREATH011);\r
+    } else if (frequencyScore >= BREATH_SIXTY_SIZE && frequencyScore <= BREATH_SIXTY_NINE_SIZE) {\r
+        LOADIMG::LoadImageViewImg(scores, BREATH_IMAGE, IMAGE_CONVERTER_TOOL_BREATH009);\r
+    } else {\r
+        LOADIMG::LoadImageViewImg(scores, BREATH_IMAGE, IMAGE_CONVERTER_TOOL_BREATH010);\r
+    }\r
+\r
+    heartRate = BreathModel::GetInstance().GetHeartRate();\r
+    char szHeartRate[TEXT_SIZE] = "";\r
+    sprintf_s(szHeartRate, sizeof(szHeartRate), "%d", heartRate);\r
+    heartRateScout->SetText(szHeartRate);\r
+}\r
+\r
+bool BreathResultPage::OnClick(UIView &view, const ClickEvent &event)\r
+{\r
+    return true;\r
+}\r
+\r
+bool BreathResultPage::OnDrag(UIView &view, const DragEvent &event)\r
+{\r
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BreathResultPage::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, "BreathResultPage::OnDrag ChangeSlice(VIEW_APPLIST)");\r
+        NativeAbility::GetInstance().SwitchPageInSlice(BREATH_MAIN_VIEW, nullptr, TransitionType::TRANSITION_INVALID,\r
+                                                       true);\r
+    }\r
+    return true;\r
+}\r
+}  // namespace OHOS
\ No newline at end of file
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/breath/src/BreathRhyPage.cpp b/code/sdk/application/wearable/nativeapp/nativeui/breath/src/BreathRhyPage.cpp
new file mode 100644 (file)
index 0000000..1265c99
--- /dev/null
@@ -0,0 +1,172 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: BreathRhyPage\r
+ * Create: 2025-5-13\r
+ */\r
+#include "gfx_utils/graphic_math.h"\r
+#include "UiConfig.h"\r
+#include "AppViewIDs.h"\r
+#include "wearable_log.h"\r
+#include "NativeAbility.h"\r
+#include "alarm/MainAlarmView.h"\r
+#include "SlicePageFactory.h"\r
+#include "ui_resource_breath.h"\r
+#include "main/LoadImg.h"\r
+#include "breath/BreathView.h"\r
+#include "breath/BreathModel.h"\r
+#include "breath/BreathRhyPage.h"\r
+\r
+namespace OHOS {\r
+REGIST_SLICE_PAGE(VIEW_MAIN_BREATHEASE, BrearhView::BREATH_RHY_VIEW, BreathRhyPage, false);\r
+#define WND_BTHRHY_BTN_OK_ID "BTH_RHY_OK"\r
+#define WND_BTHRHY_TITLE_X 100\r
+#define WND_BTHRHY_TITLE_Y 38\r
+#define WND_BTHRHY_TITLE_W 253\r
+#define WND_BTHRHY_TITLE_H 53\r
+#define WND_BTHRHY_TITLE_FONT_SIZE 38\r
+#define WND_BTHRHY_PICKER_X 64\r
+#define WND_BTHRHY_PICKER_Y 109\r
+#define WND_BTHRHY_PICKER_W 321\r
+#define WND_BTHRHY_PICKER_H 218\r
+#define WND_BTHRHY_PICKER_B_FONT_SIZE 44\r
+#define WND_BTHRHY_PICKER_H_FONT_SIZE 44\r
+#define WND_BTHRHY_PICKER_ITEM_H 80\r
+#define WND_BTHRHY_OK_X 61\r
+#define WND_BTHRHY_OK_Y 362\r
+#define WND_BTHRHY_OK_W 331\r
+#define WND_BTHRHY_OK_H 98\r
+#define BREATH_GROUP_SIZE 466\r
+\r
+BreathRhyPage::BreathRhyPage() {}\r
+\r
+BreathRhyPage::~BreathRhyPage()\r
+{\r
+    group->RemoveAll();\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 (group != nullptr) {\r
+        delete group;\r
+        group = nullptr;\r
+    }\r
+    if (center != nullptr) {\r
+        delete center;\r
+        center = nullptr;\r
+    }\r
+}\r
+\r
+void BreathRhyPage::OnStart(void *data)\r
+{\r
+    if (group == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BreathRhyPage::OnStart new group ERROR");\r
+        group = new UIViewGroup();\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
+    if (lableRhythm == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BreathRhyPage::OnStart new lableRhythm ERROR");\r
+        lableRhythm = new UILabel();\r
+    }\r
+    lableRhythm->SetPosition(WND_BTHRHY_TITLE_X, WND_BTHRHY_TITLE_Y);\r
+    lableRhythm->Resize(WND_BTHRHY_TITLE_W, WND_BTHRHY_TITLE_H);\r
+    lableRhythm->SetText("节奏设置");\r
+    lableRhythm->SetTextColor(Color::White());\r
+    lableRhythm->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+    lableRhythm->SetFont(DEFAULT_VECTOR_FONT_FILENAME, WND_BTHRHY_TITLE_FONT_SIZE);\r
+    group->Add(lableRhythm);\r
+\r
+    if (pickerRhythm == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BreathRhyPage::OnStart new pickerRhythm ERROR");\r
+        pickerRhythm = new UIPicker();\r
+    }\r
+    pickerRhythm->SetPosition(WND_BTHRHY_PICKER_X, WND_BTHRHY_PICKER_Y);\r
+    pickerRhythm->Resize(WND_BTHRHY_PICKER_W, WND_BTHRHY_PICKER_H);\r
+    pickerRhythm->SetBackgroundFont(DEFAULT_VECTOR_FONT_FILENAME, WND_BTHRHY_PICKER_B_FONT_SIZE);\r
+    pickerRhythm->SetHighlightFont(DEFAULT_VECTOR_FONT_FILENAME, WND_BTHRHY_PICKER_H_FONT_SIZE);\r
+    pickerRhythm->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+    pickerRhythm->SetItemHeight(WND_BTHRHY_PICKER_ITEM_H);\r
+    pickerRhythm->SetTextColor(Color::GetColorFromRGBA(0xfa, 0xf3, 0xf3, 0xff),\r
+                               Color::GetColorFromRGBA(0xfa, 0xf3, 0xf3, 0xff));\r
+    uint8_t selectTempo = BreathModel::GetInstance().GetSelectTempo();\r
+    pickerRhythm->SetSelected(selectTempo);\r
+    pickerRhythm->RegisterSelectedListener(this);\r
+    pickerRhythm->SetVisible(true);\r
+    pickerRhythm->SetOnDragListener(this);\r
+    pickerRhythm->SetLoopState(false);\r
+    group->Add(pickerRhythm);\r
+\r
+    if (center == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BreathRhyPage::OnStart new Center ERROR");\r
+        center = new UIImageView();\r
+    }\r
+    center->SetPosition(WND_BTHRHY_PICKER_X, WND_BTHRHY_PICKER_Y);\r
+    center->Resize(WND_BTHRHY_PICKER_W, WND_BTHRHY_PICKER_H);\r
+    LOADIMG::LoadImageViewImg(center, BREATH_IMAGE, IMAGE_CONVERTER_TOOL_BREATH013);\r
+    group->Add(center);\r
+\r
+    if (buttonOk == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BreathRhyPage::OnStart new buttonOk ERROR");\r
+        buttonOk = new UIButton();\r
+    }\r
+    buttonOk->SetPosition(WND_BTHRHY_OK_X, WND_BTHRHY_OK_Y);\r
+    buttonOk->Resize(WND_BTHRHY_OK_W, WND_BTHRHY_OK_H);\r
+    buttonOk->SetViewId(WND_BTHRHY_BTN_OK_ID);\r
+    buttonOk->SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
+    LOADIMG::LoadBtnImage(buttonOk, BREATH_IMAGE, IMAGE_CONVERTER_TOOL_BREATH005, IMAGE_CONVERTER_TOOL_BREATH005);\r
+    buttonOk->SetStyleForState(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT, UIButton::PRESSED);\r
+    buttonOk->SetOnClickListener(this);\r
+    group->Add(buttonOk);\r
+\r
+    AddViewToPageContainer(group);\r
+}\r
+void BreathRhyPage::OnResume()\r
+{\r
+    pickerRhythm->SetValues(BreathModel::GetInstance().GetRhyListData(), BreathModel::GetInstance().GetRhyListSize());\r
+    GetSlicePageContainer()->SetIntercept(true);\r
+    GetSlicePageContainer()->SetOnDragListener(nullptr);\r
+}\r
+\r
+void BreathRhyPage::OnPause() {}\r
+\r
+void BreathRhyPage::OnStop() {}\r
+\r
+bool BreathRhyPage::OnClick(UIView &view, const ClickEvent &event)\r
+{\r
+    if (strcmp(view.GetViewId(), WND_BTHRHY_BTN_OK_ID) == 0) {\r
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BreathRhyPage OnClick...ChangeTo DUR");\r
+        NativeAbility::GetInstance().SwitchPageInSlice(BREATH_MAIN_VIEW, nullptr, TransitionType::TRANSITION_INVALID,\r
+                                                       true);\r
+        BreathModel::GetInstance().SetTimeRhyation(pickerRhythm->GetSelected());\r
+    } else {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BreathRhyPage OnClick...ChangeTo unknow");\r
+        return false;\r
+    }\r
+    return true;\r
+}\r
+\r
+bool BreathRhyPage::OnDrag(UIView &view, const DragEvent &event)\r
+{\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BreathRhyPage::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, "BreathRhyPage::OnDrag ChangeSlice(VIEW_APPLIST)");\r
+        NativeAbility::GetInstance().SwitchPageInSlice(BREATH_MAIN_VIEW, nullptr, TransitionType::TRANSITION_INVALID,\r
+                                                       true);\r
+    }\r
+    return true;\r
+}\r
+}  // namespace OHOS
\ No newline at end of file
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/breath/src/BreathStartPage.cpp b/code/sdk/application/wearable/nativeapp/nativeui/breath/src/BreathStartPage.cpp
new file mode 100644 (file)
index 0000000..6545ac4
--- /dev/null
@@ -0,0 +1,197 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: BreathStartPage\r
+ * Create: 2025-5-13\r
+ */\r
+#include <string>\r
+#include <sstream>\r
+#include <sys/time.h>\r
+#include "gfx_utils/graphic_math.h"\r
+#include "components/root_view.h"\r
+#include "UiConfig.h"\r
+#include "ohos_timer.h"\r
+#include "AppViewIDs.h"\r
+#include "wearable_log.h"\r
+#include "NativeAbility.h"\r
+#include "TransitionType.h"\r
+#include "SlicePageFactory.h"\r
+#include "PageTransitionMgr.h"\r
+#include "ui_resource_breath.h"\r
+#include "main/LoadImg.h"\r
+#include "breath/BreathView.h"\r
+#include "breath/BreathModel.h"\r
+#include "breath/BreathStartPage.h"\r
+\r
+namespace OHOS {\r
+REGIST_SLICE_PAGE(VIEW_MAIN_BREATHEASE, BrearhView::BREATH_START_VIEW, BreathStartPage, false);\r
+\r
+#define WND_BTHSTART_TITLE_X 97\r
+#define WND_BTHSTART_TITLE_Y 40\r
+#define WND_BTHSTART_TITLE_W 260\r
+#define WND_BTHSTART_TITLE_H 53\r
+#define WND_BTHSTART_TITLE_FONT_SIZE 36\r
+#define WND_BTHSTART_CENTERIMG_X 88\r
+#define WND_BTHSTART_CENTERIMG_Y 88\r
+#define WND_BTHSTART_CENTERIMG_W 279\r
+#define WND_BTHSTART_CENTERIMG_H 280\r
+#define WND_BTHSTART_GUIDE_X 126\r
+#define WND_BTHSTART_GUIDE_Y 354\r
+#define WND_BTHSTART_GUIDE_W 202\r
+#define WND_BTHSTART_GUIDE_H 68\r
+#define WND_BTHSTART_GUIDE_FONT_SIZE 24\r
+#define BREATH_GROUP_SIZE 466\r
+#define TEXT_OPACITY 147\r
+#define countDown 5\r
+#define SIZE 64\r
+\r
+BreathStartPage::BreathStartPage() {}\r
+\r
+BreathStartPage::~BreathStartPage()\r
+{\r
+    group->RemoveAll();\r
+    if (titleLable != nullptr) {\r
+        delete titleLable;\r
+        titleLable = nullptr;\r
+    }\r
+    if (guideLable != nullptr) {\r
+        delete guideLable;\r
+        guideLable = nullptr;\r
+    }\r
+    if (centerImge != nullptr) {\r
+        delete centerImge;\r
+        centerImge = nullptr;\r
+    }\r
+    if (group != nullptr) {\r
+        delete group;\r
+        group = nullptr;\r
+    }\r
+    if (background != nullptr) {\r
+        delete background;\r
+        background = nullptr;\r
+    }\r
+    if (animation != nullptr) {\r
+        delete animation;\r
+        animation = nullptr;\r
+    }\r
+    if (animatorCallBack != nullptr) {\r
+        delete animatorCallBack;\r
+        animatorCallBack = nullptr;\r
+    }\r
+}\r
+\r
+void BreathStartPage::OnStart(void *data)\r
+{\r
+    if (group == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BreathStartPage::OnStart new group ERROR");\r
+        group = new UIViewGroup();\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
+    if (background == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BreathStartPage::OnStart new background ERROR");\r
+        background = new UIImageView();\r
+    }\r
+    background->SetPosition(0, 0);\r
+    background->Resize(BREATH_GROUP_SIZE, BREATH_GROUP_SIZE);\r
+    LOADIMG::LoadImageViewImg(background, BREATH_IMAGE, IMAGE_CONVERTER_TOOL_BREATH001);\r
+    group->Add(background);\r
+\r
+    if (titleLable == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BreathStartPage::OnStart new titleLable ERROR");\r
+        titleLable = new UILabel();\r
+    }\r
+    titleLable->SetPosition(WND_BTHSTART_TITLE_X, WND_BTHSTART_TITLE_Y);\r
+    titleLable->Resize(WND_BTHSTART_TITLE_W, WND_BTHSTART_TITLE_H);\r
+    titleLable->SetText("请保持静止");\r
+    titleLable->SetTextColor(Color::White());\r
+    titleLable->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+    titleLable->SetFont(DEFAULT_VECTOR_FONT_FILENAME, WND_BTHSTART_TITLE_FONT_SIZE);\r
+    group->Add(titleLable);\r
+\r
+    if (centerImge == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BreathStartPage::OnStart new centerImg ERROR");\r
+        centerImge = new UIImageView();\r
+    }\r
+    centerImge->SetPosition(WND_BTHSTART_CENTERIMG_X, WND_BTHSTART_CENTERIMG_Y);\r
+    centerImge->Resize(WND_BTHSTART_CENTERIMG_W, WND_BTHSTART_CENTERIMG_H);\r
+    LOADIMG::LoadImageViewImg(centerImge, BREATH_IMAGE, IMAGE_CONVERTER_TOOL_BREATH003);\r
+    group->Add(centerImge);\r
+\r
+    if (guideLable == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BreathStartPage::OnStart new guideLable ERROR");\r
+        guideLable = new UILabel();\r
+    }\r
+    guideLable->SetPosition(WND_BTHSTART_GUIDE_X, WND_BTHSTART_GUIDE_Y);\r
+    guideLable->Resize(WND_BTHSTART_GUIDE_W, WND_BTHSTART_GUIDE_H);\r
+    guideLable->SetTextColor(Color::White());\r
+    guideLable->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+    guideLable->SetFont(DEFAULT_VECTOR_FONT_FILENAME, WND_BTHSTART_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, "BreathStartPage::OnStart new animatorCallBack ERROR");\r
+        return;\r
+    }\r
+    animation = new Animator(animatorCallBack, nullptr, 0, true);\r
+    if (animation == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BreathStartPage::OnStart new animation ERROR");\r
+        return;\r
+    }\r
+    animation->Start();\r
+    AddViewToPageContainer(group);\r
+}\r
+\r
+void BreathStartPage::OnStop() {}\r
+\r
+void BreathStartPage::BreathStartCallback::Callback(UIView *view)\r
+{\r
+    UNUSED(view);\r
+    struct timeval current_time;\r
+    gettimeofday(&current_time, nullptr);\r
+    int32_t overTime = countDown;\r
+    int32_t start_time = BreathModel::GetInstance().GetSaveTime();\r
+    int32_t remTime = overTime - (current_time.tv_sec - start_time);\r
+\r
+    char szText[SIZE] = "";\r
+    sprintf_s(szText, sizeof(szText), "%d秒后跟随训练指引开始吸气和呼气", remTime);\r
+    BreathStartPage->guideLable->SetText(szText);\r
+    if (remTime <= 0) {\r
+        NativeAbility::GetInstance().SwitchPageInSlice(BREATH_EXER_VIEW, nullptr, TransitionType::TRANSITION_INVALID,\r
+                                                       true);\r
+        BreathStartPage->animation->Stop();\r
+        struct timeval start_breathing_time;\r
+        gettimeofday(&start_breathing_time, nullptr);\r
+        uint32_t breathing_time = start_breathing_time.tv_sec;\r
+        BreathModel::GetInstance().SetBeginsTime(breathing_time);\r
+    }\r
+}\r
+\r
+void BreathStartPage::OnPause()\r
+{\r
+    animation->Stop();\r
+}\r
+\r
+bool BreathStartPage::OnDrag(UIView &view, const DragEvent &event)\r
+{\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BreathStartPage::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, "BreathStartPage::OnDrag ChangeSlice(VIEW_APPLIST)");\r
+        NativeAbility::GetInstance().SwitchPageInSlice(BREATH_MAIN_VIEW, nullptr, TransitionType::TRANSITION_INVALID,\r
+                                                       true);\r
+    }\r
+    return true;\r
+}\r
+\r
+void BreathStartPage::OnTimer() {}\r
+\r
+}  // namespace OHOS
\ No newline at end of file
index c63f185..70b6230 100644 (file)
@@ -5,9 +5,12 @@
  * Create: 2021-10-12\r
  */\r
 \r
-#include "CallerItemView.h"\r
-#include "CallerLogPresenter.h"\r
+#include "callerlog/CallerItemView.h"\r
+#include "sys/time.h"\r
 #include "wearable_log.h"\r
+#ifdef BUILD_IN_LINUX\r
+#include "localtime.h"\r
+#endif\r
 \r
 namespace OHOS {\r
 static constexpr int16 ICON_X = 100;\r
index 5e9e96d..11d2483 100644 (file)
@@ -4,15 +4,15 @@
  * Author:
  * Create: 2021-10-12
  */
-#include "CallerLogModel.h"
-#include "CallerLogView.h"
-#include "DialingScreenView.h"
-#include "CallingView.h"
+#include "callerlog/CallerLogModel.h"
+#include "callerlog/CallerLogView.h"
+#include "makephone/DialingScreenView.h"
+#include "makephone/CallingView.h"
 #include "ohos_timer.h"
 #include "graphic_timer.h"
 #include "samgr_lite.h"
-#include "MainCallingPresenter.h"
-#include "PlayersModel.h"
+#include "makephone/MainCallingPresenter.h"
+#include "player/PlayersModel.h"
 #include "graphic_service.h"
 
 #ifdef __cplusplus
index 6c87b1f..398f251 100644 (file)
@@ -5,11 +5,11 @@
  * Create: 2021-10-12\r
  */\r
 \r
-#include "CallerLogPresenter.h"\r
-#include "CallerLogView.h"\r
+#include "callerlog/CallerLogPresenter.h"\r
+#include "callerlog/CallerLogView.h"\r
 #include "common/task_manager.h"\r
 #include "wearable_log.h"\r
-#include "PhoneService.h"\r
+#include "phoneservice/PhoneService.h"\r
 #include "NativeRegisterManager.h"\r
 \r
 namespace OHOS {\r
index 5edabaa..a9d012a 100644 (file)
@@ -5,9 +5,9 @@
  * Create: 2021-10-12\r
  */\r
 \r
-#include "CallerLogView.h"\r
-#include "CallerLogPresenter.h"\r
-#include "CallerLogModel.h"\r
+#include "callerlog/CallerLogView.h"\r
+#include "callerlog/CallerLogPresenter.h"\r
+#include "callerlog/CallerLogModel.h"\r
 #include "wearable_log.h"\r
 \r
 namespace OHOS {\r
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/camera/src/CameraMainPage.cpp b/code/sdk/application/wearable/nativeapp/nativeui/camera/src/CameraMainPage.cpp
new file mode 100644 (file)
index 0000000..6aca116
--- /dev/null
@@ -0,0 +1,376 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: CameraMainPage\r
+ * Created: 2025-06-05\r
+ */\r
+\r
+#include <string>\r
+#include "ui_test_group.h"\r
+#include "phoneservice/PhoneService.h"\r
+#include "uiservice/ui_service.h"\r
+#include "common/image_cache_manager.h"\r
+#include "main/LoadImg.h"\r
+#include "msg_center_device.h"\r
+#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
+\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
+static constexpr uint16_t TITLE_XPOY = 329;\r
+static constexpr uint16_t TITLE_WIDTH = 424;\r
+static constexpr uint16_t TITLE_HIGHT = 50;\r
+static constexpr uint16_t TITLE_FONT_SIZE = 36;\r
+static constexpr uint16_t CAMERATITLE_FONT_SIZE = 38;\r
+static constexpr uint16_t CAMERATITLE_XPOS = 97;\r
+static constexpr uint16_t CAMERATITLE_XPOY = 37;\r
+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_WIDTH = 250;\r
+static constexpr uint16_t CAMERAFIND_HIGHT = 42;\r
+static constexpr uint16_t CAMERATIME_XPOS = 200;\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
+\r
+REGIST_SLICE_PAGE(VIEW_CAMERA, CAMERA_PAGES::CAMERA_MAIN_PAGE, CameraMainPage, true);\r
+\r
+CameraMainPage::CameraMainPage()\r
+{\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "CameraMainPage::CameraMainPage");\r
+    ImageCacheManager::GetInstance().LoadAllInMultiRes(CAMERA_IMAGE);\r
+    g_pCameraMainPage = this;\r
+}\r
+\r
+CameraMainPage::~CameraMainPage()\r
+{\r
+    g_pCameraMainPage = nullptr;\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 (bluetoothDisconnected != nullptr) {\r
+        delete bluetoothDisconnected;\r
+        bluetoothDisconnected = nullptr;\r
+    }\r
+\r
+    if (cameraFind != nullptr) {\r
+        delete cameraFind;\r
+        cameraFind = nullptr;\r
+    }\r
+\r
+    if (cameraTitle != nullptr) {\r
+        delete cameraTitle;\r
+        cameraTitle = nullptr;\r
+    }\r
+\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
+    }\r
+\r
+    if (callBack_ != nullptr) {\r
+        delete callBack_;\r
+        callBack_ = nullptr;\r
+    }\r
+    ImageCacheManager::GetInstance().UnloadAllInMultiRes(CAMERA_IMAGE);\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "CameraMainPage::~CameraMainPage");\r
+}\r
+\r
+CameraMainPage *CameraMainPage::GetInstance()\r
+{\r
+    return g_pCameraMainPage;\r
+}\r
+\r
+void CameraMainPage::OnStart(void *data)\r
+{\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
+    }\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
+        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
+        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
+        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
+        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
+        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
+    SetUpButton();\r
+    callBack_ = new CameraAnimatorCallback(this);\r
+    animator_ = new Animator(callBack_, nullptr, 0, true);\r
+\r
+    AddViewToPageContainer(container_);\r
+    InitCameraView();\r
+}\r
+\r
+uint8_t CameraMainPage::GetConnectStatus()\r
+{\r
+    uint8_t conn_status = 0;\r
+\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
+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
+        container_->Invalidate();\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_CONNECT_PHONE, &value, sizeof(value));\r
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MSGCENTER_TYPE_ID_CAMERA_CONNECT_PHONE 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
+        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
+    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
+    }\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
+}\r
+\r
+void CameraMainPage::OnPause()\r
+{\r
+    animator_->Stop();\r
+}\r
+\r
+bool CameraMainPage::OnClick(UIView &view, const ClickEvent &event)\r
+{\r
+    UNUSED(event);\r
+    if (view.GetViewId() == "button1") {\r
+        if (GetConnectStatus() == 1) {\r
+            button->SetVisible(false);\r
+            cameraTime->SetVisible(true);\r
+            SetFirstFlag(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
+            container_->Invalidate();\r
+        }\r
+    }\r
+    return true;\r
+}\r
+\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
+#endif\r
+        NativeAbility::GetInstance().ChangeSlice(VIEW_APPLIST);\r
+    }\r
+    return true;\r
+}\r
+\r
+void CameraMainPage::CameraAnimatorCallback::Callback(UIView *view)\r
+{\r
+    (void)view;\r
+    static int count = 0;\r
+    static struct timeval start_time;\r
+    struct timeval current_time;\r
+    if (page_->GetFirstFlag()) {\r
+        gettimeofday(&start_time, nullptr);\r
+        page_->SetFirstFlag(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
+    }\r
+}\r
+\r
+void CameraMainPage::StopAnimator()\r
+{\r
+    animator_->Stop();\r
+    button->SetVisible(true);\r
+    cameraTime->SetVisible(false);\r
+    cameraTime->SetText("5s");\r
+    SetFirstFlag(false);\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_ON_CAMERA, &value, sizeof(value));\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MSGCENTER_TYPE_ID_ON_CAMERA ret = %d", ret);\r
+#endif\r
+}\r
+\r
+void CameraMainPage::SetCameraTime(int time)\r
+{\r
+    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
+}\r
+\r
+bool CameraMainPage::GetFirstFlag()\r
+{\r
+    return isFirst;\r
+}\r
+\r
+void CameraMainPage::SetFirstFlag(bool value)\r
+{\r
+    isFirst = value;\r
+}\r
+}
\ No newline at end of file
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/camera/src/CameraModel.cpp b/code/sdk/application/wearable/nativeapp/nativeui/camera/src/CameraModel.cpp
new file mode 100644 (file)
index 0000000..669c55b
--- /dev/null
@@ -0,0 +1,24 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: CameraModel\r
+ * Created: 2025-06-05\r
+ */\r
+\r
+#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
+\r
+namespace OHOS {\r
+\r
+CameraModel::CameraModel() {}\r
+\r
+CameraModel::~CameraModel() {}\r
+\r
+CameraModel &CameraModel::GetInstance()\r
+{\r
+    static CameraModel instance;\r
+    return instance;\r
+}\r
+}\r
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/camera/src/CameraPresenter.cpp b/code/sdk/application/wearable/nativeapp/nativeui/camera/src/CameraPresenter.cpp
new file mode 100644 (file)
index 0000000..4d94013
--- /dev/null
@@ -0,0 +1,15 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: CameraPresenter\r
+ * Created: 2025-06-05\r
+ */\r
+\r
+#include "uiservice/ui_service.h"\r
+#include "NativeRegisterManager.h"\r
+#include "camera/CameraView.h"\r
+#include "camera/CameraModel.h"\r
+#include "camera/CameraPresenter.h"\r
+\r
+namespace OHOS {\r
+REGIST_MENU(VIEW_CAMERA, CameraView, CameraPresenter, CAMERA_MAIN_ICON, PNG_APPLIST_SETTING_IMAGE, "相机");\r
+}\r
index 7bc705a..c0e5076 100644 (file)
@@ -5,14 +5,18 @@
  * Create: 2024-10-30
  */
 
-#include "AmbientClockView.h"
-#include "MainPresenterSample.h"
+#include "clock/AmbientClockView.h"
+#include "main/MainPresenterSample.h"
 #include "components/ui_label.h"
 #include "wearable_log.h"
 #include "ui_resource_image.h"
 #include "common/image_cache_manager.h"
+#include "UICardPageFactory.h"
 
 namespace OHOS {
+
+REGIST_WATCH_DIAL(DIAL_DISPLAY_MODE_AOD, DIAL_CLOCK, AmbientClockView);
+
 static constexpr uint16_t POINT_POSITION_X = 202;
 static constexpr uint16_t POINT_POSITION_Y = 16;
 static constexpr uint16_t SECOND_POINT_POSITION_Y = 16;
index 9beeb51..1fdfcf4 100644 (file)
@@ -5,15 +5,19 @@
  * Create: 2021-08-14
  */
 
-#include "MainClockView.h"
-#include "MainPresenterSample.h"
+#include "clock/MainClockView.h"
+#include "main/MainPresenterSample.h"
 #include "components/ui_label.h"
 #include "wearable_log.h"
 #include "ui_resource_image.h"
 #include "common/image_cache_manager.h"
+#include "UICardPageFactory.h"
 #include <ctime>
 
 namespace OHOS {
+
+REGIST_WATCH_DIAL(DIAL_DISPLAY_MODE_MAIN, DIAL_CLOCK, MainClockView);
+
 static MainClockView *g_pMainClockView = nullptr;
 
 static constexpr uint16_t FONT_DEFAULT_SIZE = 25;
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/compass/include/CompassCalibrationView.h b/code/sdk/application/wearable/nativeapp/nativeui/compass/include/CompassCalibrationView.h
deleted file mode 100644 (file)
index 704e60d..0000000
+++ /dev/null
@@ -1,34 +0,0 @@
-/*\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
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/compass/include/CompassControlView.h b/code/sdk/application/wearable/nativeapp/nativeui/compass/include/CompassControlView.h
deleted file mode 100644 (file)
index 3dc43f2..0000000
+++ /dev/null
@@ -1,36 +0,0 @@
-/*\r
- * Copyright (c) CompanyNameMagicTag 2022-2022. All rights reserved.\r
- * Description: CompassControlView.h\r
- * Author:\r
- * Create: 2022-04-02\r
- */\r
-\r
-#ifndef COMPASS_CONTROL_VIEW_H\r
-#define COMPASS_CONTROL_VIEW_H\r
-\r
-#include "components/root_view.h"\r
-#include "UiConfig.h"\r
-#include "components/ui_card_page.h"\r
-#include "CompassCalibrationView.h"\r
-#include "CompassView.h"\r
-\r
-namespace OHOS {\r
-\r
-class CompassControlView : public UICardPage {\r
-public:\r
-    CompassControlView();\r
-    ~CompassControlView() override;\r
-    bool InitView(void);\r
-    void PreLoad(void) override;\r
-    void UnLoad(void) override;\r
-    void SetCalibrationView(bool flag);\r
-private:\r
-    CompassCalibrationView *compassCalibrationView{nullptr};\r
-    CompassView *compassView{nullptr};\r
-    bool viewiInitStatus{false};\r
-    bool isCalibration{false};\r
-\r
-    void ClearAll(void);\r
-};\r
-}\r
-#endif\r
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/compass/include/CompassModel.h b/code/sdk/application/wearable/nativeapp/nativeui/compass/include/CompassModel.h
deleted file mode 100644 (file)
index 80cfd2f..0000000
+++ /dev/null
@@ -1,38 +0,0 @@
-/*\r
- * Copyright (c) CompanyNameMagicTag 2022-2022. All rights reserved.\r
- * Description: CompassModel.h\r
- * Author:\r
- * Create: 2022-04-02\r
- */\r
-\r
-#ifndef COMPASS_MODEL_H\r
-#define COMPASS_MODEL_H\r
-\r
-#include <cstdint>\r
-\r
-namespace OHOS {\r
-class CompassModel {\r
-public:\r
-    static CompassModel *GetInstance(void);\r
-    bool OpenCompassSensor(void);\r
-    bool CloseCompassSensor(void);\r
-    void SetCalibrationStatus(uint8_t status);\r
-    uint8_t GetCalibrationStatus(void);\r
-    void SetDisplayAngle(uint16_t angle);\r
-    uint16_t GetDisplayAngle(void);\r
-#if defined(_WIN32)\r
-#undef GetCurrentTime\r
-#endif\r
-    time_t GetCurrentTime(void);\r
-    void SetLastTime(time_t value);\r
-    time_t GetLastTime(void);\r
-\r
-private:\r
-    uint8_t calibrationStatus{1};\r
-    uint16_t displayAngle{0};\r
-    time_t lastTime{0};\r
-};\r
-}\r
-\r
-#endif\r
-\r
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/compass/include/CompassPresenter.h b/code/sdk/application/wearable/nativeapp/nativeui/compass/include/CompassPresenter.h
deleted file mode 100644 (file)
index 68d6877..0000000
+++ /dev/null
@@ -1,46 +0,0 @@
-/*\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/nativeapp/nativeui/compass/include/CompassView.h b/code/sdk/application/wearable/nativeapp/nativeui/compass/include/CompassView.h
deleted file mode 100644 (file)
index 97cd957..0000000
+++ /dev/null
@@ -1,47 +0,0 @@
-/*\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
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/compass/include/MainCompassPresenter.h b/code/sdk/application/wearable/nativeapp/nativeui/compass/include/MainCompassPresenter.h
deleted file mode 100644 (file)
index cd025a4..0000000
+++ /dev/null
@@ -1,32 +0,0 @@
-/*\r
- * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved.\r
- * Description: MainCompassPresenter.h\r
- * Author:\r
- * Create: 2021-12-21\r
- */\r
-#ifndef COMPASS_MAINPRESENTER_H\r
-#define COMPASS_MAINPRESENTER_H\r
-\r
-#include "Presenter.h"\r
-#include "ModelListenerSample.h"\r
-#include "ohos_types.h"\r
-#include "UiConfig.h"\r
-#include "AppViewIDs.h"\r
-#include "MainCompassView.h"\r
-#include "CompassPresenter.h"\r
-#include "CompassModel.h"\r
-#include "CompassCalibrationView.h"\r
-\r
-namespace OHOS {\r
-class MainCompassPresenter : public Presenter<MainCompassView>, public CompassPresenter,\r
-    public ModelListenerSample, public UIView::OnDragListener {\r
-public:\r
-    MainCompassPresenter();\r
-    ~MainCompassPresenter() override;\r
-\r
-    static MainCompassPresenter *GetInstance(void);\r
-    bool OnDrag(UIView& view, const DragEvent& event) override;\r
-    void Notify() override;\r
-};\r
-}\r
-#endif
\ No newline at end of file
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/compass/include/MainCompassView.h b/code/sdk/application/wearable/nativeapp/nativeui/compass/include/MainCompassView.h
deleted file mode 100644 (file)
index 306496a..0000000
+++ /dev/null
@@ -1,44 +0,0 @@
-/*\r
- * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved.\r
- * Description: MainCompassView\r
- * Author:\r
- * Create: 2021-12-23\r
- */\r
-\r
-#ifndef MAIN_COMPASS_VIEW_H\r
-#define MAIN_COMPASS_VIEW_H\r
-\r
-#include <string>\r
-#include "View.h"\r
-#include "components/ui_label.h"\r
-#include "components/root_view.h"\r
-#include "components/ui_view_group.h"\r
-#include "components/ui_image_view.h"\r
-#include "components/ui_label_button.h"\r
-#include "ChangeSliceListener.h"\r
-#include "graphic_config.h"\r
-#include "CompassView.h"\r
-#include "CompassModel.h"\r
-#include "CompassCalibrationView.h"\r
-\r
-namespace OHOS {\r
-class MainCompassPresenter;\r
-class CompassView;\r
-class MainCompassView : public View<MainCompassPresenter> {\r
-public:\r
-    MainCompassView();\r
-    ~MainCompassView() override;\r
-\r
-    void OnStart() override;\r
-    void OnStop() override;\r
-\r
-    static MainCompassView *GetInstance(void);\r
-    void SetDisplayTure(void);\r
-    void SetDisplayFalse(void);\r
-\r
-private:\r
-    CompassView *compassView{nullptr};\r
-    CompassCalibrationView *compassCalibrationView{nullptr};\r
-};\r
-} // namespace OHOS\r
-#endif
\ No newline at end of file
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/compass/src/CompassCalibrationView.cpp b/code/sdk/application/wearable/nativeapp/nativeui/compass/src/CompassCalibrationView.cpp
deleted file mode 100644 (file)
index 390c0ae..0000000
+++ /dev/null
@@ -1,124 +0,0 @@
-/*
- * Copyright (c) CompanyNameMagicTag 2022-2022. All rights reserved.
- * Description: CompassCalibrationView.cpp
- * Author:
- * Create: 2022-04-02
- */
-#include "UiConfig.h"
-#include "wearable_log.h"
-#include "CompassCalibrationView.h"
-#include "CompassModel.h"
-
-namespace OHOS {
-// 标签设置
-static constexpr uint16_t LABEL_POSITION_X = 118;
-static constexpr uint16_t LABEL_POSITION_Y = 80;
-static constexpr uint16_t LABEL_POSITION_WIDTH = 200;
-static constexpr uint16_t LABEL_POSITION_HEIGHT = 50;
-
-static constexpr uint16_t LABEL_POSITION_X1 = 28;
-static constexpr uint16_t LABEL_POSITION_Y1 = 130;
-static constexpr uint16_t LABEL_POSITION_WIDTH1 = 400;
-static constexpr uint16_t LABEL_POSITION_HEIGHT1 = 50;
-static constexpr uint16_t FONT_DEFAULT_SIZE = 35;
-
-static CompassCalibrationView *g_pMainView = nullptr;
-CompassCalibrationView::CompassCalibrationView()
-{
-    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "CompassCalibrationView::CompassCalibrationView");
-    SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);
-    g_pMainView = this;
-}
-
-CompassCalibrationView::~CompassCalibrationView()
-{
-    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "CompassCalibrationView::~CompassCalibrationView");
-    ClearAll();
-    g_pMainView = nullptr;
-}
-
-void CompassCalibrationView::ClearAll(void)
-{
-    RemoveAll();
-    if (labelOne != nullptr) {
-        delete labelOne;
-        labelOne = nullptr;
-    }
-    if (imageView != nullptr) {
-        delete imageView;
-        imageView = nullptr;
-    }
-    if (labelTwo != nullptr) {
-        delete labelTwo;
-        labelTwo = nullptr;
-    }
-}
-
-CompassCalibrationView *CompassCalibrationView::GetInstance(void)
-{
-    return g_pMainView;
-}
-
-bool CompassCalibrationView::CreateUIViewGroup(void)
-{
-    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "CompassCalibrationView::CreateUIViewGroup");
-    imageView = new UIImageView();
-    if (imageView == nullptr) {
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "CompassCalibrationView::new UIImageView fail");
-        return false;
-    }
-    imageView->SetPosition(0, 0);
-    imageView->SetSrc(COMPASS_CALIBRATE_IMAGE);
-
-    labelOne = new UILabel();
-    if (labelOne == nullptr) {
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "CompassCalibrationView::new labelOne fail");
-        ClearAll();
-        return false;
-    }
-
-    labelOne->SetPosition(LABEL_POSITION_X, LABEL_POSITION_Y, LABEL_POSITION_WIDTH, LABEL_POSITION_HEIGHT);
-    labelOne->SetText("请按图示");
-    labelOne->SetFont(DEFAULT_VECTOR_FONT_FILENAME, FONT_DEFAULT_SIZE);
-    labelOne->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);
-    labelOne->SetStyle(STYLE_TEXT_OPA, OPA_OPAQUE);
-    labelOne->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);
-    labelOne->SetStyle(STYLE_TEXT_COLOR, Color::White().full);
-
-    labelTwo = new UILabel();
-    if (labelTwo == nullptr) {
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "CompassCalibrationView::new labelTwo fail");
-        ClearAll();
-        return false;
-    }
-
-    labelTwo->SetPosition(LABEL_POSITION_X1, LABEL_POSITION_Y1, LABEL_POSITION_WIDTH1, LABEL_POSITION_HEIGHT1);
-    labelTwo->SetText("旋转手表进行校准");
-    labelTwo->SetFont(DEFAULT_VECTOR_FONT_FILENAME, FONT_DEFAULT_SIZE);
-    labelTwo->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);
-    labelTwo->SetStyle(STYLE_TEXT_OPA, OPA_OPAQUE);
-    labelTwo->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);
-    labelTwo->SetStyle(STYLE_TEXT_COLOR, Color::White().full);
-
-    Add(imageView);
-    Add(labelOne);
-    Add(labelTwo);
-    SetDraggable(false);
-    SetTouchable(false);
-    initViewStatus = true;
-    return true;
-}
-
-bool CompassCalibrationView::InitView(void *caller)
-{
-    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "CompassCalibrationView InitView %p", caller);
-    bool ret = CreateUIViewGroup();
-    if (!ret) {
-        return false;
-    }
-    SetDraggable(true);
-    SetTouchable(true);
-    return true;
-}
-
-}
index 546dd33..d4139a5 100644 (file)
@@ -4,95 +4,64 @@
  * Author:
  * Create: 2022-04-02
  */
-#include "CompassControlView.h"
-#include "CompassModel.h"
+#include "compass/CompassControlView.h"
+#include "wearable_log.h"
 
 namespace OHOS {
 CompassControlView::CompassControlView()
 {
-    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "CompassControlView::CompassControlView()");
     SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);
 }
 
-CompassControlView::~CompassControlView()
+void CompassControlView::PreLoad(void)
 {
-    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "CompassControlView::~CompassControlView()");
-    if (viewiInitStatus) {
-        ClearAll();
+    if (compassFragment_ == nullptr) {
+        compassFragment_ = new CompassFragment();
+        if (compassFragment_ == nullptr) {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "CompassView::new compassFragment_ fail");
+            return;
+        }
     }
+
+    compassFragment_->CreateView();
+    Add(compassFragment_->GetFragmentView());
 }
 
-void CompassControlView::ClearAll(void)
+void CompassControlView::UnLoad(void)
 {
-    RemoveAll();
-    if (compassCalibrationView != nullptr) {
-        delete compassCalibrationView;
-        compassCalibrationView = nullptr;
-    }
-    if (compassView != nullptr) {
-        delete compassView;
-        compassView = nullptr;
+    if (compassFragment_ != nullptr) {
+        compassFragment_->DestroyView();
+        Remove(compassFragment_->GetFragmentView());
+        delete compassFragment_;
+        compassFragment_ = nullptr;
     }
 }
 
-bool CompassControlView::InitView(void)
+void CompassControlView::OnPause(void)
 {
-    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "CompassControlView InitView");
-    compassCalibrationView = new CompassCalibrationView();
-    if (compassCalibrationView == nullptr) {
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "CompassCalibrationView::new compassCalibrationView fail");
-        return false;
-    }
-    if (!compassCalibrationView->CreateUIViewGroup()) {
-        return false;
-    }
-
-    compassView = new CompassView();
-    if (compassView == nullptr) {
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "CompassView::new compassView fail");
-        return false;
+    if (compassFragment_ != nullptr) {
+        compassFragment_->PauseView();
     }
-    if (!compassView->InitPage()) {
-        return false;
-    }
-    Add(compassView);
-    Add(compassCalibrationView);
-    uint8_t status = CompassModel::GetInstance()->GetCalibrationStatus();
-    if (status == 1) {
-        compassView->SetVisible(false);
-        compassCalibrationView->SetVisible(true);
-    } else {
-        compassView->SetVisible(true);
-        compassCalibrationView->SetVisible(false);
-    }
-    return true;
 }
 
-void CompassControlView::SetCalibrationView(bool flag)
+void CompassControlView::OnActive(void)
 {
-    if (flag == isCalibration) {
-        return;
-    }
-
-    if (flag) {
-        compassCalibrationView->SetVisible(true);
-        compassView->SetVisible(false);
-    } else {
-        compassCalibrationView->SetVisible(false);
-        compassView->SetVisible(true);
+    if (compassFragment_ != nullptr) {
+        compassFragment_->ResumeView();
     }
 }
 
-void CompassControlView::PreLoad(void)
+void CompassControlView::ScrollBegin(bool isActive)
 {
-    if (!viewiInitStatus) {
-        InitView();
-        viewiInitStatus = true;
+    if (isActive && (compassFragment_ != nullptr)) {
+        compassFragment_->PauseView();
     }
 }
 
-void CompassControlView::UnLoad(void)
+void CompassControlView::ScrollEnd(bool isActive)
 {
-    // Compass's usage scenes is complicated, so we do not release it's resources inner slice.
+    if (isActive && (compassFragment_ != nullptr)) {
+        compassFragment_->ResumeView();
+    }
 }
 }
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/compass/src/CompassFragment.cpp b/code/sdk/application/wearable/nativeapp/nativeui/compass/src/CompassFragment.cpp
new file mode 100644 (file)
index 0000000..cca744b
--- /dev/null
@@ -0,0 +1,213 @@
+/*
+ * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved.
+ * Description: CompassFragment.cpp
+ * Author:
+ * Create: 2021-12-21
+ */
+#include "compass/CompassFragment.h"
+
+#include <string>
+#include "UiConfig.h"
+#include "common/image_cache_manager.h"
+#include "ui_resource_image.h"
+#include "compass/CompassModel.h"
+#include "wearable_log.h"
+
+namespace OHOS {
+static constexpr float VIEW_CENTERS = 227;
+static constexpr int16_t POINT_CENTER_IMAGE_X = 150;
+static constexpr int16_t POINT_CENTER_IMAGE_Y = 150;
+static constexpr int16_t trianImg__X = 210;
+static constexpr int16_t trianImg__Y = 0;
+static constexpr int16_t directionLabel__X = 160;
+static constexpr int16_t directionLabel__Y = 215;
+static constexpr int16_t FONT_TEXT_SIZE = 25;
+static constexpr int16_t angleLabel__X = 215;
+static constexpr int16_t angleLabel__Y = 215;
+static constexpr int16_t TEXT_WIDTH = 90;
+static constexpr int16_t TEXT_HEIGHT = 35;
+static constexpr int16_t RANDOM_NUMBER_720 = 720;
+static constexpr int16_t RANDOM_NUMBER_360 = 360;
+static constexpr int16_t DELAYING_NUMS = 2000;
+static constexpr int16_t RIGHT_NORTH_DOWN_23 = 23;
+static constexpr int16_t RIGHT_EASTNORTH_UP_68 = 68;
+static constexpr int16_t RIGHT_WESTNORTH_UP_338 = 338;
+static constexpr int16_t RIGHT_SOUTH_UP_203 = 203;
+static constexpr int16_t RIGHT_EASTSOUTH_UP_158 = 158;
+static constexpr int16_t RIGHT_WESTSOUTH_UP_248 = 248;
+static constexpr int16_t RIGHT_WEST_UP_293 = 293;
+static constexpr int16_t RIGHT_EAST_UP_113 = 113;
+static constexpr int16_t DIRECTION_COUNT = 7;
+
+typedef struct {
+    uint16_t beginAngle;
+    uint16_t endAngle;
+    const char *dir;
+} CompassItem;
+
+const CompassItem g_compassList[] = {
+    {RIGHT_NORTH_DOWN_23, RIGHT_EASTNORTH_UP_68, "东北"},
+    {RIGHT_EASTNORTH_UP_68, RIGHT_EAST_UP_113, "东"},
+    {RIGHT_EAST_UP_113, RIGHT_EASTSOUTH_UP_158, "东南"},
+    {RIGHT_EASTSOUTH_UP_158, RIGHT_SOUTH_UP_203, "南"},
+    {RIGHT_SOUTH_UP_203, RIGHT_WESTSOUTH_UP_248, "西南"},
+    {RIGHT_WESTSOUTH_UP_248, RIGHT_WEST_UP_293, "西"},
+    {RIGHT_WEST_UP_293, RIGHT_WESTNORTH_UP_338, "西北"}
+};
+
+void CompassFragment::Callback(void)
+{
+    if (!initialized_) {
+        return;
+    }
+    int16_t angle  = CompassModel::GetInstance()->GetAngle();
+    bgImg_->Rotate(-angle, Vector2<float>(VIEW_CENTERS, VIEW_CENTERS));
+    if ((angle >= RIGHT_WESTNORTH_UP_338) || (angle >= 0 && angle < RIGHT_NORTH_DOWN_23)) {
+        directionLabel_->SetText("北");
+        angleLabel_->SetText((std::to_string(angle) + "°").c_str());
+    }
+    for (int i = 0; i < DIRECTION_COUNT; i++) {
+        if ((angle >= g_compassList[i].beginAngle) && (angle < g_compassList[i].endAngle)) {
+            directionLabel_->SetText(g_compassList[i].dir);
+            angleLabel_->SetText((std::to_string(angle) + "°").c_str());
+        }
+    }
+    CompassModel::GetInstance()->UpdateAngle();
+}
+
+bool CompassFragment::LoadCompassImage(UIImageView *view, uint32_t resId)
+{
+    std::string file = COMPASS_IAMGES;
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "CompassFragment LoadCompassImage: %s, resID=0x%x", COMPASS_IAMGES, resId);
+    ImageInfo* image = ImageCacheManager::GetInstance().LoadOneInMultiRes(resId, file);
+    if (image == nullptr) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "CompassFragment::LoadCompassImage %x fail", resId);
+        return false;
+    }
+    view->SetSrc(image);
+    return true;
+}
+
+bool CompassFragment::InitCompassImage(void)
+{
+    bgImg_ = new UIImageView();
+    if (bgImg_ == nullptr) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[%d], bgImg_ new fail", __LINE__);
+        return false;
+    }
+    bgImg_->SetPosition(0, 0);
+
+    if (!LoadCompassImage(bgImg_, COMPASS_COMPASS)) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[%d], trianImg_ load fail", __LINE__);
+        return false;
+    }
+
+    fgImg_ = new UIImageView();
+    if (fgImg_ == nullptr) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[%d], fgImg_ new fail", __LINE__);
+        return false;
+    }
+    fgImg_->SetPosition(POINT_CENTER_IMAGE_X, POINT_CENTER_IMAGE_Y);
+    if (!LoadCompassImage(fgImg_, COMPASS_ROTATE_CENTER_IMAGE)) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[%d], fgImg_ load fail", __LINE__);
+        return false;
+    }
+
+    trianImg_ = new UIImageView();
+    if (trianImg_ == nullptr) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[%d], trianImg_ new fail", __LINE__);
+        return false;
+    }
+    trianImg_->SetPosition(trianImg__X, trianImg__Y);
+    if (!LoadCompassImage(trianImg_, COMPASS_CORRESPONDENCE_DEGREE)) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "trianImg_ load fail");
+        return false;
+    }
+    return true;
+}
+
+void CompassFragment::OnCreateView(void* data)
+{
+    fragmentView_.SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "CompassFragment InitView");
+    if (!InitCompassImage()) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "InitCompassImage fail");
+        initialized_ = false;
+        return;
+    }
+
+    directionLabel_ = new UILabel();
+    if (directionLabel_ == nullptr) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "directionLabel_ new fail");
+        initialized_ = false;
+        return;
+    }
+    directionLabel_->SetPosition(directionLabel__X, directionLabel__Y);
+    directionLabel_->Resize(TEXT_WIDTH, TEXT_HEIGHT);
+    directionLabel_->SetText("北");
+    directionLabel_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, FONT_TEXT_SIZE);
+    directionLabel_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);
+    directionLabel_->SetStyle(STYLE_TEXT_OPA, OPA_OPAQUE);
+    directionLabel_->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);
+    directionLabel_->SetStyle(STYLE_TEXT_COLOR, Color::White().full);
+
+    angleLabel_ = new UILabel();
+    if (angleLabel_ == nullptr) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "angleLabel_ new fail");
+        initialized_ = false;
+        return;
+    }
+    angleLabel_->SetPosition(angleLabel__X, angleLabel__Y);
+    angleLabel_->Resize(TEXT_WIDTH, TEXT_HEIGHT);
+    angleLabel_->SetText("0°");
+    angleLabel_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, FONT_TEXT_SIZE);
+    angleLabel_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);
+    angleLabel_->SetStyle(STYLE_TEXT_OPA, OPA_OPAQUE);
+    angleLabel_->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);
+    angleLabel_->SetStyle(STYLE_TEXT_COLOR, Color::White().full);
+
+    fragmentView_.Add(bgImg_);
+    fragmentView_.Add(fgImg_);
+    fragmentView_.Add(trianImg_);
+    fragmentView_.Add(directionLabel_);
+    fragmentView_.Add(angleLabel_);
+    CompassModel::GetInstance()->ResetAngle();
+    initialized_ = true;
+}
+
+void CompassFragment::OnPauseView()
+{
+    Deinit();
+}
+
+void CompassFragment::OnResumeView()
+{
+    Init();
+}
+
+void CompassFragment::OnDestroyView()
+{
+    Deinit();
+    fragmentView_.RemoveAll();
+    if (directionLabel_ != nullptr) {
+        delete directionLabel_;
+        directionLabel_= nullptr;
+    }
+    if (angleLabel_ != nullptr) {
+        delete angleLabel_;
+        angleLabel_ = nullptr;
+    }
+    if (bgImg_ != nullptr) {
+        delete bgImg_;
+        bgImg_ = nullptr;
+    }
+    if (fgImg_ != nullptr) {
+        delete fgImg_;
+        fgImg_ = nullptr;
+    }
+    if (trianImg_ != nullptr) {
+        delete trianImg_;
+        trianImg_ = nullptr;
+    }
+}
+}
index e9ff3f5..80774e6 100644 (file)
@@ -5,9 +5,8 @@
  * Create: 2022-04-02
  */
 
-#include <sys/time.h>
-#include "CompassModel.h"
-#include <ctime>
+#include "compass/CompassModel.h"
+#include "gfx_utils/graphic_math.h"
 
 #ifdef __cplusplus
 extern "C" {
@@ -20,59 +19,50 @@ using namespace OHOS;
 #endif
 
 namespace OHOS {
+static constexpr int16_t DELTA_ANGLE = 1;
+
 CompassModel *CompassModel::GetInstance(void)
 {
     static CompassModel instance;
     return &instance;
 }
 
-void CompassModel::SetCalibrationStatus(uint8_t status)
-{
-    calibrationStatus = status;
-}
-
-uint8_t CompassModel::GetCalibrationStatus(void)
+void CompassModel::UpdateAngle()
 {
-    return 0;
-}
-
-void CompassModel::SetDisplayAngle(uint16_t angle)
-{
-    displayAngle += angle;
-    if (displayAngle > 359) {
-        displayAngle = 0;
+    if (clockwise_) {
+        angle_ += DELTA_ANGLE;
+    } else {
+        angle_ -= DELTA_ANGLE;
+    }
+    if (angle_ >= CIRCLE_IN_DEGREE) {
+        angle_ = 360;
+        clockwise_ = false;
+    }
+    if (angle_ <= 0) {
+        angle_ = 0;
+        clockwise_ = true;
     }
 }
 
-uint16_t CompassModel::GetDisplayAngle(void)
-{
-    return displayAngle;
-}
-
-void CompassModel::SetLastTime(time_t value)
-{
-    lastTime = value;
-}
-
-time_t CompassModel::GetLastTime(void)
+int16_t CompassModel::GetAngle(void)
 {
-    return lastTime;
+    return angle_;
 }
 
-time_t CompassModel::GetCurrentTime(void)
+void CompassModel::ResetAngle(void)
 {
-    struct timeval tv;
-    gettimeofday(&tv, nullptr);
-    return tv.tv_sec;
+    angle_ = 0;
 }
 
 bool CompassModel::OpenCompassSensor(void)
 {
+    // Add implemetion later
     return true;
 }
 
 bool CompassModel::CloseCompassSensor(void)
 {
+    // Add implemetion later
     return true;
 }
 }
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/compass/src/CompassPresenter.cpp b/code/sdk/application/wearable/nativeapp/nativeui/compass/src/CompassPresenter.cpp
deleted file mode 100644 (file)
index 4a48b54..0000000
+++ /dev/null
@@ -1,171 +0,0 @@
-/*\r
- * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved.\r
- * Description: CompassPresenter.cpp\r
- * Author:\r
- * Create: 2021-12-21\r
- */\r
-#include "CompassView.h"\r
-#include "CompassPresenter.h"\r
-#include "CompassModel.h"\r
-#include "graphic_service.h"\r
-\r
-namespace OHOS {\r
-static constexpr int16_t RIGHT_NORTH_DOWN_23 = 23;\r
-static constexpr int16_t RIGHT_EASTNORTH_UP_68 = 68;\r
-static constexpr int16_t RIGHT_WESTNORTH_UP_338 = 338;\r
-static constexpr int16_t RIGHT_SOUTH_UP_203 = 203;\r
-static constexpr int16_t RIGHT_EASTSOUTH_UP_158 = 158;\r
-static constexpr int16_t RIGHT_WESTSOUTH_UP_248 = 248;\r
-static constexpr int16_t RIGHT_WEST_UP_293 = 293;\r
-static constexpr int16_t RIGHT_EAST_UP_113 = 113;\r
-static constexpr int16_t RIGHT_MAX_ANGLE_360 = 360;\r
-static constexpr int16_t RIGHT_HALF_ANGLE_180 = 180;\r
-static constexpr int16_t RIGHT_ROTATION_INTERVAL = 2;\r
-static constexpr int16_t DIRECTION_COUNT = 7;\r
-static constexpr int16_t LEFT_NORTH_DOWN_23 = -23;\r
-static constexpr int16_t LEFT_EASTNORTH_DOWN_337 = -337;\r
-static constexpr int16_t LEFT_WESTNORTH_DOWN_68 = -68;\r
-static constexpr int16_t LEFT_SOUTH_DOWN_202 = -202;\r
-static constexpr int16_t LEFT_EASTSOUTH_DOWN_247 = -247;\r
-static constexpr int16_t LEFT_WESTSOUTH_DOWN_157 = -157;\r
-static constexpr int16_t LEFT_WEST_DOWN_113 = -113;\r
-static constexpr int16_t LEFT_EAST_DOWN_292 = -292;\r
-static constexpr int16_t RIGHT_MIN_ANGLE_360 = -360;\r
-static constexpr int16_t LEFT_HALF_ANGLE_180 = -180;\r
-static constexpr int16_t LEFT_ROTATION_INTERVAL = -2;\r
-\r
-static constexpr const char *NORTH_DIRECTION =  (char *)"北";\r
-static constexpr const char *SOUTH_DIRECTION =  (char *)"南";\r
-static constexpr const char *WEST_DIRECTION =  (char *)"西";\r
-static constexpr const char *EAST_DIRECTION =  (char *)"东";\r
-static constexpr const char *WESTNORTH_DIRECTION =  (char *)"西北";\r
-static constexpr const char *WESTSOUTH_DIRECTION =  (char *)"西南";\r
-static constexpr const char *EASTSOUTH_DIRECTION =  (char *)"东南";\r
-static constexpr const char *EASTNORTH_DIRECTION =  (char *)"东北";\r
-\r
-const CompassItem g_compassList[] = {\r
-    {RIGHT_NORTH_DOWN_23, RIGHT_EASTNORTH_UP_68, EASTNORTH_DIRECTION},\r
-    {RIGHT_EASTNORTH_UP_68, RIGHT_EAST_UP_113, EAST_DIRECTION},\r
-    {RIGHT_EAST_UP_113, RIGHT_EASTSOUTH_UP_158, EASTSOUTH_DIRECTION},\r
-    {RIGHT_EASTSOUTH_UP_158, RIGHT_SOUTH_UP_203, SOUTH_DIRECTION},\r
-    {RIGHT_SOUTH_UP_203, RIGHT_WESTSOUTH_UP_248, WESTSOUTH_DIRECTION},\r
-    {RIGHT_WESTSOUTH_UP_248, RIGHT_WEST_UP_293, WEST_DIRECTION},\r
-    {RIGHT_WEST_UP_293, RIGHT_WESTNORTH_UP_338, WESTNORTH_DIRECTION}\r
-};\r
-\r
-static CompassPresenter *g_pMainView = nullptr;\r
-\r
-CompassPresenter::CompassPresenter()\r
-{\r
-    g_pMainView = this;\r
-}\r
-\r
-CompassPresenter::~CompassPresenter()\r
-{\r
-    g_pMainView = nullptr;\r
-}\r
-\r
-CompassPresenter* CompassPresenter::GetInstance(void)\r
-{\r
-    return g_pMainView;\r
-}\r
-\r
-void CompassPresenter::DisplayAngleRight(uint16_t angle)\r
-{\r
-    if ((angle >= RIGHT_WESTNORTH_UP_338) || (angle >= 0 && angle < RIGHT_NORTH_DOWN_23)) {\r
-        CompassView::GetInstance()->DirectionSetText(NORTH_DIRECTION, (std::to_string(angle) + "°").c_str());\r
-    }\r
-    for (int i = 0; i < DIRECTION_COUNT; i++) {\r
-        if ((angle >= g_compassList[i].beginAngle) && (angle < g_compassList[i].endAngle)) {\r
-            CompassView::GetInstance()->DirectionSetText(g_compassList[i].dir, (std::to_string(angle) + "°").c_str());\r
-        }\r
-    }\r
-}\r
-\r
-void CompassPresenter::DisplayAngleDir(uint16_t angle)\r
-{\r
-    if (CompassView::GetInstance() == nullptr) {\r
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[DisplayAngleDir]CompassView::GetInstance() is nullptr");\r
-        return;\r
-    }\r
-    if (angle >= 0 && angle <= RIGHT_MAX_ANGLE_360) {\r
-        DisplayAngleRight(angle);\r
-    }\r
-}\r
-\r
-\r
-void CompassPresenter::InScopeRotate(void)\r
-{\r
-    angleDiff = lastRotateAngle - currentRotateAngle;\r
-    if (angleDiff > LEFT_HALF_ANGLE_180 && angleDiff < RIGHT_HALF_ANGLE_180) {\r
-        if (lastRotateAngle < currentRotateAngle) {\r
-            CompassView::GetInstance()->CompassStartRotate(lastRotateAngle);\r
-            if (angleDiff <= LEFT_ROTATION_INTERVAL) {\r
-                lastRotateAngle+=RIGHT_ROTATION_INTERVAL;\r
-            } else {\r
-                lastRotateAngle++;\r
-            }\r
-        } else if (lastRotateAngle != currentRotateAngle) {\r
-            CompassView::GetInstance()->CompassStartRotate(lastRotateAngle);\r
-            if (angleDiff >= RIGHT_ROTATION_INTERVAL) {\r
-                lastRotateAngle-=RIGHT_ROTATION_INTERVAL;\r
-            } else {\r
-                lastRotateAngle--;\r
-            }\r
-        }\r
-    } else {\r
-        if (lastRotateAngle < currentRotateAngle) {\r
-            CompassView::GetInstance()->CompassStartRotate(lastRotateAngle);\r
-            if (angleDiff <= LEFT_ROTATION_INTERVAL) {\r
-                lastRotateAngle-=RIGHT_ROTATION_INTERVAL;\r
-            } else {\r
-                lastRotateAngle--;\r
-            }\r
-            if (lastRotateAngle <= 0) {\r
-                lastRotateAngle = RIGHT_MAX_ANGLE_360;\r
-            }\r
-        } else if (lastRotateAngle != currentRotateAngle) {\r
-            CompassView::GetInstance()->CompassStartRotate(lastRotateAngle);\r
-            if (angleDiff >= RIGHT_ROTATION_INTERVAL) {\r
-                lastRotateAngle+=RIGHT_ROTATION_INTERVAL;\r
-            } else {\r
-                lastRotateAngle++;\r
-            }\r
-            if (lastRotateAngle >= RIGHT_MAX_ANGLE_360) {\r
-                lastRotateAngle = 0;\r
-            }\r
-        }\r
-    }\r
-}\r
-\r
-void CompassPresenter::DetermineToRotate(void)\r
-{\r
-    if (CompassView::GetInstance()  == nullptr) {\r
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[DetermineToRotate]CompassView::GetInstance() is nullptr");\r
-        return;\r
-    }\r
-    bool initState = CompassView::GetInstance()->GetInitViewState();\r
-    if (initState) {\r
-        if (initDisplayStatus) {\r
-            currentRotateAngle = CompassModel::GetInstance()->GetDisplayAngle();\r
-            lastRotateAngle = currentRotateAngle;\r
-            CompassView::GetInstance()->CompassStartRotate(lastRotateAngle);\r
-            DisplayAngleDir(currentRotateAngle);\r
-            initDisplayStatus = false;\r
-        } else {\r
-            if (!getAngleStatus) {\r
-                currentRotateAngle = CompassModel::GetInstance()->GetDisplayAngle();\r
-            }\r
-            InScopeRotate();\r
-            getAngleStatus = true;\r
-            if (lastRotateAngle == currentRotateAngle) {\r
-                CompassView::GetInstance()->CompassStartRotate(lastRotateAngle);\r
-                DisplayAngleDir(currentRotateAngle);\r
-                getAngleStatus = false;\r
-            }\r
-        }\r
-    }\r
-    CompassModel::GetInstance()->SetDisplayAngle(1);\r
-}\r
-\r
-}
\ No newline at end of file
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/compass/src/CompassView.cpp b/code/sdk/application/wearable/nativeapp/nativeui/compass/src/CompassView.cpp
deleted file mode 100644 (file)
index 5b3bbc2..0000000
+++ /dev/null
@@ -1,206 +0,0 @@
-/*
- * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved.
- * Description: CompassView.cpp
- * Author:
- * Create: 2021-12-21
- */
-#include <string>
-#include "common/image_cache_manager.h"
-#include "ui_resource_image.h"
-#include "CompassView.h"
-#include "MainCompassView.h"
-
-namespace OHOS {
-static constexpr int16_t POINT_CENTER_IMAGE_X = 150;
-static constexpr int16_t POINT_CENTER_IMAGE_Y = 150;
-static constexpr int16_t TRIANGULATION_X = 210;
-static constexpr int16_t TRIANGULATION_Y = 0;
-static constexpr int16_t DIRECTIONLABEL_X = 160;
-static constexpr int16_t DIRECTIONLABEL_Y = 215;
-static constexpr int16_t FONT_TEXT_SIZE = 25;
-static constexpr int16_t ANGLEDLABEL_X = 215;
-static constexpr int16_t ANGLEDLABEL_Y = 215;
-static constexpr int16_t TEXT_WIDTH = 90;
-static constexpr int16_t TEXT_HEIGHT = 35;
-static constexpr int16_t RANDOM_NUMBER_720 = 720;
-static constexpr int16_t RANDOM_NUMBER_360 = 360;
-static constexpr int16_t DELAYING_NUMS = 2000;
-
-static CompassView *g_pCompassView = nullptr;
-
-CompassView::CompassView()
-{
-    SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);
-    g_pCompassView = this;
-}
-
-CompassView::~CompassView()
-{
-    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "CompassView::~CompassView()");
-    ClearAll();
-    g_pCompassView = nullptr;
-}
-
-void CompassView::ClearAll(void)
-{
-    RemoveAll();
-    if (directionLabel != nullptr) {
-        delete directionLabel;
-        directionLabel= nullptr;
-    }
-    if (angledLabel != nullptr) {
-        delete angledLabel;
-        angledLabel = nullptr;
-    }
-    if (backGround != nullptr) {
-        delete backGround;
-        backGround = nullptr;
-    }
-    if (rotateShaft != nullptr) {
-        delete rotateShaft;
-        rotateShaft = nullptr;
-    }
-    if (triangulation != nullptr) {
-        delete triangulation;
-        triangulation = nullptr;
-    }
-}
-
-void CompassView::DirectionSetText(const char *text, const char *angle)
-{
-    directionLabel->SetText(text);
-    angledLabel->SetText(angle);
-}
-
-bool CompassView::LoadCompassImage(UIImageView *view, uint32_t resId)
-{
-    std::string file = COMPASS_IAMGES;
-    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "CompassView LoadCompassImage: %s, resID=0x%x", COMPASS_IAMGES, resId);
-    ImageInfo* image = ImageCacheManager::GetInstance().LoadOneInMultiRes(resId, file);
-    if (image == nullptr) {
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "CompassView::LoadCompassImage %x fail", resId);
-        return false;
-    }
-    view->SetSrc(image);
-    return true;
-}
-
-bool CompassView::InitCompassImage(void)
-{
-    backGround = new UIImageView();
-    if (backGround == nullptr) {
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[%d], backGround new fail", __LINE__);
-        return false;
-    }
-    backGround->SetPosition(0, 0);
-
-    if (!LoadCompassImage(backGround, COMPASS_COMPASS)) {
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[%d], triangulation load fail", __LINE__);
-        return false;
-    }
-
-    rotateShaft = new UIImageView();
-    if (rotateShaft == nullptr) {
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[%d], rotateShaft new fail", __LINE__);
-        return false;
-    }
-    rotateShaft->SetPosition(POINT_CENTER_IMAGE_X, POINT_CENTER_IMAGE_Y);
-    if (!LoadCompassImage(rotateShaft, COMPASS_ROTATE_CENTER_IMAGE)) {
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[%d], rotateShaft load fail", __LINE__);
-        return false;
-    }
-
-    triangulation = new UIImageView();
-    if (triangulation == nullptr) {
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[%d], triangulation new fail", __LINE__);
-        return false;
-    }
-    triangulation->SetPosition(TRIANGULATION_X, TRIANGULATION_Y);
-    if (!LoadCompassImage(triangulation, COMPASS_CORRESPONDENCE_DEGREE)) {
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "triangulation load fail");
-        return false;
-    }
-    return true;
-}
-
-bool CompassView::InitPage(void)
-{
-    if (!InitCompassImage()) {
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "InitCompassImage fail");
-        ClearAll();
-        return false;
-    }
-
-    directionLabel = new UILabel();
-    if (directionLabel == nullptr) {
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "directionLabel new fail");
-        ClearAll();
-        return false;
-    }
-    directionLabel->SetPosition(DIRECTIONLABEL_X, DIRECTIONLABEL_Y);
-    directionLabel->Resize(TEXT_WIDTH, TEXT_HEIGHT);
-    directionLabel->SetText("北");
-    directionLabel->SetFont(DEFAULT_VECTOR_FONT_FILENAME, FONT_TEXT_SIZE);
-    directionLabel->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);
-    directionLabel->SetStyle(STYLE_TEXT_OPA, OPA_OPAQUE);
-    directionLabel->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);
-    directionLabel->SetStyle(STYLE_TEXT_COLOR, Color::White().full);
-
-    angledLabel = new UILabel();
-    if (angledLabel == nullptr) {
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "angledLabel new fail");
-        ClearAll();
-        return false;
-    }
-    angledLabel->SetPosition(ANGLEDLABEL_X, ANGLEDLABEL_Y);
-    angledLabel->Resize(TEXT_WIDTH, TEXT_HEIGHT);
-    angledLabel->SetText("0°");
-    angledLabel->SetFont(DEFAULT_VECTOR_FONT_FILENAME, FONT_TEXT_SIZE);
-    angledLabel->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);
-    angledLabel->SetStyle(STYLE_TEXT_OPA, OPA_OPAQUE);
-    angledLabel->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);
-    angledLabel->SetStyle(STYLE_TEXT_COLOR, Color::White().full);
-
-    Add(backGround);
-    Add(rotateShaft);
-    Add(triangulation);
-    Add(directionLabel);
-    Add(angledLabel);
-    SetDraggable(false);
-    SetTouchable(false);
-    initViewStatus = true;
-    return true;
-}
-
-
-bool CompassView::InitView(void *caller)
-{
-    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "CompassView InitView %p", caller);
-    if (!InitPage()) {
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "InitPage fail");
-        return false;
-    }
-    SetDraggable(true);
-    SetTouchable(true);
-    return true;
-}
-
-bool CompassView::GetInitViewState(void)
-{
-    return initViewStatus;
-}
-
-CompassView *CompassView::GetInstance(void)
-{
-    return g_pCompassView;
-}
-
-void CompassView::CompassStartRotate(int16_t numb)
-{
-    if (backGround == nullptr) {
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "backGround is nullptr");
-        return;
-    }
-    backGround->Rotate(-numb, VIEW_CENTER);
-}
-}
index 72dc3b7..11a3b45 100644 (file)
@@ -4,54 +4,36 @@
  * Author:
  * Create: 2021-12-21
  */
-#include "CompassView.h"
-#include "MainCompassPresenter.h"
-#include "MainCompassView.h"
+#include "compass/MainCompassPresenter.h"
+#include "compass/MainCompassView.h"
 #include "NativeRegisterManager.h"
 
 namespace OHOS {
 
-REGIST_MENU(VIEW_COMPASS, MainCompassView, MainCompassPresenter, PNG_APPLIST_COMPASS_IMAGE, PNG_APPLIST_DEFAULT_IMG, "指南针");
-
-static MainCompassPresenter *g_pMainView = nullptr;
-
-MainCompassPresenter::MainCompassPresenter()
-{
-    g_pMainView = this;
-}
-
-MainCompassPresenter::~MainCompassPresenter()
-{
-    g_pMainView = nullptr;
-}
-
-
-MainCompassPresenter* MainCompassPresenter::GetInstance()
-{
-    return g_pMainView;
-}
+REGIST_MENU(VIEW_COMPASS, MainCompassView, MainCompassPresenter, PNG_APPLIST_COMPASS_IMAGE,
+    PNG_APPLIST_DEFAULT_IMG, "指南针");
 
 bool MainCompassPresenter::OnDrag(UIView& view, const DragEvent& event)
 {
     UNUSED(view);
-    if (event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT) {
+    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);
     }
     return true;
 }
 
-void MainCompassPresenter::Notify()
+void MainCompassPresenter::OnResume()
 {
-    if (MainCompassView::GetInstance() == nullptr) {
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[Notify]MainCompassView::GetInstance() == nullptr");
-        return;
+    if ((view_ != nullptr) && (view_->compassFragment_ != nullptr)) {
+        view_->compassFragment_->ResumeView();
     }
-    uint8_t status = CompassModel::GetInstance()->GetCalibrationStatus();
-    if (status == 1) {
-        MainCompassView::GetInstance()->SetDisplayTure();
-    } else {
-        MainCompassView::GetInstance()->SetDisplayFalse();
-        DetermineToRotate();
+}
+
+void MainCompassPresenter::OnPause()
+{
+    if ((view_ != nullptr) && (view_->compassFragment_ != nullptr)) {
+        view_->compassFragment_->PauseView();
     }
 }
 }
index b5311d4..9f7ecb0 100644 (file)
  * Create: 2021-12-23
  */
 
-#include "MainCompassView.h"
-#include "MainCompassPresenter.h"
+#include "compass/MainCompassView.h"
+#include "compass/MainCompassPresenter.h"
+#include "compass/CompassModel.h"
+#include "wearable_log.h"
 
 namespace OHOS {
 static constexpr int16_t TWO_HOUR_SECOND = 7200;
-static MainCompassView *g_pMainCompassView = nullptr;
-
-MainCompassView::MainCompassView()
-{
-    g_pMainCompassView = this;
-}
-
-MainCompassView::~MainCompassView()
-{
-    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MainCompassView::~MainCompassView");
-    delete compassView;
-    compassView = nullptr;
-    delete compassCalibrationView;
-    compassCalibrationView = nullptr;
-    g_pMainCompassView = nullptr;
-}
-
-MainCompassView *MainCompassView::GetInstance()
-{
-    return g_pMainCompassView;
-}
-
-void MainCompassView::SetDisplayTure()
-{
-    if (compassView == nullptr || compassCalibrationView == nullptr) {
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "MainCompassView::SetDisplayTure null");
-        return;
-    }
-    compassView->SetVisible(false);
-    compassCalibrationView->SetVisible(true);
-}
-
-void MainCompassView::SetDisplayFalse()
-{
-    if (compassView == nullptr || compassCalibrationView == nullptr) {
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "MainCompassView::SetDisplayFalse null");
-        return;
-    }
-    compassView->SetVisible(true);
-    compassCalibrationView->SetVisible(false);
-}
 
 void MainCompassView::OnStart()
 {
-
-    compassCalibrationView = new CompassCalibrationView();
-    if (compassCalibrationView == nullptr) {
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "MainCompassView:: OnStart compassCalibrationView null");
-        return;
-    }
-
-    compassView = new CompassView();
-    if (compassView == nullptr) {
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "MainCompassView:: OnStart compassView null");
+    compassFragment_ = new CompassFragment();
+    if (compassFragment_ == nullptr) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "MainCompassView:: OnStart compassFragment_ null");
         return;
     }
-
-    UIView::OnDragListener *compassCalibrationDragListener = (UIView::OnDragListener *)
-        OHOS::MainCompassPresenter::GetInstance();
-    if (compassCalibrationDragListener == nullptr) {
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "compassCalibrationDragListener new fail");
-        return;
-    }
-
-    UIView::OnDragListener *compassDragListener = (UIView::OnDragListener *)OHOS::MainCompassPresenter::GetInstance();
-    if (compassDragListener == nullptr) {
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "compassDragListener new fail");
-        return;
-    }
-    compassView->SetOnDragListener(compassDragListener);
-    compassView->InitView(this);
-
-    compassCalibrationView->SetOnDragListener(compassCalibrationDragListener);
-    compassCalibrationView->InitView(this);
-    AddViewToRootContainer(compassView);
-    AddViewToRootContainer(compassCalibrationView);
-
-    time_t currTime = CompassModel::GetInstance()->GetCurrentTime();
-    time_t lastTime = CompassModel::GetInstance()->GetLastTime();
-    if (currTime >= TWO_HOUR_SECOND + lastTime) {
-        CompassModel::GetInstance()->SetCalibrationStatus(1);
-    }
-
-    uint8_t status = CompassModel::GetInstance()->GetCalibrationStatus();
-    if (status == 1) {
-        compassView->SetVisible(false);
-        compassCalibrationView->SetVisible(true);
-    } else {
-        compassView->SetVisible(true);
-        compassCalibrationView->SetVisible(false);
-    }
+    compassFragment_->CreateView();
+    compassFragment_->GetFragmentView()->SetTouchable(true);
+    compassFragment_->GetFragmentView()->SetDraggable(true);
+    compassFragment_->GetFragmentView()->SetOnDragListener(presenter_);
+    AddViewToRootContainer(compassFragment_->GetFragmentView());
     CompassModel::GetInstance()->OpenCompassSensor();
 }
 
 void MainCompassView::OnStop()
 {
+    if (compassFragment_ != nullptr) {
+        compassFragment_->DestroyView();
+        delete compassFragment_;
+        compassFragment_ = nullptr;
+    }
     CompassModel::GetInstance()->CloseCompassSensor();
     return;
 }
index ac8fee5..2b5a5f4 100644 (file)
@@ -3,11 +3,12 @@
  * Description: ConnectOpen View\r
  * Create: 2022-03-22\r
  */\r
-#include "ConnectOpenView.h"\r
+#include "connectnewphone/ConnectOpenView.h"\r
+#include "PageTransitionMgr.h"\r
 #include "wearable_log.h"\r
 #include "UiConfig.h"\r
-#include "ConnectPhonePresenter.h"\r
-#include "BluetoothModel.h"\r
+#include "connectnewphone/ConnectPhonePresenter.h"\r
+#include "bluetooth/BluetoothModel.h"\r
 \r
 namespace OHOS {\r
 static ConnectOpenView *g_pConnectOpenView{nullptr};\r
@@ -120,7 +121,7 @@ UIViewGroup *ConnectOpenView::InitShowUpView(void)
         WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "tipsDragListener GetInstance fail");\r
         return nullptr;\r
     }\r
-    if (PageTransitionMgr::GetInstance().GetTopSlideBackImage() == nullptr) { // support default slide back firstly\r
+    if (!PageTransitionMgr::GetInstance().CanSlideBack()) { // support default slide back firstly\r
         group->SetOnDragListener(tipsDragListener);\r
     }\r
     group->SetViewId(CONNECT_OPEN_VIEW);\r
index 4994756..a9a8985 100644 (file)
@@ -4,13 +4,13 @@
  * Create: 2022-01-19\r
  */\r
 \r
-#include "ConnectPhonePresenter.h"\r
-#include "ConnectPhoneView.h"\r
+#include "connectnewphone/ConnectPhonePresenter.h"\r
+#include "connectnewphone/ConnectPhoneView.h"\r
 #include "drag_event.h"\r
 #include "cmsis_os.h"\r
 #include "UiConfig.h"\r
 #include "wearable_log.h"\r
-#include "ui_service.h"\r
+#include "uiservice/ui_service.h"\r
 #include "NativeRegisterManager.h"\r
 \r
 namespace OHOS {\r
index 5e9c6b5..1e5b1c1 100644 (file)
@@ -4,7 +4,7 @@
  * Create: 2022-01-19\r
  */\r
 \r
-#include "ConnectPhoneView.h"\r
+#include "connectnewphone/ConnectPhoneView.h"\r
 #include "components/ui_label.h"\r
 #include "wearable_log.h"\r
 #include "UiConfig.h"\r
index 3a41961..4465006 100644 (file)
@@ -3,10 +3,11 @@
  * Description: ConnectSelect View\r
  * Create: 2022-03-22\r
  */\r
-#include "ConnectSelectView.h"\r
+#include "connectnewphone/ConnectSelectView.h"\r
+#include "PageTransitionMgr.h"\r
 #include "wearable_log.h"\r
 #include "UiConfig.h"\r
-#include "ConnectPhonePresenter.h"\r
+#include "connectnewphone/ConnectPhonePresenter.h"\r
 \r
 namespace OHOS {\r
 static ConnectSelectView *g_pConnectSelectView{nullptr};\r
@@ -109,7 +110,7 @@ UIViewGroup *ConnectSelectView::InitShowUpView()
         WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "connectDragListener GetInstance fail");\r
         return nullptr;\r
     }\r
-    if (PageTransitionMgr::GetInstance().GetTopSlideBackImage() == nullptr) { // support default slide back firstly\r
+    if (!PageTransitionMgr::GetInstance().CanSlideBack()) { // support default slide back firstly\r
         group->SetOnDragListener(connectDragListener);\r
     }\r
     group->SetViewId(CONNECT_SELECT_VIEW);\r
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/date/src/DateAdapter.cpp b/code/sdk/application/wearable/nativeapp/nativeui/date/src/DateAdapter.cpp
new file mode 100644 (file)
index 0000000..944e5b6
--- /dev/null
@@ -0,0 +1,73 @@
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: DateAdapter\r
+ * Create: 2025-03-23\r
+ */\r
+\r
+#include "date/DateAdapter.h"\r
+\r
+namespace OHOS {\r
+DateAdapter::DateAdapter() {}\r
+\r
+DateAdapter::~DateAdapter()\r
+{\r
+    listData.clear();\r
+}\r
+\r
+uint16_t DateAdapter::GetCount(void)\r
+{\r
+    return listData.size();\r
+}\r
+\r
+void DateAdapter::SetData(std::list<DateItem> &data)\r
+{\r
+    if (!listData.empty()) {\r
+        listData.clear();\r
+    }\r
+    std::list<DateItem>::iterator it;\r
+    for (it = data.begin(); it != data.end(); it++) {\r
+        listData.push_back(*it);\r
+    }\r
+}\r
+\r
+UIView *DateAdapter::GetView(UIView *inView, int16_t index)\r
+{\r
+    if (listData.empty()) {\r
+        return nullptr;\r
+    }\r
+    if (index < 0) {\r
+        return nullptr;\r
+    }\r
+    size_t uindex = index;\r
+    if (uindex >= listData.size()) {\r
+        return nullptr;\r
+    }\r
+\r
+    std::list<DateItem>::iterator it = listData.begin();\r
+    for (int i = 0; i < index; i++) {\r
+        it++;\r
+    }\r
+    DateItem itemData = *it;\r
+    DateItemView *item = nullptr;\r
+    if (inView == nullptr) {\r
+        item = new DateItemView();\r
+    } else {\r
+        item = static_cast<DateItemView *>(inView);\r
+    }\r
+\r
+    item->SetItemInfo(itemData);\r
+    item->SetOnClickListener(itemClickListener);\r
+    return item;\r
+}\r
+\r
+void DateAdapter::AddListItem(const DateItem &item)\r
+{\r
+    listData.push_back(item);\r
+}\r
+\r
+void DateAdapter::ClearListItem()\r
+{\r
+    listData.clear();\r
+}\r
+\r
+}  // namespace OHOS\r
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/date/src/DateButtonAdapter.cpp b/code/sdk/application/wearable/nativeapp/nativeui/date/src/DateButtonAdapter.cpp
new file mode 100644 (file)
index 0000000..c187d09
--- /dev/null
@@ -0,0 +1,73 @@
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: DateButtonAdapter\r
+ * Create: 2025-03-23\r
+ */\r
+\r
+#include "date/DateButtonAdapter.h"\r
+\r
+namespace OHOS {\r
+DateButtonAdapter::DateButtonAdapter() {}\r
+\r
+DateButtonAdapter::~DateButtonAdapter()\r
+{\r
+    listData.clear();\r
+}\r
+\r
+uint16_t DateButtonAdapter::GetCount(void)\r
+{\r
+    return listData.size();\r
+}\r
+\r
+void DateButtonAdapter::SetData(std::list<DateButtonItem> &data)\r
+{\r
+    if (!listData.empty()) {\r
+        listData.clear();\r
+    }\r
+    std::list<DateButtonItem>::iterator it;\r
+    for (it = data.begin(); it != data.end(); it++) {\r
+        listData.push_back(*it);\r
+    }\r
+}\r
+\r
+UIView *DateButtonAdapter::GetView(UIView *inView, int16_t index)\r
+{\r
+    if (listData.empty()) {\r
+        return nullptr;\r
+    }\r
+    if (index < 0) {\r
+        return nullptr;\r
+    }\r
+    size_t uindex = index;\r
+    if (uindex >= listData.size()) {\r
+        return nullptr;\r
+    }\r
+\r
+    std::list<DateButtonItem>::iterator it = listData.begin();\r
+    for (int i = 0; i < index; i++) {\r
+        it++;\r
+    }\r
+    DateButtonItem itemData = *it;\r
+    DateButtonItemView *item = nullptr;\r
+    if (inView == nullptr) {\r
+        item = new DateButtonItemView();\r
+    } else {\r
+        item = static_cast<DateButtonItemView *>(inView);\r
+    }\r
+\r
+    item->SetItemInfo(itemData);\r
+    item->SetOnClickListener(itemClickListener);\r
+    return item;\r
+}\r
+\r
+void DateButtonAdapter::AddListItem(const DateButtonItem &item)\r
+{\r
+    listData.push_back(item);\r
+}\r
+\r
+void DateButtonAdapter::ClearListItem()\r
+{\r
+    listData.clear();\r
+}\r
+\r
+}  // namespace OHOS\r
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/date/src/DateButtonItemView.cpp b/code/sdk/application/wearable/nativeapp/nativeui/date/src/DateButtonItemView.cpp
new file mode 100644 (file)
index 0000000..210f188
--- /dev/null
@@ -0,0 +1,96 @@
+/*\r
+ * Copyright (c) Huawei 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
+\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_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
+}\r
+\r
+DateButtonItemView::~DateButtonItemView()\r
+{\r
+    Remove(&sLabelButton);\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
+        } 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
+        }\r
+    } else {\r
+        if (sItemInfo.isSelect) {\r
+            image1 = ImageCacheManager::GetInstance().LoadOneInMultiRes(IMAGE_CONVERTER_TOOL_DATE4, DATE_IMAGE);\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
+        }\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
+    }\r
+    sLabelButton.SetImageSrc(image1, image2);\r
+}\r
+\r
+void DateButtonItemView::SetUpChild()\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
+}\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/nativeapp/nativeui/date/src/DateItemView.cpp b/code/sdk/application/wearable/nativeapp/nativeui/date/src/DateItemView.cpp
new file mode 100644 (file)
index 0000000..a201412
--- /dev/null
@@ -0,0 +1,118 @@
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: DateItemView\r
+ * Create: 2025-03-23\r
+ */\r
+\r
+#include "date/DateItemView.h"\r
+#include "UiConfig.h"\r
+#include "common/image_cache_manager.h"\r
+#include "ui_resource_date.h"\r
+#include "wearable_log.h"\r
+\r
+namespace OHOS {\r
+static constexpr int16_t DATE_ITEM_BUTTON_HEIGHT = 65;\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_TWO_POSITION_X = 23;\r
+static constexpr int16_t DATE_ITEM_LABEL_TWO_POSITION_Y = 60;\r
+static constexpr int16_t DATE_ITEM_LABEL_WIDTH = 135;\r
+static constexpr int16_t DATE_ITEM_LABEL_HEIGHT = 40;\r
+static constexpr int16_t DATE_ITEM_LABEL2_HEIGHT = 96;\r
+static constexpr int16_t DATE_ITEM_LABEL_TWO_WIDTH = 314;\r
+static constexpr int16 DATE_ITEM_FONT_SIZE = 24;\r
+static constexpr int16 DATE_ITEM_FONT2_SIZE = 32;\r
+static constexpr int16_t DATE_ITEM_WIDTH = 376;\r
+static constexpr int16_t DATE_ITEM_HEIGHT = 190;\r
+\r
+DateItemView::DateItemView()\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(&sLabel_1);\r
+    Add(&sLabel_2);\r
+    Add(&Signs);\r
+    Add(&BackGround);\r
+}\r
+\r
+DateItemView::~DateItemView()\r
+{\r
+    Remove(&sLabel_1);\r
+    Remove(&sLabel_2);\r
+    Remove(&Signs);\r
+    Remove(&BackGround);\r
+}\r
+\r
+void DateItemView::SetItemInfo(const DateItem itemInfo)\r
+{\r
+    sItemInfo = itemInfo;\r
+    sLabel_1.SetText(itemInfo.label_1);\r
+    sLabel_2.SetText(itemInfo.label_2);\r
+    BackGround.SetPosition(0, 0);\r
+    if (itemInfo.visiable) {\r
+        int offsetX1 = 100;\r
+        int offsetY1 = 10;\r
+        int offsetX2 = 30;\r
+        int offsetY2 = 40;\r
+        sLabel_1.SetPosition(DATE_ITEM_LABEL_POSITION_X + offsetX1, DATE_ITEM_LABEL_POSITION_Y + offsetY1);\r
+        sLabel_2.SetPosition(DATE_ITEM_LABEL_TWO_POSITION_X + offsetX2, DATE_ITEM_LABEL_TWO_POSITION_Y + offsetY2);\r
+        sLabel_1.SetStyle(STYLE_TEXT_COLOR, Color::White().full);\r
+        sLabel_2.SetStyle(STYLE_TEXT_COLOR, Color::Gray().full);\r
+        sLabel_1.SetFont(DEFAULT_VECTOR_FONT_FILENAME, DATE_ITEM_FONT2_SIZE);\r
+        sLabel_2.SetFont(DEFAULT_VECTOR_FONT_FILENAME, DATE_ITEM_FONT_SIZE);\r
+        Signs.SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+    } else {\r
+        sLabel_1.SetPosition(DATE_ITEM_LABEL_POSITION_X, DATE_ITEM_LABEL_POSITION_Y);\r
+        sLabel_2.SetPosition(DATE_ITEM_LABEL_TWO_POSITION_X, DATE_ITEM_LABEL_TWO_POSITION_Y);\r
+        sLabel_1.SetStyle(STYLE_TEXT_COLOR, Color::Gray().full);\r
+        sLabel_2.SetStyle(STYLE_TEXT_COLOR, Color::White().full);\r
+        sLabel_1.SetFont(DEFAULT_VECTOR_FONT_FILENAME, DATE_ITEM_FONT_SIZE);\r
+        sLabel_2.SetFont(DEFAULT_VECTOR_FONT_FILENAME, DATE_ITEM_FONT2_SIZE);\r
+        Signs.SetPosition(DATE_ITEM_LABEL_TWO_POSITION_X, DATE_ITEM_FONT_SIZE);\r
+    }\r
+    Signs.SetVisible(!itemInfo.visiable);\r
+}\r
+\r
+void DateItemView::SetUpChild()\r
+{\r
+    sLabel_1.Resize(DATE_ITEM_LABEL_WIDTH, DATE_ITEM_LABEL_HEIGHT);\r
+    sLabel_1.SetAlign(TEXT_ALIGNMENT_LEFT, TEXT_ALIGNMENT_LEFT);\r
+    sLabel_1.SetStyle(STYLE_TEXT_OPA, OPA_OPAQUE);\r
+    sLabel_1.SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
+    sLabel_1.SetStyle(STYLE_BACKGROUND_OPA, OPA_OPAQUE);\r
+\r
+    sLabel_2.Resize(DATE_ITEM_LABEL_TWO_WIDTH, DATE_ITEM_LABEL2_HEIGHT);\r
+    sLabel_2.SetAlign(TEXT_ALIGNMENT_LEFT, TEXT_ALIGNMENT_LEFT);\r
+    sLabel_2.SetStyle(STYLE_TEXT_OPA, OPA_OPAQUE);\r
+    sLabel_2.SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
+    sLabel_2.SetStyle(STYLE_BACKGROUND_OPA, OPA_OPAQUE);\r
+\r
+    ImageInfo *image = ImageCacheManager::GetInstance().LoadOneInMultiRes(IMAGE_CONVERTER_TOOL_DATE5, DATE_IMAGE);\r
+    if (image == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,\r
+                      "DateMessagePage::OnStart LoadStopwatchImage IMAGE_CONVERTER_TOOL_DATE5 fail");\r
+        return;\r
+    }\r
+    Signs.SetSrc(image);\r
+    image = ImageCacheManager::GetInstance().LoadOneInMultiRes(IMAGE_CONVERTER_TOOL_DATE1, DATE_IMAGE);\r
+    if (image == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,\r
+                      "DateMessagePage::OnStart LoadStopwatchImage IMAGE_CONVERTER_TOOL_DATE1 fail");\r
+        return;\r
+    }\r
+    BackGround.SetSrc(image);\r
+}\r
+\r
+const char *DateItemView ::GetViewId()\r
+{\r
+    return sItemInfo.index;\r
+}\r
+bool DateItemView::GetVisiable()\r
+{\r
+    return sItemInfo.visiable;\r
+}\r
+\r
+}
\ No newline at end of file
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/date/src/DateMainPage.cpp b/code/sdk/application/wearable/nativeapp/nativeui/date/src/DateMainPage.cpp
new file mode 100644 (file)
index 0000000..5072468
--- /dev/null
@@ -0,0 +1,303 @@
+/*\r
+ * Copyright (c) Huawei 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 "common/image_cache_manager.h"\r
+#include "components/ui_button.h"\r
+#include "components/ui_list_nested.h"\r
+#include "components/ui_scroll_view_nested.h"\r
+#include "ui_resource_date.h"\r
+\r
+static constexpr int16_t DOWNSELECTPOSITION = 100;\r
+static constexpr int16_t DOWNCONTENTLIST_POSITION_X = 39;\r
+static constexpr int16_t DOWNCONTENTLIST_POSITION_Y = 171;\r
+static constexpr int16_t DOWNCONTENTLIST_WIDTH = 376;\r
+static constexpr int16_t DOWNCONTENTLIST_HEIGHT = 260;\r
+static constexpr int16_t BUTTONCONTENTLIST_POSITION_X = 36;\r
+static constexpr int16_t BUTTONCONTENTLIST_POSITION_Y = 97;\r
+static constexpr int16_t BUTTONCONTENTLIST_WIDTH = 410;\r
+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_WIDTH = 196;\r
+static constexpr uint16_t LIST_POSITION_Y = 155;\r
+static constexpr uint16_t DATE_MONTH_HEIGHT = 50;\r
+static constexpr uint8_t FONT_FORTY_SIZE = 36;\r
+\r
+namespace OHOS {\r
+REGIST_SLICE_PAGE(VIEW_DATE, DATE_PAGES::DATE_MAIN_PAGE, DateMainPage, true);\r
+\r
+DateMainPage::DateMainPage()\r
+{\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
+    }\r
+\r
+    if (listAdapter != nullptr) {\r
+        delete listAdapter;\r
+        listAdapter = nullptr;\r
+    }\r
+\r
+    if (buttonAdapter != nullptr) {\r
+        delete buttonAdapter;\r
+        buttonAdapter = nullptr;\r
+    }\r
+\r
+    if (buttonContentList != nullptr) {\r
+        delete buttonContentList;\r
+        buttonContentList = nullptr;\r
+    }\r
+\r
+    if (downContentList != nullptr) {\r
+        delete downContentList;\r
+        downContentList = 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
+    }\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "DateMainPage::~DateMainPage");\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
+        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
+        return;\r
+    }\r
+    image1->SetSrc(imgSrc);\r
+    uiScrollView->Add(image1);\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
+        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
+}\r
+\r
+void DateMainPage::InitDownList()\r
+{\r
+    if (buttonContentList == nullptr) {\r
+        buttonContentList = new UIList(0);\r
+    }\r
+    buttonAdapter = new DateButtonAdapter();\r
+    if (buttonAdapter == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "DateView::OnStart::listAdapter 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
+                                   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
+\r
+    listAdapter = new DateAdapter();\r
+    if (listAdapter == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "DateView::OnStart::listAdapter 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
+\r
+int calculateWeekday(int year, int month, int day)\r
+{\r
+    if (month < SET_THREE) {\r
+        month += SET_TWELVE;\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
+}\r
+\r
+// 刷新List数据\r
+void DateMainPage::UpdateMsg(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
+    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
+        return;\r
+    }\r
+    std::string weekDay[] = {"星期六", "星期日", "星期一", "星期二", "星期三", "星期四", "星期五"};\r
+    int today = calculateWeekday(year, month, day);\r
+    std::string titleDay;\r
+    if (dateMsg == listTop.front().button_viewId) {\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
+}\r
+\r
+void DateMainPage::SetDownListAdapter()\r
+{\r
+    for (const auto &item : DateModel::GetInstance().listDate) {\r
+        listAdapter->AddListItem(item);\r
+    }\r
+}\r
+\r
+void DateMainPage::RefreshButtonListDate(int value)\r
+{\r
+    buttonAdapter->ClearListItem();\r
+    for (auto &item : listTop) {\r
+        if (item.index == value) {\r
+            item.isSelect = true;\r
+        } else {\r
+            item.isSelect = false;\r
+        }\r
+        buttonAdapter->AddListItem(item);\r
+    }\r
+    buttonContentList->RefreshList();\r
+}\r
+\r
+bool DateMainPage::InitDateTop()\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
+        if (i == 0) {\r
+            listTop.push_back({strDate[i].c_str(), strDay[i].c_str(), i, true, true});\r
+        } else {\r
+            listTop.push_back({strDate[i].c_str(), strDay[i].c_str(), i, false, false});\r
+        }\r
+    }\r
+    return true;\r
+}\r
+\r
+std::string DateMainPage::GetFutureDate(int days_ahead)\r
+{\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
+    strftime(buffer, sizeof(buffer), "%Y-%m-%d", tm);\r
+    return std::string(buffer);\r
+}\r
+\r
+bool DateMainPage::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().ChangeSlice(VIEW_APPLIST);\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
+        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
+    }\r
+    UNUSED(event);\r
+    return true;\r
+}\r
+}\r
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/date/src/DateMessagePage.cpp b/code/sdk/application/wearable/nativeapp/nativeui/date/src/DateMessagePage.cpp
new file mode 100644 (file)
index 0000000..277e655
--- /dev/null
@@ -0,0 +1,168 @@
+/*\r
+ * Copyright (c) Huawei 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 "common/image_cache_manager.h"\r
+#include "components/ui_list_nested.h"\r
+#include "components/ui_scroll_view_nested.h"\r
+#include "ui_resource_date.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_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_WIDTH = 392;\r
+static constexpr uint16_t DATE_MESSAGE_TWO_HEIGHT = 120;\r
+static constexpr uint16_t DATE_MESSAGE_MAX_LINE_HEIGHT = 140;\r
+\r
+REGIST_SLICE_PAGE(VIEW_DATE, DATE_PAGES::DATE_MESSAGE_PAGE, DateMessagePage, false);\r
+\r
+DateMessagePage::DateMessagePage()\r
+{\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "DateMessagePage::DateMessagePage");\r
+}\r
+\r
+DateMessagePage::~DateMessagePage()\r
+{\r
+    if (group != nullptr) {\r
+        group->RemoveAll();\r
+        delete group;\r
+        group = nullptr;\r
+    }\r
+\r
+    if (image1 != nullptr) {\r
+        delete image1;\r
+        image1 = nullptr;\r
+    }\r
+\r
+    if (labelTitle != nullptr) {\r
+        delete labelTitle;\r
+        labelTitle = nullptr;\r
+    }\r
+\r
+    if (labelMessage != nullptr) {\r
+        delete labelMessage;\r
+        labelMessage = nullptr;\r
+    }\r
+\r
+    if (labelTime != nullptr) {\r
+        delete labelTime;\r
+        labelTime = nullptr;\r
+    }\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
+        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
+    if (imgSrc == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "WeatherMainPage::LoadOneInMultiRes fail");\r
+    }\r
+    image1->SetSrc(imgSrc);\r
+    group->Add(image1);\r
+\r
+    labelTitle = new UILabel();\r
+    if (labelTitle == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "WeatherView::OnStart::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
+        return;\r
+    }\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
+        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
+        }\r
+    }\r
+    int posTextHeight = labelMessage->GetTextHeight();\r
+    int posHeight = DATE_MESSAGE_TWO_POSITION_Y;\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
+    } 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
+}\r
+\r
+bool DateMessagePage::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
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "DatePresenter::OnDrag ChangeSlice(VIEW_APPLIST)");\r
+    }\r
+    return true;\r
+}\r
+\r
+}
\ No newline at end of file
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/date/src/DateModel.cpp b/code/sdk/application/wearable/nativeapp/nativeui/date/src/DateModel.cpp
new file mode 100644 (file)
index 0000000..4792289
--- /dev/null
@@ -0,0 +1,93 @@
+/*\r
+ * Copyright (c) Huawei 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 "ohos_timer.h"\r
+#include "wearable_log.h"\r
+\r
+namespace OHOS {\r
+static constexpr int16 DATE_COUNT = 24;\r
+static constexpr int16 DATE_HOUR = 12;\r
+\r
+DateModel::DateModel() {}\r
+\r
+DateModel::~DateModel() {}\r
+\r
+DateModel &DateModel::GetInstance()\r
+{\r
+    static DateModel instance;\r
+    return instance;\r
+}\r
+\r
+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
+    } else {\r
+        for (const auto &msg : keyValues) {\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
+            }\r
+        }\r
+        if (listDate.size() == 0) {\r
+            listDate.push_back({"无日程", "请前往手机日历创建日程", "0", true});\r
+        }\r
+    }\r
+    return true;\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
+    if (!file.is_open()) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "cannot open file");\r
+        return false;\r
+    }\r
+    std::stringstream buffer;\r
+    buffer << file.rdbuf();\r
+    std::string content = buffer.str();\r
+    int intsize = sizeof(content);\r
+    cJSON *root = nullptr;\r
+    if (intsize != 0) {\r
+        root = cJSON_Parse(content.c_str());\r
+    }\r
+    if (root == NULL) {\r
+        const char *error_ptr;\r
+        return false;\r
+    }\r
+    cJSON *dateSum = cJSON_GetObjectItemCaseSensitive(root, "dateSum");\r
+    if (!cJSON_IsObject(dateSum)) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Error observe:");\r
+        cJSON_Delete(root);\r
+        return false;\r
+    }\r
+    int sum = std::atoi(cJSON_GetObjectItemCaseSensitive(dateSum, "count")->valuestring);\r
+    for (int i = 0; i < sum; i++) {\r
+        cJSON *date = cJSON_GetObjectItemCaseSensitive(dateSum, std::to_string(i).c_str());\r
+        if (!cJSON_IsObject(date)) {\r
+            cJSON_Delete(root);\r
+            continue;\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
+    return true;\r
+}\r
+}\r
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/date/src/DatePresenter.cpp b/code/sdk/application/wearable/nativeapp/nativeui/date/src/DatePresenter.cpp
new file mode 100644 (file)
index 0000000..64ba20f
--- /dev/null
@@ -0,0 +1,16 @@
+/*\r
+ * Copyright (c) Huawei 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
+\r
+namespace OHOS {\r
+REGIST_MENU(VIEW_DATE, DateView, DatePresenter, DATE_MAIN_ICON, DATE_MAIN_ICON, "日程");\r
+}\r
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/emptypage/src/EmptyPage.cpp b/code/sdk/application/wearable/nativeapp/nativeui/emptypage/src/EmptyPage.cpp
new file mode 100644 (file)
index 0000000..6860eae
--- /dev/null
@@ -0,0 +1,67 @@
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: EmptyPage\r
+ * Create: 2025-04-24\r
+ */\r
+\r
+#include "emptypage/EmptyPage.h"\r
+#include "emptypage/EmptyPresenter.h"\r
+#include "SlicePageFactory.h"\r
+#include "flashlight/FlashLightView.h"\r
+#include "wearable_log.h"\r
+#include "AppViewIDs.h"\r
+#include "NativeAbility.h"\r
+\r
+namespace OHOS {\r
+static const uint16_t MEM_LABEL_FONT_SIZE = 40;\r
+static uint32_t EMPTY_PAGE = 1;\r
+REGIST_SLICE_PAGE(VIEW_EMPTY, EMPTY_PAGE, EmptyPage, true);\r
+void EmptyPage::OnStart(void *data)\r
+{\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
+    }\r
+#if !defined(_WIN32)\r
+    test_get_mem_info(1, &used_, &free_);\r
+#endif\r
+    // Add Label to App\r
+    if (memLabel_ == nullptr) {\r
+        memLabel_ = new UILabel();\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
+    AddViewToPageContainer(container_);\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
+    }\r
+}\r
+\r
+bool EmptyPage::OnDrag(UIView &view, const DragEvent &event)\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
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/emptypage/src/EmptyPresenter.cpp b/code/sdk/application/wearable/nativeapp/nativeui/emptypage/src/EmptyPresenter.cpp
new file mode 100644 (file)
index 0000000..1a429df
--- /dev/null
@@ -0,0 +1,13 @@
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: EmptyPresenter\r
+ * Create: 2025-04-24\r
+ */\r
+\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
+}\r
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/findphone/src/FindPhoneMainPage.cpp b/code/sdk/application/wearable/nativeapp/nativeui/findphone/src/FindPhoneMainPage.cpp
new file mode 100644 (file)
index 0000000..54396d2
--- /dev/null
@@ -0,0 +1,623 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: FindPhoneMainPage\r
+ * Create: 2025-03-23\r
+ */\r
+\r
+#include "phoneservice/PhoneService.h"\r
+#include "UiConfig.h"\r
+#include "bts_spp.h"\r
+#include "common/image_cache_manager.h"\r
+#include "main/LoadImg.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 "findphone/FindPhonePresenter.h"\r
+#include "findphone/FindPhoneView.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
+static constexpr uint16_t FIND_PHONE_BUTTON_POSITION_X = 154;\r
+static constexpr uint16_t FIND_PHONE_BUTTON_POSITION_Y = 154;\r
+static constexpr uint16_t FIND_PHONE_BUTTON_WIDTH = 146;\r
+static constexpr uint16_t FIND_PHONE_BUTTON_HEIGHT = 146;\r
+static constexpr uint16_t FIND_PHONE_RTYBUTTON_POSITION_X = 179;\r
+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_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_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 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
+\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
+    g_pFindPhoneMainPage = this;\r
+}\r
+\r
+FindPhoneMainPage::~FindPhoneMainPage()\r
+{\r
+    g_pFindPhoneMainPage = nullptr;\r
+    if (container_ != nullptr) {\r
+        container_->RemoveAll();\r
+        delete container_;\r
+        container_ = nullptr;\r
+    }\r
+\r
+    if (buttonFind != nullptr) {\r
+        delete buttonFind;\r
+        buttonFind = nullptr;\r
+    }\r
+\r
+    if (mainImage != nullptr) {\r
+        delete mainImage;\r
+        mainImage = nullptr;\r
+    }\r
+\r
+    if (labelUnder != nullptr) {\r
+        delete labelUnder;\r
+        labelUnder = nullptr;\r
+    }\r
+\r
+    if (labelFindTitle != nullptr) {\r
+        delete labelFindTitle;\r
+        labelFindTitle = nullptr;\r
+    }\r
+\r
+    if (labelRing != nullptr) {\r
+        delete labelRing;\r
+        labelRing = nullptr;\r
+    }\r
+\r
+    if (buttonRty != nullptr) {\r
+        delete buttonRty;\r
+        buttonRty = nullptr;\r
+    }\r
+    WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "FindPhoneMainPage::~FindPhoneMainPage");\r
+}\r
+\r
+FindPhoneMainPage *FindPhoneMainPage::GetInstance()\r
+{\r
+    return g_pFindPhoneMainPage;\r
+}\r
+\r
+void FindPhoneMainPage::OnStop()\r
+{\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
+#endif\r
+        ImageCacheManager::GetInstance().UnloadAllInMultiRes(FINDPHONE_IMAGE);\r
+    }\r
+    data = 0;\r
+}\r
+\r
+void FindPhoneMainPage::OnStart(void *data)\r
+{\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
+    }\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
+\r
+    labelUnder = new UILabel();\r
+    if (labelUnder == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "FindPhoneMainPage::new labelUnder 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
+        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
+\r
+    labelRing = new UILabel();\r
+    if (labelRing == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "FindPhoneMainPage::new labelRing fail");\r
+        return;\r
+    }\r
+    labelRing->SetFont(DEFAULT_VECTOR_FONT_FILENAME, FONT_DEFAULT_SIZE_1);\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
+    } 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
+    }\r
+    imageAnimator_->Stop();\r
+    imageAnimator_->SetVisible(false);\r
+    AddViewToPageContainer(container_);\r
+}\r
+\r
+void FindPhoneMainPage::SetUpImageAnimator()\r
+{\r
+    imageAnimator_ = new UIImageAnimatorView();\r
+    if (imageAnimator_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,\r
+                      "FindPhoneMainPage::UIImageAnimatorView new Label SetUpImageAnimator 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
+    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
+{\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
+    }\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
+    }\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
+}\r
+\r
+bool FindPhoneMainPage::ClickButtonChange()\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
+        // 开启定时器\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
+        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
+            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
+    imageAnimator_->Stop();\r
+    imageAnimator_->SetVisible(false);\r
+    DisableFindPhoneTimer();\r
+}\r
+\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
+    }\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
+        // 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
+        if (result == 0) {\r
+            buttonRty->SetVisible(false);\r
+            labelUnder->SetVisible(false);\r
+            mainImage->SetVisible(false);\r
+            buttonFind->SetVisible(true);\r
+            labelFindTitle->SetVisible(true);\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
+            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
+        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
+    }\r
+    return false;\r
+}\r
+\r
+uint8_t FindPhoneMainPage::GetConnectStatus()\r
+{\r
+    uint8_t conn_status = 0;\r
+#ifndef _WIN32\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
+void FindPhoneMainPage::ChangeToDisConnect()\r
+{\r
+    LOADIMG::LoadBtnImage(buttonFind, FINDPHONE_IMAGE, IMAGE_CONVERTER_TOOL_CONNECT_PHONE_4,\r
+                          IMAGE_CONVERTER_TOOL_CONNECT_PHONE_4);\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
+}\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
+}\r
+\r
+/* 开启定时器 */\r
+void FindPhoneMainPage::InitFindPhoneTimer()\r
+{\r
+    if (g_startCount != nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "FindPhoneMainPage 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
+        return;\r
+    }\r
+    bool retTimer = g_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
+        }\r
+        return;\r
+    }\r
+}\r
+\r
+/* 关闭定时器 */\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
+    }\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
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/findphone/src/FindPhoneModel.cpp b/code/sdk/application/wearable/nativeapp/nativeui/findphone/src/FindPhoneModel.cpp
new file mode 100644 (file)
index 0000000..c4784a6
--- /dev/null
@@ -0,0 +1,30 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: FindPhoneModel\r
+ * Create: 2025-03-23\r
+ */\r
+\r
+#include "ohos_timer.h"\r
+#include "wearable_log.h"\r
+#include "findphone/FindPhoneModel.h"\r
+#include "findphone/FindPhoneView.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
+\r
+FindPhoneModel &FindPhoneModel::GetInstance()\r
+{\r
+    static FindPhoneModel instance;\r
+    return instance;\r
+}\r
+}\r
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/findphone/src/FindPhonePresenter.cpp b/code/sdk/application/wearable/nativeapp/nativeui/findphone/src/FindPhonePresenter.cpp
new file mode 100644 (file)
index 0000000..96f909c
--- /dev/null
@@ -0,0 +1,15 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: FindPhonePresenter\r
+ * Create: 2025-03-23\r
+ */\r
+\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
+\r
+namespace OHOS {\r
+REGIST_MENU(VIEW_FIND_PHONE, FindPhoneView, FindPhonePresenter, FINDPHONE_MAIN_ICON, FINDPHONE_MAIN_ICON, "查找手机");\r
+}\r
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/flashlight/src/FlashLightBlinkPage.cpp b/code/sdk/application/wearable/nativeapp/nativeui/flashlight/src/FlashLightBlinkPage.cpp
new file mode 100644 (file)
index 0000000..5216735
--- /dev/null
@@ -0,0 +1,141 @@
+/*\r
+ * Copyright (c) Huawei 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
+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
+\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
+        container_->SetStyle(STYLE_BACKGROUND_OPA, 0);\r
+    }\r
+\r
+    if (blinkLabel_ == nullptr) {\r
+        blinkLabel_ = new UILabel();\r
+    }\r
+    blinkLabel_->SetPosition(BLINK_TEXT_POS_X, BLINK_TEXT_POS_Y, BLINK_TEXT_WIDTH, BLINK_TEXT_HEIGHT);\r
+    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
+    container_->Add(blinkLabel_);\r
+    blinkLabel_->SetVisible(true);\r
+\r
+    // Add Picker to App\r
+    if (blinkPicker_ == nullptr) {\r
+        blinkPicker_ = new UIPicker();\r
+    }\r
+    blinkPicker_->SetPosition(BLINK_PICKER_POS_X, BLINK_PICKER_POS_Y, BLINK_PICKER_WIDTH, BLINK_PICKER_HEIGHT);\r
+    blinkPicker_->SetViewId("uiPicker1");\r
+    blinkPicker_->SetBackgroundFont(DEFAULT_VECTOR_FONT_FILENAME, BLINK_PICKER_BACKGROUND_FONT_SIZE);\r
+    blinkPicker_->SetHighlightFont(DEFAULT_VECTOR_FONT_FILENAME, BLINK_PICKER_HIGHLIGHT_FONT_SIZE);\r
+    const char *uiPicker1Data[] = {"慢", "快", "不闪烁"};\r
+    blinkPicker_->SetValues(uiPicker1Data, BLINK_PICKER_NUM);\r
+    uint16_t selectBlink = FlashLightModel::GetInstance().GetBlinkFrequency();\r
+    blinkPicker_->SetSelected(selectBlink);\r
+    blinkPicker_->SetTextColor(Color::Gray(), Color::White());\r
+    blinkPicker_->SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
+    blinkPicker_->SetItemHeight(BLINK_PICKER_ITEM_HEIGHT);\r
+    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_->SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
+    blinkButton_->SetStyleForState(STYLE_BACKGROUND_COLOR, Color::Black().full, UIButton::PRESSED);\r
+    container_->Add(blinkButton_);\r
+    blinkButton_->SetVisible(true);\r
+\r
+    blinkButton_->SetOnClickListener(this);\r
+    container_->SetOnDragListener(this);\r
+    AddViewToPageContainer(container_);\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
+        container_ = nullptr;\r
+    }\r
+    if (blinkLabel_ != nullptr) {\r
+        delete blinkLabel_;\r
+        blinkLabel_ = nullptr;\r
+    }\r
+    if (blinkPicker_ != nullptr) {\r
+        delete blinkPicker_;\r
+        blinkPicker_ = nullptr;\r
+    }\r
+    if (blinkButton_ != nullptr) {\r
+        delete blinkButton_;\r
+        blinkButton_ = nullptr;\r
+    }\r
+    ImageCacheManager::GetInstance().UnloadSingleRes(FLASHLIGHT_IMAGE);\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
+    }\r
+    return false;\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
+        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
+    }\r
+    return false;\r
+}\r
+}
\ No newline at end of file
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/flashlight/src/FlashLightColorPage.cpp b/code/sdk/application/wearable/nativeapp/nativeui/flashlight/src/FlashLightColorPage.cpp
new file mode 100644 (file)
index 0000000..20ae1c0
--- /dev/null
@@ -0,0 +1,330 @@
+/*\r
+ * Copyright (c) Huawei 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
+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
+// 行坐标\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
+// 列坐标\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
+// 按钮大小\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
+    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
+};\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
+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
+        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
+    };\r
+    uint16_t selectColor = (uint16_t)FlashLightModel::GetInstance().GetViewColor();\r
+    COLOR_BUTTON_RES[selectColor] = SELECT_COLOR_BUTTON_RES[selectColor];\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
+        container_->SetScrollBlankSize(CONTAINER_BLANK_SIZE, UIAbstractScroll::Direction::TOP);\r
+        container_->SetScrollBlankSize(CONTAINER_BLANK_SIZE, UIAbstractScroll::Direction::BOTTOM);\r
+    }\r
+\r
+    if (colorLabel_ == nullptr) {\r
+        colorLabel_ = new UILabel();\r
+    }\r
+    colorLabel_->SetPosition(COLOR_LABEL_POS_X, COLOR_LABEL_POS_Y, COLOR_LABEL_WIDTH, COLOR_LABEL_HEIGHT);\r
+    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
+    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
+\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
+\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
+\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
+\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
+\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
+\r
+    container_->Add(color6Button_);\r
+    color6Button_->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
+\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
+\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
+\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
+    AddViewToPageContainer(container_);\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
+        container_ = nullptr;\r
+    }\r
+    if (colorLabel_ != nullptr) {\r
+        delete colorLabel_;\r
+        colorLabel_ = nullptr;\r
+    }\r
+    if (color1Button_ != nullptr) {\r
+        delete color1Button_;\r
+        color1Button_ = nullptr;\r
+    }\r
+    if (color2Button_ != nullptr) {\r
+        delete color2Button_;\r
+        color2Button_ = nullptr;\r
+    }\r
+    if (color3Button_ != nullptr) {\r
+        delete color3Button_;\r
+        color3Button_ = nullptr;\r
+    }\r
+    if (color4Button_ != nullptr) {\r
+        delete color4Button_;\r
+        color4Button_ = nullptr;\r
+    }\r
+    if (color5Button_ != nullptr) {\r
+        delete color5Button_;\r
+        color5Button_ = nullptr;\r
+    }\r
+    if (color6Button_ != nullptr) {\r
+        delete color6Button_;\r
+        color6Button_ = nullptr;\r
+    }\r
+    if (color7Button_ != nullptr) {\r
+        delete color7Button_;\r
+        color7Button_ = nullptr;\r
+    }\r
+    if (color8Button_ != nullptr) {\r
+        delete color8Button_;\r
+        color8Button_ = nullptr;\r
+    }\r
+    if (color9Button_ != nullptr) {\r
+        delete color9Button_;\r
+        color9Button_ = nullptr;\r
+    }\r
+    ImageCacheManager::GetInstance().UnloadSingleRes(FLASHLIGHT_IMAGE);\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
+    }\r
+    return false;\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
+    }\r
+    return false;\r
+}\r
+}
\ No newline at end of file
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/flashlight/src/FlashLightDefaultPage.cpp b/code/sdk/application/wearable/nativeapp/nativeui/flashlight/src/FlashLightDefaultPage.cpp
new file mode 100644 (file)
index 0000000..7b6582c
--- /dev/null
@@ -0,0 +1,132 @@
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: FlashLightDefaultPage\r
+ * Create: 2025-04-24\r
+ */\r
+#include "flashlight/FlashLightDefaultPage.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
+namespace OHOS {\r
+static const uint16_t RECOVER_LABEL_POS_X = 15;\r
+static const uint16_t RECOVER_LABEL_POS_Y = 185;\r
+static const uint16_t RECOVER_LABEL_WIDTH = 424;\r
+static const uint16_t RECOVER_LABEL_HEIGHT = 50;\r
+static const uint16_t RECOVER_LABEL_FONT_SIZE = 36;\r
+static const uint16_t CANCLE_BUTTON_POS_X = 115;\r
+static const uint16_t CANCLE_BUTTON_POS_Y = 300;\r
+static const uint16_t CONFIRM_BUTTON_POS_X = 255;\r
+static const uint16_t CONFIRM_BUTTON_POS_Y = 300;\r
+static const uint16_t CANCLE_BUTTON_WIDTH = 85;\r
+static const uint16_t CANCLE_BUTTON_HEIGHT = 85;\r
+static const std::string CANCLE_BUTTON_ID = "cancle";\r
+static const std::string CONFIRM_BUTTON_ID = "confirm";\r
+\r
+REGIST_SLICE_PAGE(VIEW_FLASHLIGHT, FlashLightAllView::FLASH_LIGHT_DEFAULT_VIEW, FlashLightDefaultPage, false);\r
+void FlashLightDefaultPage::OnStart(void *data)\r
+{\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "FlashLightDefaultPage::OnStart");\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.c_str());\r
+    LOADIMG::LoadBtnImage(cancelButton_, FLASHLIGHT_IMAGE, IMAGE_CONVERTER_TOOL_RECOVERCANCLE,\r
+                          IMAGE_CONVERTER_TOOL_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.c_str());\r
+    LOADIMG::LoadBtnImage(confirmButton_, FLASHLIGHT_IMAGE, IMAGE_CONVERTER_TOOL_RECOVERCONFIRM,\r
+                          IMAGE_CONVERTER_TOOL_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
+FlashLightDefaultPage::~FlashLightDefaultPage()\r
+{\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "FlashLightDefaultPage::~FlashLightDefaultPage");\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 FlashLightDefaultPage::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
+    }\r
+    return false;\r
+}\r
+\r
+bool FlashLightDefaultPage::OnClick(UIView &view, const ClickEvent &event)\r
+{\r
+    std::string viewId = view.GetViewId();\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "FlashLightDefaultPage::OnClick [%s]", viewId.c_str());\r
+    uint16_t preSlice = NativeAbility::GetInstance().GetPreSliceId();\r
+    if (viewId == CONFIRM_BUTTON_ID) {\r
+        NativeAbility::GetInstance().SwitchSlice(VIEW_FLASHLIGHT, FlashLightAllView::FLASH_LIGTH_VIEW);\r
+        FlashLightModel::GetInstance().SetDefault();\r
+    } else if (viewId == CANCLE_BUTTON_ID) {\r
+        NativeAbility::GetInstance().SwitchSlice(VIEW_FLASHLIGHT, FlashLightAllView::FLASH_LIGHT_SET_VIEW);\r
+    } else {\r
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "FlashLightDefaultPage::OnClick [Invalid]");\r
+    }\r
+    return false;\r
+}\r
+}
\ No newline at end of file
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/flashlight/src/FlashLightModel.cpp b/code/sdk/application/wearable/nativeapp/nativeui/flashlight/src/FlashLightModel.cpp
new file mode 100644 (file)
index 0000000..273a464
--- /dev/null
@@ -0,0 +1,78 @@
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: FlashLightModel\r
+ * Create: 2025-04-24\r
+ */\r
+#include "flashlight/FlashLightModel.h"\r
+#ifdef BUILD_IN_LINUX\r
+#include "localtime.h"\r
+#endif\r
+\r
+namespace OHOS {\r
+static const uint32_t TIME_DISPLAY_NUM = 10;\r
+FlashLightModel::FlashLightModel(FlashLightColorAttribute color, FlashLightBlinkFrequency blinkFrequency)\r
+{\r
+    color_ = color;\r
+    blinkFrequency_ = blinkFrequency;\r
+}\r
+\r
+FlashLightModel::~FlashLightModel() {}\r
+\r
+FlashLightModel &FlashLightModel::GetInstance()\r
+{\r
+    static FlashLightModel instance;\r
+    return instance;\r
+}\r
+\r
+FlashLightColorAttribute FlashLightModel::GetViewColor()\r
+{\r
+    return color_;\r
+}\r
+\r
+void FlashLightModel::SetViewColor(FlashLightColorAttribute color)\r
+{\r
+    color_ = color;\r
+}\r
+\r
+FlashLightBlinkFrequency FlashLightModel::GetBlinkFrequency()\r
+{\r
+    return blinkFrequency_;\r
+}\r
+\r
+void FlashLightModel::SetBlinkFrequency(FlashLightBlinkFrequency blinkFrequency)\r
+{\r
+    blinkFrequency_ = blinkFrequency;\r
+}\r
+\r
+void FlashLightModel::SetDefault()\r
+{\r
+    blinkFrequency_ = FlashLightBlinkFrequency::NOT_BLINK;  // 不闪烁;\r
+    color_ = FlashLightColorAttribute::WHITE_COLOR;         // 白色;\r
+}\r
+\r
+uint32_t FlashLightModel::GetSysCurrentTime(std::string &currentTime)\r
+{\r
+#ifdef _WIN32\r
+    struct tm localTime;\r
+    time_t timep;\r
+    gettimeofday(&sysTime_, NULL);\r
+    timep = (time_t)sysTime_.tv_sec;\r
+    localtime_r(&timep, &localTime);\r
+#else\r
+    struct tm localTime;\r
+    time64_t timep;\r
+    gettimeofday64(&sysTime_, NULL);\r
+    timep = (time64_t)sysTime_.tv_sec;\r
+    localtime64_r(&sysTime_.tv_sec, &localTime);\r
+#endif\r
+    if (localTime.tm_hour < TIME_DISPLAY_NUM) {\r
+        currentTime += "0";\r
+    }\r
+    currentTime += std::to_string(localTime.tm_hour) + ":";\r
+    if (localTime.tm_min < TIME_DISPLAY_NUM) {\r
+        currentTime += "0";\r
+    }\r
+    currentTime += std::to_string(localTime.tm_min);\r
+    return 0;\r
+}\r
+}\r
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/flashlight/src/FlashLightPage.cpp b/code/sdk/application/wearable/nativeapp/nativeui/flashlight/src/FlashLightPage.cpp
new file mode 100644 (file)
index 0000000..ba91d99
--- /dev/null
@@ -0,0 +1,174 @@
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: FlashLightPage\r
+ * Create: 2025-04-24\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
+\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
+\r
+REGIST_SLICE_PAGE(VIEW_FLASHLIGHT, FlashLightAllView::FLASH_LIGTH_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
+\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
+\r
+    // 创建时间显示组件\r
+    if (systemTime_ == nullptr) {\r
+        systemTime_ = new UILabel();\r
+    }\r
+    systemTime_->SetPosition(TIME_TEXT_POS_X, TIME_TEXT_POS_Y, TIME_TEXT_WIDTH, TIME_TEXT_HEIGHT);\r
+    systemTime_->SetText("12:00");\r
+    systemTime_->SetStyle(STYLE_TEXT_COLOR, Color::White().full);\r
+    systemTime_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, TIME_LABEL_FONT_SIZE);\r
+    systemTime_->SetStyle(STYLE_BACKGROUND_COLOR, OPA_OPAQUE);\r
+    systemTime_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+    systemTime_->SetVisible(true);\r
+    container_->Add(systemTime_);\r
+    if (timeCallback_ == nullptr) {\r
+        timeCallback_ = new TimeAnimatorCallback();\r
+    }\r
+    if (timeAnimator_ == nullptr) {\r
+        timeAnimator_ = new Animator(timeCallback_, systemTime_, 0, true);\r
+    }\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
+\r
+    flashLightOn_->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
+    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
+    }\r
+    if (systemTime_ != nullptr) {\r
+        delete systemTime_;\r
+        systemTime_ = 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
+    ImageCacheManager::GetInstance().UnloadSingleRes(FLASHLIGHT_IMAGE);\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
+    } 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
+    }\r
+    return false;\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
+}\r
+\r
+void FlashLightPage::TimeAnimatorCallback::Callback(UIView *view)\r
+{\r
+    UILabel *timeLabel = dynamic_cast<UILabel *>(view);\r
+    if (timeLabel == nullptr) {\r
+        return;\r
+    }\r
+    std::string currTime;\r
+    FlashLightModel::GetInstance().GetSysCurrentTime(currTime);\r
+    timeLabel->SetText(currTime.c_str());\r
+    timeLabel->Invalidate();\r
+}\r
+}\r
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/flashlight/src/FlashLightPlayPage.cpp b/code/sdk/application/wearable/nativeapp/nativeui/flashlight/src/FlashLightPlayPage.cpp
new file mode 100644 (file)
index 0000000..fdf35dc
--- /dev/null
@@ -0,0 +1,104 @@
+/*\r
+ * Copyright (c) Huawei 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
+\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
+};\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
+\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
+    }\r
+    uint16_t colorIndex = (uint16_t)FlashLightModel::GetInstance().GetViewColor();\r
+    uint16_t blinkIndex = (uint16_t)FlashLightModel::GetInstance().GetBlinkFrequency();\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
+\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
+    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
+    }\r
+    ImageCacheManager::GetInstance().UnloadSingleRes(FLASHLIGHT_IMAGE);\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
+    }\r
+    return false;\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
+    }\r
+    return false;\r
+}\r
+}
\ No newline at end of file
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/flashlight/src/FlashLightPresenter.cpp b/code/sdk/application/wearable/nativeapp/nativeui/flashlight/src/FlashLightPresenter.cpp
new file mode 100644 (file)
index 0000000..57bb513
--- /dev/null
@@ -0,0 +1,14 @@
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: FlashLightPresenter\r
+ * Create: 2025-04-24\r
+ */\r
+\r
+#include "flashlight/FlashLightView.h"\r
+#include "flashlight/FlashLightPresenter.h"\r
+#include "NativeRegisterManager.h"\r
+\r
+namespace OHOS {\r
+REGIST_MENU(VIEW_FLASHLIGHT, FlashLightView, FlashLightPresenter, FLASHLIGHT_MAIN_ICON, PNG_APPLIST_DEFAULT_IMG,\r
+            "手电筒");\r
+}\r
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/flashlight/src/FlashLightSetItemAdapter.cpp b/code/sdk/application/wearable/nativeapp/nativeui/flashlight/src/FlashLightSetItemAdapter.cpp
new file mode 100644 (file)
index 0000000..2adbf45
--- /dev/null
@@ -0,0 +1,57 @@
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: FlashLightSetItemAdapter.cpp\r
+ * Create: 2025-11-23\r
+ */\r
+#include "flashlight/FlashLightSetItemAdapter.h"\r
+#include "flashlight/FlashLightSetItemView.h"\r
+\r
+namespace OHOS {\r
+FlashLightSetItemAdapter::FlashLightSetItemAdapter() {}\r
+\r
+FlashLightSetItemAdapter::~FlashLightSetItemAdapter()\r
+{\r
+    itemDatas_.Clear();\r
+}\r
+\r
+uint16_t FlashLightSetItemAdapter::GetCount(void)\r
+{\r
+    return itemDatas_.Size();\r
+}\r
+\r
+void FlashLightSetItemAdapter::SetData(const Graphic::Vector<FlashLightSetItem> &data)\r
+{\r
+    if (!itemDatas_.IsEmpty()) {\r
+        itemDatas_.Clear();\r
+    }\r
+    itemDatas_ = data;\r
+}\r
+\r
+UIView *FlashLightSetItemAdapter::GetView(UIView *inView, int16_t index)\r
+{\r
+    if (itemDatas_.IsEmpty()) {\r
+        return nullptr;\r
+    }\r
+\r
+    if (index >= itemDatas_.Size() || index < 0) {\r
+        return nullptr;\r
+    }\r
+\r
+    FlashLightSetItem itemData = itemDatas_[index];\r
+    FlashLightSetItemView *item = nullptr;\r
+    if (inView == nullptr) {\r
+        item = new FlashLightSetItemView();\r
+    } else {\r
+        item = static_cast<FlashLightSetItemView *>(inView);\r
+    }\r
+    item->SetItemInfo(itemData);\r
+    item->SetViewId(itemData.label.c_str());\r
+    item->SetOnClickListener(itemClickListener);\r
+    return item;\r
+}\r
+\r
+void FlashLightSetItemAdapter::AddListItem(const FlashLightSetItem &item)\r
+{\r
+    itemDatas_.PushBack(item);\r
+}\r
+}  // namespace OHOS\r
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/flashlight/src/FlashLightSetItemView.cpp b/code/sdk/application/wearable/nativeapp/nativeui/flashlight/src/FlashLightSetItemView.cpp
new file mode 100644 (file)
index 0000000..32f330b
--- /dev/null
@@ -0,0 +1,95 @@
+/*\r
+ * Copyright (c) Huawei 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
+\r
+namespace OHOS {\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 uint16_t ICON_X = 0;\r
+static constexpr uint16_t ICON_Y = 10;\r
+static constexpr uint16_t LABEL_X = 109;\r
+static constexpr uint16_t LABEL_Y = 0;\r
+static constexpr uint16_t LABEL_W = 172;\r
+static constexpr uint16_t LABEL_H = 53;\r
+static constexpr uint16_t LABEL_FONT = 38;\r
+static constexpr uint16_t IMAGE_X = 315;\r
+static constexpr uint16_t IMAGE_Y = 33;\r
+static constexpr uint16_t ITEM_LABEL_X = 109;\r
+static constexpr uint16_t ITEM_LABEL_Y = 52;\r
+static constexpr uint16_t ITEM_LABEL_W = 172;\r
+static constexpr uint16_t ITEM_LABEL_H = 46;\r
+static constexpr uint16_t ITEM_LABEL_FONT = 32;\r
+\r
+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
+\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
+\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
+\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
+    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
+}\r
+}
\ No newline at end of file
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/flashlight/src/FlashLightSetPage.cpp b/code/sdk/application/wearable/nativeapp/nativeui/flashlight/src/FlashLightSetPage.cpp
new file mode 100644 (file)
index 0000000..7a2361a
--- /dev/null
@@ -0,0 +1,166 @@
+/*\r
+ * Copyright (c) Huawei 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
+\r
+namespace OHOS {\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
+\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
+    if (container_ == nullptr) {\r
+        container_ = new UIScrollView();\r
+        container_->SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);\r
+        container_->SetStyle(STYLE_BACKGROUND_OPA, 0);\r
+        container_->SetScrollBlankSize(CONTAINER_BLANK_SIZE, UIAbstractScroll::Direction::TOP);\r
+        container_->SetScrollBlankSize(CONTAINER_BLANK_SIZE, UIAbstractScroll::Direction::BOTTOM);\r
+    }\r
+\r
+    if (setLabel_ == nullptr) {\r
+        setLabel_ = 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
+\r
+    if (setItemList_ == nullptr) {\r
+        setItemList_ = new UIList();\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
+    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
+    container_->Add(setItemList_);\r
+    setItemList_->SetVisible(true);\r
+\r
+    if (recoverButton_ == nullptr) {\r
+        recoverButton_ = new UILabelButtonExt();\r
+    }\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_->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
+    recoverButton_->SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
+    recoverButton_->SetStyleForState(STYLE_BACKGROUND_COLOR, Color::Black().full, UIButton::PRESSED);\r
+    container_->Add(recoverButton_);\r
+    recoverButton_->SetVisible(true);\r
+\r
+    // 设置界面组件回调函数\r
+    container_->SetOnDragListener(this);\r
+    recoverButton_->SetOnClickListener(this);\r
+    AddViewToPageContainer(container_);\r
+}\r
+\r
+FlashLightSetPage::~FlashLightSetPage()\r
+{\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "FlashLightSetPage::~FlashLightSetPage");\r
+    if (container_ != nullptr) {\r
+        container_->RemoveAll();\r
+        delete container_;\r
+        container_ = nullptr;\r
+    }\r
+    if (setLabel_ != nullptr) {\r
+        delete setLabel_;\r
+        setLabel_ = nullptr;\r
+    }\r
+    if (recoverButton_ != nullptr) {\r
+        delete recoverButton_;\r
+        recoverButton_ = nullptr;\r
+    }\r
+    if (setItemList_ != nullptr) {\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
+    }\r
+    return false;\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
+    }\r
+    return false;\r
+}\r
+}
\ No newline at end of file
index 852053b..43e318f 100644 (file)
@@ -1,10 +1,10 @@
-#include "HeartModel.h"\r
+#include "heartrate/HeartModel.h"\r
 #include "wearable_log.h"\r
 #include "graphic_service.h"\r
-#include "IndoorWalkPreparedView.h"\r
-#include "IndoorWalkPresenter.h"\r
-#include "MainViewSample.h"\r
-#include "HeartRateView.h"\r
+#include "indoorwalk/IndoorWalkPreparedView.h"\r
+#include "indoorwalk/IndoorWalkPresenter.h"\r
+#include "main/MainViewSample.h"\r
+#include "heartrate/HeartRateView.h"\r
 \r
 #ifdef __cplusplus\r
 extern "C" {\r
@@ -73,7 +73,7 @@ static void Notify(void *args, const Topic topic, Request* request)
             WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[Notify] malloc fail");\r
         }\r
 \r
-        int rets = memcpy_s(heartInfo, sizeof(HeartDatas), (HeartInfo*)request->data, request->len);\r
+        int rets = memcpy_s(heartInfo, sizeof(HeartDatas), (HeartDatas*)request->data, request->len);\r
         if (rets != EOK) {\r
             free(heartInfo);\r
             heartInfo = nullptr;\r
index 8c96435..2c9b2c4 100644 (file)
@@ -6,10 +6,10 @@
  */\r
 \r
 #include <securec.h>\r
-#include "HeartRateView.h"\r
+#include "heartrate/HeartRateView.h"\r
 #include "common/screen.h"\r
 #include "UiConfig.h"\r
-#include "ScreenModels.h"\r
+#include "screensetting/ScreenModels.h"\r
 #include "ui_resource_image.h"\r
 #include "common/image_cache_manager.h"\r
 \r
@@ -13,7 +13,7 @@
 #include <ctime>\r
 #include <cstdio>\r
 #include "ohos_types.h"\r
-#include "RtcService.h"\r
+#include "rtcservice/RtcService.h"\r
 #include "samgr_lite.h"\r
 \r
 namespace OHOS {\r
@@ -39,7 +39,7 @@ public:
     uint32 GetStepCounter(void);\r
     void ReviseStepCounter(uint32 &counter);\r
     void GetStepData(const StepDataDistribute &type, uint32_t *value);\r
-    void SetStepData(uint32_t &value);\r
+    void SetStepData(const uint32_t &value);\r
     void SaveStepToFile(struct tm *tm_data);\r
     int GetWeekToday(void);\r
     uint32 GetLastSavedValue(void);\r
 #include "font/ui_font_bitmap.h"\r
 #include "font/ui_font.h"\r
 #include "graphic_config.h"\r
-#include "ModelListenerSample.h"\r
-#include "ActivityModel.h"\r
-#include "ActivityPresenter.h"\r
-#include "ActivityWeekView.h"\r
+#include "main/ModelListenerSample.h"\r
+#include "activity/ActivityModel.h"\r
+#include "activity/ActivityPresenter.h"\r
+#include "activity/ActivityWeekView.h"\r
 \r
 namespace OHOS {\r
 class ActivityPresenter;\r
@@ -12,8 +12,8 @@
 #include <map>
 #include "AppViewIDs.h"
 #include "UiConfig.h"
-#include "AddCardPresenter.h"
-#include "MainModel.h"
+#include "add_card/AddCardPresenter.h"
+#include "main/MainModel.h"
 
 namespace OHOS {
     class AddCardModel {
@@ -15,8 +15,8 @@
 #include "components/ui_toggle_button.h"
 #include "ChangeSliceListener.h"
 #include "UiConfig.h"
-#include "AddCardAdapter.h"
-#include "AddCardModel.h"
+#include "add_card/AddCardAdapter.h"
+#include "add_card/AddCardModel.h"
 
 namespace OHOS {
 class AddCardPresenter;
@@ -9,7 +9,7 @@
 \r
 #include "ohos_types.h"\r
 #include "list.h"\r
-#include "AlmmgrAlarmClockManage.h"\r
+#include "alarmclockmanage/AlmmgrAlarmClockManage.h"\r
 #include "player.h"\r
 #include "source.h"\r
 #include "broadcast_feature.h"\r
@@ -14,7 +14,7 @@
 #include "components/ui_button.h"\r
 #include "components/ui_label_button.h"\r
 #include "UiConfig.h"\r
-#include "AlarmClockModel.h"\r
+#include "alarm/AlarmClockModel.h"\r
 #include "ChangeSliceListener.h"\r
 \r
 namespace OHOS {\r
@@ -20,8 +20,8 @@
 #include "layout/grid_layout.h"\r
 #include "font/ui_font.h"\r
 #include "common/screen.h"\r
-#include "AlarmPresenter.h"\r
-#include "AlarmClockModel.h"\r
+#include "alarm/AlarmPresenter.h"\r
+#include "alarm/AlarmClockModel.h"\r
 \r
 namespace OHOS {\r
 class AlarmJudgeView {\r
@@ -20,8 +20,8 @@
 #include "layout/grid_layout.h"\r
 #include "font/ui_font.h"\r
 #include "common/screen.h"\r
-#include "AlarmPresenter.h"\r
-#include "AlarmClockModel.h"\r
+#include "alarm/AlarmPresenter.h"\r
+#include "alarm/AlarmClockModel.h"\r
 \r
 namespace OHOS {\r
 void CancelScanHandle(void);\r
@@ -13,8 +13,8 @@
 #include "components/ui_scroll_view.h"\r
 #include "components/ui_time_picker.h"\r
 #include "View.h"\r
-#include "AlarmPresenter.h"\r
-#include "AlarmClockModel.h"\r
+#include "alarm/AlarmPresenter.h"\r
+#include "alarm/AlarmClockModel.h"\r
 \r
 namespace OHOS {\r
 class AlarmNewTimeView : public UITimePicker::SelectedListener {\r
@@ -13,7 +13,7 @@
 #include "Presenter.h"\r
 #include "ChangeSliceListener.h"\r
 #include "UiConfig.h"\r
-#include "AlarmPopUpView.h"\r
+#include "alarm/AlarmPopUpView.h"\r
 #include "components/ui_label.h"\r
 #include "common/screen.h"\r
 #include "components/ui_label.h"\r
 #include "components/ui_label_button.h"\r
 #include "components/ui_digital_clock.h"\r
 #include "gfx_utils/graphic_log.h"\r
-#include "ModelListenerSample.h"\r
-#include "AlarmCloseRingView.h"\r
-#include "AlarmRingView.h"\r
-#include "AlarmPopUpView.h"\r
-#include "AlarmClockModel.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
 \r
 namespace OHOS {\r
 #include "components/ui_label_button.h"\r
 #include "ChangeSliceListener.h"\r
 #include "components/ui_digital_clock.h"\r
-#include "AlarmSetTimeView.h"\r
-#include "AlarmCloseRingView.h"\r
-#include "AlarmRingView.h"\r
-#include "AlarmClockModel.h"\r
+#include "alarm/AlarmSetTimeView.h"\r
+#include "alarm/AlarmCloseRingView.h"\r
+#include "alarm/AlarmRingView.h"\r
+#include "alarm/AlarmClockModel.h"\r
 #include "UiConfig.h"\r
 \r
 namespace OHOS {\r
@@ -24,7 +24,7 @@
 #include "components/ui_time_picker.h"\r
 #include "components/ui_digital_clock.h"\r
 #include "gfx_utils/graphic_log.h"\r
-#include "AlarmClockModel.h"\r
+#include "alarm/AlarmClockModel.h"\r
 #include "wearable_log.h"\r
 #include "color.h"\r
 \r
@@ -17,7 +17,7 @@
 #include "ChangeSliceListener.h"\r
 #include "components/ui_digital_clock.h"\r
 #include "UiConfig.h"\r
-#include "AlarmClockModel.h"\r
+#include "alarm/AlarmClockModel.h"\r
 #include "ChangeSliceListener.h"\r
 \r
 namespace OHOS {\r
@@ -13,8 +13,8 @@
 #include "components/ui_scroll_view.h"\r
 #include "components/ui_time_picker.h"\r
 #include "View.h"\r
-#include "AlarmPresenter.h"\r
-#include "AlarmClockModel.h"\r
+#include "alarm/AlarmPresenter.h"\r
+#include "alarm/AlarmClockModel.h"\r
 #include "wearable_log.h"\r
 \r
 namespace OHOS {\r
@@ -17,8 +17,8 @@
 #include "layout/grid_layout.h"\r
 #include "components/root_view.h"\r
 #include "components/ui_time_picker.h"\r
-#include "AlarmPresenter.h"\r
-#include "AlarmClockModel.h"\r
+#include "alarm/AlarmPresenter.h"\r
+#include "alarm/AlarmClockModel.h"\r
 \r
 namespace OHOS {\r
 class AlarmSetWeekView {\r
 #include "ChangeSliceListener.h"
 #include "components/ui_digital_clock.h"
 #include "components/ui_toggle_button.h"
-#include "AlarmPresenter.h"
-#include "AlarmSetTimeView.h"
-#include "AlarmSetWeekView.h"
-#include "AlarmJudgeView.h"
-#include "AlarmConfigView.h"
-#include "AlarmNewTimeView.h"
-#include "AlarmMaxClock.h"
-#include "AlarmClockModel.h"
+#include "alarm/AlarmPresenter.h"
+#include "alarm/AlarmSetTimeView.h"
+#include "alarm/AlarmSetWeekView.h"
+#include "alarm/AlarmJudgeView.h"
+#include "alarm/AlarmConfigView.h"
+#include "alarm/AlarmNewTimeView.h"
+#include "alarm/AlarmMaxClock.h"
+#include "alarm/AlarmClockModel.h"
 
 namespace OHOS {
 constexpr int16_t D_CLOCK_Y = 210;
@@ -12,7 +12,7 @@
 #include "components/ui_label.h"\r
 #include "components/ui_label_button.h"\r
 #include "components/ui_barcode.h"\r
-#include "AlipayPresenter.h"\r
+#include "alipay/AlipayPresenter.h"\r
 \r
 namespace OHOS {\r
 class AlipayBarCode : public UIViewGroup {\r
@@ -11,7 +11,7 @@
 #include "components/ui_image_view.h"\r
 #include "components/ui_label.h"\r
 #include "components/ui_label_button.h"\r
-#include "AlipayPresenter.h"\r
+#include "alipay/AlipayPresenter.h"\r
 #include "components/ui_qrcode.h"\r
 \r
 namespace OHOS {\r
@@ -12,7 +12,7 @@
 #include "components/ui_label.h"\r
 #include "components/ui_label_button.h"\r
 #include "components/ui_image_animator.h"\r
-#include "AlipayPresenter.h"\r
+#include "alipay/AlipayPresenter.h"\r
 \r
 #define ALIPAY_BIND_SEARCH_IMAGE_NUM 8\r
 \r
@@ -11,7 +11,7 @@
 #include "components/ui_image_view.h"\r
 #include "components/ui_label.h"\r
 #include "components/ui_label_button.h"\r
-#include "AlipayPresenter.h"\r
+#include "alipay/AlipayPresenter.h"\r
 \r
 namespace OHOS {\r
 class AlipayBindRes : public UIViewGroup {\r
@@ -11,7 +11,7 @@
 #include "components/ui_image_view.h"\r
 #include "components/ui_label.h"\r
 #include "components/ui_label_button.h"\r
-#include "AlipayPresenter.h"\r
+#include "alipay/AlipayPresenter.h"\r
 \r
 namespace OHOS {\r
 class AlipayExitBind : public UIViewGroup {\r
@@ -11,7 +11,7 @@
 #include "components/ui_image_view.h"\r
 #include "components/ui_label.h"\r
 #include "components/ui_label_button.h"\r
-#include "AlipayPresenter.h"\r
+#include "alipay/AlipayPresenter.h"\r
 #include "components/ui_qrcode.h"\r
 \r
 namespace OHOS {\r
@@ -13,8 +13,8 @@
 #include "components/ui_image_view.h"
 
 #include "UiConfig.h"
-#include "AlipayListItem.h"
-#include "AlipayListView.h"
+#include "alipay/AlipayList/AlipayListItem.h"
+#include "alipay/AlipayList/AlipayListView.h"
 
 namespace OHOS {
 class AlipayListItemView : public UIViewGroup {
 #include "components/ui_scroll_view.h"
 #include "components/ui_list.h"
 #include "components/icon_adapter.h"
-#include "AlipayPresenter.h"
+#include "alipay/AlipayPresenter.h"
 #include "AppViewIDs.h"
 #include "UiConfig.h"
-#include "AlipayListAdapter.h"
-#include "AlipayListItem.h"
+#include "alipay/AlipayList/AlipayListAdapter.h"
+#include "alipay/AlipayList/AlipayListItem.h"
 
 namespace OHOS {
 class AlipayListAdapter;
 #include "components/ui_view_group.h"\r
 #include "ChangeSliceListener.h"\r
 #include "components/ui_swipe_view.h"\r
-#include "AlipayPresenter.h"\r
-#include "AlipayModel.h"\r
-#include "AlipayBind.h"\r
-#include "AlipayExitBind.h"\r
-#include "AlipayBindRes.h"\r
-#include "AlipayBindAni.h"\r
-#include "AlipayListView.h"\r
-#include "AlipayBarCode.h"\r
-#include "AlipayPayCode.h"\r
-#include "AlipaySetting.h"\r
-#include "AlipayHelp.h"\r
-#include "AlipayUnbindFinish.h"\r
-#include "AlipayUnbind.h"\r
+#include "alipay/AlipayPresenter.h"\r
+#include "alipay/AlipayModel.h"\r
+#include "alipay/AlipayBind.h"\r
+#include "alipay/AlipayExitBind.h"\r
+#include "alipay/AlipayBindRes.h"\r
+#include "alipay/AlipayBindAni.h"\r
+#include "alipay/AlipayList/AlipayListView.h"\r
+#include "alipay/AlipayBarCode.h"\r
+#include "alipay/AlipayPayCode.h"\r
+#include "alipay/AlipaySetting.h"\r
+#include "alipay/AlipayHelp.h"\r
+#include "alipay/AlipayUnbindFinish.h"\r
+#include "alipay/AlipayUnbind.h"\r
 \r
-#include "AlipayGetTransList.h"\r
-#include "AlipayTransTips.h"\r
-#include "AlipayTransCode.h"\r
-#include "AlipayTransEnable.h"\r
-#include "AlipayTransRes.h"\r
-#include "AlipayTransListView.h"\r
-#include "AlipayTransAni.h"\r
+#include "alipay/AlipayTrans/AlipayGetTransList.h"\r
+#include "alipay/AlipayTrans/AlipayTransTips.h"\r
+#include "alipay/AlipayTrans/AlipayTransCode.h"\r
+#include "alipay/AlipayTrans/AlipayTransEnable.h"\r
+#include "alipay/AlipayTrans/AlipayTransRes.h"\r
+#include "alipay/AlipayTrans/AlipayTransListView.h"\r
+#include "alipay/AlipayTrans/AlipayTransAni.h"\r
 \r
 namespace OHOS {\r
 class AlipayMainView;\r
@@ -12,7 +12,7 @@
 #include "components/ui_label_button.h"\r
 #include "components/ui_button.h"\r
 #include "components/ui_qrcode.h"\r
-#include "AlipayPresenter.h"\r
+#include "alipay/AlipayPresenter.h"\r
 \r
 namespace OHOS {\r
 class AlipayPayCode : public UIViewGroup {\r
@@ -12,7 +12,7 @@
 #include "UiConfig.h"\r
 #include "wearable_log.h"\r
 #include "color.h"\r
-#include "AlipayModel.h"\r
+#include "alipay/AlipayModel.h"\r
 \r
 namespace OHOS {\r
 constexpr char *ALIPAY_LIST_PAY_BUTTON = (char *)"alipaylistpay";\r
@@ -11,7 +11,7 @@
 #include "components/ui_image_view.h"\r
 #include "components/ui_label.h"\r
 #include "components/ui_label_button.h"\r
-#include "AlipayPresenter.h"\r
+#include "alipay/AlipayPresenter.h"\r
 #include "components/ui_qrcode.h"\r
 \r
 namespace OHOS {\r
@@ -11,7 +11,7 @@
 #include "components/ui_image_view.h"\r
 #include "components/ui_label.h"\r
 #include "components/ui_label_button.h"\r
-#include "AlipayPresenter.h"\r
+#include "alipay/AlipayPresenter.h"\r
 #include "components/ui_qrcode.h"\r
 \r
 namespace OHOS {\r
@@ -13,8 +13,8 @@
 #include "components/ui_image_view.h"
 
 #include "UiConfig.h"
-#include "AlipayTransListItem.h"
-#include "AlipayTransListView.h"
+#include "alipay/AlipayTrans/AlipayTransListItem.h"
+#include "alipay/AlipayTrans/AlipayTransListView.h"
 
 namespace OHOS {
 class AlipayTransListItemView : public UIViewGroup {
 #include "components/ui_list.h"
 #include "components/ui_button.h"
 #include "components/icon_adapter.h"
-#include "AlipayPresenter.h"
+#include "alipay/AlipayPresenter.h"
 #include "AppViewIDs.h"
 #include "UiConfig.h"
-#include "AlipayTransListAdapter.h"
-#include "AlipayTransListItem.h"
+#include "alipay/AlipayTrans/AlipayTransListAdapter.h"
+#include "alipay/AlipayTrans/AlipayTransListItem.h"
 
 namespace OHOS {
 
@@ -11,7 +11,7 @@
 #include "components/ui_image_view.h"\r
 #include "components/ui_label.h"\r
 #include "components/ui_label_button.h"\r
-#include "AlipayPresenter.h"\r
+#include "alipay/AlipayPresenter.h"\r
 \r
 namespace OHOS {\r
 class AlipayUnbind : public UIViewGroup {\r
@@ -11,7 +11,7 @@
 #include "components/ui_image_view.h"\r
 #include "components/ui_label.h"\r
 #include "components/ui_label_button.h"\r
-#include "AlipayPresenter.h"\r
+#include "alipay/AlipayPresenter.h"\r
 #include "components/ui_qrcode.h"\r
 \r
 namespace OHOS {\r
@@ -8,10 +8,10 @@
 #ifndef AODPRESENTER_H
 #define AODPRESENTER_H
 #include "Presenter.h"
-#include "AodView.h"
+#include "aod_view/AodView.h"
 #include "components/ui_view.h"
-#include "KeyInputListener.h"
-#include "ModelListenerSample.h"
+#include "key/KeyInputListener.h"
+#include "main/ModelListenerSample.h"
 
 namespace OHOS {
 class AodView;
@@ -8,9 +8,9 @@
 #ifndef AODVIEW_H
 #define AODVIEW_H
 #include "View.h"
-#include "MainModel.h"
-#include "SetDialInfo.h"
-#include "DialBinTypesV2.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"
 
@@ -8,10 +8,10 @@
 #ifndef APP_ITEM_VIEW_H
 #define APP_ITEM_VIEW_H
 
-#include "components/ui_label.h"
+#include "components/ui_label_ext.h"
 #include "components/ui_view_group.h"
 #include "components/ui_image_view.h"
-#include "ApplistModel.h"
+#include "applist/ApplistModel.h"
 #include "UiConfig.h"
 
 namespace OHOS {
@@ -30,8 +30,8 @@ private:
     AppItemView &operator = (const AppItemView &);
 
     UIImageView icon_;
-    UILabel label_;
-    AppItem itemInfo_ = { VIEW_INVALID, nullptr, nullptr, nullptr, nullptr };
+    UILabelExt label_;
+    AppItem itemInfo_;
 };
 
 class HexagonsItemView : public UIImageView {
@@ -44,34 +44,34 @@ public:
 private:
     HexagonsItemView(const HexagonsItemView &);
     HexagonsItemView &operator = (const HexagonsItemView &);
-    AppItem itemInfo_ = { VIEW_INVALID, nullptr, nullptr, nullptr, nullptr };
+    AppItem itemInfo_;
 };
 
 class FootballItemView : public UIImageView {
 public:
     explicit FootballItemView() {}
-    ~FootballItemView() {}
+    ~FootballItemView();
     void SetItemInfo(const AppItem &itemInfo);
     AppViewId GetViewId();
     const char *GetAppUid();
 private:
     FootballItemView(const FootballItemView &);
     FootballItemView &operator = (const FootballItemView &);
-    AppItem itemInfo_ = { VIEW_INVALID, nullptr, nullptr, nullptr, nullptr };
+    AppItem itemInfo_;
 };
 
 
 class WaterfallItemView : public UIImageView {
 public:
     explicit WaterfallItemView() {}
-    ~WaterfallItemView() {}
+    ~WaterfallItemView();
     void SetItemInfo(const AppItem &itemInfo);
     AppViewId GetViewId();
     const char *GetAppUid();
 private:
     WaterfallItemView(const WaterfallItemView &);
     WaterfallItemView &operator = (const WaterfallItemView &);
-    AppItem itemInfo_ = { VIEW_INVALID, nullptr, nullptr, nullptr, nullptr };
+    AppItem itemInfo_;
 };
 }
 
@@ -17,8 +17,8 @@
 #include "components/abstract_adapter.h"
 #include "UiConfig.h"
 #include "wearable_log.h"
-#include "AppItemView.h"
-#include "ApplistModel.h"
+#include "applist/AppItemView.h"
+#include "applist/ApplistModel.h"
 
 namespace OHOS {
 class ApplistAdapter : public AbstractAdapter {
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/include/applist/ApplistModel.h b/code/sdk/application/wearable/nativeapp/nativeui/include/applist/ApplistModel.h
new file mode 100644 (file)
index 0000000..1cd7bd0
--- /dev/null
@@ -0,0 +1,103 @@
+/*
+ * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved.
+ * Description: ApplistModel.h
+ * Author:
+ * Create: 2021-09-18
+ */
+
+#ifndef APPLIST_MODEL_H
+#define APPLIST_MODEL_H
+
+#include "bundle_info.h"
+#include "AppViewIDs.h"
+#include "ohos_types.h"
+
+#define APP_MAX_NUM 50
+
+namespace OHOS {
+static const int INVALID_MASK = 0x0;
+
+enum UIResourceTextId : uint16_t {
+    STR_MAX_ID = 0,
+};
+
+struct AppItem {
+    uint16_t id = VIEW_INVALID;
+    const char *iconSmall = nullptr; // 小图标资源路径
+    const char *iconHexagon = nullptr; // 六边形图标资源路径
+    const char *label = nullptr; // 应用名
+    uint32_t resId = INVALID_MASK; // 小图标压缩资源对应的id
+    uint32_t hexagonId = INVALID_MASK; // 六边形图标压缩资源对应的id
+    const char *resPath = nullptr; // 小图标压缩资源路径
+    const char *hexagonPath = nullptr; // 六边形图标压缩资源路径
+    uint16_t labelId = STR_MAX_ID; // 多语言环境下对应的字符id
+    const char *uid = nullptr;
+    // resId、resPath和iconSmall互斥, hexagonId、hexagonPath和iconHexagon互斥, labelId和label互斥
+
+    AppItem() = default;
+
+    // 使用该构造方法初始化,支持多语言注册以及多图标打包功能
+    AppItem(uint16_t id, uint32_t resId, uint32_t hexagonId, const char *resPath,
+           const char *hexagonPath, uint16_t labelId, const char *uid) :
+        id(id),
+        resId(resId),
+        hexagonId(hexagonId),
+        resPath(resPath),
+        hexagonPath(hexagonPath),
+        labelId(labelId),
+        uid(uid) {}
+
+    // 使用该构造方法初始化,不支持多语言,一个图标使用一个文件
+    AppItem(uint16_t id, const char *iconSmall, const char *iconHexagon,
+            const char *label, const char *uid) :
+        id(id),
+        iconSmall(iconSmall),
+        iconHexagon(iconHexagon),
+        label(label),
+        uid(uid) {}
+};
+
+enum AppListStyle {
+    APPLIST_STYLE,
+    HEXAGONS_STYLE,
+    FOOTBALL_STYLE,
+    WATERFALL_STYLE
+};
+
+class ApplistPresenter;
+class ApplistModel {
+public:
+    static ApplistModel &GetInstance(void);
+
+    void Init();
+    const AppItem *GetApplistItems() const;
+    uint8 GetAppListNum() const;
+    void ResolvingJSAppItems(void);
+    void SetStartIndex(uint16_t index);
+    uint16_t GetStartIndex(void);
+    void SetHeadItemY(int index);
+    int GetHeadItemY(void);
+    void ApplistUpdate(void);
+    void SetPresenter(ApplistPresenter *p);
+    AppListStyle GetCurrentStyle(void);
+    void SetInitFlag(bool flag);
+
+private:
+    ApplistModel();
+    ApplistModel(const ApplistModel &);
+    ApplistModel &operator=(const ApplistModel &);
+    virtual ~ApplistModel();
+    ApplistPresenter *presenter{nullptr};
+
+    AppItem applist[APP_MAX_NUM];
+    BundleInfo *bundleInfos = nullptr;
+    int32 bundleLen = 0;
+    uint8 appLen = 0;
+
+    uint16_t startIndex = 0;
+    int headItemY = 0;
+    bool initFlag{false};
+};
+}
+
+#endif
@@ -10,9 +10,9 @@
 
 #include "Presenter.h"
 #include "ohos_types.h"
-#include "AppItemView.h"
-#include "ApplistView.h"
-#include "ApplistModel.h"
+#include "applist/AppItemView.h"
+#include "applist/ApplistView.h"
+#include "applist/ApplistModel.h"
 #include "components/root_view.h"
 
 namespace OHOS {
@@ -20,7 +20,7 @@
 #include "components/ui_icosahedron_view.h"
 #include "gfx_utils/list.h"
 #include "ohos_types.h"
-#include "ApplistAdapter.h"
+#include "applist/ApplistAdapter.h"
 #include "ChangeSliceListener.h"
 #include "drag_event.h"
 #include "UiConfig.h"
@@ -113,6 +113,7 @@ public:
     void OnStart() override;
     void OnStop() override;
 
+    void LoadAppIconImage(UIImageView *view, const uint32_t id, const char *path);
     void AddAppItemToList(const AppItem &item);
     void ClearAppItemToList();
     void RefreshAppList(void);
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/include/blood/BloodModel.h b/code/sdk/application/wearable/nativeapp/nativeui/include/blood/BloodModel.h
new file mode 100644 (file)
index 0000000..47a2cae
--- /dev/null
@@ -0,0 +1,35 @@
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SettingModel.h\r
+ * Author:\r
+ * Create: 2025-03-23\r
+ */\r
+\r
+#ifndef BLOOD_MODEL_H\r
+#define BLOOD_MODEL_H\r
+\r
+#include <string>\r
+#include <list>\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
+    };\r
+}\r
+#endif // BLOOD_MODEL_H
\ No newline at end of file
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/include/blood/BloodPresenter.h b/code/sdk/application/wearable/nativeapp/nativeui/include/blood/BloodPresenter.h
new file mode 100644 (file)
index 0000000..893d577
--- /dev/null
@@ -0,0 +1,54 @@
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SettingPresenter.h\r
+ * Author:\r
+ * Create: 2025-03-23\r
+ */\r
+\r
+#ifndef BLOOD_PRESENTER_H\r
+#define BLOOD_PRESENTER_H\r
+\r
+#include "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
+}\r
+\r
+#endif // BLOOD_PRESENTER_H
\ No newline at end of file
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/include/blood/BloodView.h b/code/sdk/application/wearable/nativeapp/nativeui/include/blood/BloodView.h
new file mode 100644 (file)
index 0000000..f28958a
--- /dev/null
@@ -0,0 +1,86 @@
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SettingView.h\r
+ * Author:\r
+ * Create: 2025-03-23\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
+};\r
+}\r
+#endif // BLOOD_VIEW_H\r
@@ -17,8 +17,8 @@
 #include "components/ui_image_animator.h"\r
 #include "components/ui_circle_progress.h"\r
 #include "components/ui_view_group.h"\r
-#include "BloodOxygenPresenter.h"\r
-#include "BloodBandoffView.h"\r
+#include "bloodoxygen/BloodOxygenPresenter.h"\r
+#include "bloodoxygen/BloodBandoffView.h"\r
 \r
 namespace OHOS {\r
 class BloodOxygenView : public View<BloodOxygenPresenter> {\r
@@ -11,8 +11,8 @@
 #include "components/abstract_adapter.h"
 #include "components/ui_label.h"
 #include "components/ui_label_button.h"
-#include "PlayersPresenter.h"
-#include "BluetoothItemView.h"
+#include "player/PlayersPresenter.h"
+#include "bluetooth/BluetoothItemView.h"
 
 namespace OHOS {
 class BluetoothCaseListAdapter : public AbstractAdapter {
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/include/bluetooth/BluetoothChangeBle.h b/code/sdk/application/wearable/nativeapp/nativeui/include/bluetooth/BluetoothChangeBle.h
new file mode 100644 (file)
index 0000000..fb6b043
--- /dev/null
@@ -0,0 +1,17 @@
+/*\r
+ * Copyright (c) @CompanyNameMagicTag 2021-2023. All rights reserved.\r
+ * Description: transmit header file\r
+ * This file should be changed only infrequently and with great care.\r
+ */\r
+#ifndef BLUETOOTH_CHANGE_BLE_H\r
+#define BLUETOOTH_CHANGE_BLE_H\r
+\r
+#ifdef __cplusplus\r
+extern "C" {\r
+#endif\r
+void ChangeBleConnectToMax(void);\r
+void ChangeBleConnectToDefault(void);\r
+#ifdef __cplusplus\r
+}\r
+#endif\r
+#endif\r
@@ -11,7 +11,7 @@
 #include "components/ui_label.h"\r
 #include "components/ui_label_button.h"\r
 #include "components/ui_list.h"\r
-#include "BluetoothDeviceCaseListAdapter.h"\r
+#include "bluetooth/BluetoothDeviceCaseListAdapter.h"\r
 \r
 namespace OHOS {\r
 class BluetoothDeviceCaseListAdapter;\r
@@ -12,7 +12,7 @@
 #include "components/ui_label_button.h"\r
 #include "components/ui_image_animator.h"\r
 #include "components/ui_list.h"\r
-#include "BluetoothCaseListAdapter.h"\r
+#include "bluetooth/BluetoothCaseListAdapter.h"\r
 \r
 namespace OHOS {\r
 class BluetoothCaseListAdapter;\r
 #include "bts_br_gap.h"\r
 \r
 namespace OHOS {\r
+constexpr uint16_t BLUETOOTH_CONN_HANDLE = 64;\r
+constexpr uint16_t BLUETOOTH_INTERVAL_TOMAX_MIN = 12;\r
+constexpr uint16_t BLUETOOTH_INTERVAL_TOMAX_MAX = 12;\r
+constexpr uint16_t BLUETOOTH_INTERVAL_TODEFAULT_MIN = 24;\r
+constexpr uint16_t BLUETOOTH_INTERVAL_TODEFAULT_MAX = 48;\r
+constexpr uint16_t BLUETOOTH_LATENCY = 0;\r
+constexpr uint16_t BLUETOOTH_TIMEOUT_MUTIPLIER = 500;\r
+\r
 typedef enum : uint16_t {\r
     CALLERSETTING,\r
     CALLERPLAYERS,\r
@@ -81,7 +89,9 @@ public:
     int ConnectRemoteDevice(const bd_addr_t *addr);\r
     bool ConnectRemoteCheck(const bd_addr_t *addr);\r
     char* getWatchName(void);\r
-\r
+    void ChangeBleConnectToMax();\r
+    void ChangeBleConnectToDefault();\r
+       \r
 private:\r
     BluetoothModel();\r
     int16_t callerid{0};\r
@@ -11,7 +11,7 @@
 #include "components/ui_label.h"\r
 #include "components/ui_label_button.h"\r
 #include "components/ui_image_animator.h"\r
-#include "BluetoothCaseListAdapter.h"\r
+#include "bluetooth/BluetoothCaseListAdapter.h"\r
 \r
 namespace OHOS {\r
 class BluetoothOptionsView {\r
@@ -8,14 +8,14 @@
 #define BLUETOOTH_PRESENTER_H\r
 \r
 #include "Presenter.h"\r
-#include "BluetoothModel.h"\r
-#include "MainBluetoothView.h"\r
+#include "bluetooth/BluetoothModel.h"\r
+#include "bluetooth/MainBluetoothView.h"\r
 #include "components/ui_view.h"\r
 #include "components/ui_image_view.h"\r
 #include "components/ui_label_button.h"\r
 #include "components/ui_view_group.h"\r
-#include "VolumeSettingView.h"\r
-#include "UiViewId.h"\r
+#include "main/VolumeSettingView.h"\r
+#include "main/UiViewId.h"\r
 \r
 namespace OHOS {\r
 enum BluetoothPresenterNum : uint8_t {\r
 #include "View.h"\r
 #include "UiConfig.h"\r
 #include "ChangeSliceListener.h"\r
-#include "BluetoothPresenter.h"\r
-#include "BluetoothCaseListAdapter.h"\r
-#include "BluetoothEarListView.h"\r
-#include "BluetoothEarPhoneView.h"\r
-#include "BluetoothOptionsView.h"\r
-#include "BluetoothReconnectView.h"\r
-#include "TipsConnFailMessageView.h"\r
-#include "TipsSuccMessageView.h"\r
-#include "TipsFailMessageView.h"\r
-#include "BluetoothDeviceListView.h"\r
-#include "BluetoothItemView.h"\r
+#include "bluetooth/BluetoothPresenter.h"\r
+#include "bluetooth/BluetoothCaseListAdapter.h"\r
+#include "bluetooth/BluetoothEarListView.h"\r
+#include "bluetooth/BluetoothEarPhoneView.h"\r
+#include "bluetooth/BluetoothOptionsView.h"\r
+#include "bluetooth/BluetoothReconnectView.h"\r
+#include "bluetooth/TipsConnFailMessageView.h"\r
+#include "bluetooth/TipsSuccMessageView.h"\r
+#include "bluetooth/TipsFailMessageView.h"\r
+#include "bluetooth/BluetoothDeviceListView.h"\r
+#include "bluetooth/BluetoothItemView.h"\r
 \r
 namespace OHOS {\r
 constexpr int16_t NUM_CONTAINER = 9; // NUM_CONTAINER :蓝牙耳机连接的9个界面容器\r
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/include/breath/BreathDurPage.h b/code/sdk/application/wearable/nativeapp/nativeui/include/breath/BreathDurPage.h
new file mode 100644 (file)
index 0000000..0376dbe
--- /dev/null
@@ -0,0 +1,47 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: BreathDurPage\r
+ * Create: 2025-5-13\r
+ */\r
+#ifndef BREATH_DUR_PAGE_H\r
+#define BREATH_DUR_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 "breath/BreathModel.h"\r
+#include "breath/BreathPresenter.h"\r
+\r
+namespace OHOS {\r
+\r
+class BreathDurPage : public SlicePage<BreathPresenter>,\r
+                        public UIView::OnClickListener,\r
+                        public UIView::OnDragListener {\r
+public:\r
+    BreathDurPage();\r
+    ~BreathDurPage() override;\r
+    void OnStart(void* data) override;\r
+    void OnStop() override;\r
+    void OnResume() override;\r
+    void OnPause() override;\r
+    bool OnClick(UIView &view, const ClickEvent &event) override;\r
+    bool OnDrag(UIView &view, const DragEvent &event) override;\r
+private:\r
+    UILabel *lableTitle = nullptr;\r
+    UIPicker *pickerTime = nullptr;\r
+    UIButton *buttonOk = nullptr;\r
+    UIViewGroup *group = 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/nativeapp/nativeui/include/breath/BreathExerPage.h b/code/sdk/application/wearable/nativeapp/nativeui/include/breath/BreathExerPage.h
new file mode 100644 (file)
index 0000000..3f3513b
--- /dev/null
@@ -0,0 +1,62 @@
+/*\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 "breath/BreathModel.h"\r
+#include "breath/BreathPresenter.h"\r
+\r
+#define ALIPAY_BIND_SEARCH_IMAGE_NUM 80\r
+#define SPEED_IDX_3 3\r
+\r
+namespace OHOS {\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 OnStop() override;\r
+    void OnPause() override;\r
+    bool OnDrag(UIView &view, const DragEvent &event) override;\r
+    void OnTimer();\r
+    void SetUpImageAnimator();\r
+    void InitImageInfo();\r
+\r
+private:\r
+    UIViewGroup *group = nullptr;\r
+    UIImageAnimatorView* imageAnimator_ = nullptr;\r
+    ImageInfo* imageInfoOen = nullptr;\r
+    ImageInfo* imageInfoTwo = nullptr;\r
+    ImageInfo* imageInfoThree = nullptr;\r
+    uint32_t palyNumber;\r
+    ImageAnimatorInfo imageAnimatorImageInfo[SPEED_IDX_3] = { 0 };\r
+    ImageAnimatorInfo searchImageInfo[ALIPAY_BIND_SEARCH_IMAGE_NUM];\r
+\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 *animation = nullptr;\r
+};\r
+}  // namespace OHOS\r
+\r
+#endif
\ No newline at end of file
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/include/breath/BreathMainPage.h b/code/sdk/application/wearable/nativeapp/nativeui/include/breath/BreathMainPage.h
new file mode 100644 (file)
index 0000000..bd06de4
--- /dev/null
@@ -0,0 +1,48 @@
+/*\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 "breath/BreathView.h"\r
+#include "breath/BreathModel.h"\r
+#include "breath/BreathPresenter.h"\r
+\r
+namespace OHOS {\r
+\r
+class BreathMainPage : public SlicePage<BreathPresenter>,\r
+                        public UIView::OnClickListener,\r
+                        public UIView::OnDragListener {\r
+public:\r
+    BreathMainPage() = default;\r
+    ~BreathMainPage() override;\r
+    void OnStart(void* data) override;\r
+    void OnStop() 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 *lableBreathing = nullptr;\r
+    UIButton *buttonTime = nullptr;\r
+    UIButton *buttonSetting = nullptr;\r
+    UIButton *buttonStart = nullptr;\r
+    UILabel *lableSetting = nullptr;\r
+    UILabel *lableTime = nullptr;\r
+    UIViewGroup *group = nullptr;\r
+    UIImageView *background = 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/nativeapp/nativeui/include/breath/BreathModel.h b/code/sdk/application/wearable/nativeapp/nativeui/include/breath/BreathModel.h
new file mode 100644 (file)
index 0000000..7010403
--- /dev/null
@@ -0,0 +1,57 @@
+/*\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 "gfx_utils/graphic_math.h"\r
+namespace OHOS {\r
+#define SPEED_IDX_3 3\r
+class BreathModel {\r
+public:\r
+    static BreathModel &GetInstance();\r
+    virtual ~BreathModel();\r
+    const char **GetDurListData();\r
+    const char **GetRhyListData();\r
+    uint8_t GetDurListSize();\r
+    uint8_t GetRhyListSize();\r
+    char *GetTimeDuration();\r
+    void SetTimeDuration(uint16_t idx);\r
+    void SetTimeRhyation(uint16_t idx);\r
+    uint8_t GetSelectTime();\r
+    uint8_t GetSelectTempo();\r
+    char *GetDuration();\r
+    char *GetRhythm();\r
+    void SetSaveTime(int32_t idx);\r
+    int32_t GetSaveTime();\r
+    uint32_t GetTimeBreathing();\r
+    uint32_t GetStatusRespiratory();\r
+    void SetBeginsTime(int32_t idx);\r
+    int32_t GetBeginsTime();\r
+    void SetFrequencyScore();\r
+    uint8_t GetFrequencyScore();\r
+    void SetHeartRate();\r
+    uint8_t GetHeartRate();\r
+    uint32_t GetTheNumberOfPlays();\r
+\r
+protected:\r
+    void DefaultData();\r
+\r
+private:\r
+    BreathModel();\r
+    BreathModel(const BreathModel &);\r
+    BreathModel &operator=(const BreathModel &);\r
+    const char *durList[SPEED_IDX_3];\r
+    const char *rhyList[SPEED_IDX_3];\r
+    uint32_t durListVal[SPEED_IDX_3];\r
+    uint32_t rhyListVal[SPEED_IDX_3];\r
+    uint16_t data;\r
+    uint16_t date;\r
+    int32_t saveTime;\r
+    int32_t beginsTime;\r
+};\r
+}\r
+\r
+#endif
\ No newline at end of file
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/include/breath/BreathPresenter.h b/code/sdk/application/wearable/nativeapp/nativeui/include/breath/BreathPresenter.h
new file mode 100644 (file)
index 0000000..1b1f6c0
--- /dev/null
@@ -0,0 +1,19 @@
+/*\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
+constexpr int16_t SET_INT_MAX_ = 255;\r
+\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/nativeapp/nativeui/include/breath/BreathResultPage.h b/code/sdk/application/wearable/nativeapp/nativeui/include/breath/BreathResultPage.h
new file mode 100644 (file)
index 0000000..0f2b1a4
--- /dev/null
@@ -0,0 +1,55 @@
+/*\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 "UiConfig.h"\r
+#include "SlicePage.h"\r
+#include "SlicePageFactory.h"\r
+#include "breath/BreathModel.h"\r
+#include "breath/BreathPresenter.h"\r
+\r
+namespace OHOS {\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
+    void OnStop() override;\r
+    void OnResume() override;\r
+    bool OnDrag(UIView &view, const DragEvent &event) override;\r
+    bool OnClick(UIView &view, const ClickEvent &event) override;\r
+\r
+private:\r
+    UILabel *trainingResults = nullptr;\r
+    UILabel *trainingFrequencies = nullptr;\r
+    UILabel *trainingHeartRate = nullptr;\r
+    UILabel *trainingDuration = nullptr;\r
+    UILabel *heartRateScout = nullptr;\r
+    UILabel *frequenciesScout = nullptr;\r
+    UIImageView *scores = nullptr;\r
+    UILabel *descriptionBreathing = nullptr;\r
+    UILabel *time = nullptr;\r
+    UILabel *timeUnit = nullptr;\r
+    UILabel *frequencyTimes = nullptr;\r
+    UILabel *heartRateTimes = nullptr;\r
+    UIViewGroup *group = nullptr;\r
+    uint8_t frequencyScore;\r
+    uint8_t heartRate;\r
+};\r
+}\r
+#endif
\ No newline at end of file
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/include/breath/BreathRhyPage.h b/code/sdk/application/wearable/nativeapp/nativeui/include/breath/BreathRhyPage.h
new file mode 100644 (file)
index 0000000..2c9780d
--- /dev/null
@@ -0,0 +1,44 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: BreathRhyPage\r
+ * Create: 2025-5-13\r
+ */\r
+#ifndef BREATH_RHY_PAGE_H\r
+#define BREATH_RHY_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 "breath/BreathModel.h"\r
+#include "breath/BreathPresenter.h"\r
+\r
+namespace OHOS {\r
+\r
+class BreathRhyPage : public SlicePage<BreathPresenter>,\r
+                    public UIView::OnClickListener,\r
+                    public UIView::OnDragListener,\r
+                    public UIPicker::SelectedListener {\r
+public:\r
+    BreathRhyPage();\r
+    ~BreathRhyPage() override;\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 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 *center = nullptr;\r
+};\r
+}  // namespace OHOS\r
+\r
+#endif
\ No newline at end of file
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/include/breath/BreathStartPage.h b/code/sdk/application/wearable/nativeapp/nativeui/include/breath/BreathStartPage.h
new file mode 100644 (file)
index 0000000..86b1a9f
--- /dev/null
@@ -0,0 +1,51 @@
+/*\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 "SlicePage.h"\r
+#include "graphic_timer.h"\r
+#include "SlicePageFactory.h"\r
+#include "breath/BreathModel.h"\r
+#include "breath/BreathPresenter.h"\r
+\r
+namespace OHOS {\r
+\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 OnStop() 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 *centerImge = nullptr;\r
+    UIViewGroup *group = nullptr;\r
+    UIImageView *background = 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 *animation = nullptr;\r
+};\r
+}  // namespace OHOS\r
+\r
+#endif
\ No newline at end of file
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/include/breath/BreathView.h b/code/sdk/application/wearable/nativeapp/nativeui/include/breath/BreathView.h
new file mode 100644 (file)
index 0000000..0cfa801
--- /dev/null
@@ -0,0 +1,24 @@
+/*\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 BrearhView {\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
+};\r
+\r
+class BreathPresenter;\r
+class BreathView : public View<BreathPresenter> {};\r
+}\r
+#endif  // BREATH_VIEW_H
\ No newline at end of file
@@ -13,9 +13,9 @@
 #include "components/ui_image_view.h"\r
 #include "components/ui_label_button.h"\r
 \r
-#include "CallerLogModel.h"\r
+#include "callerlog/CallerLogModel.h"\r
 #include "UiConfig.h"\r
-#include "PhoneService.h"\r
+#include "phoneservice/PhoneService.h"\r
 \r
 namespace OHOS {\r
 class CallerItemView : public UIViewGroup {\r
@@ -9,8 +9,8 @@
 #define CALLER_LOG_VIEW_H\r
 \r
 #include "View.h"\r
-#include "CallerLogPresenter.h"\r
-#include "CallerItemView.h"\r
+#include "callerlog/CallerLogPresenter.h"\r
+#include "callerlog/CallerItemView.h"\r
 #include "components/ui_view_group.h"\r
 #include "components/ui_image_animator.h"\r
 #include "components/ui_scroll_view.h"\r
@@ -18,7 +18,7 @@
 #include "components/ui_label_button.h"\r
 #include "components/ui_list.h"\r
 #include "components/abstract_adapter.h"\r
-#include "PhoneService.h"\r
+#include "phoneservice/PhoneService.h"\r
 #include "vector.h"\r
 #include "ChangeSliceListener.h"\r
 \r
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/include/camera/CameraMainPage.h b/code/sdk/application/wearable/nativeapp/nativeui/include/camera/CameraMainPage.h
new file mode 100644 (file)
index 0000000..01aa7b8
--- /dev/null
@@ -0,0 +1,84 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: CameraMainPage\r
+ * Created: 2025-06-05\r
+ */\r
+\r
+#ifndef CAMERA_MAIN_PAGE_H\r
+#define CAMERA_MAIN_PAGE_H\r
+\r
+#include <sys/time.h>\r
+#include "View.h"\r
+#include "components/root_view.h"\r
+#include "components/ui_label_button.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 "UiConfig.h"\r
+#include "layout/grid_layout.h"\r
+#include "SlicePageFactory.h"\r
+#include "SlicePage.h"\r
+#include "diag_service.h"\r
+#include "ohos_timer.h"\r
+#include "components/ui_chart.h"\r
+#include "camera/CameraModel.h"\r
+#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
+                        public UIView::OnDragListener {\r
+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
+    void SetUpButton();\r
+    void InitCameraTimer();\r
+    void InitCameraView();\r
+    void DisableCameraTimer();\r
+    void SetCameraTime(int time);\r
+    void StopAnimator();\r
+    void PhotoTaken();\r
+    void Refresh_page();\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
+    UIScrollView* container_ = nullptr;\r
+    UIImageView *bluetoothDisconnected = nullptr;\r
+\r
+class CameraAnimatorCallback : public AnimatorCallback {\r
+public:\r
+    explicit CameraAnimatorCallback(CameraMainPage* page) : page_(page) {}\r
+    ~CameraAnimatorCallback() override {}\r
+    void Callback(UIView *view) override;\r
+\r
+private:\r
+    CameraMainPage* page_{nullptr};\r
+};\r
+    Animator *animator_ = nullptr;\r
+    CameraAnimatorCallback *callBack_ = nullptr;\r
+};\r
+}\r
+#endif // CAMERA_VIEW_H\r
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/include/camera/CameraModel.h b/code/sdk/application/wearable/nativeapp/nativeui/include/camera/CameraModel.h
new file mode 100644 (file)
index 0000000..61a9c5e
--- /dev/null
@@ -0,0 +1,27 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: CameraModel\r
+ * Created: 2025-06-05\r
+ */\r
+\r
+#ifndef CAMERA_MODEL_H\r
+#define CAMERA_MODEL_H\r
+\r
+#include <string>\r
+#include <list>\r
+#include "graphic_timer.h"\r
+\r
+namespace OHOS {\r
+class CameraModel {\r
+public:\r
+    static CameraModel &GetInstance(void);\r
+private:\r
+    CameraModel();\r
+    CameraModel(const CameraModel &);\r
+    CameraModel &operator=(const CameraModel &);\r
+    virtual ~CameraModel();\r
+    bool buttonStatus = 0;\r
+};\r
+}\r
+\r
+#endif // CAMERA_MODEL_H
\ No newline at end of file
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/include/camera/CameraPresenter.h b/code/sdk/application/wearable/nativeapp/nativeui/include/camera/CameraPresenter.h
new file mode 100644 (file)
index 0000000..dced576
--- /dev/null
@@ -0,0 +1,20 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: CameraPresenter\r
+ * Created: 2025-06-05\r
+ */\r
+\r
+#ifndef CAMERA_PRESENTER_H\r
+#define CAMERA_PRESENTER_H\r
+\r
+#include "Presenter.h"\r
+#include "components/ui_view.h"\r
+\r
+namespace OHOS {\r
+\r
+class CameraView;\r
+class CameraPresenter : public Presenter<CameraView> {\r
+};\r
+}\r
+\r
+#endif // CAMERA_PRESENTER_H
\ No newline at end of file
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/include/camera/CameraView.h b/code/sdk/application/wearable/nativeapp/nativeui/include/camera/CameraView.h
new file mode 100644 (file)
index 0000000..d939d9d
--- /dev/null
@@ -0,0 +1,20 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: CameraView\r
+ * Created: 2025-06-05\r
+ */\r
+\r
+#ifndef CAMERA_VIEW_H\r
+#define CAMERA_VIEW_H\r
+\r
+#include "View.h"\r
+namespace OHOS {\r
+enum CAMERA_PAGES {\r
+    CAMERA_MAIN_PAGE = 1, // 0 is invalid\r
+};\r
+\r
+class CameraPresenter;\r
+class CameraView : public View<CameraPresenter> {\r
+};\r
+}\r
+#endif // CAMERA_VIEW_H\r
@@ -21,8 +21,8 @@
 #include "font/ui_font_bitmap.h"
 #include "font/ui_font.h"
 #include "graphic_config.h"
-#include "HealthModel.h"
-#include "ActivityModel.h"
+#include "main/HealthModel.h"
+#include "activity/ActivityModel.h"
 #include "UiConfig.h"
 #include "components/ui_card_page.h"
 #include "animator/animator_manager.h"
@@ -21,8 +21,8 @@
 #include "font/ui_font_bitmap.h"
 #include "font/ui_font.h"
 #include "graphic_config.h"
-#include "HealthModel.h"
-#include "ActivityModel.h"
+#include "main/HealthModel.h"
+#include "activity/ActivityModel.h"
 #include "UiConfig.h"
 #include "components/ui_card_page.h"
 #include "animator/animator_manager.h"
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/include/compass/CompassControlView.h b/code/sdk/application/wearable/nativeapp/nativeui/include/compass/CompassControlView.h
new file mode 100644 (file)
index 0000000..e2242e1
--- /dev/null
@@ -0,0 +1,29 @@
+/*\r
+ * Copyright (c) CompanyNameMagicTag 2022-2022. All rights reserved.\r
+ * Description: CompassControlView.h\r
+ * Author:\r
+ * Create: 2022-04-02\r
+ */\r
+\r
+#ifndef COMPASS_CONTROL_VIEW_H\r
+#define COMPASS_CONTROL_VIEW_H\r
+\r
+#include "components/ui_card_page.h"\r
+#include "compass/CompassFragment.h"\r
+\r
+namespace OHOS {\r
+\r
+class CompassControlView : public UICardPage {\r
+public:\r
+    CompassControlView();\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
+private:\r
+    CompassFragment *compassFragment_{nullptr};\r
+};\r
+}\r
+#endif\r
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/include/compass/CompassFragment.h b/code/sdk/application/wearable/nativeapp/nativeui/include/compass/CompassFragment.h
new file mode 100644 (file)
index 0000000..64c6ee0
--- /dev/null
@@ -0,0 +1,36 @@
+/*
+ * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved.
+ * Description: CompassView.h
+ * Author:
+ * Create: 2021-12-21
+ */
+
+#ifndef COMPASS_VIEW_H
+#define COMPASS_VIEW_H
+
+#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 {
+public:
+    void OnCreateView(void* data) override;
+    void OnResumeView() override;
+    void OnPauseView() override;
+    void OnDestroyView() override;
+    void Callback() override;
+
+private:
+    bool InitCompassImage(void);
+    bool LoadCompassImage(UIImageView *view, uint32_t resId);
+    UILabel *directionLabel_{nullptr};
+    UILabel *angleLabel_{nullptr};
+    UIImageView *bgImg_{nullptr};
+    UIImageView *fgImg_{nullptr};
+    UIImageView *trianImg_{nullptr};
+    bool initialized_{false};
+};
+}
+#endif
\ No newline at end of file
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/include/compass/CompassModel.h b/code/sdk/application/wearable/nativeapp/nativeui/include/compass/CompassModel.h
new file mode 100644 (file)
index 0000000..8806174
--- /dev/null
@@ -0,0 +1,30 @@
+/*\r
+ * Copyright (c) CompanyNameMagicTag 2022-2022. All rights reserved.\r
+ * Description: CompassModel.h\r
+ * Author:\r
+ * Create: 2022-04-02\r
+ */\r
+\r
+#ifndef COMPASS_MODEL_H\r
+#define COMPASS_MODEL_H\r
+\r
+#include <cstdint>\r
+\r
+namespace OHOS {\r
+class CompassModel {\r
+public:\r
+    static CompassModel *GetInstance(void);\r
+    bool OpenCompassSensor(void);\r
+    bool CloseCompassSensor(void);\r
+    void UpdateAngle(void);\r
+    void ResetAngle(void);\r
+    int16_t GetAngle(void);\r
+\r
+private:\r
+    int16_t angle_{0};\r
+    bool clockwise_{true};\r
+};\r
+}\r
+\r
+#endif\r
+\r
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/include/compass/MainCompassPresenter.h b/code/sdk/application/wearable/nativeapp/nativeui/include/compass/MainCompassPresenter.h
new file mode 100644 (file)
index 0000000..2588f0a
--- /dev/null
@@ -0,0 +1,25 @@
+/*\r
+ * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved.\r
+ * Description: MainCompassPresenter.h\r
+ * Author:\r
+ * Create: 2021-12-21\r
+ */\r
+#ifndef COMPASS_MAINPRESENTER_H\r
+#define COMPASS_MAINPRESENTER_H\r
+\r
+#include "Presenter.h"\r
+#include "compass/MainCompassView.h"\r
+#include "compass/CompassModel.h"\r
+\r
+namespace OHOS {\r
+class MainCompassView;\r
+class MainCompassPresenter : public Presenter<MainCompassView>, public UIView::OnDragListener {\r
+public:\r
+    bool OnDrag(UIView& view, const DragEvent& event) override;\r
+\r
+    void OnResume() override;\r
+\r
+    void OnPause() override;\r
+};\r
+}\r
+#endif
\ No newline at end of file
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/include/compass/MainCompassView.h b/code/sdk/application/wearable/nativeapp/nativeui/include/compass/MainCompassView.h
new file mode 100644 (file)
index 0000000..4694861
--- /dev/null
@@ -0,0 +1,27 @@
+/*\r
+ * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved.\r
+ * Description: MainCompassView\r
+ * Author:\r
+ * Create: 2021-12-23\r
+ */\r
+\r
+#ifndef MAIN_COMPASS_VIEW_H\r
+#define MAIN_COMPASS_VIEW_H\r
+\r
+#include "View.h"\r
+#include "compass/CompassFragment.h"\r
+\r
+namespace OHOS {\r
+class MainCompassPresenter;\r
+class MainCompassView : public View<MainCompassPresenter> {\r
+public:\r
+    MainCompassView() : compassFragment_(nullptr) {}\r
+    void OnStart() override;\r
+    void OnStop() override;\r
+\r
+private:\r
+    friend class MainCompassPresenter;\r
+    CompassFragment *compassFragment_;\r
+};\r
+} // namespace OHOS\r
+#endif
\ No newline at end of file
@@ -8,9 +8,9 @@
 #define CONNECT_PHONE_VIEW_H\r
 \r
 #include "View.h"\r
-#include "ConnectPhonePresenter.h"\r
-#include "ConnectSelectView.h"\r
-#include "AppGroupView.h"\r
+#include "connectnewphone/ConnectPhonePresenter.h"\r
+#include "connectnewphone/ConnectSelectView.h"\r
+#include "main/AppGroupView.h"\r
 \r
 namespace OHOS {\r
 constexpr int16_t NUM_CONNECT_PHONE_CONTAINER = 2;\r
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/include/date/DateAdapter.h b/code/sdk/application/wearable/nativeapp/nativeui/include/date/DateAdapter.h
new file mode 100644 (file)
index 0000000..676b800
--- /dev/null
@@ -0,0 +1,43 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: DateAdapter\r
+ * Create: 2025-03-23\r
+ */\r
+\r
+#ifndef DATE_ADAPTER_H\r
+#define DATE_ADAPTER_H\r
+\r
+#include <list>\r
+#include <string>\r
+#include "components/ui_list.h"\r
+#include "components/ui_label.h"\r
+#include "components/ui_view_group.h"\r
+#include "components/ui_image_view.h"\r
+#include "components/abstract_adapter.h"\r
+#include "wearable_log.h"\r
+#include "UiConfig.h"\r
+#include "date/DateModel.h"\r
+#include "date/DateItemView.h"\r
+\r
+namespace OHOS {\r
+class DateAdapter : public AbstractAdapter {\r
+public:\r
+    explicit DateAdapter();\r
+    ~DateAdapter() override;\r
+    void SetData(std::list<DateItem> &data);\r
+    uint16_t GetCount(void) override;\r
+    UIView *GetView(UIView *inView, int16_t index) override;\r
+    void AddListItem(const DateItem &item);\r
+    void SetItemClickListener(UIView::OnClickListener *itemclicklistener)\r
+    {\r
+        itemClickListener = itemclicklistener;\r
+    }\r
+    void ClearListItem();\r
+\r
+private:\r
+    std::list<DateItem> listData;\r
+    UIView::OnClickListener *itemClickListener{nullptr};\r
+};\r
+}\r
+\r
+#endif
\ No newline at end of file
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/include/date/DateButtonAdapter.h b/code/sdk/application/wearable/nativeapp/nativeui/include/date/DateButtonAdapter.h
new file mode 100644 (file)
index 0000000..da4c013
--- /dev/null
@@ -0,0 +1,44 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: DateButtonAdapter\r
+ * Create: 2025-03-23\r
+ */\r
+\r
+#ifndef DATE_BUTTON_ADAPTER_H\r
+#define DATE_BUTTON_ADAPTER_H\r
+\r
+#include <list>\r
+#include <string>\r
+#include "components/ui_list.h"\r
+#include "components/ui_label.h"\r
+#include "components/ui_view_group.h"\r
+#include "components/ui_image_view.h"\r
+#include "components/abstract_adapter.h"\r
+#include "wearable_log.h"\r
+#include "UiConfig.h"\r
+#include "date/DateModel.h"\r
+#include "date/DateButtonItemView.h"\r
+\r
+namespace OHOS {\r
+class DateButtonAdapter : public AbstractAdapter {\r
+public:\r
+    explicit DateButtonAdapter();\r
+    ~DateButtonAdapter() override;\r
+\r
+    void SetData(std::list<DateButtonItem> &data);\r
+    uint16_t GetCount(void) override;\r
+    UIView *GetView(UIView *inView, int16_t index) override;\r
+    void AddListItem(const DateButtonItem &item);\r
+    void SetItemClickListener(UIView::OnClickListener *itemclicklistener)\r
+    {\r
+        itemClickListener = itemclicklistener;\r
+    }\r
+    void ClearListItem();\r
+\r
+private:\r
+    std::list<DateButtonItem> listData;\r
+    UIView::OnClickListener *itemClickListener{nullptr};\r
+};\r
+}\r
+\r
+#endif
\ No newline at end of file
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/include/date/DateButtonItemView.h b/code/sdk/application/wearable/nativeapp/nativeui/include/date/DateButtonItemView.h
new file mode 100644 (file)
index 0000000..c03c4b2
--- /dev/null
@@ -0,0 +1,35 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: DateButtonItemView\r
+ * Create: 2025-03-23\r
+ */\r
+\r
+#ifndef DATE_BUTTON_ITEM_VIEW_H\r
+#define DATE_BUTTON_ITEM_VIEW_H\r
+\r
+#include "date/DateModel.h"\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 "main/LoadImg.h"\r
+\r
+namespace OHOS {\r
+class DateButtonItemView : public UIViewGroup {\r
+public:\r
+    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
+};\r
+}\r
+\r
+#endif\r
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/include/date/DateItemView.h b/code/sdk/application/wearable/nativeapp/nativeui/include/date/DateItemView.h
new file mode 100644 (file)
index 0000000..9f7d976
--- /dev/null
@@ -0,0 +1,39 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: DateItemView\r
+ * Create: 2025-03-23\r
+ */\r
+\r
+#ifndef DATE_ITEM_VIEW_H\r
+#define DATE_ITEM_VIEW_H\r
+\r
+#include "date/DateModel.h"\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_view_group.h"\r
+\r
+namespace OHOS {\r
+class DateItemView : public UIViewGroup {\r
+public:\r
+    explicit DateItemView();\r
+    ~DateItemView() override;\r
+    virtual void SetItemInfo(const DateItem itemInfo);\r
+    virtual void SetUpChild();\r
+    const char *GetViewId();\r
+    bool GetVisiable();\r
+\r
+private:\r
+    UILabel sLabel_1;\r
+    UIImageView sIcon;\r
+    UILabel sLabel_2;\r
+    UIImageView sNextImage;\r
+    UIImageView Schedule;\r
+    UIImageView Signs;\r
+    UIImageView BackGround;\r
+    DateItem sItemInfo = {nullptr, nullptr, nullptr, false};\r
+};\r
+}\r
+\r
+#endif\r
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/include/date/DateMainPage.h b/code/sdk/application/wearable/nativeapp/nativeui/include/date/DateMainPage.h
new file mode 100644 (file)
index 0000000..9bb4584
--- /dev/null
@@ -0,0 +1,58 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: DateMainPage\r
+ * Create: 2025-03-23\r
+ */\r
+\r
+#ifndef DATE_MAIN_PAGE_H\r
+#define DATE_MAIN_PAGE_H\r
+\r
+#include <string>\r
+#include <iomanip>\r
+#include <string>\r
+#include <sys/time.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 "SlicePage.h"\r
+#include "UiConfig.h"\r
+#include "date/DateView.h"\r
+#include "components/ui_button.h"\r
+\r
+namespace OHOS {\r
+#define LABEL_COUNT 4\r
+static constexpr int16_t START_YEAR = 1900;\r
+\r
+class DatePresenter;\r
+class DateMainPage : public SlicePage<DatePresenter>,\r
+                        public UIView::OnClickListener,\r
+                        public UIView::OnDragListener {\r
+public:\r
+    DateMainPage();\r
+    ~DateMainPage() 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 InitDownList();\r
+    void UpdateMsg(std::string dateMsg);\r
+    void SetDownListAdapter();\r
+    bool InitDateTop();\r
+    std::string GetFutureDate(int days_ahead);\r
+    void RefreshButtonListDate(int value);\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
+};\r
+}\r
+#endif // SETTING_MAIN_PAGE_H
\ No newline at end of file
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/include/date/DateMessagePage.h b/code/sdk/application/wearable/nativeapp/nativeui/include/date/DateMessagePage.h
new file mode 100644 (file)
index 0000000..8a5e59c
--- /dev/null
@@ -0,0 +1,40 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: DateMessagePage\r
+ * Create: 2025-03-15\r
+ */\r
+\r
+#ifndef DATE_MESSAGE_H\r
+#define DATE_MESSAGE_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 "date/DatePresenter.h"\r
+#include "date/DateModel.h"\r
+#include "date/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
+public:\r
+    DateMessagePage();\r
+    ~DateMessagePage() override;\r
+    void OnStart(void* data) override;\r
+    bool OnDrag(UIView& view, const DragEvent& event) override;\r
+\r
+private:\r
+    UIViewGroup *group;\r
+    UIImageView *image1;\r
+    UILabel *labelTitle{nullptr};\r
+    UILabel *labelMessage{nullptr};\r
+    UILabel *labelTime{nullptr};\r
+};\r
+}\r
+#endif
\ No newline at end of file
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/include/date/DateModel.h b/code/sdk/application/wearable/nativeapp/nativeui/include/date/DateModel.h
new file mode 100644 (file)
index 0000000..b86e3e2
--- /dev/null
@@ -0,0 +1,82 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: DateModel\r
+ * Create: 2025-03-23\r
+ */\r
+\r
+#ifndef DATE_MODEL_H\r
+#define DATE_MODEL_H\r
+\r
+#include <sys/time.h>\r
+#include <chrono>\r
+#include <cstdint>\r
+#include <ctime>\r
+#include <fstream>\r
+#include <iomanip>\r
+#include <iostream>\r
+#include <list>\r
+#include <map>\r
+#include <random>\r
+#include <sstream>\r
+#include <unordered_map>\r
+#include "hal_tick.h"\r
+#include "AppViewIDs.h"\r
+#include "UiConfig.h"\r
+#include "cJSON.h"\r
+\r
+namespace OHOS {\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_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
+typedef struct {\r
+    std::string hour;\r
+    std::string eventTitle;\r
+    std::string startTime;\r
+    std::string week;\r
+} DateMsg;\r
+\r
+typedef struct {\r
+    const char *label_1;\r
+    const char *label_2;\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
+    bool isFirst;\r
+    bool isSelect;\r
+} DateButtonItem;\r
+\r
+static const uint16_t DATE_ITEM_COUNT = 10;\r
+class DateModel {\r
+public:\r
+    static DateModel &GetInstance(void);\r
+    virtual ~DateModel();\r
+    bool InitDateVec(std::string dateStr);\r
+    bool InitDate();\r
+\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
+\r
+private:\r
+    DateModel();\r
+    DateModel(const DateModel &);\r
+    DateModel &operator=(const DateModel &);\r
+};\r
+}\r
+\r
+#endif  // DATE_MODEL_H
\ No newline at end of file
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/include/date/DatePresenter.h b/code/sdk/application/wearable/nativeapp/nativeui/include/date/DatePresenter.h
new file mode 100644 (file)
index 0000000..813c5ba
--- /dev/null
@@ -0,0 +1,36 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: DatePresenter\r
+ * Create: 2025-03-23\r
+ */\r
+\r
+#ifndef DATE_PRESENTER_H\r
+#define DATE_PRESENTER_H\r
+\r
+#include "date/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
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/include/date/DateView.h b/code/sdk/application/wearable/nativeapp/nativeui/include/date/DateView.h
new file mode 100644 (file)
index 0000000..8271b29
--- /dev/null
@@ -0,0 +1,20 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: DateView\r
+ * Create: 2025-03-23\r
+ */\r
+\r
+#ifndef DATE_VIEW_H\r
+#define DATE_VIEW_H\r
+\r
+#include "View.h"\r
+namespace OHOS {\r
+enum DATE_PAGES {\r
+    DATE_MAIN_PAGE = 1,  // 0 is invalid\r
+    DATE_MESSAGE_PAGE = 2,\r
+};\r
+\r
+class DatePresenter;\r
+class DateView : public View<DatePresenter> {};\r
+}\r
+#endif  // Date_VIEW_H\r
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/include/emptypage/EmptyPage.h b/code/sdk/application/wearable/nativeapp/nativeui/include/emptypage/EmptyPage.h
new file mode 100644 (file)
index 0000000..0b497c7
--- /dev/null
@@ -0,0 +1,48 @@
+/*\r
+ * Copyright (c) Huawei 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_label.h"\r
+#include "SlicePage.h"\r
+#include "emptypage/EmptyPresenter.h"\r
+\r
+namespace OHOS {\r
+\r
+class EmptyPage : public SlicePage<EmptyPresenter>,\r
+    public UIView::OnClickListener,\r
+    public UIView::OnDragListener {\r
+public:\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
+    EmptyPage &operator=(const EmptyPage &) = delete;\r
+    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
+};\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
+#endif\r
+#ifdef __cplusplus\r
+}\r
+#endif\r
+}  // namespace OHOS\r
+#endif /* EMPTY_PAGE_H */\r
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/include/emptypage/EmptyPresenter.h b/code/sdk/application/wearable/nativeapp/nativeui/include/emptypage/EmptyPresenter.h
new file mode 100644 (file)
index 0000000..ca245c8
--- /dev/null
@@ -0,0 +1,17 @@
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: EmptyPresenter\r
+ * Create: 2025-04-24\r
+ */\r
+\r
+#ifndef EMPTY_PRESENTER_H\r
+#define EMPTY_PRESENTER_H\r
+\r
+#include "Presenter.h"\r
+\r
+namespace OHOS {\r
+class EmptyView;\r
+class EmptyPresenter : public Presenter<EmptyView> {};\r
+}\r
+\r
+#endif  // EMPTY_PRESENTER_H
\ No newline at end of file
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/include/emptypage/EmptyView.h b/code/sdk/application/wearable/nativeapp/nativeui/include/emptypage/EmptyView.h
new file mode 100644 (file)
index 0000000..b17ea9e
--- /dev/null
@@ -0,0 +1,14 @@
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: EmptyView\r
+ * Create: 2025-04-24\r
+ */\r
+\r
+#ifndef EMPTY_VIEW_H\r
+#define EMPTY_VIEW_H\r
+#include "View.h"\r
+namespace OHOS {\r
+class EmptyPresenter;\r
+class EmptyView : public View<EmptyPresenter> {};\r
+}\r
+#endif  // EMPTY_VIEW_H\r
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/include/findphone/FindPhoneMainPage.h b/code/sdk/application/wearable/nativeapp/nativeui/include/findphone/FindPhoneMainPage.h
new file mode 100644 (file)
index 0000000..39e3b92
--- /dev/null
@@ -0,0 +1,74 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: FindPhoneMainPage\r
+ * Create: 2025-03-23\r
+ */\r
+\r
+#ifndef FINDPHONE_MAIN_PAGE_H\r
+#define FINDPHONE_MAIN_PAGE_H\r
+\r
+#include <string>\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_button.h"\r
+#include "components/ui_list.h"\r
+#include "components/ui_image_animator.h"\r
+#include "ChangeSliceListener.h"\r
+#include "UiConfig.h"\r
+#include "layout/grid_layout.h"\r
+#include "SlicePageFactory.h"\r
+#include "SlicePage.h"\r
+#include "diag_service.h"\r
+#include "ohos_timer.h"\r
+#include "findphone/FindPhoneModel.h"\r
+#include "findphone/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
+class FindPhonePresenter;\r
+class FindPhoneModel;\r
+class FindPhoneMainPage : public SlicePage<FindPhonePresenter>,\r
+                        public UIView::OnClickListener,\r
+                        public UIView::OnDragListener {\r
+public:\r
+    FindPhoneMainPage();\r
+    ~FindPhoneMainPage() override;\r
+    static FindPhoneMainPage *GetInstance();\r
+    void OnStart(void* data) override;\r
+    void OnStop() override;\r
+    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 InitImageInfo();\r
+    void ShowReset();\r
+    void DisableFindPhoneTimer();\r
+    void InitFindPhoneTimer();\r
+    bool StopFindPhone();\r
+    uint8_t GetConnectStatus();\r
+    void ChangeToDisConnect();\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
+    UIImageAnimatorView* imageAnimator_ = nullptr;\r
+    GraphicTimer *g_startCount = nullptr;\r
+    ImageAnimatorInfo searchImageInfo[ALIPAY_BIND_SEARCH_IMAGE_NUM];\r
+};\r
+}\r
+#endif // FINDPHONE_VIEW_H\r
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/include/findphone/FindPhoneModel.h b/code/sdk/application/wearable/nativeapp/nativeui/include/findphone/FindPhoneModel.h
new file mode 100644 (file)
index 0000000..494c171
--- /dev/null
@@ -0,0 +1,42 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: FindPhoneModel\r
+ * Create: 2025-03-23\r
+ */\r
+\r
+#ifndef FINDPHONE_MODEL_H\r
+#define FINDPHONE_MODEL_H\r
+\r
+#include <sys/time.h>\r
+#include <list>\r
+#include <string>\r
+#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
+\r
+private:\r
+    FindPhoneModel();\r
+    FindPhoneModel(const FindPhoneModel &);\r
+    FindPhoneModel &operator=(const FindPhoneModel &);\r
+    virtual ~FindPhoneModel();\r
+    bool buttonStatus = 0;\r
+};\r
+}\r
+\r
+#endif // FINDPHONE_MODEL_H
\ No newline at end of file
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/include/findphone/FindPhonePresenter.h b/code/sdk/application/wearable/nativeapp/nativeui/include/findphone/FindPhonePresenter.h
new file mode 100644 (file)
index 0000000..6c74c46
--- /dev/null
@@ -0,0 +1,18 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: FindPhonePresenter\r
+ * Create: 2025-03-23\r
+ */\r
+\r
+#ifndef FINDPHONE_PRESENTER_H\r
+#define FINDPHONE_PRESENTER_H\r
+\r
+#include "Presenter.h"\r
+#include "components/ui_view.h"\r
+\r
+namespace OHOS {\r
+class FindPhoneView;\r
+class FindPhonePresenter : public Presenter<FindPhoneView> {};\r
+}\r
+\r
+#endif // FINDPHONE_PRESENTER_H
\ No newline at end of file
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/include/findphone/FindPhoneView.h b/code/sdk/application/wearable/nativeapp/nativeui/include/findphone/FindPhoneView.h
new file mode 100644 (file)
index 0000000..6cb7de1
--- /dev/null
@@ -0,0 +1,20 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: FindPhoneView\r
+ * Create: 2025-03-23\r
+ */\r
+\r
+#ifndef FINDPHONE_VIEW_H\r
+#define FINDPHONE_VIEW_H\r
+\r
+#include "View.h"\r
+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
+class FindPhoneView : public View<FindPhonePresenter> {};\r
+}\r
+#endif // FINDPHONE_VIEW_H\r
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/include/flashlight/FlashLightBlinkPage.h b/code/sdk/application/wearable/nativeapp/nativeui/include/flashlight/FlashLightBlinkPage.h
new file mode 100644 (file)
index 0000000..46f4ef9
--- /dev/null
@@ -0,0 +1,40 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: FlashLightBlinkPage\r
+ * Create: 2025-04-24\r
+ */\r
+\r
+#ifndef FLASHLIGHT_BLINK_PAGE_H\r
+#define FLASHLIGHT_BLINK_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 "flashlight/FlashLightPresenter.h"\r
+#include "components/ui_picker.h"\r
+\r
+namespace OHOS {\r
+class FlashLightBlinkPage : public SlicePage<FlashLightPresenter>,\r
+    public UIView::OnClickListener,\r
+    public UIView::OnDragListener {\r
+public:\r
+    FlashLightBlinkPage(){};\r
+    ~FlashLightBlinkPage();\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
+    FlashLightBlinkPage(const FlashLightBlinkPage &) = delete;\r
+    FlashLightBlinkPage &operator=(const FlashLightBlinkPage &) = delete;\r
+    FlashLightBlinkPage(FlashLightBlinkPage &&) = delete;\r
+    FlashLightBlinkPage &operator=(FlashLightBlinkPage &&) = delete;\r
+\r
+    UIScrollView *container_ = nullptr;\r
+    UILabel *blinkLabel_ = nullptr;\r
+    UIPicker* blinkPicker_ = nullptr;\r
+    UILabelButtonExt* blinkButton_ = nullptr;\r
+};\r
+}  // namespace OHOS\r
+#endif /* FLASHLIGHT_BLINK_PAGE_H */\r
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/include/flashlight/FlashLightColorPage.h b/code/sdk/application/wearable/nativeapp/nativeui/include/flashlight/FlashLightColorPage.h
new file mode 100644 (file)
index 0000000..acbe25c
--- /dev/null
@@ -0,0 +1,46 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: FlashLightColorPage\r
+ * Create: 2025-04-24\r
+ */\r
+\r
+#ifndef FLASHLIGHT_COLOR_PAGE_H\r
+#define FLASHLIGHT_COLOR_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 "flashlight/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
+    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
+    FlashLightColorPage(const FlashLightColorPage &) = delete;\r
+    FlashLightColorPage &operator=(const FlashLightColorPage &) = delete;\r
+    FlashLightColorPage(FlashLightColorPage &&) = delete;\r
+    FlashLightColorPage &operator=(FlashLightColorPage &&) = delete;\r
+\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
+};\r
+}  // namespace OHOS\r
+#endif /* FLASHLIGHT_COLOR_PAGE_H */\r
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/include/flashlight/FlashLightDefaultPage.h b/code/sdk/application/wearable/nativeapp/nativeui/include/flashlight/FlashLightDefaultPage.h
new file mode 100644 (file)
index 0000000..0314434
--- /dev/null
@@ -0,0 +1,39 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: FlashLightDefaultPage\r
+ * Create: 2025-04-24\r
+ */\r
+\r
+#ifndef FLASHLIGHT_DEFAULT_PAGE_H\r
+#define FLASHLIGHT_DEFAULT_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 "flashlight/FlashLightPresenter.h"\r
+\r
+namespace OHOS {\r
+class FlashLightDefaultPage : public SlicePage<FlashLightPresenter>,\r
+    public UIView::OnClickListener,\r
+    public UIView::OnDragListener {\r
+public:\r
+    FlashLightDefaultPage(){};\r
+    ~FlashLightDefaultPage();\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
+    FlashLightDefaultPage(const FlashLightDefaultPage &) = delete;\r
+    FlashLightDefaultPage &operator=(const FlashLightDefaultPage &) = delete;\r
+    FlashLightDefaultPage(FlashLightDefaultPage &&) = delete;\r
+    FlashLightDefaultPage &operator=(FlashLightDefaultPage &&) = 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_DEFAULT_PAGE_H */\r
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/include/flashlight/FlashLightModel.h b/code/sdk/application/wearable/nativeapp/nativeui/include/flashlight/FlashLightModel.h
new file mode 100644 (file)
index 0000000..adf42ce
--- /dev/null
@@ -0,0 +1,73 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: FlashLightModel\r
+ * Create: 2025-04-24\r
+ */\r
+\r
+#ifndef FLASHLIGHT_MODEL_H\r
+#define FLASHLIGHT_MODEL_H\r
+\r
+#include <cstdint>\r
+#include <map>\r
+#include <string>\r
+#include <sys/time.h>\r
+#include "AppViewIDs.h"\r
+#include "UiConfig.h"\r
+#include "flashlight/FlashLightPresenter.h"\r
+#include "flashlight/FlashlightUiResourceImage.h"\r
+#ifndef _WIN32\r
+#include "time64.h"\r
+#endif\r
+namespace OHOS {\r
+enum FlashLightBlinkFrequency { SLOW_BLINK = 0, FAST_BLINK, NOT_BLINK };\r
+\r
+enum FlashLightColorAttribute {\r
+    BLACK_COLOR = 0,\r
+    WHITE_COLOR = 1,\r
+    RED_COLOR = 2,\r
+    ORANGE_COLOR = 3,\r
+    YELLOW_COLOR = 4,\r
+    GREEN_COLOR = 5,\r
+    LIGHT_BLUE_COLOR = 6,\r
+    DARK_BLUE_COLOR = 7,\r
+    PURPLE_COLOR = 8,\r
+    MULTI_COLOR = 9,\r
+};\r
+\r
+class FlashLightModel {\r
+public:\r
+    static FlashLightModel &GetInstance(void);\r
+    // 设置手电筒颜色;\r
+    FlashLightColorAttribute GetViewColor();\r
+    void SetViewColor(FlashLightColorAttribute color);\r
+    // 设置手电筒闪烁频率;\r
+    FlashLightBlinkFrequency GetBlinkFrequency();\r
+    void SetBlinkFrequency(FlashLightBlinkFrequency blinkFrequency);\r
+    // 恢复默认参数;\r
+    void SetDefault();\r
+    // 获取当前时间;\r
+    uint32_t GetSysCurrentTime(std::string &currentTime);\r
+\r
+private:\r
+    FlashLightModel(FlashLightColorAttribute color = FlashLightColorAttribute::WHITE_COLOR,\r
+                    FlashLightBlinkFrequency blinkFrequency = FlashLightBlinkFrequency::NOT_BLINK);\r
+    FlashLightModel(const FlashLightModel &);\r
+    FlashLightModel &operator=(const FlashLightModel &);\r
+    virtual ~FlashLightModel();\r
+\r
+private:\r
+#ifdef _WIN32\r
+    struct timeval sysTime_ {\r
+        0\r
+    };\r
+#else\r
+    struct timeval64 sysTime_ {\r
+        0\r
+    };\r
+#endif\r
+    FlashLightColorAttribute color_;\r
+    FlashLightBlinkFrequency blinkFrequency_;\r
+};\r
+}\r
+\r
+#endif  // FLASHLIGHT_MODEL_H
\ No newline at end of file
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/include/flashlight/FlashLightPage.h b/code/sdk/application/wearable/nativeapp/nativeui/include/flashlight/FlashLightPage.h
new file mode 100644 (file)
index 0000000..629a2e8
--- /dev/null
@@ -0,0 +1,55 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: FlashLightPage\r
+ * Create: 2025-04-24\r
+ */\r
+\r
+#ifndef FLASHLIGHT_PAGE_H\r
+#define FLASHLIGHT_PAGE_H\r
+\r
+#include <string>\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_list.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_image_view.h"\r
+#include "ChangeSliceListener.h"\r
+#include "UiConfig.h"\r
+#include "SlicePage.h"\r
+#include "flashlight/FlashLightPresenter.h"\r
+#include "animator.h"\r
+\r
+namespace OHOS {\r
+class FlashLightPage : public SlicePage<FlashLightPresenter>,\r
+    public UIView::OnClickListener,\r
+    public UIView::OnDragListener {\r
+public:\r
+    FlashLightPage(){};\r
+    ~FlashLightPage();\r
+\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
+    class TimeAnimatorCallback : public AnimatorCallback {\r
+    public:\r
+        TimeAnimatorCallback() {}\r
+        virtual ~TimeAnimatorCallback() override {}\r
+        void Callback(UIView* view) override;\r
+    };\r
+    TimeAnimatorCallback* timeCallback_ = nullptr;\r
+    Animator* timeAnimator_ = nullptr;\r
+    UILabelButton* flashLightOn_ = nullptr;\r
+    UILabel* systemTime_ = nullptr;\r
+    UILabel* OnLabel_ = nullptr;\r
+    UIImageView* imageArrow_ = nullptr;\r
+    UIScrollView *container_ = nullptr;\r
+};\r
+}\r
+#endif  // FLASHLIGHT_PAGE_H\r
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/include/flashlight/FlashLightPlayPage.h b/code/sdk/application/wearable/nativeapp/nativeui/include/flashlight/FlashLightPlayPage.h
new file mode 100644 (file)
index 0000000..b7fc365
--- /dev/null
@@ -0,0 +1,38 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: FlashLightPlayPage\r
+ * Create: 2025-04-24\r
+ */\r
+#ifndef FLASHLIGHT_PLAY_PAGE_H\r
+#define FLASHLIGHT_PLAY_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_image_animator.h"\r
+#include "SlicePage.h"\r
+#include "flashlight/FlashLightPresenter.h"\r
+#include "flashlight/FlashLightModel.h"\r
+\r
+namespace OHOS {\r
+class FlashLightPlayPage : public SlicePage<FlashLightPresenter>,\r
+    public UIView::OnClickListener,\r
+    public UIView::OnDragListener {\r
+public:\r
+    FlashLightPlayPage(){};\r
+    ~FlashLightPlayPage();\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
+    FlashLightPlayPage(const FlashLightPlayPage &) = delete;\r
+    FlashLightPlayPage &operator=(const FlashLightPlayPage &) = delete;\r
+    FlashLightPlayPage(FlashLightPlayPage &&) = delete;\r
+    FlashLightPlayPage &operator=(FlashLightPlayPage &&) = delete;\r
+\r
+    UIScrollView *container_ = nullptr;\r
+    UIImageAnimatorView *playImageAnimal = nullptr;\r
+    ImageAnimatorInfo playImageInfo[2];\r
+};\r
+}  // namespace OHOS\r
+#endif /* FLASHLIGHT_PLAY_PAGE_H */\r
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/include/flashlight/FlashLightPresenter.h b/code/sdk/application/wearable/nativeapp/nativeui/include/flashlight/FlashLightPresenter.h
new file mode 100644 (file)
index 0000000..3f356de
--- /dev/null
@@ -0,0 +1,18 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: FlashLightPresenter\r
+ * Create: 2025-04-24\r
+ */\r
+\r
+#ifndef FLASHLIGHT_PRESENTER_H\r
+#define FLASHLIGHT_PRESENTER_H\r
+\r
+#include "Presenter.h"\r
+\r
+namespace OHOS {\r
+\r
+class FlashLightView;\r
+class FlashLightPresenter : public Presenter<FlashLightView> {};\r
+}\r
+\r
+#endif  // FLASHLIGHT_PRESENTER_H
\ No newline at end of file
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/include/flashlight/FlashLightSetItemAdapter.h b/code/sdk/application/wearable/nativeapp/nativeui/include/flashlight/FlashLightSetItemAdapter.h
new file mode 100644 (file)
index 0000000..9aeb158
--- /dev/null
@@ -0,0 +1,54 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: FlashLightSetItemAdapter\r
+ * Create: 2025-11-23\r
+ */\r
+\r
+#ifndef FLASHLIGHTSET_ITEM_ADAPTER_H\r
+#define FLASHLIGHTSET_ITEM_ADAPTER_H\r
+\r
+#include "flashlight/FlashLightSetItemAdapter.h"\r
+#include "flashlight/FlashLightSetItemView.h"\r
+#include "components/abstract_adapter.h"\r
+#include "gfx_utils/vector.h"\r
+\r
+namespace OHOS {\r
+\r
+class FlashLightSetItemAdapter : public AbstractAdapter {\r
+public:\r
+    explicit FlashLightSetItemAdapter();\r
+    ~FlashLightSetItemAdapter() override;\r
+\r
+    /* *\r
+    * @brief Sets the UIView adapter data, which is a SettingItem linked list.\r
+    *\r
+    * @param data Indicates the SettingItem linked list data.\r
+    * @since 1.0\r
+    * @version 1.0\r
+    */\r
+    void SetData(const Graphic::Vector<FlashLightSetItem> &data);\r
+\r
+    /* *\r
+    * @brief Obtains the <b>data</b> size of the UILabel adapter.\r
+    *\r
+    * @return Returns the <b>data</b> size of the UILabel adapter.\r
+    * @since 1.0\r
+    * @version 1.0\r
+    */\r
+    uint16_t GetCount(void) override;\r
+\r
+    UIView *GetView(UIView *inView, int16_t index) override;\r
+\r
+    void AddListItem(const FlashLightSetItem &item);\r
+\r
+    void SetItemClickListener(UIView::OnClickListener *itemclicklistener)\r
+    {\r
+        itemClickListener = itemclicklistener;\r
+    }\r
+private:\r
+    Graphic::Vector<FlashLightSetItem> itemDatas_;\r
+    UIView::OnClickListener *itemClickListener{nullptr};\r
+};\r
+}\r
+\r
+#endif   // FLASHLIGHTSET_ITEM_ADAPTER_H
\ No newline at end of file
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/include/flashlight/FlashLightSetItemView.h b/code/sdk/application/wearable/nativeapp/nativeui/include/flashlight/FlashLightSetItemView.h
new file mode 100644 (file)
index 0000000..1704f88
--- /dev/null
@@ -0,0 +1,38 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: FlashLightSetItemView\r
+ * Create: 2025-05-18\r
+ */\r
+\r
+#ifndef FLASHLIGHTSET_ITEM_VIEW_H\r
+#define FLASHLIGHTSET_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 item;\r
+    uint32_t resId;\r
+    std::string label;\r
+    std::string itemLabel;\r
+    std::string viewId;\r
+} FlashLightSetItem;\r
+\r
+class FlashLightSetItemView : public UIViewGroup {\r
+public:\r
+    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
+};\r
+}\r
+#endif  // FLASHLIGHTSET_ITEM_VIEW_H
\ No newline at end of file
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/include/flashlight/FlashLightSetPage.h b/code/sdk/application/wearable/nativeapp/nativeui/include/flashlight/FlashLightSetPage.h
new file mode 100644 (file)
index 0000000..d1f1b06
--- /dev/null
@@ -0,0 +1,49 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: FlashLightSetPage\r
+ * Create: 2025-04-24\r
+ */\r
+\r
+#ifndef FLASHLIGHT_SET_PAGE_H\r
+#define FLASHLIGHT_SET_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 "components/ui_list.h"\r
+#include "SlicePage.h"\r
+#include "flashlight/FlashLightPresenter.h"\r
+#include "flashlight/FlashLightSetItemAdapter.h"\r
+#include "flashlight/FlashLightSetItemView.h"\r
+#include "UiConfig.h"\r
+#include "main/LoadImg.h"\r
+#include "flashlight/FlashlightUiResourceImage.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
+    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
+    FlashLightSetPage(const FlashLightSetPage &) = delete;\r
+    FlashLightSetPage &operator=(const FlashLightSetPage &) = delete;\r
+    FlashLightSetPage(FlashLightSetPage &&) = delete;\r
+    FlashLightSetPage &operator=(FlashLightSetPage &&) = delete;\r
+\r
+    UIScrollView *container_ = nullptr;\r
+    UILabel *setLabel_ = 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
+};\r
+}  // namespace OHOS\r
+#endif /* FLASHLIGHT_SET_PAGE_H */\r
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/include/flashlight/FlashLightView.h b/code/sdk/application/wearable/nativeapp/nativeui/include/flashlight/FlashLightView.h
new file mode 100644 (file)
index 0000000..463a94e
--- /dev/null
@@ -0,0 +1,25 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: FlashLightView\r
+ * Create: 2025-04-24\r
+ */\r
+\r
+#ifndef FLASHLIGHT_VIEW_H\r
+#define FLASHLIGHT_VIEW_H\r
+#include "View.h"\r
+namespace OHOS {\r
+\r
+enum FlashLightAllView {\r
+    FLASH_LIGTH_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_ALL_VIEW,\r
+};\r
+\r
+class FlashLightPresenter;\r
+class FlashLightView : public View<FlashLightPresenter> {};\r
+}\r
+#endif  // FLASHLIGHT_VIEW_H\r
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/include/flashlight/FlashlightUiResourceImage.h b/code/sdk/application/wearable/nativeapp/nativeui/include/flashlight/FlashlightUiResourceImage.h
new file mode 100644 (file)
index 0000000..50238d3
--- /dev/null
@@ -0,0 +1,49 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: FlashlightUiResourceImage\r
+ * Create: 2025-04-24\r
+ */\r
+\r
+#ifndef FLASHLIGHT_UI_RESOURCE_IMAGE_H\r
+#define FLASHLIGHT_UI_RESOURCE_IMAGE_H\r
+#include <cstdint>\r
+namespace OHOS {\r
+static const int IMAGE_CONVERTER_TOOL_BLINKBUTTON = 0x100001;\r
+static const int IMAGE_CONVERTER_TOOL_BLINKITEM = 0x100002;\r
+static const int IMAGE_CONVERTER_TOOL_COLOR1BUTTON = 0x100003;\r
+static const int IMAGE_CONVERTER_TOOL_COLOR1PRESSBUTTON = 0x100004;\r
+static const int IMAGE_CONVERTER_TOOL_COLOR2BUTTON = 0x100005;\r
+static const int IMAGE_CONVERTER_TOOL_COLOR2PRESSBUTTON = 0x100006;\r
+static const int IMAGE_CONVERTER_TOOL_COLOR3BUTTON = 0x100007;\r
+static const int IMAGE_CONVERTER_TOOL_COLOR3PRESSBUTTON = 0x100008;\r
+static const int IMAGE_CONVERTER_TOOL_COLOR4BUTTON = 0x100009;\r
+static const int IMAGE_CONVERTER_TOOL_COLOR4PRESSBUTTON = 0x10000a;\r
+static const int IMAGE_CONVERTER_TOOL_COLOR5BUTTON = 0x10000b;\r
+static const int IMAGE_CONVERTER_TOOL_COLOR5PRESSBUTTON = 0x10000c;\r
+static const int IMAGE_CONVERTER_TOOL_COLOR6BUTTON = 0x10000d;\r
+static const int IMAGE_CONVERTER_TOOL_COLOR6PRESSBUTTON = 0x10000e;\r
+static const int IMAGE_CONVERTER_TOOL_COLOR7BUTTON = 0x10000f;\r
+static const int IMAGE_CONVERTER_TOOL_COLOR7PRESSBUTTON = 0x100010;\r
+static const int IMAGE_CONVERTER_TOOL_COLOR8BUTTON = 0x100011;\r
+static const int IMAGE_CONVERTER_TOOL_COLOR8PRESSBUTTON = 0x100012;\r
+static const int IMAGE_CONVERTER_TOOL_COLOR9BUTTON = 0x100013;\r
+static const int IMAGE_CONVERTER_TOOL_COLOR9PRESSBUTTON = 0x100014;\r
+static const int IMAGE_CONVERTER_TOOL_COLORITEM = 0x100015;\r
+static const int IMAGE_CONVERTER_TOOL_DOWNARROW = 0x100016;\r
+static const int IMAGE_CONVERTER_TOOL_FLASHLIGHTON = 0x100017;\r
+static const int IMAGE_CONVERTER_TOOL_PLAY1PAGE = 0x100018;\r
+static const int IMAGE_CONVERTER_TOOL_PLAY2PAGE = 0x100019;\r
+static const int IMAGE_CONVERTER_TOOL_PLAY3PAGE = 0x10001a;\r
+static const int IMAGE_CONVERTER_TOOL_PLAY4PAGE = 0x10001b;\r
+static const int IMAGE_CONVERTER_TOOL_PLAY5PAGE = 0x10001c;\r
+static const int IMAGE_CONVERTER_TOOL_PLAY6PAGE = 0x10001d;\r
+static const int IMAGE_CONVERTER_TOOL_PLAY7PAGE = 0x10001e;\r
+static const int IMAGE_CONVERTER_TOOL_PLAY8PAGE = 0x10001f;\r
+static const int IMAGE_CONVERTER_TOOL_PLAY9PAGE = 0x100020;\r
+static const int IMAGE_CONVERTER_TOOL_PLAYBLACKPAGE = 0x100021;\r
+static const int IMAGE_CONVERTER_TOOL_RECOVERBUTTON = 0x100022;\r
+static const int IMAGE_CONVERTER_TOOL_RECOVERCANCLE = 0x100023;\r
+static const int IMAGE_CONVERTER_TOOL_RECOVERCONFIRM = 0x100024;\r
+static const int IMAGE_CONVERTER_TOOL_RIGHTARROW = 0x100025;\r
+}  // OHOS\r
+#endif  // FLASHLIGHT_UI_RESOURCE_IMAGE_H\r
@@ -8,11 +8,11 @@
 #define INDOORWALK_MOTION_VIEW_H\r
 \r
 #include "View.h"\r
-#include "MotionPageFirst.h"\r
-#include "MotionPageSecond.h"\r
-#include "MotionPageThird.h"\r
-#include "MotionPageFourth.h"\r
-#include "MotionPageFifth.h"\r
+#include "indoorwalk/MotionPageFirst.h"\r
+#include "indoorwalk/MotionPageSecond.h"\r
+#include "indoorwalk/MotionPageThird.h"\r
+#include "indoorwalk/MotionPageFourth.h"\r
+#include "indoorwalk/MotionPageFifth.h"\r
 #include "components/ui_swipe_view.h"\r
 \r
 namespace OHOS {\r
@@ -7,12 +7,12 @@
 #ifndef INDOORWALK_VIEW_H\r
 #define INDOORWALK_VIEW_H\r
 \r
-#include "IndoorWalkEndView.h"\r
+#include "indoorwalk/IndoorWalkEndView.h"\r
 #include "View.h"\r
-#include "IndoorWalkPresenter.h"\r
-#include "IndoorWalkPreparedView.h"\r
-#include "CustomizationView.h"\r
-#include "IndoorWalkMotionView.h"\r
+#include "indoorwalk/IndoorWalkPresenter.h"\r
+#include "indoorwalk/IndoorWalkPreparedView.h"\r
+#include "indoorwalk/CustomizationView.h"\r
+#include "indoorwalk/IndoorWalkMotionView.h"\r
 #include "components/ui_view_group.h"\r
 \r
 namespace OHOS {\r
@@ -12,7 +12,7 @@
 #include "ohos_types.h"\r
 #include "components/ui_label.h"\r
 #include "components/ui_image_view.h"\r
-#include "AppGroupView.h"\r
+#include "main/AppGroupView.h"\r
 \r
 namespace OHOS {\r
 class MotionPageFifth : public AppGroupView {\r
@@ -12,7 +12,7 @@
 #include "ohos_types.h"\r
 #include "components/ui_label.h"\r
 #include "components/ui_image_view.h"\r
-#include "AppGroupView.h"\r
+#include "main/AppGroupView.h"\r
 \r
 namespace OHOS {\r
 class MotionPageFirst : public AppGroupView {\r
@@ -12,7 +12,7 @@
 #include "ohos_types.h"\r
 #include "components/ui_label.h"\r
 #include "components/ui_image_view.h"\r
-#include "AppGroupView.h"\r
+#include "main/AppGroupView.h"\r
 \r
 namespace OHOS {\r
 class MotionPageFourth : public AppGroupView {\r
@@ -12,7 +12,7 @@
 #include "ohos_types.h"\r
 #include "components/ui_label.h"\r
 #include "components/ui_image_view.h"\r
-#include "AppGroupView.h"\r
+#include "main/AppGroupView.h"\r
 \r
 namespace OHOS {\r
 class MotionPageSecond : public AppGroupView {\r
@@ -12,7 +12,7 @@
 #include "ohos_types.h"\r
 #include "components/ui_label.h"\r
 #include "components/ui_image_view.h"\r
-#include "AppGroupView.h"\r
+#include "main/AppGroupView.h"\r
 \r
 namespace OHOS {\r
 class MotionPageThird : public AppGroupView {\r
  */\r
 #ifndef GRAPHIC_LITE_DIAL_BIN_PARSER_H\r
 #define GRAPHIC_LITE_DIAL_BIN_PARSER_H\r
-#include "DialBinParserManager.h"\r
-#include "DialBinTypesV2.h"\r
+#include "main/DialBinParserManager.h"\r
+#include "main/DialBinTypesV2.h"\r
 #include "components/ui_abstract_progress.h"\r
 \r
 namespace OHOS {\r
 class DialBinParser : public DialBinParserInterface {\r
 public:\r
     bool UpdateDial(const std::string& file, FILE* fp, DialViewGroup* group, DisplayState state) override;\r
-    bool GetDialPreviewInfo(FILE* fp, DialPreviewInfo* info) override;\r
+    bool GetDialPreviewInfo(const std::string& file, FILE* fp, DialPreviewInfo* info) override;\r
     DialBinParser();\r
     ~DialBinParser() override;\r
 \r
 #include <iostream>
 #include <cstring>
 #include "graphic_types.h"
-#include "DialViewGroup.h"
-#include "DialBinTypes.h"
+#include "main/dial/DialViewGroup.h"
+#include "main/DialBinTypes.h"
 
 namespace OHOS {
 class DialBinParserInterface {
 public:
     virtual bool UpdateDial(const std::string& file, FILE* fp, DialViewGroup* group, DisplayState state) = 0;
-    virtual bool GetDialPreviewInfo(FILE* fp, DialPreviewInfo* info) = 0;
+    virtual bool GetDialPreviewInfo(const std::string& file, FILE* fp, DialPreviewInfo* info) = 0;
+    virtual void SetEncryptData(uint8_t *data, uint32_t len) {}
     virtual ~DialBinParserInterface() {}
 }; // class DialBinParserInterface
 
@@ -25,7 +26,7 @@ class DialBinParserManager {
 public:
     static DialBinParserManager *GetInstance(void);
     bool UpdateDial(const std::string &file, FILE *fp, DialViewGroup *group, DisplayState state);
-    bool GetDialPreviewInfo(FILE *fp, DialPreviewInfo *info);
+    bool GetDialPreviewInfo(const std::string& file, FILE *fp, DialPreviewInfo *info, bool isNeedVerify = false);
     bool RegisterParser(const std::string &version, DialBinParserInterface *parser);
 
     uint8_t GetSupportVersionCnt() const
@@ -46,6 +47,7 @@ private:
     DialBinParserManager();
     virtual ~DialBinParserManager();
     DialBinParserInterface *GetParser(FILE* fp) const;
+    DialBinParserInterface *GetParser(const std::string &fileName, FILE *fp, bool isNeedVerify = false) const;
     static constexpr uint8_t PARSER_MAX_NUM = 8;
     struct Pair {
         std::string version;
@@ -7,12 +7,12 @@
 
 #ifndef GRAPHIC_LITE_DIAL_BIN_PARSER_V3_H
 #define GRAPHIC_LITE_DIAL_BIN_PARSER_V3_H
-#include "DialBinParserManager.h"
-#include "DialModelTime.h"
+#include "main/DialBinParserManager.h"
+#include "main/dial/DialModelTime.h"
 #include "components/ui_abstract_progress.h"
-#include "DialViewContainer.h"
-#include "DialDataType.h"
-#include "DialOHSliceId.h"
+#include "main/dial/DialViewContainer.h"
+#include "main/dial/DialDataType.h"
+#include "main/dial/DialOHSliceId.h"
 
 namespace OHOS {
 class DialBinParserV3 : public DialBinParserInterface {
@@ -20,7 +20,8 @@ public:
     DialBinParserV3();
     ~DialBinParserV3() override;
     bool UpdateDial(const std::string& file, FILE* fp, DialViewGroup* group, DisplayState state) override;
-    bool GetDialPreviewInfo(FILE* fp, DialPreviewInfo* info) override;
+    bool GetDialPreviewInfo(const std::string& file, FILE* fp, DialPreviewInfo* info) override;
+    void SetEncryptData(uint8_t *data, uint32_t len) override final;
 
 protected:
     bool ParseDialHeader(FILE* file);
@@ -58,12 +59,16 @@ private:
     bool ParseViewType(uint8_t *viewType, uint8_t dialViewCount, FILE *file);
     bool ParseContainerSubviews(DialViewContainer *container, uint8_t num);
     bool ParseOptionsSubviews(ContainerInterface &parent);
+    DialHeader *GetHeader(FILE *fp);
+    uint8_t *GetVeiwType(FILE *fp, DialHeader *dialHeader);
 
     DialViewGroup* dialGroup_ = nullptr;
     std::string file_;
     const uint32_t dirId_ = 0xfef << 20; // 20: offset
     uint32_t imageOffset_ = 0;
     DisplayState state_ = DisplayState::NORMAL;
+    uint8_t *encryptedData_ = nullptr;
+    uint32_t encrpytedLen_ = 0;
 }; // class DialBinParserV3
 } // namespace OHOS
 
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/include/main/LoadImg.h b/code/sdk/application/wearable/nativeapp/nativeui/include/main/LoadImg.h
new file mode 100644 (file)
index 0000000..b92e242
--- /dev/null
@@ -0,0 +1,23 @@
+/*\r
+ * Copyright (c) CompanyNameMagicTag 2025-2025. All rights reserved.\r
+ * Description: LoadImg\r
+ * Create: 2025-06-05\r
+ */\r
+#ifndef LOAD_IMG_H\r
+#define LOAD_IMG_H\r
+\r
+#include <string>\r
+#include "wearable_log.h"\r
+#include "components/ui_button.h"\r
+#include "components/ui_image_view.h"\r
+#include "common/image_cache_manager.h"\r
+\r
+namespace OHOS {\r
+namespace LOADIMG {\r
+// 加载图片资源\r
+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
+}\r
+#endif  // LOAD_IMG_H
\ No newline at end of file
@@ -9,17 +9,17 @@
 #define MAIN_PRESENTER_SAMPLE_H
 
 #include "Presenter.h"
-#include "ModelListenerSample.h"
+#include "main/ModelListenerSample.h"
 #include "components/root_view.h"
 #include "drag_event.h"
-#include "MainViewSample.h"
-#include "MainModel.h"
+#include "main/MainViewSample.h"
+#include "main/MainModel.h"
 #include "components/ui_swipe_view.h"
 #include "components/ui_view.h"
-#include "MainCompassView.h"
-#include "MainCompassPresenter.h"
-#include "PlayersView.h"
-#include "HeartRateView.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 {
@@ -45,7 +45,7 @@ enum class MainPresenterState {
 class MainViewSample;
 class MainPresenterSample : public Presenter<MainViewSample>, public ModelListenerSample,
                             public UIView::OnClickListener, public UISwipeView::OnSwipeListener,
-                            public UIView::OnLongPressListener, public UISwipeView, public CompassPresenter {
+                            public UIView::OnLongPressListener, public UISwipeView {
 public:
     MainPresenterSample();
     ~MainPresenterSample() override;
@@ -75,7 +75,6 @@ public:
 private:
     void ProcessDataNotify(void);
     void SetCircleProgress(void);
-    void SetCompassRotate(void);
     uint8_t state_ = UICheckBox::UICheckBoxState::MAX_STATUS_NUM;
     int64_t playerCurrentTime_{0};
     int64_t playerMusicDuration_{0};
 #include "ChangeSliceListener.h"
 #include "font/ui_font.h"
 #include "graphic_config.h"
-#include "ModelListenerSample.h"
-#include "ScreenModels.h"
-#include "ActivityWeekView.h"
-#include "CompassControlView.h"
-#include "DialViewGroup.h"
-#include "MainClockView.h"
-#include "PlayersView.h"
-#include "MainPresenterSample.h"
-#include "HeartRateView.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 "PullUpDownView.h"
+#include "main/PullUpDownView.h"
 #include "components/ui_cross_view.h"
-#include "SetCardModel.h"
-#include "VideoCard.h"
+#include "set_card/SetCardModel.h"
+#include "videocard/VideoCard.h"
 
 namespace OHOS {
 class MainPresenterSample;
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/include/main/MessageAdapter.h b/code/sdk/application/wearable/nativeapp/nativeui/include/main/MessageAdapter.h
new file mode 100644 (file)
index 0000000..a3e52fe
--- /dev/null
@@ -0,0 +1,66 @@
+/*\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: MessageAdapter.h\r
+ * Author:\r
+ * Create: 2021-11-23\r
+ */\r
+\r
+#ifndef MESSAGE_ADAPTER_H\r
+#define MESSAGE_ADAPTER_H\r
+\r
+#include <list>\r
+#include <string>\r
+#include "components/ui_list.h"\r
+#include "components/ui_label.h"\r
+#include "components/ui_view_group.h"\r
+#include "components/ui_image_view.h"\r
+#include "components/abstract_adapter.h"\r
+#include "wearable_log.h"\r
+#include "UiConfig.h"\r
+#include "main/MainModel.h"\r
+#include "main/MessageItemView.h"\r
+\r
+namespace OHOS {\r
+class MessageAdapter : public AbstractAdapter {\r
+public:\r
+    explicit MessageAdapter();\r
+    ~MessageAdapter() override;\r
+\r
+    /* *\r
+    * @brief Sets the UIView adapter data, which is a WeatherItem linked list.\r
+    *\r
+    * @param data Indicates the MessageItem linked list data.\r
+    * @since 1.0\r
+    * @version 1.0\r
+    */\r
+    void SetData(std::list<MessageItem> &data);\r
+\r
+    /* *\r
+    * @brief Obtains the <b>data</b> size of the UILabel adapter.\r
+    *\r
+    * @return Returns the <b>data</b> size of the UILabel adapter.\r
+    * @since 1.0\r
+    * @version 1.0\r
+    */\r
+    uint16_t GetCount(void) override;\r
+\r
+    UIView *GetView(UIView *inView, int16_t index) override;\r
+\r
+    void AddListItem(const MessageItem &item);\r
+\r
+    void ClearListItem();\r
+\r
+    void SetItemClickListener(UIView::OnClickListener *itemclicklistener)\r
+    {\r
+        itemClickListener = itemclicklistener;\r
+    }\r
+private:\r
+    std::list<MessageItem> listData;\r
+    UIView::OnClickListener *itemClickListener{nullptr};\r
+};\r
+}\r
+\r
+#endif
\ No newline at end of file
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/include/main/MessageItemView.h b/code/sdk/application/wearable/nativeapp/nativeui/include/main/MessageItemView.h
new file mode 100644 (file)
index 0000000..73ec20a
--- /dev/null
@@ -0,0 +1,40 @@
+/*\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
+ */\r
+\r
+#ifndef MESSAGE_ITEM_VIEW_H\r
+#define MESSAGE_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 "components/ui_canvas.h"\r
+\r
+#include "UiConfig.h"\r
+#include "main/MessageModel.h"\r
+\r
+namespace OHOS {\r
+class MessageItemView : public UIViewGroup {\r
+public:\r
+    explicit MessageItemView();\r
+    ~MessageItemView() override;\r
+    virtual void SetItemInfo(const MessageItem itemInfo);\r
+    virtual void SetUpChild();\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
+};\r
+}\r
+\r
+#endif\r
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/include/main/MessageMainView.h b/code/sdk/application/wearable/nativeapp/nativeui/include/main/MessageMainView.h
new file mode 100644 (file)
index 0000000..79b049a
--- /dev/null
@@ -0,0 +1,54 @@
+/*\r
+ * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved.\r
+ * Description: WeekStep\r
+ * Author:\r
+ * Create: 2021-09-11\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 "main/MessageModel.h"\r
+#include "main/MessageAdapter.h"\r
+\r
+namespace OHOS {\r
+class MessageMainView : public UICardPage {\r
+public:\r
+    MessageMainView();\r
+    ~MessageMainView() override;\r
+    static MessageMainView *GetInstance(void);\r
+    bool InitView();\r
+    void PreLoad(void) override;\r
+    void VerticalViewInits(void);\r
+    void ConfirmDeletion(void);\r
+    void CancelDeletion(void);\r
+    void ShowMessageList(void);\r
+    void DeletionView(void);\r
+    void NoNotify(void);\r
+    void NewNotify(void);\r
+    void RefreshMessageList(std::vector<MessageItem> item);\r
+    bool InitScrollData();\r
+    MessageAdapter *listAdapter{nullptr};\r
+    UIList *contentList{nullptr}; // 列表\r
+private:\r
+    UILabel *messageLables{nullptr}; // 无消息\r
+    UILabel *messageLable{nullptr}; // 通知\r
+    UILabel *deletereminder{nullptr}; // 是否删除通知?\r
+    UILabelButton *confirm{nullptr}; // 确认\r
+    UILabelButton *cancel{nullptr}; // 取消\r
+    UIImageView *notice{nullptr}; // 删除图标\r
+    UIView::OnClickListener *clickListener{nullptr};\r
+    UIView::OnClickListener *confirmListener{nullptr};\r
+    UIView::OnClickListener *cancelListener{nullptr};\r
+    UIView::OnClickListener *notifyListener{nullptr};\r
+    UIView::OnClickListener *newNotifyListener{nullptr};\r
+};\r
+}\r
+#endif\r
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/include/main/MessageModel.h b/code/sdk/application/wearable/nativeapp/nativeui/include/main/MessageModel.h
new file mode 100644 (file)
index 0000000..fd24ca3
--- /dev/null
@@ -0,0 +1,44 @@
+/*\r
+ * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved.\r
+ * Description: MainModel.h\r
+ * Author:\r
+ * Create: 2021-11-23\r
+ */\r
+\r
+#ifndef MESSAGE_MODEL_H\r
+#define MESSAGE_MODEL_H\r
+\r
+#include <string>\r
+#include <vector>\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
+} 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 ClearListItem();\r
+        void GetMessageInfo(std::string app, std::string contact, std::string information);\r
+        void SetViewStatus(bool viewStatus);\r
+        bool GetViewStatus(void);\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
+    };\r
+}\r
+\r
+#endif
\ No newline at end of file
@@ -11,8 +11,8 @@
 #include "components/ui_label_button.h"
 #include "components/ui_view_group.h"
 #include "components/ui_slider.h"
-#include "VolumeSettingView.h"
-#include "PlayersView.h"
+#include "main/VolumeSettingView.h"
+#include "player/PlayersView.h"
 
 namespace OHOS {
 #define INCREASE_BUTTON "increaseButton"
@@ -11,9 +11,9 @@
 #include "components/ui_button.h"\r
 #include "components/ui_view_group.h"\r
 #include "components/ui_slider.h"\r
-#include "PlayersView.h"\r
+#include "player/PlayersView.h"\r
 #include "wearable_log.h"\r
-#include "VolumeSettingPresenter.h"\r
+#include "main/VolumeSettingPresenter.h"\r
 \r
 namespace OHOS {\r
 #define VOLUME_MIN 0\r
@@ -5,7 +5,7 @@
 #ifndef DIAL_ARC_PROGRESS_VIEW_H
 #define DIAL_ARC_PROGRESS_VIEW_H
 
-#include "DialView.h"
+#include "main/dial/DialView.h"
 #include "components/ui_circle_progress.h"
 
 namespace OHOS {
@@ -14,6 +14,7 @@ public:
     DialArcProgressView();
     ~DialArcProgressView() override;
     void HandleFloatData(float data) override;
+    void OnDraw(BufferInfo& gfxDstBuffer, const Rect& invalidatedArea) override;
 private:
     int32_t value_ = -1;
 };
@@ -5,7 +5,7 @@
 #ifndef DIAL_BOX_PROGRESS_VIEW_H
 #define DIAL_BOX_PROGRESS_VIEW_H
 
-#include "DialView.h"
+#include "main/dial/DialView.h"
 #include "components/ui_box_progress.h"
 
 namespace OHOS {
@@ -14,6 +14,7 @@ public:
     DialBoxProgressView();
     ~DialBoxProgressView() override;
     void HandleFloatData(float data) override;
+    void OnDraw(BufferInfo& gfxDstBuffer, const Rect& invalidatedArea) override;
 private:
     int32_t value_ = -1;
 };
@@ -6,8 +6,8 @@
 #define DIAL_DIGITAL_IMG_VIEW_H
 
 #include <cstdint>
-#include "DialView.h"
-#include "DialModelTime.h"
+#include "main/dial/DialView.h"
+#include "main/dial/DialModelTime.h"
 #include "components/ui_image_view.h"
 #include "gfx_utils/graphic_math.h"
 #include "components/ui_view_group.h"
@@ -6,8 +6,8 @@
 #define DIAL_OPTION_IMG_VIEW_H
 
 #include <cstdint>
-#include "DialView.h"
-#include "DialModelTime.h"
+#include "main/dial/DialView.h"
+#include "main/dial/DialModelTime.h"
 #include "components/ui_image_view.h"
 #include "font/font_global_manager.h"
 
@@ -9,8 +9,8 @@
 #define DIAL_VIEW_CONTAINER_H
 #include "components/ui_view_group.h"
 #include "gfx_utils/list.h"
-#include "dial/DialView.h"
-#include "dial/DialDataBase.h"
+#include "main/dial/DialView.h"
+#include "main/dial/DialDataBase.h"
 
 namespace OHOS {
 class ContainerInterface {
@@ -7,19 +7,19 @@
 
 #include <unordered_map>
 #include <memory>
-#include "DialDataBase.h"
+#include "main/dial/DialDataBase.h"
 #include "components/ui_view_group.h"
 #include "components/ui_image_animator.h"
 #include "components/ui_label.h"
-#include "OnDialDataUpdateListener.h"
+#include "main/dial/OnDialDataUpdateListener.h"
 #include "components/ui_card_page.h"
 #include "components/ui_kaleidoscope_view.h"
 #include "gfx_utils/list.h"
 #include "gfx_utils/vector.h"
-#include "DialView.h"
-#include "DialVideoView.h"
-#include "DialBinTypesV2.h"
-#include "DialViewContainer.h"
+#include "main/dial/DialView.h"
+#include "main/dial/DialVideoView.h"
+#include "main/DialBinTypesV2.h"
+#include "main/dial/DialViewContainer.h"
 
 namespace OHOS {
 class DialViewGroup : public UICardPage, public OnDialDataUpdateListener, public ContainerInterface {
@@ -9,9 +9,9 @@
 #define MODE_DIAL_DATA_FACTORY
 
 #include <unordered_map>
-#include "DialBaseModel.h"
-#include "DialDataBase.h"
-#include "ModelDialDataFactory.h"
+#include "main/dial/DialBaseModel.h"
+#include "main/dial/DialDataBase.h"
+#include "main/dial/ModelDialDataFactory.h"
 
 namespace OHOS {
 class ModelDialDataFactory : public HeapBase {
@@ -8,8 +8,8 @@
 #ifndef REGISTER_DIAL_MODEL_H
 #define REGISTER_DIAL_MODEL_H
 
-#include "DialDataBase.h"
-#include "ModelDialDataFactory.h"
+#include "main/dial/DialDataBase.h"
+#include "main/dial/ModelDialDataFactory.h"
 namespace OHOS {
 class RegisterDialModel {
 public:
@@ -16,12 +16,22 @@ extern "C" {
 
 /**
  * @brief Get all watch face information
- * @param[out] info Pointer to store the watch face information
- * @param[out] num Pointer to store the number of watch faces
- * @param[in] maxCnt Maximum number of watch faces to retrieve
- * @return bool Returns true if successful, false otherwise
+ * @param [out] watch_dial_info **info
+ *         A pointer to a pointer where the retrieved watch face information will be stored.
+ * @param [out] uint8_t *num
+ *         A pointer to the number of watch face information entries retrieved.
+ * @return bool
+ *         - true: Successfully retrieved watch face information.
+ *           The pointer pointed to by `info` needs to be released
+ * externally.
+ *         - false: Failed to retrieve watch face information.
+ * @remarks
+ *          - If the function returns true,
+ *            the memory pointed to by `info` must be freed by the caller to prevent
+ * memory leaks.
+ *          - If the function returns false, the values of `info` and `num` remain unchanged.
  */
-bool GetAllWatchFaceInfo(watch_dial_info *info, uint8_t *num, uint8_t maxCnt);
+bool GetAllWatchFaceInfo(watch_dial_info **info, uint8_t *num);
 
 /**
  * @brief Get information of a specific watch face by UUID
@@ -68,15 +78,20 @@ bool SetCurrentWatchFace(uint32_t uuid);
 bool UninstallWatch(uint32_t uuid);
 
 /**
- * @brief Install a watch face from a specified path
- * @param[in] path Path to the watch face file
- * @param[out] uuid Pointer to store the unique identifier of the installed watch face
- * @return bool Returns true if successful, false otherwise
- * @note If a watch face with the same UUID already exists, it will be replaced
+ * @brief Retrieves the unique identifier (UUID) associated with a specified path.
+ *
+ * @param[in] path The path to look up.
+ * @param[out] uuid A pointer to a variable where the UUID will be stored if found.
+ *
+ * @return bool
+ *         - true if the UUID is successfully retrieved.
+ *         - false if the path is invalid or the UUID cannot be obtained.
+ *
+ * @remarks The caller is responsible for ensuring that the 'uuid' pointer is valid and properly aligned.
  */
-bool InstallWatch(const char *path, uint32_t *uuid);
+bool GetUuidByPath(const char *path, uint32_t *uuid);
 
 #ifdef __cplusplus
 }
 #endif
-#endif // WATCH_INTERFACE_H
\ No newline at end of file
+#endif  // WATCH_INTERFACE_H
\ No newline at end of file
@@ -9,9 +9,9 @@
 \r
 #include "Presenter.h"\r
 #include "ohos_types.h"\r
-#include "CallerLogModel.h"\r
-#include "VolumeSettingView.h"\r
-#include "VolumeSettingPresenter.h"\r
+#include "callerlog/CallerLogModel.h"\r
+#include "main/VolumeSettingView.h"\r
+#include "main/VolumeSettingPresenter.h"\r
 \r
 namespace OHOS {\r
 class MainCallingView;\r
 #include "View.h"\r
 #include "components/ui_view_group.h"\r
 #include "ohos_types.h"\r
-#include "CallerDisplayView.h"\r
-#include "CallingView.h"\r
-#include "DialingScreenView.h"\r
-#include "WaitingHintsView.h"\r
+#include "makephone/CallerDisplayView.h"\r
+#include "makephone/CallingView.h"\r
+#include "makephone/DialingScreenView.h"\r
+#include "makephone/WaitingHintsView.h"\r
 \r
 namespace OHOS {\r
 class MainCallingPresenter;\r
@@ -8,8 +8,8 @@
 #define MAIN_VOCASSIST_VIEW_H\r
 \r
 #include "View.h"\r
-#include "VocassistModel.h"\r
-#include "VocassistView.h"\r
+#include "offlinevoice/VocassistModel.h"\r
+#include "offlinevoice/VocassistView.h"\r
 \r
 namespace OHOS {\r
 class VocassistPresenter;\r
@@ -10,8 +10,8 @@
 \r
 #include "Presenter.h"\r
 #include "NativeAbility.h"\r
-#include "VocassistView.h"\r
-#include "MainVocassistView.h"\r
+#include "offlinevoice/VocassistView.h"\r
+#include "offlinevoice/MainVocassistView.h"\r
 \r
 namespace OHOS {\r
 class MainVocassistView;\r
@@ -15,7 +15,7 @@
 #include "UiConfig.h"\r
 #include "dfx/event_injector.h"\r
 #include "wearable_log.h"\r
-#include "AppGroupView.h"\r
+#include "main/AppGroupView.h"\r
 \r
 static constexpr const char VOCPHOTO_ID[]  = "VOCPIC";\r
 static constexpr const char VOC_ID[] = "VOC";\r
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/include/player/BluetoothView.h b/code/sdk/application/wearable/nativeapp/nativeui/include/player/BluetoothView.h
new file mode 100644 (file)
index 0000000..a5465e5
--- /dev/null
@@ -0,0 +1,50 @@
+/*\r
+ * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved.\r
+ * Description: Bluetooth view 设置页面\r
+ * Create: 2021-09-5\r
+ */\r
+\r
+#ifndef BLUETOOTH_VIEW_H\r
+#define BLUETOOTH_VIEW_H\r
+\r
+#include "components/ui_label.h"\r
+#include "components/ui_image_view.h"\r
+#include "components/ui_radio_button.h"\r
+#include "components/ui_label_button.h"\r
+#include "components/ui_view_group.h"\r
+\r
+namespace OHOS {\r
+class PlayerOnDragListener;\r
+class BluetoothView {\r
+public:\r
+    BluetoothView();\r
+    virtual ~BluetoothView();\r
+    UIViewGroup *LoadBluetoothView(void);\r
+    static BluetoothView *GetInstance(void);\r
+    UIViewGroup *group{nullptr};\r
+    UIRadioButton *GetPhoneButton(void);\r
+    UIRadioButton *GetWatchButton(void);\r
+    UIButton *GetSettingButton(void);\r
+    UILabelButton *GetDeleteButton(void);\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 *settingButton{nullptr};\r
+    UILabelButton *deleteButton{nullptr};\r
+    int LoadRadioButton();\r
+    int LoadButtonView();\r
+    int LoadLabelButton();\r
+    int LoadLabel();\r
+    int LoadImage();\r
+\r
+    void SetUpButton(UILabelButton *btn, const Point& point, int16_t width, int16_t height,\r
+                     UIView::OnClickListener *listener);\r
+};\r
+} // namespace OHOS\r
+#endif
\ No newline at end of file
 
 #include <cstdio>
 #include "gfx_utils/list.h"
-#include "UiServersMsg.h"
+#include "main/UiServersMsg.h"
 #include "player.h"
 #include "source.h"
 #include "audio_manager.h"
 #include "audio_base_type.h"
-#include "PlayersPresenter.h"
+#include "player/PlayersPresenter.h"
 #include "bts_avrcp_controller.h"
 
 namespace OHOS {
@@ -88,13 +88,14 @@ public:
     int DecreaseVolume(void);
     int32_t GetPlayerstatus();
     void SetBTMusicPlay(avrcp_key_operation_t notification);
-    void ConnectBtAndLocalPlay(int32_t connCtState, int32_t connTgState, int32_t playerState); // 蓝牙连接和本地播放
-    void ConnectBtAndLocalPause(int32_t connCtState, int32_t connTgState);
+    int32_t ConnectBtAndLocalPlay(int32_t connCtState, int32_t connTgState, int32_t playerState); // 蓝牙连接和本地播放
+    int32_t ConnectBtAndLocalPause(int32_t connCtState, int32_t connTgState);
     void ConncetBtResetButton();
     void ClearActivateAudioInterrupt(void);
     void GetDuration(int64_t &duration);
 private:
     int64_t duration_{0};
+    bool isInterruptedPause_{false};
     bool audioInitStatus{false};
     char *sliceId{nullptr};
     List<PlayersMsg> listPlayers;
 #include "player.h"
 #include "audio_manager.h"
 #include "audio_base_type.h"
-#include "BluetoothView.h"
-#include "VolumeSettingView.h"
-#include "VolumeSettingPresenter.h"
-#include "BluetoothModel.h"
-#include "BluetoothEarPhoneView.h"
-#include "BluetoothEarListView.h"
-#include "BluetoothOptionsView.h"
-#include "BluetoothReconnectView.h"
-#include "TipsSuccMessageView.h"
-#include "TipsConnFailMessageView.h"
-#include "TipsFailMessageView.h"
-#include "BluetoothDeviceListView.h"
-#include "BluetoothItemView.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"
 
 namespace OHOS {
 using OHOS::Media::Player;
@@ -138,6 +138,7 @@ public:
     bool IsResumed();
     bool IsBeginStopped();
     bool IsEndStopped();
+    bool IsInterruptedPaused();
     void OnInterrupt(int32_t type, int32_t hint) override;
     void PausePlayer(void);
     void ResumePlayer(void);
@@ -151,6 +152,7 @@ private:
     bool isResumed_{false};
     bool isBeginStopped_{false};
     bool isEndStopped_{false};
+    bool isInterruptedPause_{false};
 };
 
 // 滑动手势
@@ -23,7 +23,7 @@
 #include "font/ui_font.h"\r
 #include "graphic_config.h"\r
 #include "components/ui_card_page.h"\r
-#include "PlayersPresenter.h"\r
+#include "player/PlayersPresenter.h"\r
 \r
 namespace OHOS {\r
 #define PLAY_PROGRESS_MIN 0\r
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/include/qrcode_conn/QrcodeConnModel.h b/code/sdk/application/wearable/nativeapp/nativeui/include/qrcode_conn/QrcodeConnModel.h
new file mode 100644 (file)
index 0000000..9bfab45
--- /dev/null
@@ -0,0 +1,31 @@
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: QrcodeConnModel.h\r
+ * Author:\r
+ * Create: 2025-04-24\r
+ */\r
+\r
+#ifndef QRCODE_CONN_MODEL_H\r
+#define QRCODE_CONN_MODEL_H\r
+\r
+#include <cstdint>\r
+#include <map>\r
+#include "AppViewIDs.h"\r
+#include "UiConfig.h"\r
+\r
+namespace OHOS {\r
+class QrcodeConnModel {\r
+public:\r
+    static QrcodeConnModel &GetInstance(void);\r
+\r
+private:\r
+    QrcodeConnModel();\r
+    QrcodeConnModel(const QrcodeConnModel &);\r
+    QrcodeConnModel &operator=(const QrcodeConnModel &);\r
+    virtual ~QrcodeConnModel();\r
+\r
+private:\r
+};\r
+}\r
+\r
+#endif  // QRCODE_CONN_MODEL_H
\ No newline at end of file
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/include/qrcode_conn/QrcodeConnPresenter.h b/code/sdk/application/wearable/nativeapp/nativeui/include/qrcode_conn/QrcodeConnPresenter.h
new file mode 100644 (file)
index 0000000..8914dc9
--- /dev/null
@@ -0,0 +1,31 @@
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: QrcodeConnPresenter.h\r
+ * Author:\r
+ * Create: 2025-04-24\r
+ */\r
+\r
+#ifndef QRCODE_CONN_PRESENTER_H\r
+#define QRCODE_CONN_PRESENTER_H\r
+\r
+#include "Presenter.h"\r
+#include "components/ui_view.h"\r
+#include "qrcode_conn/QrcodeConnView.h"\r
+#include "qrcode_conn/QrcodeConnModel.h"\r
+\r
+namespace OHOS {\r
+\r
+class QrcodeConnView;\r
+class QrcodeConnModel;\r
+class QrcodeConnPresenter : public Presenter<QrcodeConnView>,\r
+                            public UIView::OnDragListener {\r
+public:\r
+    QrcodeConnPresenter();\r
+    ~QrcodeConnPresenter() override;\r
+    static QrcodeConnPresenter *GetInstance();\r
+    bool OnDrag(UIView& view, const DragEvent& event) override;\r
+private:\r
+};\r
+}\r
+\r
+#endif // QRCODE_CONN_PRESENTER_H
\ No newline at end of file
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/include/qrcode_conn/QrcodeConnView.h b/code/sdk/application/wearable/nativeapp/nativeui/include/qrcode_conn/QrcodeConnView.h
new file mode 100644 (file)
index 0000000..24aaae6
--- /dev/null
@@ -0,0 +1,45 @@
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: QrcodeConnView.h\r
+ * Author:\r
+ * Create: 2025-04-24\r
+ */\r
+\r
+#ifndef QRCODE_CONN_VIEW_H\r
+#define QRCODE_CONN_VIEW_H\r
+\r
+#include <string>\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 "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
+\r
+namespace OHOS {\r
+\r
+class QrcodeConnPresenter;\r
+class QrcodeConnView : public View<QrcodeConnPresenter> {\r
+public:\r
+    QrcodeConnView();\r
+    ~QrcodeConnView() override;\r
+\r
+    static QrcodeConnView *GetInstance();\r
+\r
+    void OnStart() override;\r
+    void OnStop() override;\r
+    void InitView();\r
+    void DeInit();\r
+\r
+private:\r
+    UIScrollView *group_ = nullptr;\r
+    UIQrcode *qrcode_ = nullptr;\r
+};\r
+}\r
+#endif  // QRCODE_CONN_VIEW_H\r
@@ -7,8 +7,8 @@
 #define REBOOT_VIEW_H\r
 \r
 #include "View.h"\r
-#include "ShutdownDeviceView.h"\r
-#include "RebootDeviceView.h"\r
+#include "rebootdevice/ShutdownDeviceView.h"\r
+#include "rebootdevice/RebootDeviceView.h"\r
 #include "components/ui_view_group.h"\r
 #include "components/ui_label.h"\r
 #include "components/ui_button.h"\r
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/include/recent_app/RecentAppPresenter.h b/code/sdk/application/wearable/nativeapp/nativeui/include/recent_app/RecentAppPresenter.h
new file mode 100644 (file)
index 0000000..ccc47e1
--- /dev/null
@@ -0,0 +1,33 @@
+/*
+ * Copyright (c) 2025 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.
+ */
+
+#ifndef RECENT_APP_PRESENTER_H
+#define RECENT_APP_PRESENTER_H
+
+#include "Presenter.h"
+#include "components/ui_view.h"
+
+namespace OHOS {
+class RecentAppView;
+class RecentAppPresenter : public Presenter<RecentAppView>, public UIView::OnClickListener {
+public:
+    RecentAppPresenter();
+    ~RecentAppPresenter() override;
+    void OnResume() override;
+    bool OnClick(UIView &view, const ClickEvent &event) override;
+};
+}
+
+#endif // RECENT_APP_PRESENTER_H
\ No newline at end of file
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/include/recent_app/RecentAppView.h b/code/sdk/application/wearable/nativeapp/nativeui/include/recent_app/RecentAppView.h
new file mode 100644 (file)
index 0000000..02dc694
--- /dev/null
@@ -0,0 +1,68 @@
+/*
+ * Copyright (c) 2025 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.
+ */
+
+#ifndef RECENT_APP_VIEW_H
+#define RECENT_APP_VIEW_H
+
+#include <string>
+#include "recent_app/RecentAppPresenter.h"
+#include "View.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() override;
+    void OnStart() override;
+    void LoadContent();
+    UIRollerView* GetRollerView()
+    {
+        return roller_;
+    }
+private:
+    class LoadingAnimCb : public AnimatorCallback {
+    public:
+        LoadingAnimCb() {}
+        ~LoadingAnimCb() override {}
+        void Callback(UIView* view) override;
+        void SetRecentAppView(RecentAppView* recentAppView)
+        {
+            recentAppView_ = recentAppView;
+        }
+    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_;
+    bool viewiInitStatus_ = false;
+};
+} // namespace OHOS
+#endif // RECENT_APP_VIEW_H
\ No newline at end of file
@@ -8,9 +8,9 @@
 #define RESTORE_DEFAULTS_VIEW_H\r
 \r
 #include "View.h"\r
-#include "RestoreDefaultsPresenter.h"\r
-#include "RestoreSelectView.h"\r
-#include "AppGroupView.h"\r
+#include "restoredefaults/RestoreDefaultsPresenter.h"\r
+#include "restoredefaults/RestoreSelectView.h"\r
+#include "main/AppGroupView.h"\r
 \r
 namespace OHOS {\r
 constexpr int16_t NUM_RESTORE_DEFAULTS_CONTAINER = 1;\r
@@ -8,7 +8,7 @@
 #define RESTORE_SELECT_VIEW_H\r
 \r
 #include "View.h"\r
-#include "RestoreDefaultsPresenter.h"\r
+#include "restoredefaults/RestoreDefaultsPresenter.h"\r
 #include "components/ui_label.h"\r
 #include "components/ui_button.h"\r
 #include "components/ui_view_group.h"\r
@@ -41,6 +41,20 @@ void set_back_to_home_interval(uint32_t time_sec);
  */
 uint32_t get_back_to_home_interval(void);
 
+/**
+ * @brief 设置进入AOD后返回上一个应用的可返回时间间隔,需要在slice对应的Presentor的OnStart方法中调用
+ * 默认可返回时间间隔是5秒,进入AOD超过5秒后再次亮屏会跳回主界面
+ * @param time_sec 设置的可返回时间间隔
+ */
+void set_back_to_pre_slice_interval(uint32_t time_sec);
+
+/**
+ * @brief 获取进入AOD后返回上一个应用的可返回时间间隔,需要在slice对应的Presentor的OnStart方法中调用
+ * 默认可返回时间间隔是5秒,进入AOD超过5秒后再次亮屏会跳回主界面
+ * @param time_sec 获取的可返回时间间隔
+ */
+uint32_t get_back_to_pre_slice_interval(void);
+
 #ifdef __cplusplus
 }
 #endif
@@ -13,7 +13,7 @@
 #include "components/ui_view.h"\r
 #include "components/ui_view_group.h"\r
 #include "components/ui_image_view.h"\r
-#include "MainModel.h"\r
+#include "main/MainModel.h"\r
 #include "UiConfig.h"\r
 \r
 namespace OHOS {\r
@@ -12,8 +12,8 @@
 #include <map>
 #include "AppViewIDs.h"
 #include "UiConfig.h"
-#include "SetCardPresenter.h"
-#include "SetCardItem.h"
+#include "set_card/SetCardPresenter.h"
+#include "set_card/SetCardItem.h"
 
 namespace OHOS {
     class SetCardModel {
@@ -11,7 +11,7 @@
 #include "components/ui_image_view.h"\r
 #include "components/ui_label.h"\r
 #include "components/ui_label_button.h"\r
-#include "SetCardPresenter.h"\r
+#include "set_card/SetCardPresenter.h"\r
 \r
 namespace OHOS {\r
 class SetCardNoCardView : public UIViewGroup {\r
 #include "components/ui_toggle_button.h"
 #include "ChangeSliceListener.h"
 #include "UiConfig.h"
-#include "SetCardAdapter.h"
-#include "SetCardModel.h"
-#include "SetCardDeleteView.h"
-#include "SetCardNoCardView.h"
+#include "set_card/SetCardAdapter.h"
+#include "set_card/SetCardModel.h"
+#include "set_card/SetCardDeleteView.h"
+#include "set_card/SetCardNoCardView.h"
 
 namespace OHOS {
 class SetCardPresenter;
@@ -7,13 +7,15 @@
 
 #ifndef SET_DIAL_PRESENTER_H
 #define SET_DIAL_PRESENTER_H
-#include "SetDialInfo.h"
-#include "SetDialModel.h"
+#include "set_dial/SetDialInfo.h"
+#include "set_dial/SetDialModel.h"
 #include "Presenter.h"
 #include "components/ui_view.h"
 #include "components/ui_roller_view.h"
-#include "KeyInputListener.h"
-#include "ModelListenerSample.h"
+#include "key/KeyInputListener.h"
+#include "main/ModelListenerSample.h"
+#include "components/ui_coverflow_view.h"
+#include "main/MainModel.h"
 
 namespace OHOS {
 
@@ -28,6 +30,8 @@ class SetDialPresenter : public Presenter<SetDialView>,
 public:
     SetDialPresenter();
     ~SetDialPresenter() override;
+    static SetDialPresenter *GetCurrentInstance();
+    void SpecifyDialSetting(const DialSetting &setting);
     size_t GetDialCount(void);
     std::vector<SetDialInfo>& GetDialInfo(void);
     uint8_t GetPageIndex(void);
@@ -42,6 +46,8 @@ private:
     void OnClickAction(void);
     SetDialModel *model{nullptr};
     uint64_t startTime{0};
+    bool isSpecific = false;
+    DialSetting specificSetting;
 };
 }
 
@@ -7,7 +7,7 @@
 
 #ifndef SET_DIAL_STYLE_PRESENTER_H
 #define SET_DIAL_STYLE_PRESENTER_H
-#include "SetDialView.h"
+#include "set_dial/SetDialView.h"
 #include "components/ui_view.h"
 #include "Presenter.h"
 
@@ -19,7 +19,7 @@ class SetDialStylePresenter : public Presenter<SetDialStyleView, SetDialStyleMod
                               public UIView::OnDragListener {
 public:
     SetDialStylePresenter();
-    ~SetDialStylePresenter();
+    ~SetDialStylePresenter() override;
     SetDialStylePresenter(const SetDialStylePresenter&) = delete;
     SetDialStylePresenter& operator=(const SetDialStylePresenter&) = delete;
     bool OnClick(UIView &view, const ClickEvent &event) override;
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/include/set_ota/OTACommon.h b/code/sdk/application/wearable/nativeapp/nativeui/include/set_ota/OTACommon.h
new file mode 100644 (file)
index 0000000..50a8574
--- /dev/null
@@ -0,0 +1,39 @@
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025. All rights reserved.\r
+ * Description: ota local update\r
+ * Author: wangle\r
+ * Create: 2025-5-6\r
+ */\r
+#ifndef OTA_COMMON_H\r
+#define OTA_COMMON_H\r
+\r
+#define MODLE_THREAD_STACK_SIZE 4096\r
+\r
+#define LOCAL_UPDATE_PROGRESS_5 5\r
+#define LOCAL_UPDATE_PROGRESS_25 25\r
+#define LOCAL_UPDATE_PROGRESS_40 40\r
+#define LOCAL_UPDATE_PROGRESS_50 50\r
+#define LOCAL_UPDATE_PROGRESS_100 100\r
+\r
+#define SLEEP_TIME_S 1000\r
+\r
+#define SLIDING_LENGTH      30\r
+\r
+#define VIEW_MESSAGE_X 53\r
+#define VIEW_MESSAGE_Y 148\r
+#define VIEW_MESSAGE_W 360\r
+#define VIEW_MESSAGE_H 20\r
+#define VIEW_MESSAGE_FONT 20\r
+\r
+#define VIEW_PROGRESS_X 73\r
+#define VIEW_PROGRESS_Y 226\r
+#define VIEW_PROGRESS_W 320\r
+#define VIEW_PROGRESS_H 10\r
+\r
+#define VIEW_UPDATE_X 173\r
+#define VIEW_UPDATE_Y 312\r
+#define VIEW_UPDATE_W 120\r
+#define VIEW_UPDATE_H 40\r
+#define VIEW_UPDATE_FONT 16\r
+\r
+#endif
\ No newline at end of file
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/include/set_ota/OTAModel.h b/code/sdk/application/wearable/nativeapp/nativeui/include/set_ota/OTAModel.h
new file mode 100644 (file)
index 0000000..d72ea88
--- /dev/null
@@ -0,0 +1,56 @@
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025. All rights reserved.\r
+ * Description: ota local update\r
+ * Author: wangle\r
+ * Create: 2025-5-6\r
+ */\r
+#ifndef OTA_MODEL_H\r
+#define OTA_MODEL_H\r
+#include "osal_task.h"\r
+#include "osal_wait.h"\r
+#include "Model.h"\r
+#include <atomic>\r
+namespace OHOS {\r
+\r
+enum class TaskType { UpdateInfo, LocalUpdate, Unknown };\r
+\r
+struct LocalUpdateData {\r
+    uint32_t fileSize;\r
+};\r
+\r
+class OTAPresenter;\r
+class OTAModel : public Model<OTAPresenter> {\r
+public:\r
+    OTAModel();\r
+    ~OTAModel();\r
+\r
+public:\r
+    bool ModelRunTask(TaskType type, void *data);\r
+\r
+protected:\r
+    void SwitchTask();\r
+    void UpdateInfo(void *data);\r
+    void LocalUpdate(void *data);\r
+\r
+protected:\r
+    void DelayRebootFor5S();\r
+    void UpdatePercentCallback(uint32_t percent);\r
+\r
+protected:\r
+    static int OSALKthreadCallback(void *data);\r
+    static int WaitCondition(const void *data);\r
+\r
+protected:\r
+    static void OtaUpdatePercentCallback(uint32_t percent);\r
+\r
+private:\r
+    osal_task *task = nullptr;\r
+    osal_wait wait;\r
+    std::atomic_bool isIdel;\r
+    TaskType type = TaskType::Unknown;\r
+    void *data = nullptr;\r
+};\r
+\r
+}  // namespace OHOS\r
+\r
+#endif
\ No newline at end of file
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/include/set_ota/OTAPresenter.h b/code/sdk/application/wearable/nativeapp/nativeui/include/set_ota/OTAPresenter.h
new file mode 100644 (file)
index 0000000..8c37384
--- /dev/null
@@ -0,0 +1,44 @@
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025. All rights reserved.\r
+ * Description: ota local update\r
+ * Author: wangle\r
+ * Create: 2025-5-6\r
+ */\r
+#ifndef OTA_PRESENTER_H\r
+#define OTA_PRESENTER_H\r
+\r
+#include "Presenter.h"\r
+#include "components/ui_view.h"\r
+#include "set_ota/OTAModel.h"\r
+\r
+namespace OHOS {\r
+\r
+class OTAView;\r
+class OTAPresenter : public Presenter<OTAView, OTAModel>,\r
+                     public UIView::OnClickListener,\r
+                     public UIView::OnDragListener {\r
+public:\r
+    void OnStart() override;\r
+    void OnStop() override;\r
+\r
+public:\r
+    bool OnClick(UIView &view, const ClickEvent &event) override;\r
+    bool OnDrag(UIView &view, const DragEvent &event) override;\r
+public:\r
+    // Model调用\r
+    void SetPackageInfo(const char* filePath, uint32_t fileSize);\r
+    void SetUpdateProgress(const char* message, uint8_t progress);\r
+    void SetErrorMessage(const char* message);\r
+    void SetMessage(const char* message);\r
+protected:\r
+    void SaveSystemScreen();\r
+    void BackSystemScreen();\r
+private:\r
+    bool updateEnable = true;\r
+    const char* updateFilePath = nullptr;\r
+    uint32_t updateFileSize = 0;\r
+    uint32_t briScrStatus = 0;\r
+};\r
+}  // namespace OHOS\r
+\r
+#endif
\ No newline at end of file
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/include/set_ota/OTAView.h b/code/sdk/application/wearable/nativeapp/nativeui/include/set_ota/OTAView.h
new file mode 100644 (file)
index 0000000..1beee87
--- /dev/null
@@ -0,0 +1,45 @@
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025. All rights reserved.\r
+ * Description: ota local update\r
+ * Author: wangle\r
+ * Create: 2025-5-6\r
+ */\r
+#ifndef OTA_VIEW_H\r
+#define OTA_VIEW_H\r
+\r
+#include "View.h"\r
+#include "Presenter.h"\r
+#include "components/ui_label.h"\r
+#include "components/ui_box_progress.h"\r
+#include "components/ui_label_button.h"\r
+\r
+namespace OHOS {\r
+class OTAPresenter;\r
+class OTAView : public View<OTAPresenter> {\r
+public:\r
+    OTAView(){};\r
+    ~OTAView(){};\r
+    void OnStart() override;\r
+    void OnStop() override;\r
+    void InitMessageCtrl();\r
+    void InitProgressCtrl();\r
+    void InitUpdateCtrl();\r
+    void AddCtrlToView();\r
+    void DeInitMessageCtrl();\r
+    void DeInitProgressCtrl();\r
+    void DeInitUpdateCtrl();\r
+\r
+public:\r
+    void SetUpdateEnable();\r
+    void SetUpdateDisable();\r
+    void SetMessage(const char *msg);\r
+    void SetProgress(uint8_t progress);\r
+\r
+private:\r
+    UILabel *message = nullptr;\r
+    UIBoxProgress *progress = nullptr;\r
+    UILabelButton *update = nullptr;\r
+};\r
+}  // namespace OHOS\r
+\r
+#endif
\ No newline at end of file
@@ -1,8 +1,8 @@
 /*
- * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved.
- * Description: SetDesktopModel.h
- * Author:
- * Create: 2021-11-23
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.
+ * Description: SetDesktopModel
+ * Author: Hisi Graphic Team
+ * Created: 2025-4
  */
 
 #ifndef SET_DESKTOP_MODEL_H
@@ -27,10 +27,8 @@ namespace OHOS {
         DesktopStyle GetDesktopStyle(void);
         void SetDesktopStyle(DesktopStyle style);
     private:
-        SetDesktopModel();
-        SetDesktopModel(const SetDesktopModel &);
-        SetDesktopModel &operator=(const SetDesktopModel &);
-        virtual ~SetDesktopModel();
+        SetDesktopModel() = default;
+        virtual ~SetDesktopModel() = default;
     };
 }
 
@@ -17,8 +17,8 @@
 #include "components/abstract_adapter.h"
 #include "wearable_log.h"
 #include "UiConfig.h"
-#include "SettingModel.h"
-#include "SettingItemView.h"
+#include "settings/SettingModel.h"
+#include "settings/SettingItemView.h"
 
 namespace OHOS {
 class SettingAdapter : public AbstractAdapter {
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/include/settings/SettingDesktopPage.h b/code/sdk/application/wearable/nativeapp/nativeui/include/settings/SettingDesktopPage.h
new file mode 100644 (file)
index 0000000..8e8dd1e
--- /dev/null
@@ -0,0 +1,53 @@
+/*
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.
+ * Description: SettingDesktopPage
+ * Author: Hisi Graphic Team
+ * Created: 2025-4
+ */
+
+#ifndef SETTING_DESKTOP_PAGE_H
+#define SETTING_DESKTOP_PAGE_H
+
+#include "View.h"
+#include "components/ui_scroll_view.h"
+#include "components/ui_view_group.h"
+#include "components/ui_label.h"
+#include "components/ui_image_view.h"
+#include "components/ui_toggle_button.h"
+#include "SlicePage.h"
+#include "UiConfig.h"
+#include "settings/SetDesktopModel.h"
+#include "settings/SettingPresenter.h"
+
+namespace OHOS {
+class SettingDesktopPage : public SlicePage<SettingPresenter>,
+    public UIView::OnClickListener,
+    public UIView::OnDragListener {
+public:
+    SettingDesktopPage();
+    ~SettingDesktopPage() override;
+    void OnStart(void* data) override;
+    void UpdateSelectedStyle(DesktopStyle selectedStyle);
+    bool OnClick(UIView &view, const ClickEvent &event) override;
+    bool OnDrag(UIView& view, const DragEvent& event) override;
+
+private:
+    void InitFootballItem();
+    void InitWaterfallItem();
+    UIScrollView *scrollview{nullptr};
+    UILabel titleText;
+    UIToggleButton hexagonsBtn;
+    UIToggleButton listBtn;
+    UIToggleButton footballBtn_;
+    UIToggleButton waterfallBtn_;
+    UIImageView hexagonsImage;
+    UIImageView listImage;
+    UIImageView footballImage_;
+    UIImageView waterfallImage_;
+    UILabel listText;
+    UILabel hexagonsText;
+    UILabel footballText_;
+    UILabel waterfallText_;
+};
+}
+#endif // SETTING_DESKTOP_PAGE_H
@@ -13,7 +13,7 @@
 #include "components/ui_image_view.h"
 
 #include "UiConfig.h"
-#include "SettingModel.h"
+#include "settings/SettingModel.h"
 
 namespace OHOS {
 class SettingItemView : public UIViewGroup {
@@ -26,7 +26,7 @@ public:
     {
         return sItemInfo.enableSlideBack;
     }
-    AppViewId GetViewId();
+    uint32_t GetTargetId();
     const char* GetIconId();
 private:
     UIImageView sIcon;
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/include/settings/SettingMainPage.h b/code/sdk/application/wearable/nativeapp/nativeui/include/settings/SettingMainPage.h
new file mode 100644 (file)
index 0000000..5d3a8c4
--- /dev/null
@@ -0,0 +1,38 @@
+/*
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.
+ * Description: SettingMainPage
+ * Author: Hisi Graphic Team
+ * Created: 2025-4
+ */
+
+#ifndef SETTING_MAIN_PAGE_H
+#define SETTING_MAIN_PAGE_H
+
+#include "components/ui_scroll_view.h"
+#include "components/ui_label.h"
+#include "components/ui_list.h"
+#include "SlicePage.h"
+#include "settings/SettingAdapter.h"
+#include "settings/SettingPresenter.h"
+
+namespace OHOS {
+class SettingPresenter;
+class SettingMainPage : public SlicePage<SettingPresenter>,
+                        public UIView::OnClickListener,
+                        public UIView::OnDragListener {
+public:
+    SettingMainPage() = default;
+    ~SettingMainPage() override;
+
+    void OnStart(void* data) override;
+    void RefreshSettingsList(const SettingItem* item, uint8_t count);
+    bool OnClick(UIView &view, const ClickEvent &event) override;
+    bool OnDrag(UIView& view, const DragEvent& event) override;
+private:
+    SettingAdapter *listAdapter{nullptr};
+    UIScrollView *scrollView{nullptr};
+    UIList *contentList{nullptr};
+    UILabel *title{nullptr};
+};
+}
+#endif // SETTING_MAIN_PAGE_H
\ No newline at end of file
@@ -12,8 +12,8 @@
 #include <map>
 #include "AppViewIDs.h"
 #include "UiConfig.h"
-#include "SettingItem.h"
-#include "SettingPresenter.h"
+#include "settings/SettingItem.h"
+#include "settings/SettingPresenter.h"
 
 namespace OHOS {
     static const uint16_t SETTING_ITEM_COUNT = 10;
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/include/settings/SettingPresenter.h b/code/sdk/application/wearable/nativeapp/nativeui/include/settings/SettingPresenter.h
new file mode 100644 (file)
index 0000000..16595d2
--- /dev/null
@@ -0,0 +1,19 @@
+/*
+ * 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> {
+};
+}
+
+#endif // SETTING_PRESENTER_H
\ No newline at end of file
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/include/settings/SettingView.h b/code/sdk/application/wearable/nativeapp/nativeui/include/settings/SettingView.h
new file mode 100644 (file)
index 0000000..2f79acf
--- /dev/null
@@ -0,0 +1,22 @@
+/*
+ * 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> {
+};
+}
+#endif // SETTING_VIEW_H
\ No newline at end of file
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/include/sleep/SleepingDetailsPage.h b/code/sdk/application/wearable/nativeapp/nativeui/include/sleep/SleepingDetailsPage.h
new file mode 100644 (file)
index 0000000..34cb969
--- /dev/null
@@ -0,0 +1,75 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SleepingDetailsPage\r
+ * Created: 2025-06-05\r
+ */\r
+#ifndef SLEEPING_DETAILS_PAGE_H\r
+#define SLEEPING_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/SleepingPresenter.h"\r
+#include "sleep/SleepingView.h"\r
+#include "sleep/SleepingModel.h"\r
+\r
+namespace OHOS {\r
+class SleepingPresenter;\r
+class SleepingDetailsPage : public SlicePage<SleepingPresenter>,\r
+                             public UIView::OnDragListener {\r
+public:\r
+    SleepingDetailsPage();\r
+    ~SleepingDetailsPage() override;\r
+\r
+    void OnStart(void* data) override;\r
+    void InitPage();\r
+    void InitNoDeatilPage();\r
+    void InitDetailPage();\r
+\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 SetTimeText(std::tuple<uint32_t, uint32_t> timeTuple);\r
+    void InitActualSleepTime(std::tuple<uint32_t, uint32_t> timeTuple);\r
+    void IoadDeatilActualSleepTime();\r
+private:\r
+\r
+    UIScrollView *group{nullptr};\r
+    UIImageView *detailsSleepView{nullptr};\r
+    UILabel *sleep{nullptr};\r
+    UILabel *actualSleepTime{nullptr};\r
+    UILabel *actualSleepTimeHours{nullptr};\r
+    UILabel *actualSleepTimeHoursText{nullptr};\r
+    UILabel *actualSleepTimeMinutes{nullptr};\r
+    UILabel *actualSleepTimeMinutesText{nullptr};\r
+    UIImageView *grayBg{nullptr};\r
+\r
+    UIImageView *image1{nullptr};\r
+    UILabel *soberingTime_{nullptr};\r
+    UILabel *soberingTimeText{nullptr};\r
+    UIImageView *image2{nullptr};\r
+    UILabel *rapidEyeMovement_ {nullptr};\r
+    UILabel *rapidEyeMovementText{nullptr};\r
+    UIImageView *image3{nullptr};\r
+    UILabel *lightSleepTime_{nullptr};\r
+    UILabel *lightSleepTimeText{nullptr};\r
+    UIImageView *image4{nullptr};\r
+    UILabel *deepSleepTime_{nullptr};\r
+    UILabel *deepSleepTimeText{nullptr};\r
+};\r
+}\r
+\r
+#endif // SLEEPING_DETAILS_PAGE_H
\ No newline at end of file
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/include/sleep/SleepingMainPage.h b/code/sdk/application/wearable/nativeapp/nativeui/include/sleep/SleepingMainPage.h
new file mode 100644 (file)
index 0000000..7249230
--- /dev/null
@@ -0,0 +1,83 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SleepingMainPage\r
+ * Created: 2025-06-05\r
+ */\r
+#ifndef SLEEPING_MAIN_PAGE_H\r
+#define SLEEPING_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/TargetSleepTime.h"\r
+#include "sleep/SleepingPresenter.h"\r
+#include "sleep/SleepingView.h"\r
+#include "sleep/SleepingModel.h"\r
+\r
+\r
+namespace OHOS {\r
+class SleepingPresenter;\r
+class SleepingMainPage : public SlicePage<SleepingPresenter>,\r
+                             public UIView::OnClickListener,\r
+                             public UIView::OnDragListener {\r
+public:\r
+    SleepingMainPage();\r
+    ~SleepingMainPage() override;\r
+\r
+    void OnStart(void* data) override;\r
+    void InitNoRecordPage();\r
+    void InitRecordPage();\r
+    void IoadActualSleepTime(std::tuple<uint32_t, uint32_t> timeTuple);\r
+    void IoadTargetTimeButton(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 CircleProgress();\r
+    void TargetTimeButton();\r
+    uint32_t GetSleepingScores();\r
+    void InitSleepTimeLabel();\r
+    void ScoreDisplay();\r
+    bool GetRecord();\r
+    void InitScoreDisplayPicture();\r
+private:\r
+\r
+    UIImageView *imageViewMain{nullptr};\r
+    UILabel *sleep{nullptr};\r
+    UIImageView *moonNoRecord{nullptr};\r
+    UIImageView *moon{nullptr};\r
+    UILabel *noRecord{nullptr};\r
+    UILabel *tips{nullptr};\r
+\r
+    UILabel *sleepScores_{nullptr};\r
+    UILabel *scoreText{nullptr};\r
+    UILabel *sleepScore{nullptr};\r
+\r
+    UIImageView *scoreDisplayPicture1{nullptr};\r
+    UIImageView *scoreDisplayPicture2{nullptr};\r
+    UIImageView *scoreDisplayPicture3{nullptr};\r
+    UIImageView *scoreDisplayPicture4{nullptr};\r
+    UIImageView *scoreDisplayPicture5{nullptr};\r
+    UIImageView *setting{nullptr};\r
+    UILabel *actualSleepTimeHours{nullptr};\r
+    UILabel *actualSleepTimeHoursText{nullptr};\r
+    UILabel *actualSleepTimeMinutes{nullptr};\r
+    UILabel *actualSleepTimeMinutesText{nullptr};\r
+\r
+    UILabelButton *targetTimeButton{nullptr};\r
+    UILabel *targetTimeText{nullptr};\r
+    UICircleProgress* circleProgress{nullptr};\r
+\r
+    UIScrollView *group{nullptr};\r
+};\r
+}\r
+\r
+#endif // SLEEPING_MAIN_PAGE_H\r
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/include/sleep/SleepingModel.h b/code/sdk/application/wearable/nativeapp/nativeui/include/sleep/SleepingModel.h
new file mode 100644 (file)
index 0000000..0896550
--- /dev/null
@@ -0,0 +1,82 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SleepingModel\r
+ * Created: 2025-06-05\r
+ */\r
+#ifndef SLEEPING_MODEL_H\r
+#define SLEEPING_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/SleepingPresenter.h"\r
+\r
+namespace OHOS {\r
+    static const uint16_t SLEEP_DATA_DATE_RANGE = 20;\r
+    static const uint16_t SLEEP_DATA_START_DATA_RANGE = 24;\r
+\r
+    #pragma pack(1)\r
+    typedef struct {\r
+        bool isSend;\r
+        char date[SLEEP_DATA_DATE_RANGE];\r
+        uint8_t  type; // 睡眠类别  深睡 浅睡 快速动眼 清醒\r
+        char start[SLEEP_DATA_START_DATA_RANGE];\r
+        char end[SLEEP_DATA_START_DATA_RANGE];\r
+        char sleepStart[SLEEP_DATA_START_DATA_RANGE];\r
+        char sleepEnd[SLEEP_DATA_START_DATA_RANGE];\r
+    } SleepData;\r
+    #pragma pack()\r
+\r
+\r
+    class SleepingModel {\r
+    public:\r
+        static SleepingModel &GetInstance(void);\r
+        void SendData();\r
+        uint8_t* SerializeSleepData(const SleepData* sleepData, size_t* outSize);\r
+        void SetSleepData();\r
+        void SetTime(uint32_t minute);\r
+        std::tuple<uint32_t, uint32_t> GetTime();\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
+\r
+    private:\r
+        SleepingModel();\r
+        void PrintSleepData(const SleepData *data);\r
+        virtual ~SleepingModel();\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\r
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/include/sleep/SleepingPresenter.h b/code/sdk/application/wearable/nativeapp/nativeui/include/sleep/SleepingPresenter.h
new file mode 100644 (file)
index 0000000..2e0fdfa
--- /dev/null
@@ -0,0 +1,18 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SleepingPresenter\r
+ * Created: 2025-06-05\r
+ */\r
+\r
+#ifndef SETTING_PRESENTER_H\r
+#define SETTING_PRESENTER_H\r
+\r
+#include "Presenter.h"\r
+\r
+namespace OHOS {\r
+class SleepingView;\r
+class SleepingPresenter : public Presenter<SleepingView> {\r
+};\r
+}\r
+\r
+#endif // SETTING_PRESENTER_H
\ No newline at end of file
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/include/sleep/SleepingView.h b/code/sdk/application/wearable/nativeapp/nativeui/include/sleep/SleepingView.h
new file mode 100644 (file)
index 0000000..67325ad
--- /dev/null
@@ -0,0 +1,22 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SleepingView\r
+ * Created: 2025-06-05\r
+ */\r
+\r
+#ifndef SLEEPING_VIEW_H\r
+#define SLEEPING_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
+};\r
+\r
+class SleepingPresenter;\r
+class SleepingView : public View<SleepingPresenter> {\r
+};\r
+}\r
+#endif // SLEEPING_VIEW_H
\ No newline at end of file
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/include/sleep/TargetSleepTime.h b/code/sdk/application/wearable/nativeapp/nativeui/include/sleep/TargetSleepTime.h
new file mode 100644 (file)
index 0000000..2aa0f8b
--- /dev/null
@@ -0,0 +1,50 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: TargetSleepTime\r
+ * Created: 2025-06-05\r
+ */\r
+\r
+#ifndef TARGET_SLEEP_TIME_H\r
+#define TARGET_SLEEP_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/SleepingPresenter.h"\r
+#include "sleep/SleepingView.h"\r
+namespace OHOS {\r
+class TargetSleepTime : public SlicePage<SleepingPresenter>,\r
+                        public UIPicker::SelectedListener,\r
+                        public UIView::OnClickListener,\r
+                        public UIView::OnDragListener {\r
+public:\r
+    TargetSleepTime() = default;\r
+    ~TargetSleepTime() 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 TargetTimeButton();\r
+    void CreatePicker();\r
+    void CreateLabel();\r
+    void SetPickerTime();\r
+private:\r
+    UILabel* setTraget{nullptr};\r
+    UILabel* timerLabel{nullptr};\r
+    UILabelButton *startButton{nullptr};\r
+    UIImageView *backgroundImage{nullptr};\r
+    UIScrollView *group{nullptr};\r
+    UIPicker* timerPicker[2]{nullptr};\r
+};\r
+}\r
+#endif // TARGET_SLEEP_TIME_H
\ No newline at end of file
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/include/sports/SportsModel.h b/code/sdk/application/wearable/nativeapp/nativeui/include/sports/SportsModel.h
new file mode 100644 (file)
index 0000000..8b7b56a
--- /dev/null
@@ -0,0 +1,44 @@
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: Sports Model\r
+ * Create: 2025-04-28\r
+ */\r
+\r
+#ifndef SPORTS_MODEL_H\r
+#define SPORTS_MODEL_H\r
+#include "graphic_timer.h"\r
+\r
+namespace OHOS {\r
+\r
+typedef struct sport_data {\r
+    uint32_t step;\r
+    uint32_t distance;\r
+    int32_t lat;\r
+    int32_t lng;\r
+    uint32_t speed;\r
+    uint16_t heartrate;\r
+} sport_data_t;\r
+\r
+class SportsModel {\r
+public:\r
+    ~SportsModel();\r
+    static SportsModel *GetInstance(void);\r
+    void Init();\r
+    bool StartSportsTimer();\r
+    void StopSportsTimer(bool isDelete);\r
+    void IncrSportsTime();\r
+    std::string CountingSportsTime();\r
+    bool IsActive();\r
+    sport_data_t *GetSportsData();\r
+    void ResetSportsData();\r
+    uint32_t CalculateSpeed(uint32_t distance);\r
+\r
+private:\r
+    SportsModel();\r
+    void InitSportsTimer();\r
+    uint32_t uiSportTime_ = 0;\r
+    bool isActive_{false};\r
+    GraphicTimer *pGraphicTimer_{nullptr};\r
+};\r
+}\r
+#endif
\ No newline at end of file
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/include/sports/SportsPresenter.h b/code/sdk/application/wearable/nativeapp/nativeui/include/sports/SportsPresenter.h
new file mode 100644 (file)
index 0000000..6ff4a69
--- /dev/null
@@ -0,0 +1,25 @@
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: sports Presenter\r
+ * Create: 2025-04-28\r
+ */\r
+\r
+#ifndef SPORTS_PRESENTER_H\r
+#define SPORTS_PRESENTER_H\r
+\r
+#include "Presenter.h"\r
+\r
+namespace OHOS {\r
+\r
+class SportsView;\r
+class SportsPresenter : public Presenter<SportsView>,\r
+                        public UIView::OnDragListener {\r
+public:\r
+    SportsPresenter();\r
+    ~SportsPresenter();\r
+    static SportsPresenter *GetInstance();\r
+    bool OnDrag(UIView& view, const DragEvent& event) override;\r
+private:\r
+};\r
+} // namespace OHOS\r
+#endif
\ No newline at end of file
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/include/sports/SportsView.h b/code/sdk/application/wearable/nativeapp/nativeui/include/sports/SportsView.h
new file mode 100644 (file)
index 0000000..aeca787
--- /dev/null
@@ -0,0 +1,48 @@
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: sports View\r
+ * Create: 2025-04-28\r
+ */\r
+#ifndef SPORTS_VIEW_H\r
+#define SPORTS_VIEW_H\r
+\r
+#include "View.h"\r
+#include "components/ui_view_group.h"\r
+#include "components/ui_label.h"\r
+#include "components/ui_image_view.h"\r
+\r
+namespace OHOS {\r
+\r
+enum SportDataType {\r
+    SPORT_TIME = 0,\r
+    SPORT_SETP,\r
+    SPORT_DISTANCE,\r
+    SPORT_HEARTRATE,\r
+    SPORT_SPEED,\r
+    SPORT_MAX,\r
+};\r
+\r
+class SportsPresenter;\r
+class SportsView : public View<SportsPresenter> {\r
+public:\r
+    SportsView();\r
+    ~SportsView() override;\r
+    static SportsView *GetInstance();\r
+    void OnStart() override;\r
+    void SetStep(uint32_t step);\r
+    void SetHeartRate(uint16_t heartrate);\r
+    void SetDistance(uint32_t distance);\r
+    void SetTime(const char *time);\r
+    void SetSpeed(uint32_t speed);\r
+\r
+private:\r
+    bool InitView();\r
+    bool InitLableView(int index, const char *text, uint16_t x, uint16_t y1, uint16_t w, uint16_t y2);\r
+    void InitSportDataLabel();\r
+    UILabel TitleLabel[SPORT_MAX];\r
+    UILabel ContentLabel[SPORT_MAX];\r
+    UIViewGroup *group{nullptr};\r
+    UIImageView *backGround{nullptr};\r
+};\r
+}  // namespace OHOS\r
+#endif  // SPORTS_VIEW_H\r
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/include/stopwatch/StopwatchAdapter.h b/code/sdk/application/wearable/nativeapp/nativeui/include/stopwatch/StopwatchAdapter.h
new file mode 100644 (file)
index 0000000..bd160d8
--- /dev/null
@@ -0,0 +1,31 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: StopwatchAdapter\r
+ * Create: 2025-06-06\r
+ */\r
+\r
+#ifndef STOPWATCH_ADAPTER_H\r
+#define STOPWATCH_ADAPTER_H\r
+\r
+#include "gfx_utils/list.h"\r
+#include "components/abstract_adapter.h"\r
+#include "stopwatch/StopwatchItemView.h"\r
+\r
+namespace OHOS {\r
+\r
+class StopwatchAdapter : public AbstractAdapter {\r
+public:\r
+    explicit StopwatchAdapter();\r
+    ~StopwatchAdapter() override;\r
+\r
+    void SetData(const List<StopwatchItem> &data);\r
+\r
+    uint16_t GetCount(void) override;\r
+    UIView *GetView(UIView *inView, int16_t index) override;\r
+\r
+private:\r
+    List<StopwatchItem> listData_;\r
+};\r
+}\r
+\r
+#endif   // STOPWATCH_ADAPTER_H
\ No newline at end of file
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/include/stopwatch/StopwatchItemView.h b/code/sdk/application/wearable/nativeapp/nativeui/include/stopwatch/StopwatchItemView.h
new file mode 100644 (file)
index 0000000..b4a48db
--- /dev/null
@@ -0,0 +1,33 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: StopwatchItemView\r
+ * Create: 2025-06-06\r
+ */\r
+\r
+#ifndef STOPWATCH_ITEM_VIEW_H\r
+#define STOPWATCH_ITEM_VIEW_H\r
+\r
+#include "components/ui_label.h"\r
+#include "components/ui_label_button.h"\r
+#include "components/ui_view_group.h"\r
+\r
+namespace OHOS {\r
+typedef struct {\r
+    std::string record;\r
+    bool isLatest;\r
+} StopwatchItem;\r
+\r
+class StopwatchItemView : public UIViewGroup {\r
+public:\r
+    explicit StopwatchItemView();\r
+    virtual ~StopwatchItemView() override;\r
+    void SetItemInfo(int16_t index, const StopwatchItem &itemInfo);\r
+\r
+private:\r
+    UILabel nameLabel_;\r
+    UILabel recordLabel_;\r
+    UILabelButton itemBg_;\r
+};\r
+}\r
+\r
+#endif\r
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/include/stopwatch/StopwatchModel.h b/code/sdk/application/wearable/nativeapp/nativeui/include/stopwatch/StopwatchModel.h
new file mode 100644 (file)
index 0000000..41c75f0
--- /dev/null
@@ -0,0 +1,62 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: StopwatchModel\r
+ * Create: 2025-06-06\r
+ */\r
+\r
+#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
+\r
+namespace OHOS {\r
+class StopwatchModel {\r
+public:\r
+    ~StopwatchModel();\r
+    static StopwatchModel &GetInstance(void);\r
+\r
+    void SetStartTime();\r
+    void SaveElapsedTime();\r
+    uint64_t GetElapsedTime();\r
+    uint64_t UpdateElapsedTime();\r
+    void ResetCounter();\r
+    bool GetActiveState();\r
+    void SetActiveState();\r
+    void SetInactiveState();\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
+#else\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
+    List<StopwatchItem> records_;\r
+};\r
+}\r
+\r
+#endif  // STOPWATCH_MODEL_H
\ No newline at end of file
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/include/stopwatch/StopwatchPage.h b/code/sdk/application/wearable/nativeapp/nativeui/include/stopwatch/StopwatchPage.h
new file mode 100644 (file)
index 0000000..9568a30
--- /dev/null
@@ -0,0 +1,79 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: StopwatchPage\r
+ * Create: 2025-06-06\r
+ */\r
+\r
+#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_label_button.h"\r
+#include "components/ui_image_view.h"\r
+#include "components/ui_sweep_clock.h"\r
+#include "animator/animator.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
+                           public UIView::OnDragListener {\r
+public:\r
+    StopwatchPage();\r
+    ~StopwatchPage() override;\r
+\r
+    void OnStart(void* data) override;\r
+    void OnStop() override;\r
+    void OnPause() override;\r
+    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 RefreshRecordsList(void);\r
+    class StopwatchAnimatorCallback : public AnimatorCallback {\r
+    public:\r
+        StopwatchAnimatorCallback(StopwatchPage* page) : stopwatchPage(page) {}\r
+        virtual ~StopwatchAnimatorCallback() override {}\r
+        void Callback(UIView* view) override;\r
+    private:\r
+        StopwatchPage* stopwatchPage{nullptr};\r
+    };\r
+    class TimeAnimatorCallback : public AnimatorCallback {\r
+    public:\r
+        TimeAnimatorCallback() {}\r
+        virtual ~TimeAnimatorCallback() override {}\r
+        void Callback(UIView* view) override;\r
+    };\r
+    Animator* animator_{nullptr};\r
+    StopwatchAnimatorCallback* animatorCallback_{nullptr};\r
+    TimeAnimatorCallback* timeCallback_{nullptr};\r
+    Animator* timeAnimator_{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
+    UILabelButton *startButton_{nullptr};\r
+    UILabelButton *resetButton_{nullptr};\r
+    UIImageView *backGround_{nullptr};\r
+    UIImageView *imgScale_{nullptr};\r
+};\r
+}\r
+#endif  // STOPWATCH_PAGE_H\r
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/include/stopwatch/StopwatchPresenter.h b/code/sdk/application/wearable/nativeapp/nativeui/include/stopwatch/StopwatchPresenter.h
new file mode 100644 (file)
index 0000000..76492ca
--- /dev/null
@@ -0,0 +1,17 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: StopwatchPresenter\r
+ * Create: 2025-06-06\r
+ */\r
+\r
+#ifndef STOPWATCH_PRESENTER_H\r
+#define STOPWATCH_PRESENTER_H\r
+\r
+#include "Presenter.h"\r
+\r
+namespace OHOS {\r
+class StopwatchView;\r
+class StopwatchPresenter : public Presenter<StopwatchView> {};\r
+}\r
+\r
+#endif  // STOPWATCH_PRESENTER_H
\ No newline at end of file
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/include/stopwatch/StopwatchView.h b/code/sdk/application/wearable/nativeapp/nativeui/include/stopwatch/StopwatchView.h
new file mode 100644 (file)
index 0000000..c35a570
--- /dev/null
@@ -0,0 +1,19 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: StopwatchView\r
+ * Create: 2025-06-06\r
+ */\r
+\r
+#ifndef STOPWATCH_VIEW_H\r
+#define STOPWATCH_VIEW_H\r
+\r
+#include "View.h"\r
+namespace OHOS {\r
+enum STOPWATCH_PAGES {\r
+    STOPWATCH_MAIN_PAGE = 1,  // 0 is invalid\r
+};\r
+\r
+class StopwatchPresenter;\r
+class StopwatchView : public View<StopwatchPresenter> {};\r
+}\r
+#endif  // STOPWATCH_VIEW_H\r
@@ -11,7 +11,7 @@
 #include "components/ui_label.h"\r
 #include "components/ui_label_button.h"\r
 #include "components/ui_scroll_view.h"\r
-#include "TempPresenter.h"\r
+#include "temperature/TempPresenter.h"\r
 \r
 namespace OHOS {\r
 class TempClickMea : public UIScrollView {\r
@@ -11,7 +11,7 @@
 #include "components/ui_image_view.h"\r
 #include "components/ui_label.h"\r
 #include "components/ui_view_group.h"\r
-#include "TempPresenter.h"\r
+#include "temperature/TempPresenter.h"\r
 \r
 namespace OHOS {\r
 class TempContinueWarn : public UIViewGroup {\r
@@ -10,8 +10,8 @@
 \r
 #include "components/ui_image_view.h"\r
 #include "components/ui_label.h"\r
-#include "AppGroupView.h"\r
-#include "TempPresenter.h"\r
+#include "main/AppGroupView.h"\r
+#include "temperature/TempPresenter.h"\r
 \r
 namespace OHOS {\r
 class TempExitInter : public AppGroupView {\r
@@ -11,7 +11,7 @@
 #include "components/ui_image_view.h"\r
 #include "components/ui_label.h"\r
 #include "components/ui_scroll_view.h"\r
-#include "TempPresenter.h"\r
+#include "temperature/TempPresenter.h"\r
 \r
 namespace OHOS {\r
 class TempExitPrompt : public UIScrollView {\r
@@ -11,8 +11,8 @@
 #include "components/ui_image_view.h"\r
 #include "components/ui_label.h"\r
 #include "components/ui_label_button.h"\r
-#include "AppGroupView.h"\r
-#include "TempPresenter.h"\r
+#include "main/AppGroupView.h"\r
+#include "temperature/TempPresenter.h"\r
 \r
 namespace OHOS {\r
 class TempInitInter : public AppGroupView {\r
@@ -11,7 +11,7 @@
 #include "components/ui_label.h"\r
 #include "components/ui_label_button.h"\r
 #include "components/ui_scroll_view.h"\r
-#include "TempPresenter.h"\r
+#include "temperature/TempPresenter.h"\r
 \r
 namespace OHOS {\r
 class TempJoinStudy : public UIScrollView {\r
 #include "components/ui_view_group.h"\r
 #include "ChangeSliceListener.h"\r
 #include "components/ui_swipe_view.h"\r
-#include "TempPresenter.h"\r
-#include "TempJoinStudy.h"\r
-#include "TempMeasure.h"\r
-#include "TempExitInter.h"\r
-#include "TempPromptWear.h"\r
-#include "TempClickMea.h"\r
-#include "TempRemindWear.h"\r
-#include "TempMeaProcess.h"\r
-#include "TempInitInter.h"\r
-#include "TempWarn.h"\r
-#include "TempLittleTip.h"\r
-#include "TempModel.h"\r
-#include "TempStudyAbout.h"\r
-#include "TempExitPrompt.h"\r
-#include "TempContinueWarn.h"\r
-#include "TempReport.h"\r
+#include "temperature/TempPresenter.h"\r
+#include "temperature/TempJoinStudy.h"\r
+#include "temperature/TempMeasure.h"\r
+#include "temperature/TempExitInter.h"\r
+#include "temperature/TempPromptWear.h"\r
+#include "temperature/TempClickMea.h"\r
+#include "temperature/TempRemindWear.h"\r
+#include "temperature/TempMeaProcess.h"\r
+#include "temperature/TempInitInter.h"\r
+#include "temperature/TempWarn.h"\r
+#include "temperature/TempLittleTip.h"\r
+#include "temperature/TempModel.h"\r
+#include "temperature/TempStudyAbout.h"\r
+#include "temperature/TempExitPrompt.h"\r
+#include "temperature/TempContinueWarn.h"\r
+#include "temperature/TempReport.h"\r
 \r
 namespace OHOS {\r
 class TempMainView;\r
@@ -12,7 +12,7 @@
 #include "components/ui_label.h"\r
 #include "components/ui_scroll_view.h"\r
 #include "components/ui_circle_progress.h"\r
-#include "TempPresenter.h"\r
+#include "temperature/TempPresenter.h"\r
 \r
 namespace OHOS {\r
 class TempMeaProcess : public UIScrollView {\r
@@ -11,8 +11,8 @@
 #include "components/ui_image_view.h"\r
 #include "components/ui_label.h"\r
 #include "components/ui_label_button.h"\r
-#include "AppGroupView.h"\r
-#include "TempPresenter.h"\r
+#include "main/AppGroupView.h"\r
+#include "temperature/TempPresenter.h"\r
 \r
 namespace OHOS {\r
 class TempMeasure : public AppGroupView {\r
@@ -14,7 +14,7 @@
 #include "components/ui_swipe_view.h"\r
 #include "wearable_log.h"\r
 #include "color.h"\r
-#include "ModelListenerSample.h"\r
+#include "main/ModelListenerSample.h"\r
 \r
 namespace OHOS {\r
 constexpr char* TEMP_JOIN_STUDY = (char*)"tempjoinstudy";\r
@@ -12,7 +12,7 @@
 #include "components/ui_label.h"\r
 #include "components/ui_label_button.h"\r
 #include "components/ui_scroll_view.h"\r
-#include "TempPresenter.h"\r
+#include "temperature/TempPresenter.h"\r
 \r
 namespace OHOS {\r
 class TempPromptWear : public UIScrollView {\r
@@ -11,7 +11,7 @@
 #include "components/ui_image_view.h"\r
 #include "components/ui_label.h"\r
 #include "components/ui_scroll_view.h"\r
-#include "TempPresenter.h"\r
+#include "temperature/TempPresenter.h"\r
 \r
 namespace OHOS {\r
 class TempRemindWear : public UIScrollView {\r
@@ -10,8 +10,8 @@
 \r
 #include "components/ui_image_view.h"\r
 #include "components/ui_label.h"\r
-#include "AppGroupView.h"\r
-#include "TempPresenter.h"\r
+#include "main/AppGroupView.h"\r
+#include "temperature/TempPresenter.h"\r
 \r
 namespace OHOS {\r
 class TempReport : public AppGroupView {\r
@@ -12,7 +12,7 @@
 #include "components/ui_label.h"\r
 #include "components/ui_label_button.h"\r
 #include "components/ui_scroll_view.h"\r
-#include "TempPresenter.h"\r
+#include "temperature/TempPresenter.h"\r
 \r
 namespace OHOS {\r
 class TempWarn : public UIScrollView {\r
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/include/timers/TimerMainPage.h b/code/sdk/application/wearable/nativeapp/nativeui/include/timers/TimerMainPage.h
new file mode 100644 (file)
index 0000000..417b92b
--- /dev/null
@@ -0,0 +1,49 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: TimerMainPage\r
+ * Create: 2025-06-09\r
+ */\r
+\r
+#ifndef TIMER_MAIN_PAGE_H\r
+#define TIMER_MAIN_PAGE_H\r
+\r
+#include <sys/time.h>\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 "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 "SlicePage.h"\r
+#include "common/image_cache_manager.h"\r
+#include "ui_resource_timer.h"\r
+\r
+namespace OHOS {\r
+    class TimerMainPage : public SlicePage<TimerPresenter>,\r
+                          public UIView::OnClickListener,\r
+                          public UIView::OnDragListener {\r
+    public:\r
+        TimerMainPage() = default;\r
+        ~TimerMainPage() 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 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
+    };\r
+}\r
+#endif // TIMER_MAIN_PAGE_H
\ No newline at end of file
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/include/timers/TimerModel.h b/code/sdk/application/wearable/nativeapp/nativeui/include/timers/TimerModel.h
new file mode 100644 (file)
index 0000000..fee8cd6
--- /dev/null
@@ -0,0 +1,56 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: TimerModel\r
+ * Create: 2025-06-09\r
+ */\r
+\r
+#ifndef TIMER_MODEL_H\r
+#define TIMER_MODEL_H\r
+\r
+#include <sys/time.h>\r
+#include <cstdint>\r
+#include <map>\r
+#include <mutex>\r
+#include "AppViewIDs.h"\r
+#include "UiConfig.h"\r
+#include "timers/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
+\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
+\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
+    };\r
+}\r
+\r
+#endif // TIMER_MODEL_H
\ No newline at end of file
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/include/timers/TimerPresenter.h b/code/sdk/application/wearable/nativeapp/nativeui/include/timers/TimerPresenter.h
new file mode 100644 (file)
index 0000000..e2d42ae
--- /dev/null
@@ -0,0 +1,31 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: TimerPresenter\r
+ * Create: 2025-06-09\r
+ */\r
+\r
+#ifndef TIMER_PRESENTER_H\r
+#define TIMER_PRESENTER_H\r
+\r
+#include "Presenter.h"\r
+#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
+}\r
+\r
+#endif // TIMER_PRESENTER_H
\ No newline at end of file
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/include/timers/TimerSettingPage.h b/code/sdk/application/wearable/nativeapp/nativeui/include/timers/TimerSettingPage.h
new file mode 100644 (file)
index 0000000..1ede0c7
--- /dev/null
@@ -0,0 +1,54 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: TimerSettingPage\r
+ * Create: 2025-06-09\r
+ */\r
+\r
+#ifndef TIMER_SETTING_PAGE_H\r
+#define TIMER_SETTING_PAGE_H\r
+\r
+#include "View.h"\r
+#include "components/ui_button.h"\r
+#include "components/ui_label.h"\r
+#include "components/ui_time_picker.h"\r
+#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 "SlicePage.h"\r
+#include "ChangeSliceListener.h"\r
+#include "ui_resource_timer.h"\r
+\r
+namespace OHOS {\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() 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
+\r
+        void CreateLabel(void);\r
+        void CreateStartButton(void);\r
+        void CreatePicker();\r
+        UIScrollView *InitTimerSetView();\r
+        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
+    };\r
+}\r
+#endif // TIMER_SETTING_PAGE_H
\ No newline at end of file
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/include/timers/TimerTimingPage.h b/code/sdk/application/wearable/nativeapp/nativeui/include/timers/TimerTimingPage.h
new file mode 100644 (file)
index 0000000..a64450a
--- /dev/null
@@ -0,0 +1,81 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: TimerTimingPage\r
+ * Create: 2025-06-09\r
+ */\r
+\r
+#ifndef TIMER_TIMING_PAGE_H\r
+#define TIMER_TIMING_PAGE_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_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 "timers/TimerModel.h"\r
+#include "timers/TimerPresenter.h"\r
+#include "SlicePage.h"\r
+#include "ChangeSliceListener.h"\r
+#include "components/ui_sweep_clock.h"\r
+#include "ui_resource_timer.h"\r
+\r
+namespace OHOS {\r
+    class TimerTimingPage : public SlicePage<TimerPresenter>,\r
+                            public UIView::OnClickListener,\r
+                            public UIView::OnDragListener {\r
+    public:\r
+        TimerTimingPage() = default;\r
+        ~TimerTimingPage() override;\r
+        void OnStart(void *data) override;\r
+        void OnResume() override;\r
+        void OnPause() override;\r
+\r
+        bool OnClick(UIView &view, const ClickEvent &event) override;\r
+        bool OnDrag(UIView &view, const DragEvent &event) override;\r
+        void CreateButton();\r
+        void CreateTimerTime();\r
+        void CircleProgress();\r
+        void SetTimerTime(uint32_t durationTime);\r
+        void SetupAnimator();\r
+        void SetAnimatorStatus(bool status);\r
+\r
+    private:\r
+        class TimeAnimatorCallback : public AnimatorCallback {\r
+        public:\r
+            TimeAnimatorCallback() {}\r
+            virtual ~TimeAnimatorCallback() override {}\r
+            void Callback(UIView *view) override;\r
+        };\r
+\r
+        class TimerTimingCallback : public AnimatorCallback {\r
+        public:\r
+            explicit TimerTimingCallback(TimerTimingPage *page) : page_(page) {}\r
+            ~TimerTimingCallback() override {}\r
+            void Callback(UIView *view) override;\r
+\r
+        private:\r
+            TimerTimingPage *page_{nullptr};\r
+        };\r
+\r
+        UIScrollView *group{nullptr};\r
+        UISweepClock *sweepClock_{nullptr};\r
+        UIDigitalClock *dClock{nullptr};\r
+        UILabel *title{nullptr};\r
+        UIDigitalClock *timerTime{nullptr};\r
+        UIImageView *reset{nullptr};\r
+        UIImageView *start{nullptr};\r
+        UICircleProgress *circleProgress{nullptr};\r
+        UILabel *currentTime_{nullptr};\r
+        TimeAnimatorCallback *timeCallback_{nullptr};\r
+        Animator *timeAnimator_{nullptr};\r
+        TimerTimingCallback *callBack_ = nullptr;\r
+        Animator *animator_ = nullptr;\r
+        Image *secondHand_{nullptr};\r
+        UIImageView *backround{nullptr};\r
+    };\r
+}\r
+#endif // TIMER_TIMING_PAGE_H
\ No newline at end of file
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/include/timers/TimerView.h b/code/sdk/application/wearable/nativeapp/nativeui/include/timers/TimerView.h
new file mode 100644 (file)
index 0000000..2849c44
--- /dev/null
@@ -0,0 +1,24 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: TimerView\r
+ * Create: 2025-06-09\r
+ */\r
+\r
+#ifndef TIMER_VIEW_H\r
+#define TIMER_VIEW_H\r
+\r
+#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
+\r
+    class TimerPresenter;\r
+    class TimerView : public View<TimerPresenter> {\r
+    };\r
+}\r
+#endif // TIMER_VIEW_H\r
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/include/training/DataView.h b/code/sdk/application/wearable/nativeapp/nativeui/include/training/DataView.h
new file mode 100644 (file)
index 0000000..d22cc55
--- /dev/null
@@ -0,0 +1,45 @@
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: Data View\r
+ * Create: 2025-03-22\r
+ */\r
+\r
+#ifndef TRAINING_DATA_VIEW_H\r
+#define TRAINING_DATA_VIEW_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_view_group.h"\r
+\r
+namespace OHOS {\r
+class DataView {\r
+public:\r
+    DataView();\r
+    ~DataView();\r
+    static DataView *GetInstance();\r
+    UIViewGroup *InitShowUpView(void);\r
+    void UpdateDataViewByType();\r
+\r
+private:\r
+    void ShowupBackgroup();\r
+    void ShowupTopView();\r
+    void ShowupLeftView();\r
+    void ShowupRightView();\r
+    void ShowupBottomView();\r
+    void ShowupSepLine();\r
+    UIImageView *backGround{nullptr};\r
+    UIImageView *heartrate{nullptr};\r
+    UICanvas *sepLine{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
+    UIViewGroup *group{nullptr};\r
+};\r
+}  // namespace OHOS\r
+#endif  // TRAINING_DATA_VIEW_H
\ No newline at end of file
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/include/training/MenuView.h b/code/sdk/application/wearable/nativeapp/nativeui/include/training/MenuView.h
new file mode 100644 (file)
index 0000000..02bd72e
--- /dev/null
@@ -0,0 +1,57 @@
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: Menu View\r
+ * Create: 2025-03-22\r
+ */\r
+\r
+#ifndef TRAINING_MENU_VIEW_H\r
+#define TRAINING_MENU_VIEW_H\r
+\r
+#include "components/ui_label.h"\r
+#include "components/ui_list.h"\r
+#include "components/ui_view_group.h"\r
+#include "training/TrainingItemView.h"\r
+#include "training/TrainingAdapter.h"\r
+#include "UiConfig.h"\r
+namespace OHOS {\r
+enum TrainingTypes : uint8_t {\r
+    TRAINING_TYPE_OUTDOOR_RUNNING = 0,\r
+    TRAINING_TYPE_INDOOR_RUNNING,\r
+    TRAINING_TYPE_CYCLING,\r
+    TRAINING_TYPE_CLIMBING,\r
+    TRAINING_TYPE_INDOOR_SWIMMING,\r
+    TRAINING_TYPE_OUTDOOR_SWIMMING,\r
+    TRAINING_TYPE_MAX,\r
+};\r
+\r
+#define TRAINING_ITEM_OUTDOOR_RUNNING "trainingItemOutdoorRunning"\r
+#define TRAINING_ITEM_INDOOR_RUNNING "trainingItemIndoorRunning"\r
+#define TRAINING_ITEM_CYCLING "trainingItemCycling"\r
+#define TRAINING_ITEM_CLIMBING "trainingItemClimbing"\r
+#define TRAINING_ITEM_INDOOR_SWIMMING "trainingItemIndoorSwimming"\r
+#define TRAINING_ITEM_OUTDOOR_SWIMMING "trainingItemOutdoorSwimming"\r
+\r
+class MenuView {\r
+public:\r
+    MenuView();\r
+    ~MenuView();\r
+    static MenuView *GetInstance();\r
+    UIViewGroup *InitShowUpView(void);\r
+\r
+private:\r
+    void CreateUILabel(void);\r
+    void CreateUIList(void);\r
+    UILabel *titleLabel{nullptr};\r
+    UIList *trainingList{nullptr};\r
+    TrainingAdapter *listAdapter_{nullptr};\r
+    UIViewGroup *group{nullptr};\r
+    TrainingItem trainings[TRAINING_TYPE_MAX] = {\r
+        {TRAINING_TYPE_OUTDOOR_RUNNING, PNG_APPLIST_WALK_IMAGE, "户外跑步", TRAINING_ITEM_OUTDOOR_RUNNING},\r
+        {TRAINING_TYPE_INDOOR_RUNNING, PNG_APPLIST_WALK_IMAGE, "室内跑步", TRAINING_ITEM_INDOOR_RUNNING},\r
+        {TRAINING_TYPE_CYCLING, PNG_APPLIST_WALK_IMAGE, "骑行", TRAINING_ITEM_CYCLING},\r
+        {TRAINING_TYPE_CLIMBING, PNG_APPLIST_WALK_IMAGE, "登山", TRAINING_ITEM_CLIMBING},\r
+        {TRAINING_TYPE_INDOOR_SWIMMING, PNG_APPLIST_WALK_IMAGE, "室内游泳", TRAINING_ITEM_INDOOR_SWIMMING},\r
+        {TRAINING_TYPE_OUTDOOR_SWIMMING, PNG_APPLIST_WALK_IMAGE, "户外游泳", TRAINING_ITEM_OUTDOOR_SWIMMING}};\r
+};\r
+}  // namespace OHOS\r
+#endif  // TRAINING_MENU_VIEW_H
\ No newline at end of file
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/include/training/PauseView.h b/code/sdk/application/wearable/nativeapp/nativeui/include/training/PauseView.h
new file mode 100644 (file)
index 0000000..cde8714
--- /dev/null
@@ -0,0 +1,35 @@
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: Pause View\r
+ * Create: 2025-03-22\r
+ */\r
+\r
+#ifndef TRAINING_PAUSE_VIEW_H\r
+#define TRAINING_PAUSE_VIEW_H\r
+\r
+#include "components/ui_label.h"\r
+#include "components/ui_label_button.h"\r
+#include "components/ui_view_group.h"\r
+\r
+namespace OHOS {\r
+#define TRAINING_PAUSE_CONTINUE_BUTTON "trainingPauseContinueButton"\r
+#define TRAINING_PAUSE_FINISH_BUTTON "trainingPauseFinishButton"\r
+\r
+class PauseView {\r
+public:\r
+    PauseView();\r
+    ~PauseView();\r
+    static PauseView *GetInstance();\r
+    UIViewGroup *InitShowUpView(void);\r
+\r
+private:\r
+    void CreateUILabel(void);\r
+    void CreateUIButton(void);\r
+    UILabel *timeLabel{nullptr};\r
+    UILabel *textLabel{nullptr};\r
+    UILabelButton *continueButton{nullptr};\r
+    UILabelButton *finishButton{nullptr};\r
+    UIViewGroup *group{nullptr};\r
+};\r
+}  // namespace OHOS\r
+#endif  // TRAINING_PAUSE_VIEW_H
\ No newline at end of file
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/include/training/PrepareView.h b/code/sdk/application/wearable/nativeapp/nativeui/include/training/PrepareView.h
new file mode 100644 (file)
index 0000000..1805406
--- /dev/null
@@ -0,0 +1,47 @@
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: Prepare View\r
+ * Create: 2025-03-22\r
+ */\r
+\r
+#ifndef TRAINING_PREPARE_VIEW_H\r
+#define TRAINING_PREPARE_VIEW_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
+\r
+namespace OHOS {\r
+#define TRAINING_PREPARE_START_BUTTON "trainingPrepareStartButton"\r
+class PrepareView {\r
+public:\r
+    PrepareView();\r
+    ~PrepareView();\r
+    static PrepareView *GetInstance();\r
+    UIViewGroup *InitShowUpView(void);\r
+    void UpdateViewByTrainingType(uint8_t trainingType);\r
+\r
+private:\r
+    bool InitBatteryView();\r
+    bool InitHeartbeatView();\r
+    bool InitTimeLableVIew();\r
+    bool InitLocatingLableVIew();\r
+    bool InitCenterView();\r
+    bool InitGPSView();\r
+    bool InitHeartrateView();\r
+    bool InitStartButtonView();\r
+    UILabel *timeLabel{nullptr};\r
+    UIImageView *battery{nullptr};\r
+    UILabel *batteryLabel{nullptr};\r
+    UIImageView *gpsImageView{nullptr};\r
+    UILabel *gpsLabel{nullptr};\r
+    UIImageView *heartRateImageView{nullptr};\r
+    UILabel *heartRateLabel{nullptr};\r
+    UILabel *locatingLabel{nullptr};\r
+    UILabelButton *startButton{nullptr};\r
+    UIButton *iconImageView{nullptr};\r
+    UIViewGroup *group{nullptr};\r
+};\r
+}  // namespace OHOS\r
+#endif  // TRAINING_PREPARE_VIEW_H
\ No newline at end of file
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/include/training/PromptView.h b/code/sdk/application/wearable/nativeapp/nativeui/include/training/PromptView.h
new file mode 100644 (file)
index 0000000..7a1d38f
--- /dev/null
@@ -0,0 +1,34 @@
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: Prompt View\r
+ * Create: 2025-03-22\r
+ */\r
+\r
+#ifndef PROMPT_VIEW_H\r
+#define PROMPT_VIEW_H\r
+\r
+#include "components/ui_label.h"\r
+#include "components/ui_button.h"\r
+#include "components/ui_view_group.h"\r
+\r
+namespace OHOS {\r
+#define TRAINING_PROMPT_CANCEL_BUTTON "trainingPromptCancelButton"\r
+#define TRAINING_PROMPT_CONFIRM_BUTTON "trainingPromptConfirmButton"\r
+\r
+class PromptView {\r
+public:\r
+    PromptView();\r
+    ~PromptView();\r
+    static PromptView *GetInstance();\r
+    UIViewGroup *InitShowUpView(void);\r
+\r
+private:\r
+    void CreateUILabel(void);\r
+    void CreateUIButton(void);\r
+    UILabel *titleLabel{nullptr};\r
+    UIButton *cancelButton{nullptr};\r
+    UIButton *confirmButton{nullptr};\r
+    UIViewGroup *group{nullptr};\r
+};\r
+}  // namespace OHOS\r
+#endif  // PROMPT_VIEW_H
\ No newline at end of file
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/include/training/TargetAdapter.h b/code/sdk/application/wearable/nativeapp/nativeui/include/training/TargetAdapter.h
new file mode 100644 (file)
index 0000000..74045cd
--- /dev/null
@@ -0,0 +1,54 @@
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: TargetAdapter.h\r
+ * Author:\r
+ * Create: 2025-11-23\r
+ */\r
+\r
+#ifndef TARGET_ADAPTER_H\r
+#define TARGET_ADAPTER_H\r
+\r
+#include <list>\r
+#include "training/TargetItemView.h"\r
+#include "components/abstract_adapter.h"\r
+\r
+namespace OHOS {\r
+\r
+class TargetAdapter : public AbstractAdapter {\r
+public:\r
+    explicit TargetAdapter();\r
+    ~TargetAdapter() override;\r
+\r
+    /* *\r
+    * @brief Sets the UIView adapter data, which is a SettingItem linked list.\r
+    *\r
+    * @param data Indicates the SettingItem linked list data.\r
+    * @since 1.0\r
+    * @version 1.0\r
+    */\r
+    void SetData(const std::list<TargetItem> &data);\r
+\r
+    /* *\r
+    * @brief Obtains the <b>data</b> size of the UILabel adapter.\r
+    *\r
+    * @return Returns the <b>data</b> size of the UILabel adapter.\r
+    * @since 1.0\r
+    * @version 1.0\r
+    */\r
+    uint16_t GetCount(void) override;\r
+\r
+    UIView *GetView(UIView *inView, int16_t index) override;\r
+\r
+    void AddListItem(const TargetItem &item);\r
+\r
+    void SetItemClickListener(UIView::OnClickListener *itemclicklistener)\r
+    {\r
+        itemClickListener = itemclicklistener;\r
+    }\r
+private:\r
+    std::list<TargetItem> listData_;\r
+    UIView::OnClickListener *itemClickListener{nullptr};\r
+};\r
+}\r
+\r
+#endif   // TARGET_ADAPTER_H
\ No newline at end of file
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/include/training/TargetItemView.h b/code/sdk/application/wearable/nativeapp/nativeui/include/training/TargetItemView.h
new file mode 100644 (file)
index 0000000..13c211f
--- /dev/null
@@ -0,0 +1,38 @@
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: TargetItemView\r
+ * Author:\r
+ * Create: 2025-02-15\r
+ */\r
+\r
+#ifndef TARGET_ITEM_H\r
+#define TARGET_ITEM_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 type;\r
+    const char *icon;\r
+    const char *label;\r
+    const char *viewId;\r
+} TargetItem;\r
+\r
+class TargetItemView : public UIViewGroup {\r
+public:\r
+    TargetItemView();\r
+    ~TargetItemView() override;\r
+\r
+    virtual void SetItemInfo(const TargetItem itemInfo);\r
+\r
+private:\r
+    bool InitView();\r
+    UIImageView sIcon;\r
+    UILabel sLabel;\r
+    UIImageView sNextImage;\r
+    TargetItem sItemInfo = {0, nullptr, nullptr, nullptr};\r
+};\r
+}\r
+#endif
\ No newline at end of file
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/include/training/TargetSettingView.h b/code/sdk/application/wearable/nativeapp/nativeui/include/training/TargetSettingView.h
new file mode 100644 (file)
index 0000000..69ed6f1
--- /dev/null
@@ -0,0 +1,36 @@
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: TargetSetting View\r
+ * Create: 2025-03-22\r
+ */\r
+\r
+#ifndef TRAINING_TARGET_SETTING_VIEW_H\r
+#define TRAINING_TARGET_SETTING_VIEW_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
+\r
+namespace OHOS {\r
+#define TARGET_SETTING_CONFIRM_BUTTON "targetSettingConfirmButton"\r
+\r
+class TargetSettingView {\r
+public:\r
+    TargetSettingView();\r
+    ~TargetSettingView();\r
+    static TargetSettingView *GetInstance();\r
+    UIViewGroup *InitShowUpView(void);\r
+    void UpdateViewByTargetType(uint8_t targetType);\r
+\r
+private:\r
+    void CreateUILabel(void);\r
+    void CreateUIPicker(void);\r
+    void CreateUIButton(void);\r
+    UILabel *titleLabel{nullptr};\r
+    UIPicker *picker{nullptr};\r
+    UILabelButton *confirmButton{nullptr};\r
+    UIViewGroup *group{nullptr};\r
+};\r
+}  // namespace OHOS\r
+#endif  // TRAINING_TARGET_SETTING_VIEW_H
\ No newline at end of file
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/include/training/TargetView.h b/code/sdk/application/wearable/nativeapp/nativeui/include/training/TargetView.h
new file mode 100644 (file)
index 0000000..14e71ed
--- /dev/null
@@ -0,0 +1,48 @@
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: Target View\r
+ * Create: 2025-03-22\r
+ */\r
+\r
+#ifndef TRAINING_TARGET_VIEW_H\r
+#define TRAINING_TARGET_VIEW_H\r
+\r
+#include "components/ui_label.h"\r
+#include "components/ui_list.h"\r
+#include "components/ui_view_group.h"\r
+#include "training/TargetItemView.h"\r
+#include "training/TargetAdapter.h"\r
+#include "UiConfig.h"\r
+namespace OHOS {\r
+enum TrainingTargets : uint8_t {\r
+    TRAINING_TARGET_DISTANCE = 0,\r
+    TRAINING_TARGET_TIME,\r
+    TRAINING_TARGET_CALORIE,\r
+    TRAINING_TARGET_MAX,\r
+};\r
+\r
+#define TRAINING_TARGET_ITEM_DISTANCE "trainingTargetItemDistance"\r
+#define TRAINING_TARGET_ITEM_TIME "trainingTargetItemTime"\r
+#define TRAINING_TARGET_ITEM_CALORIE "trainingTargetItemCalorie"\r
+\r
+class TargetView {\r
+public:\r
+    TargetView();\r
+    ~TargetView();\r
+    static TargetView *GetInstance();\r
+    UIViewGroup *InitShowUpView(void);\r
+\r
+private:\r
+    void CreateUILabel(void);\r
+    void CreateUIList(void);\r
+    UILabel *titleLabel{nullptr};\r
+    UIList *targetList{nullptr};\r
+    TargetAdapter *listAdapter_{nullptr};\r
+    UIViewGroup *group{nullptr};\r
+    TargetItem targets[TRAINING_TARGET_MAX] = {\r
+        {TRAINING_TARGET_DISTANCE, PNG_PHONE_IMAGE, "距离", TRAINING_TARGET_ITEM_DISTANCE},\r
+        {TRAINING_TARGET_TIME, PNG_WATCH_IMAGE, "时间", TRAINING_TARGET_ITEM_TIME},\r
+        {TRAINING_TARGET_CALORIE, PNG_BLUETOOTH_IMAGE, "热量", TRAINING_TARGET_ITEM_CALORIE}};\r
+};\r
+}  // namespace OHOS\r
+#endif  // TRAINING_TARGET_VIEW_H
\ No newline at end of file
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/include/training/TrainingAdapter.h b/code/sdk/application/wearable/nativeapp/nativeui/include/training/TrainingAdapter.h
new file mode 100644 (file)
index 0000000..19b747c
--- /dev/null
@@ -0,0 +1,54 @@
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: TrainingAdapter.h\r
+ * Author:\r
+ * Create: 2025-11-23\r
+ */\r
+\r
+#ifndef TRAINING_ADAPTER_H\r
+#define TRAINING_ADAPTER_H\r
+\r
+#include <list>\r
+#include "training/TrainingItemView.h"\r
+#include "components/abstract_adapter.h"\r
+\r
+namespace OHOS {\r
+\r
+class TrainingAdapter : public AbstractAdapter {\r
+public:\r
+    explicit TrainingAdapter();\r
+    ~TrainingAdapter() override;\r
+\r
+    /* *\r
+    * @brief Sets the UIView adapter data, which is a SettingItem linked list.\r
+    *\r
+    * @param data Indicates the SettingItem linked list data.\r
+    * @since 1.0\r
+    * @version 1.0\r
+    */\r
+    void SetData(const std::list<TrainingItem> &data);\r
+\r
+    /* *\r
+    * @brief Obtains the <b>data</b> size of the UILabel adapter.\r
+    *\r
+    * @return Returns the <b>data</b> size of the UILabel adapter.\r
+    * @since 1.0\r
+    * @version 1.0\r
+    */\r
+    uint16_t GetCount(void) override;\r
+\r
+    UIView *GetView(UIView *inView, int16_t index) override;\r
+\r
+    void AddListItem(const TrainingItem &item);\r
+\r
+    void SetItemClickListener(UIView::OnClickListener *itemclicklistener)\r
+    {\r
+        itemClickListener = itemclicklistener;\r
+    }\r
+private:\r
+    std::list<TrainingItem> listData_;\r
+    UIView::OnClickListener *itemClickListener{nullptr};\r
+};\r
+}\r
+\r
+#endif   // TRAINING_ADAPTER_H
\ No newline at end of file
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/include/training/TrainingItemView.h b/code/sdk/application/wearable/nativeapp/nativeui/include/training/TrainingItemView.h
new file mode 100644 (file)
index 0000000..7b863f9
--- /dev/null
@@ -0,0 +1,38 @@
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: TrainingItemView\r
+ * Author:\r
+ * Create: 2025-02-15\r
+ */\r
+\r
+#ifndef TRAINING_ITEM_H\r
+#define TRAINING_ITEM_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 type;\r
+    const char *icon;\r
+    const char *label;\r
+    const char *viewId;\r
+} TrainingItem;\r
+\r
+class TrainingItemView : public UIViewGroup {\r
+public:\r
+    TrainingItemView();\r
+    ~TrainingItemView() override;\r
+\r
+    virtual void SetItemInfo(const TrainingItem itemInfo);\r
+\r
+private:\r
+    bool InitView();\r
+    UIImageView sIcon;\r
+    UILabel sLabel;\r
+    UIImageView sSettingImage;\r
+    TrainingItem sItemInfo = {0, nullptr, nullptr, nullptr};\r
+};\r
+}\r
+#endif
\ No newline at end of file
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/include/training/TrainingModel.h b/code/sdk/application/wearable/nativeapp/nativeui/include/training/TrainingModel.h
new file mode 100644 (file)
index 0000000..32b122c
--- /dev/null
@@ -0,0 +1,31 @@
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: TrainingModel.h\r
+ * Author:\r
+ * Create: 2025-11-23\r
+ */\r
+\r
+#ifndef TRAINING_MODEL_H\r
+#define TRAINING_MODEL_H\r
+\r
+#include <inttypes.h>\r
+namespace OHOS {\r
+class TrainingModel {\r
+public:\r
+    static TrainingModel &GetInstance(void);\r
+    void SetCurView(int16_t viewNum);\r
+    int16_t GetCurView(void);\r
+    void SetCurTrainingType(int8_t trainingType);\r
+    int8_t GetCurTrainingType(void);\r
+\r
+private:\r
+    TrainingModel();\r
+    TrainingModel(const TrainingModel &);\r
+    TrainingModel &operator=(const TrainingModel &);\r
+    virtual ~TrainingModel();\r
+    int16_t curView_{0};\r
+    uint8_t trainingType_{0};\r
+};\r
+}\r
+\r
+#endif  // TRAINING_MODEL_H
\ No newline at end of file
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/include/training/TrainingPresenter.h b/code/sdk/application/wearable/nativeapp/nativeui/include/training/TrainingPresenter.h
new file mode 100644 (file)
index 0000000..b23bfcb
--- /dev/null
@@ -0,0 +1,45 @@
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: TrainingPresenter.h\r
+ * Author:\r
+ * Create: 2025-11-23\r
+ */\r
+\r
+#ifndef TRAINING_PRESENTER_H\r
+#define TRAINING_PRESENTER_H\r
+\r
+#include "Presenter.h"\r
+#include "training/TrainingView.h"\r
+#include "training/TrainingModel.h"\r
+#include "components/ui_view.h"\r
+\r
+namespace OHOS {\r
+class TrainingView;\r
+class TrainingPresenter : public Presenter<TrainingView>,\r
+                           public UIView::OnClickListener,\r
+                           public UIView::OnDragListener {\r
+public:\r
+    TrainingPresenter();\r
+    ~TrainingPresenter() override;\r
+    static TrainingPresenter *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
+private:\r
+    void ClickStartButton(void);\r
+    void ClickCountineButton(void);\r
+    void ClickFinishButton(void);\r
+    void ClickCancelButton(void);\r
+    void ClickConfirmButton(void);\r
+    void TrainingSetting(uint8_t trainingType);\r
+    void StartTraining(uint8_t trainingType);\r
+    void SettingTarget(uint8_t targetType);\r
+    void EnterTarget(void);\r
+    void ConfirmTargetSetting(void);\r
+    TrainingModel *trainingModel_{nullptr};\r
+};\r
+}\r
+\r
+#endif // TRAINING_PRESENTER_H
\ No newline at end of file
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/include/training/TrainingSettingAdapter.h b/code/sdk/application/wearable/nativeapp/nativeui/include/training/TrainingSettingAdapter.h
new file mode 100644 (file)
index 0000000..b0c1d82
--- /dev/null
@@ -0,0 +1,54 @@
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: TrainingSettingAdapter.h\r
+ * Author:\r
+ * Create: 2025-11-23\r
+ */\r
+\r
+#ifndef TRAINING_SETTING_ADAPTER_H\r
+#define TRAINING_SETTING_ADAPTER_H\r
+\r
+#include <list>\r
+#include "training/TrainingSettingItemView.h"\r
+#include "components/abstract_adapter.h"\r
+\r
+namespace OHOS {\r
+\r
+class TrainingSettingAdapter : public AbstractAdapter {\r
+public:\r
+    explicit TrainingSettingAdapter();\r
+    ~TrainingSettingAdapter() override;\r
+\r
+    /* *\r
+    * @brief Sets the UIView adapter data, which is a SettingItem linked list.\r
+    *\r
+    * @param data Indicates the SettingItem linked list data.\r
+    * @since 1.0\r
+    * @version 1.0\r
+    */\r
+    void SetData(const std::list<TrainingSettingItem> &data);\r
+\r
+    /* *\r
+    * @brief Obtains the <b>data</b> size of the UILabel adapter.\r
+    *\r
+    * @return Returns the <b>data</b> size of the UILabel adapter.\r
+    * @since 1.0\r
+    * @version 1.0\r
+    */\r
+    uint16_t GetCount(void) override;\r
+\r
+    UIView *GetView(UIView *inView, int16_t index) override;\r
+\r
+    void AddListItem(const TrainingSettingItem &item);\r
+\r
+    void SetItemClickListener(UIView::OnClickListener *itemclicklistener)\r
+    {\r
+        itemClickListener = itemclicklistener;\r
+    }\r
+private:\r
+    std::list<TrainingSettingItem> listData_;\r
+    UIView::OnClickListener *itemClickListener{nullptr};\r
+};\r
+}\r
+\r
+#endif   // TRAINING_SETTING_ADAPTER_H
\ No newline at end of file
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/include/training/TrainingSettingItemView.h b/code/sdk/application/wearable/nativeapp/nativeui/include/training/TrainingSettingItemView.h
new file mode 100644 (file)
index 0000000..26a6442
--- /dev/null
@@ -0,0 +1,38 @@
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: TrainingSettingItemView.h\r
+ * Author:\r
+ * Create: 2025-11-23\r
+ */\r
+\r
+#ifndef TRAINING_SETTING_ITEM_H\r
+#define TRAINING_SETTING_ITEM_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 type;\r
+    const char *icon;\r
+    const char *label;\r
+    const char *viewId;\r
+} TrainingSettingItem;\r
+\r
+class TrainingSettingItemView : public UIViewGroup {\r
+public:\r
+    TrainingSettingItemView();\r
+    ~TrainingSettingItemView() override;\r
+\r
+    virtual void SetItemInfo(const TrainingSettingItem itemInfo);\r
+\r
+private:\r
+    bool InitView();\r
+    UIImageView sIcon;\r
+    UILabel sLabel;\r
+    UIImageView sNextImage;\r
+    TrainingSettingItem sItemInfo = {0, nullptr, nullptr, nullptr};\r
+};\r
+}\r
+#endif
\ No newline at end of file
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/include/training/TrainingSettingView.h b/code/sdk/application/wearable/nativeapp/nativeui/include/training/TrainingSettingView.h
new file mode 100644 (file)
index 0000000..deba904
--- /dev/null
@@ -0,0 +1,58 @@
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: TrainingSetting View\r
+ * Create: 2025-03-22\r
+ */\r
+\r
+#ifndef TRAINING_SETTING_VIEW_H\r
+#define TRAINING_SETTING_VIEW_H\r
+\r
+#include "components/ui_label.h"\r
+#include "components/ui_list.h"\r
+#include "components/ui_view_group.h"\r
+#include "training/TrainingSettingItemView.h"\r
+#include "training/TrainingSettingAdapter.h"\r
+#include "UiConfig.h"\r
+\r
+namespace OHOS {\r
+enum TrainingSettings : uint8_t {\r
+    TRAINING_SETTING_TARGET = 0,\r
+    TRAINING_SETTING_REMIND,\r
+    TRAINING_SETTING_MISTOUCH,\r
+    TRAINING_SETTING_DATA_DISPLAY,\r
+    TRAINING_SETTING_METRONOME,\r
+    TRAINING_SETTING_REMOVE,\r
+    TRAINING_SETTING_MAX,\r
+};\r
+\r
+#define TRAINING_SETTING_ITEM_TARGET "trainingSettingItemTarget"\r
+#define TRAINING_SETTING_ITEM_REMIND "trainingSettingItemTargetRemind"\r
+#define TRAINING_SETTING_ITEM_MISTOUCH "trainingSettingItemTargetMistouch"\r
+#define TRAINING_SETTING_ITEM_DATA_DISPLAY "trainingSettingItemTargetDataDisplay"\r
+#define TRAINING_SETTING_ITEM_METRONOME "trainingSettingItemTargetMetronome"\r
+#define TRAINING_SETTING_ITEM_REMOVE "trainingSettingItemTargetRemove"\r
+\r
+class TrainingSettingView {\r
+public:\r
+    TrainingSettingView();\r
+    ~TrainingSettingView();\r
+    static TrainingSettingView *GetInstance();\r
+    UIViewGroup *InitShowUpView(void);\r
+\r
+private:\r
+    void CreateUILabel(void);\r
+    void CreateUIList(void);\r
+    UILabel *titleLabel{nullptr};\r
+    UIList *settingList{nullptr};\r
+    TrainingSettingAdapter *listAdapter_{nullptr};\r
+    UIViewGroup *group{nullptr};\r
+    TrainingSettingItem settings[TRAINING_SETTING_MAX] = {\r
+        {TRAINING_SETTING_TARGET, PNG_BLUETOOTH_IMAGE, "目标", TRAINING_SETTING_ITEM_TARGET},\r
+        {TRAINING_SETTING_REMIND, PNG_WATCH_IMAGE, "提醒", TRAINING_SETTING_ITEM_REMIND},\r
+        {TRAINING_SETTING_MISTOUCH, PNG_PHONE_IMAGE, "防误触", TRAINING_SETTING_ITEM_MISTOUCH},\r
+        {TRAINING_SETTING_DATA_DISPLAY, PNG_BLUETOOTH_IMAGE, "数据显示", TRAINING_SETTING_ITEM_DATA_DISPLAY},\r
+        {TRAINING_SETTING_METRONOME, PNG_WATCH_IMAGE, "节拍器", TRAINING_SETTING_ITEM_METRONOME},\r
+        {TRAINING_SETTING_REMOVE, PNG_PHONE_IMAGE, "移除此运动", TRAINING_SETTING_ITEM_REMOVE}};\r
+};\r
+}  // namespace OHOS\r
+#endif  // SETTING_SETTING_VIEW_H
\ No newline at end of file
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/include/training/TrainingView.h b/code/sdk/application/wearable/nativeapp/nativeui/include/training/TrainingView.h
new file mode 100644 (file)
index 0000000..8c1bbd9
--- /dev/null
@@ -0,0 +1,77 @@
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: TrainingViews View\r
+ * Create: 2025-03-22\r
+ */\r
+\r
+#ifndef TRAINING_VIEW_H\r
+#define TRAINING_VIEW_H\r
+\r
+#include "View.h"\r
+#include "components/ui_view_group.h"\r
+#include "training/MenuView.h"\r
+#include "training/PrepareView.h"\r
+#include "training/DataView.h"\r
+#include "training/PauseView.h"\r
+#include "training/PromptView.h"\r
+#include "training/TrainingSettingView.h"\r
+#include "training/TargetView.h"\r
+#include "training/TargetSettingView.h"\r
+\r
+namespace OHOS {\r
+enum TrainingViews : uint8_t {\r
+    TRAINING_VIEW_MENU,\r
+    TRAINING_VIEW_PREPARE,\r
+    TRAINING_VIEW_DATA,\r
+    TRAINING_VIEW_PAUSE,\r
+    TRAINING_VIEW_PROMPT,\r
+    TRAINING_VIEW_SETTING,\r
+    TRAINING_VIEW_TARGET,\r
+    TRAINING_VIEW_TARGET_SETTING,\r
+    TRAINING_VIEW_MAX,\r
+};\r
+\r
+constexpr const char *MENU_VIEW_ID = "MenuViewID";\r
+constexpr const char *PREPARE_VIEW_ID = "PrepareViewID";\r
+constexpr const char *DATA_VIEW_ID = "DataViewID";\r
+constexpr const char *PAUSE_VIEW_ID = "PauseViewID";\r
+constexpr const char *PROMPT_VIEW_ID = "PromptViewID";\r
+constexpr const char *SETTING_VIEW_ID = "SettingViewID";\r
+constexpr const char *TARGET_VIEW_ID = "TargetViewID";\r
+constexpr const char *TARGET_SETTING_VIEW_ID = "TargetSettingViewID";\r
+\r
+class TrainingPresenter;\r
+class TrainingView : public View<TrainingPresenter> {\r
+public:\r
+    TrainingView();\r
+    ~TrainingView() override;\r
+    static TrainingView *GetInstance();\r
+\r
+    void OnStart() override;\r
+    void OnStop() override;\r
+    void ChangeView(int16_t hideView, int16_t showView);\r
+\r
+private:\r
+    UIViewGroup *container[TRAINING_VIEW_MAX]{nullptr};\r
+    typedef bool (TrainingView::*PreprosssChangeView)(int16_t hideView, int16_t thisView);\r
+    PreprosssChangeView preProcessView[TRAINING_VIEW_MAX];\r
+    bool CheckViewParam(int16_t hideView, int16_t showView);\r
+    MenuView *menuView{nullptr};\r
+    PrepareView *prepareView{nullptr};\r
+    DataView *dataView{nullptr};\r
+    PauseView *pauseView{nullptr};\r
+    PromptView *promptView{nullptr};\r
+    TrainingSettingView *settingView{nullptr};\r
+    TargetView *targetView{nullptr};\r
+    TargetSettingView *targetSettingView{nullptr};\r
+    bool ChangeMenuView(int16_t hideView, int16_t thisView);\r
+    bool ChangePrepareView(int16_t hideView, int16_t thisView);\r
+    bool ChangeDataView(int16_t hideView, int16_t thisView);\r
+    bool ChangePauseView(int16_t hideView, int16_t thisView);\r
+    bool ChangePromptView(int16_t hideView, int16_t thisView);\r
+    bool ChangeSettingView(int16_t hideView, int16_t thisView);\r
+    bool ChangeTargetView(int16_t hideView, int16_t thisView);\r
+    bool ChangeTargetSettingView(int16_t hideView, int16_t thisView);\r
+};\r
+}\r
+#endif  // TRAINING_VIEW_H\r
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/include/uiservice/ui_language.h b/code/sdk/application/wearable/nativeapp/nativeui/include/uiservice/ui_language.h
new file mode 100644 (file)
index 0000000..4595d10
--- /dev/null
@@ -0,0 +1,22 @@
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025. All rights reserved.\r
+ * Description: Breath Ease\r
+ * Author: wangle\r
+ * Create: 2025-4-23\r
+ */\r
+#ifndef UI_MANAGER_H\r
+#define UI_MANAGER_H\r
+#include <cstdint>\r
+#include "main/AppGroupView.h"\r
+\r
+namespace OHOS {\r
+class UILanguage {\r
+public:\r
+    static const char* GetText(uint16_t textId);\r
+    static void SetLanguage(uint8_t id);\r
+    static void UpdateLanguage();\r
+private:\r
+    static bool RegisterGlobalManager();\r
+};\r
+}\r
+#endif
\ No newline at end of file
@@ -46,7 +46,9 @@ typedef enum {
     BT_DISCONNECTED_TO_UI,
     UI_ADD_SLEEP_VETO,
     UI_RM_SLEEP_VETO,
+    UI_UPDATE_LANGUAGE,
     CONNECT_NEW_PHONE,
+    UI_OTA_UPDATE,
 } UiServiceMsgId;
 
 #define BUNDLE_NAME_LEN 128
@@ -6,13 +6,13 @@
 #define VIDEO_CARD_H
 
 #include <string>
-#include "DialDataBase.h"
+#include "main/dial/DialDataBase.h"
 #include "components/ui_view_group.h"
-#include "OnDialDataUpdateListener.h"
+#include "main/dial/OnDialDataUpdateListener.h"
 #include "components/ui_card_page.h"
 #include "components/ui_lite_surface_view.h"
 #include "video_play_wrapper.h"
-#include "DialView.h"
+#include "main/dial/DialView.h"
 
 namespace OHOS {
 class VideoCard : public UICardPage {
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/include/weather/WeatherAdapter.h b/code/sdk/application/wearable/nativeapp/nativeui/include/weather/WeatherAdapter.h
new file mode 100644 (file)
index 0000000..c94553b
--- /dev/null
@@ -0,0 +1,60 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: weather/WeatherAdapter.h\r
+ * Create: 2025-03-23\r
+ */\r
+\r
+#ifndef WEATHER_ADAPTER_H\r
+#define WEATHER_ADAPTER_H\r
+\r
+#include <list>\r
+#include <string>\r
+#include "components/ui_list.h"\r
+#include "components/ui_label.h"\r
+#include "components/ui_view_group.h"\r
+#include "components/ui_image_view.h"\r
+#include "components/abstract_adapter.h"\r
+#include "wearable_log.h"\r
+#include "UiConfig.h"\r
+#include "weather/WeatherModel.h"\r
+#include "weather/WeatherItemView.h"\r
+\r
+namespace OHOS {\r
+class WeatherAdapter : public AbstractAdapter {\r
+public:\r
+    explicit WeatherAdapter();\r
+    ~WeatherAdapter() override;\r
+\r
+    /* *\r
+    * @brief Sets the UIView adapter data, which is a WeatherItem linked list.\r
+    *\r
+    * @param data Indicates the WeatherItem linked list data.\r
+    * @since 1.0\r
+    * @version 1.0\r
+    */\r
+    void SetData(std::list<WeatherItem> &data);\r
+\r
+    /* *\r
+    * @brief Obtains the <b>data</b> size of the UILabel adapter.\r
+    *\r
+    * @return Returns the <b>data</b> size of the UILabel adapter.\r
+    * @since 1.0\r
+    * @version 1.0\r
+    */\r
+    uint16_t GetCount(void) override;\r
+\r
+    UIView *GetView(UIView *inView, int16_t index) override;\r
+\r
+    void AddListItem(const WeatherItem &item);\r
+\r
+    void SetItemClickListener(UIView::OnClickListener *itemclicklistener)\r
+    {\r
+        itemClickListener = itemclicklistener;\r
+    }\r
+private:\r
+    std::list<WeatherItem> listData;\r
+    UIView::OnClickListener *itemClickListener{nullptr};\r
+};\r
+}\r
+\r
+#endif
\ No newline at end of file
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/include/weather/WeatherItemView.h b/code/sdk/application/wearable/nativeapp/nativeui/include/weather/WeatherItemView.h
new file mode 100644 (file)
index 0000000..13c19fa
--- /dev/null
@@ -0,0 +1,36 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: WeatherItemView\r
+ * Create: 2025-03-23\r
+ */\r
+\r
+#ifndef WEATHER_ITEM_VIEW_H\r
+#define WEATHER_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 "components/ui_canvas.h"\r
+\r
+#include "UiConfig.h"\r
+#include "weather/WeatherModel.h"\r
+\r
+namespace OHOS {\r
+class WeatherItemView : public UIViewGroup {\r
+public:\r
+    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
+};\r
+}\r
+\r
+#endif\r
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/include/weather/WeatherMainPage.h b/code/sdk/application/wearable/nativeapp/nativeui/include/weather/WeatherMainPage.h
new file mode 100644 (file)
index 0000000..31a9ea0
--- /dev/null
@@ -0,0 +1,54 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: WeatherMainPage\r
+ * Created: 2025-4\r
+ */\r
+\r
+#ifndef WEATHER_MAIN_PAGE_H\r
+#define WEATHER_MAIN_PAGE_H\r
+\r
+#include <sys/time.h>\r
+#include "components/ui_label_button.h"\r
+#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 "SlicePage.h"\r
+#include "UiConfig.h"\r
+#include "weather/WeatherView.h"\r
+namespace OHOS {\r
+static constexpr int16_t LABEL_COUNT = 6;\r
+class WeatherPresenter;\r
+class WeatherMainPage : public SlicePage<WeatherPresenter>,\r
+                        public UIView::OnClickListener,\r
+                        public UIView::OnDragListener {\r
+public:\r
+    WeatherMainPage();\r
+    ~WeatherMainPage() 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
+    std::string FormatTime(bool falg, const std::string& inputStr);\r
+    void InitLabel();\r
+    void InitImage();\r
+    void InitWeatherImage();\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
+};\r
+}\r
+#endif // SETTING_MAIN_PAGE_H
\ No newline at end of file
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/include/weather/WeatherModel.h b/code/sdk/application/wearable/nativeapp/nativeui/include/weather/WeatherModel.h
new file mode 100644 (file)
index 0000000..55d135a
--- /dev/null
@@ -0,0 +1,185 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: WeatherModel\r
+ * Create: 2025-03-23\r
+ */\r
+\r
+#ifndef WEATHER_MODEL_H\r
+#define WEATHER_MODEL_H\r
+\r
+#include <sys/time.h>\r
+#include <fstream>\r
+#include <sstream>\r
+#include <cstdint>\r
+#include <map>\r
+#include <iostream>\r
+#include <random>\r
+#include <chrono>\r
+#include <ctime>\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 "common/image_cache_manager.h"\r
+#include "main/LoadImg.h"\r
+#include "ui_resource_weather.h"\r
+#ifndef _WIN32\r
+#include "time64.h"\r
+#endif\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 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
+\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
+\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
+\r
+typedef struct {\r
+    const char *label_1;\r
+    const ImageInfo *icon;\r
+    const char *label_2;\r
+    bool hasSecondMenu;\r
+} WeatherItem;\r
+\r
+typedef struct {\r
+    const char *min_degree;\r
+    const char *max_degree;\r
+    const char *address;\r
+    const char *weather_code;\r
+    const char *degree;\r
+    const char *updateTime;\r
+    const char *humidity;\r
+    std::string sunSet;\r
+    std::string sunRise;\r
+} CurWeather;\r
+\r
+typedef struct {\r
+    const char *hour;\r
+    const char *degree;\r
+    const char *weather;\r
+} HourWeather;\r
+class WeatherModel {\r
+public:\r
+    static WeatherModel &GetInstance(void);\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 UpdateTemp();\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
+    void SetDayStatus(const std::string &timeRise, const std::string &timeSet);\r
+    bool GetDayStatus();\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
+};\r
+}\r
+\r
+#endif  // Weather_MODEL_H
\ No newline at end of file
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/include/weather/WeatherPageSecond.h b/code/sdk/application/wearable/nativeapp/nativeui/include/weather/WeatherPageSecond.h
new file mode 100644 (file)
index 0000000..8563835
--- /dev/null
@@ -0,0 +1,51 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: WeatherPageSecond\r
+ * Create: 2025-03-15\r
+ */\r
+\r
+#ifndef WEATHER_PAGESECOND_H\r
+#define WEATHER_PAGESECOND_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 "weather/WeatherPresenter.h"\r
+#include "weather/WeatherView.h"\r
+#include "SlicePage.h"\r
+#include "UiConfig.h"\r
+namespace OHOS {\r
+class WeatherPresenter;\r
+class WeatherPageSecond : public SlicePage<WeatherPresenter>,\r
+                        public UIView::OnClickListener,\r
+                        public UIView::OnDragListener,\r
+                        public UISwipeView::OnSwipeListener {\r
+public:\r
+    WeatherPageSecond();\r
+    ~WeatherPageSecond() 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 WeatherInit(UIViewGroup *group);\r
+    void InitLabel(UIViewGroup *group, int count);\r
+    void InitImage(UIViewGroup *group, int count);\r
+    bool SetSwipeInter();\r
+    void InitVecWeather();\r
+private:\r
+    WeatherModel *weatherModel = nullptr;\r
+    std::vector<HourWeather> houWeather;\r
+    UISwipeView *weatherSwipeGroup = nullptr;\r
+    UIViewGroup *swipeGroup[SET_THREE]{nullptr};\r
+    UIImageView *imgBack[SET_EIGHT]{nullptr};\r
+    UILabel *labelTime[SET_EIGHT]{nullptr};\r
+    UILabel *labelTemp[SET_EIGHT]{nullptr};\r
+    UIImageView *imgWeather[SET_EIGHT]{nullptr};\r
+    UIImageView *mainImg{nullptr};\r
+    UIImageView *ImagePageKey{nullptr};\r
+    int index = 0;  // 记录当前是第几个swipe\r
+};\r
+}\r
+#endif
\ No newline at end of file
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/include/weather/WeatherPageThird.h b/code/sdk/application/wearable/nativeapp/nativeui/include/weather/WeatherPageThird.h
new file mode 100644 (file)
index 0000000..a7f72f9
--- /dev/null
@@ -0,0 +1,46 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: WeatherPageThird\r
+ * Create: 2025-03-15\r
+ */\r
+\r
+#ifndef WEATHER_PAGETHIRD_H\r
+#define WEATHER_PAGETHIRD_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_list_nested.h"\r
+#include "components/ui_scroll_view_nested.h"\r
+#include "components/ui_swipe_view.h"\r
+#include "main/AppGroupView.h"\r
+#include "weather/WeatherPresenter.h"\r
+#include "weather/WeatherAdapter.h"\r
+#include "SlicePage.h"\r
+#include "UiConfig.h"\r
+namespace OHOS {\r
+class WeatherPageThird :  public SlicePage<WeatherPresenter>,\r
+                        public UIView::OnClickListener,\r
+                        public UIView::OnDragListener,\r
+                        public UISwipeView::OnSwipeListener {\r
+public:\r
+    WeatherPageThird();\r
+    ~WeatherPageThird() 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(const WeatherItem *item, uint8_t count);\r
+private:\r
+    WeatherModel *weatherModel = nullptr;\r
+    UIViewGroup *group = nullptr;\r
+    UIList *contentList{nullptr};\r
+    UILabel *title{nullptr};\r
+    WeatherAdapter *listAdapter{nullptr};\r
+    UIImageView *mainImg{nullptr};\r
+    UIImageView *ImagePageKey{nullptr};\r
+};\r
+}\r
+#endif
\ No newline at end of file
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/include/weather/WeatherPresenter.h b/code/sdk/application/wearable/nativeapp/nativeui/include/weather/WeatherPresenter.h
new file mode 100644 (file)
index 0000000..6cb6bf1
--- /dev/null
@@ -0,0 +1,18 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: WeatherPresenter\r
+ * Create: 2025-11-23\r
+ */\r
+\r
+#ifndef WEATHER_PRESENTER_H\r
+#define WEATHER_PRESENTER_H\r
+\r
+#include "Presenter.h"\r
+#include "components/ui_view.h"\r
+#include "weather/WeatherModel.h"\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
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/include/weather/WeatherView.h b/code/sdk/application/wearable/nativeapp/nativeui/include/weather/WeatherView.h
new file mode 100644 (file)
index 0000000..4c2e469
--- /dev/null
@@ -0,0 +1,21 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: WeatherView\r
+ * Create: 2025-11-23\r
+ */\r
+\r
+#ifndef WEATHER_VIEW_H\r
+#define WEATHER_VIEW_H\r
+\r
+#include "View.h"\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
+};\r
+\r
+class WeatherPresenter;\r
+class WeatherView : public View<WeatherPresenter> {};\r
+}\r
+#endif  // Weather_VIEW_H\r
index 4e3e637..0546bb8 100644 (file)
@@ -4,8 +4,8 @@
  * Create: 2022-03-02\r
  */\r
 \r
-#include "CustomizationView.h"\r
-#include "IndoorWalkPresenter.h"\r
+#include "indoorwalk/CustomizationView.h"\r
+#include "indoorwalk/IndoorWalkPresenter.h"\r
 #include "wearable_log.h"\r
 #include "UiConfig.h"\r
 \r
index bcaa1e7..cbb22c3 100644 (file)
@@ -4,8 +4,8 @@
  * Create: 2022-03-02\r
  */\r
 \r
-#include "IndoorWalkEndView.h"\r
-#include "IndoorWalkPresenter.h"\r
+#include "indoorwalk/IndoorWalkEndView.h"\r
+#include "indoorwalk/IndoorWalkPresenter.h"\r
 #include "wearable_log.h"\r
 #include "UiConfig.h"\r
 \r
index 4afd157..42786d8 100644 (file)
@@ -4,8 +4,8 @@
  * Create: 2022-03-02\r
  */\r
 \r
-#include "IndoorWalkModel.h"\r
-#include "IndoorWalkPresenter.h"\r
+#include "indoorwalk/IndoorWalkModel.h"\r
+#include "indoorwalk/IndoorWalkPresenter.h"\r
 #include "ohos_timer.h"\r
 #include "graphic_timer.h"\r
 \r
@@ -293,7 +293,7 @@ void InitIndoorWalkTimer()
         WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "IndoorWalkModel::IndoorWalkTimer already exists!!");\r
         return;\r
     }\r
-    uint32 tick = GetOSTick(MS_ONE_SECONDS);\r
+    uint32_t tick = GetOSTick(MS_ONE_SECONDS);\r
     g_startCounting = new GraphicTimer(tick, IndoorWalkTimerCallback, nullptr, true);\r
     if (g_startCounting == nullptr) {\r
         WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "IndoorWalkModel::IndoorWalkTimer new GraphicTimer failed!!");\r
index a3350f2..4e88d67 100644 (file)
@@ -4,13 +4,13 @@
  * Create: 2022-03-02\r
  */\r
 \r
-#include "IndoorWalkMotionView.h"\r
-#include "IndoorWalkPresenter.h"\r
+#include "indoorwalk/IndoorWalkMotionView.h"\r
+#include "indoorwalk/IndoorWalkPresenter.h"\r
 #include "wearable_log.h"\r
 #include "UiConfig.h"\r
-#include "ScreenModels.h"\r
-#include "ActivityModel.h"\r
-#include "IndoorWalkModel.h"\r
+#include "screensetting/ScreenModels.h"\r
+#include "activity/ActivityModel.h"\r
+#include "indoorwalk/IndoorWalkModel.h"\r
 #include <iomanip>\r
 \r
 namespace OHOS {\r
index 6f3efcd..709ab28 100644 (file)
@@ -4,9 +4,9 @@
  * Create: 2022-03-02\r
  */\r
 \r
-#include "IndoorWalkPreparedView.h"\r
-#include "IndoorWalkPresenter.h"\r
-#include "ScreenModels.h"\r
+#include "indoorwalk/IndoorWalkPreparedView.h"\r
+#include "indoorwalk/IndoorWalkPresenter.h"\r
+#include "screensetting/ScreenModels.h"\r
 #include "ui_resource_image.h"\r
 #include "wearable_log.h"\r
 #include "UiConfig.h"\r
index 9ea8f60..fcffcc4 100644 (file)
@@ -4,14 +4,14 @@
  * Create: 2022-03-02\r
  */\r
 \r
-#include "IndoorWalkPresenter.h"\r
-#include "IndoorWalkView.h"\r
-#include "IndoorWalkModel.h"\r
+#include "indoorwalk/IndoorWalkPresenter.h"\r
+#include "indoorwalk/IndoorWalkView.h"\r
+#include "indoorwalk/IndoorWalkModel.h"\r
 #include "drag_event.h"\r
 #include "UiConfig.h"\r
 #include "wearable_log.h"\r
 #include <sstream>\r
-#include "ActivityModel.h"\r
+#include "activity/ActivityModel.h"\r
 #include "NativeRegisterManager.h"\r
 \r
 namespace OHOS {\r
index 0308e98..4cbdb8e 100644 (file)
@@ -4,8 +4,8 @@
  * Create: 2022-03-02\r
  */\r
 \r
-#include "IndoorWalkView.h"\r
-#include "IndoorWalkModel.h"\r
+#include "indoorwalk/IndoorWalkView.h"\r
+#include "indoorwalk/IndoorWalkModel.h"\r
 #include "wearable_log.h"\r
 #include "UiConfig.h"\r
 \r
index a3da2bb..7c41f0f 100644 (file)
@@ -3,7 +3,7 @@
  * Description: Motion PageFifth View\r
  * Create: 2022-03-02\r
  */\r
-#include "MotionPageFifth.h"\r
+#include "indoorwalk/MotionPageFifth.h"\r
 #include "wearable_log.h"\r
 #include "UiConfig.h"\r
 \r
index c16b941..0975cbe 100644 (file)
@@ -4,9 +4,9 @@
  * Create: 2022-03-02\r
  */\r
 \r
-#include "MotionPageFirst.h"\r
-#include "IndoorWalkPresenter.h"\r
-#include "IndoorWalkModel.h"\r
+#include "indoorwalk/MotionPageFirst.h"\r
+#include "indoorwalk/IndoorWalkPresenter.h"\r
+#include "indoorwalk/IndoorWalkModel.h"\r
 #include "wearable_log.h"\r
 #include "UiConfig.h"\r
 \r
index a43ab8f..8ea8feb 100644 (file)
@@ -3,9 +3,9 @@
  * Description: Motion PageFourth View\r
  * Create: 2022-03-02\r
  */\r
-#include "MotionPageFourth.h"\r
-#include "IndoorWalkPresenter.h"\r
-#include "IndoorWalkModel.h"\r
+#include "indoorwalk/MotionPageFourth.h"\r
+#include "indoorwalk/IndoorWalkPresenter.h"\r
+#include "indoorwalk/IndoorWalkModel.h"\r
 #include "wearable_log.h"\r
 #include "UiConfig.h"\r
 \r
index 34e136d..33fc94f 100644 (file)
@@ -3,9 +3,9 @@
  * Description: Motion PageSecond View\r
  * Create: 2022-03-02\r
  */\r
-#include "MotionPageSecond.h"\r
-#include "IndoorWalkPresenter.h"\r
-#include "IndoorWalkModel.h"\r
+#include "indoorwalk/MotionPageSecond.h"\r
+#include "indoorwalk/IndoorWalkPresenter.h"\r
+#include "indoorwalk/IndoorWalkModel.h"\r
 #include "wearable_log.h"\r
 #include "UiConfig.h"\r
 \r
index 668d78c..d6730e9 100644 (file)
@@ -3,9 +3,9 @@
  * Description: Motion PageThird View\r
  * Create: 2022-03-02\r
  */\r
-#include "MotionPageThird.h"\r
-#include "IndoorWalkPresenter.h"\r
-#include "IndoorWalkModel.h"\r
+#include "indoorwalk/MotionPageThird.h"\r
+#include "indoorwalk/IndoorWalkPresenter.h"\r
+#include "indoorwalk/IndoorWalkModel.h"\r
 #include "wearable_log.h"\r
 #include "UiConfig.h"\r
 \r
index 871138f..9f8ecd3 100644 (file)
@@ -5,19 +5,19 @@
  * Create: 2021-09-18
  */
 
-#include "KeyInputListener.h"
+#include "key/KeyInputListener.h"
 #include "common/key_code.h"
 #include "AppViewIDs.h"
 #include "View.h"
-#include "MainViewSample.h"
+#include "main/MainViewSample.h"
 #include "wearable_log.h"
 #include "UiConfig.h"
 #include "dock/input_device.h"
 #include "notification_manager.h"
-#include "AlarmPopUpPresenter.h"
-#include "CallerLogModel.h"
-#include "MainCallingPresenter.h"
-#include "ApplistModel.h"
+#include "alarm/AlarmPopUpPresenter.h"
+#include "callerlog/CallerLogModel.h"
+#include "makephone/MainCallingPresenter.h"
+#include "applist/ApplistModel.h"
 
 namespace OHOS {
 static bool IsNotifyCallStatus()
@@ -137,8 +137,8 @@ void KeyInputListener::OnKeyRelease(const KeyEvent& event)
                 NotificationManager::GetInstance()->GetWatchCallStatus()) { // 音量卡片
                 // 音量-
                 CallVolumeDipSwitchControl(VOLUMEDOWN);
-            } else {
-                // 切换到用户配置的快捷卡片
+            } else if (currentViewId != VIEW_RECENT_APP) {
+                NativeAbility::GetInstance().ChangeSlice(VIEW_RECENT_APP);
             }
         }
     }
index d61182d..5f0b22d 100644 (file)
@@ -12,7 +12,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-#include "HealthModel.h"
+#include "main/HealthModel.h"
 #include <sys/types.h>
 #include <sys/stat.h>
 #include <fcntl.h>
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/main/src/LoadImg.cpp b/code/sdk/application/wearable/nativeapp/nativeui/main/src/LoadImg.cpp
new file mode 100644 (file)
index 0000000..5586182
--- /dev/null
@@ -0,0 +1,40 @@
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: LoadImg\r
+ * Author:\r
+ * Create: 2025-06-05\r
+ */\r
+\r
+#include "main/LoadImg.h"\r
+\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
+        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
+        return;\r
+    }\r
+    btn->SetImageSrc(image1, image2);\r
+}\r
+\r
+void LoadImageViewImg(UIImageView *view, std::string file, uint32_t resId)\r
+{\r
+    ImageInfo *image = ImageCacheManager::GetInstance().LoadOneInMultiRes(resId, file);\r
+    if (image == nullptr) {\r
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "LoadImageViewImg %x fail", resId);\r
+        return;\r
+    }\r
+    view->SetSrc(image);\r
+    return;\r
+}\r
+}\r
+}\r
index dc5b9e3..a84d1d7 100644 (file)
@@ -6,11 +6,11 @@
  */\r
 \r
 #include "unistd.h"\r
-#include "MainModel.h"\r
+#include "main/MainModel.h"\r
 #include "kv_store.h"\r
 #include "securec.h"\r
 #include "wearable_log.h"\r
-#include "DialBinTypesV2.h"\r
+#include "main/DialBinTypesV2.h"\r
 #include "power_display_service.h"\r
 \r
 namespace OHOS {\r
@@ -198,6 +198,9 @@ namespace OHOS {
                 return;\r
             }\r
 \r
+            if (dialSetting.dialFlag == 0) {\r
+                return;\r
+            }\r
             setValue = strtok_s(nullptr, ",", &setBuffer);\r
             if (setValue != nullptr) {\r
                 dialSetting.dialFullName = setValue;\r
index ca40fa4..434c85e 100644 (file)
@@ -5,15 +5,13 @@
  * Create: 2021-10-18
  */
 
-#include "MainPresenterSample.h"
+#include "main/MainPresenterSample.h"
 #include "common/task_manager.h"
-#include "HeartRateView.h"
-#include "PlayersModel.h"
-#include "PlayersPresenter.h"
-#include "MainCompassPresenter.h"
+#include "heartrate/HeartRateView.h"
+#include "player/PlayersModel.h"
+#include "player/PlayersPresenter.h"
 #include "NativeRegisterManager.h"
-#include "CompassModel.h"
-#include "CompassCalibrationView.h"
+#include "compass/CompassModel.h"
 #include "drag_event.h"
 #include "graphic_service.h"
 #include "wearable_log.h"
 #include "ui_resource_image.h"
 #include <iostream>
 #include <map>
-#include "ModelDialDataFactory.h"
-#include "DialModelTime.h"
-#include "DialViewGroup.h"
-#include "ui_service.h"
+#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 {
@@ -73,7 +71,6 @@ void MainPresenterSample::OnStart()
 
 void MainPresenterSample::OnPause()
 {
-    Presenter<MainViewSample>::OnPause();
     // Save watchface content for slide back
     UIView* watchFace = view_->GetViewById(WATCH_FACE)->GetParent();
     uint8_t opaScale = watchFace->GetOpaScale();
@@ -91,7 +88,6 @@ void MainPresenterSample::OnPause()
 
 void MainPresenterSample::OnResume(void)
 {
-    Presenter::OnResume();
     mainPresenterState_ = MainPresenterState::RESUME;
     // Set current page again to invoke OnActive method.
     uint8_t curCardId = view_->GetHorCurrentCard();
@@ -263,21 +259,10 @@ void MainPresenterSample::SetCircleProgress()
     }
 }
 
-void MainPresenterSample::SetCompassRotate()
-{
-    bool status = CompassModel::GetInstance()->GetCalibrationStatus();
-    dynamic_cast<CompassControlView*>(view_->GetViewById(COMPASS))->SetCalibrationView(status);
-    if (!status) {
-        DetermineToRotate();
-    }
-}
-
 void MainPresenterSample::Notify(void)
 {
     CardId cardId = view_->GetHorCurrentCard();
-    if (cardId == COMPASS) {
-        SetCompassRotate();
-    } else if (cardId == MUSIC_PLAYER) {
+    if (cardId == MUSIC_PLAYER) {
         SetCircleProgress();
     } else if (cardId == WATCH_FACE) {
         DialSetting &setting = GetDialSetting();
index b6c8826..0133239 100644 (file)
@@ -5,9 +5,10 @@
  * Create: 2021-10-18
  */
 #include "wearable_log.h"
-#include "MainViewSample.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;
@@ -271,12 +272,7 @@ UICardPage *MainViewSample::InitWatchOffDial(DialSetting &setting)
 
 UICardPage *MainViewSample::InitWatchDial(DialSetting &setting)
 {
-    switch (setting.dialId) {
-        case DIAL_CLOCK:
-            return new MainClockView();
-        default:
-            return nullptr;
-    }
+    return UICardPageFactory::GetInstance().CreateWatchDial(DIAL_DISPLAY_MODE_MAIN, setting.dialId);
 }
 
 UICardPage *MainViewSample::InitWatchFacePage(void)
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/main/src/MessageAdapter.cpp b/code/sdk/application/wearable/nativeapp/nativeui/main/src/MessageAdapter.cpp
new file mode 100644 (file)
index 0000000..8d5748c
--- /dev/null
@@ -0,0 +1,82 @@
+/*\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: MessageAdapter.cpp\r
+ * Author:\r
+ * Create: 2021-11-23\r
+ */\r
+\r
+#include "main/MessageAdapter.h"\r
+\r
+namespace OHOS {\r
+MessageAdapter::MessageAdapter() {}\r
+\r
+MessageAdapter::~MessageAdapter()\r
+{\r
+    listData.clear();\r
+}\r
+\r
+uint16_t MessageAdapter::GetCount(void)\r
+{\r
+    return listData.size();\r
+}\r
+\r
+void MessageAdapter::SetData(std::list<MessageItem> &data)\r
+{\r
+    if (!listData.empty()) {\r
+        listData.clear();\r
+    }\r
+    std::list<MessageItem>::iterator it;\r
+    for (it = data.begin(); it != data.end(); it++) {\r
+        listData.push_back(*it);\r
+    }\r
+}\r
+\r
+UIView *MessageAdapter::GetView(UIView *inView, int16_t index)\r
+{\r
+    if (listData.empty()) {\r
+        return nullptr;\r
+    }\r
+    if (index < 0) {\r
+        return nullptr;\r
+    }\r
+    size_t uindex = index;\r
+    if (uindex >= listData.size()) {\r
+        return nullptr;\r
+    }\r
+\r
+    std::list<MessageItem>::iterator it = listData.begin();\r
+    for (int i = 0; i < index; i++) {\r
+        it++;\r
+    }\r
+    MessageItem itemData = *it;\r
+    MessageItemView *item = nullptr;\r
+    if (inView == nullptr) {\r
+        item = new MessageItemView();\r
+    } else {\r
+        item = static_cast<MessageItemView *>(inView);\r
+    }\r
+\r
+    item->SetItemInfo(itemData);\r
+    item->SetOnClickListener(itemClickListener);\r
+    return item;\r
+}\r
+\r
+void MessageAdapter::AddListItem(const MessageItem &item)\r
+{\r
+    listData.push_back(item);\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "listData == %d-------zsy", listData.size());\r
+    for (const auto& item : listData) {\r
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MessageItem.App == %s-------zsy", item.label_1.c_str());\r
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MessageItem.Content == %s-------zsy", item.label_2.c_str());\r
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MessageItem.Info == %s-------zsy", item.label_3.c_str());\r
+    }\r
+}\r
+\r
+void MessageAdapter::ClearListItem()\r
+{\r
+    listData.clear();\r
+}\r
+} // namespace OHOS\r
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/main/src/MessageItemView.cpp b/code/sdk/application/wearable/nativeapp/nativeui/main/src/MessageItemView.cpp
new file mode 100644 (file)
index 0000000..db7e81e
--- /dev/null
@@ -0,0 +1,96 @@
+/*\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
+ */\r
+\r
+#include "wearable_log.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
+\r
+    MessageItemView::~MessageItemView()\r
+    {\r
+        Remove(&sIcon);\r
+        Remove(&sLabel_1);\r
+        Remove(&sLabel_2);\r
+        Remove(&sLabel_3);\r
+        Remove(&sback);\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
+    }\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
+\r
+    }\r
+\r
+}
\ No newline at end of file
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/main/src/MessageMainView.cpp b/code/sdk/application/wearable/nativeapp/nativeui/main/src/MessageMainView.cpp
new file mode 100644 (file)
index 0000000..ed1000d
--- /dev/null
@@ -0,0 +1,374 @@
+/*\r
+ * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved.\r
+ * Description: WeekStep\r
+ * Author:\r
+ * Create: 2021-09-11\r
+ */\r
+\r
+#include "main/MessageMainView.h"\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/SettingModel.h"\r
+#include "ui_resource_image.h"\r
+\r
+namespace OHOS {\r
+\r
+static MessageMainView *g_pMessageMainView = 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
+MessageMainView::MessageMainView()\r
+{\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MessageMainView::MessageMainView");\r
+    g_pMessageMainView = this;\r
+}\r
+\r
+MessageMainView::~MessageMainView()\r
+{\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MessageMainView::~MessageMainView");\r
+    RemoveAll();\r
+    delete messageLables;\r
+    messageLables = nullptr;\r
+    delete messageLable;\r
+    messageLable = nullptr;\r
+    delete deletereminder;\r
+    deletereminder = nullptr;\r
+    delete confirm;\r
+    confirm = nullptr;\r
+    delete cancel;\r
+    cancel = nullptr;\r
+    delete notice;\r
+    notice = nullptr;\r
+    delete contentList;\r
+    contentList = nullptr;\r
+    if (listAdapter != nullptr) {\r
+        delete listAdapter;\r
+        listAdapter = nullptr;\r
+    }\r
+    g_pMessageMainView = nullptr;\r
+    MessageModel::GetInstance().SetViewStatus(false);\r
+}\r
+\r
+MessageMainView *MessageMainView::GetInstance(void)\r
+{\r
+    return g_pMessageMainView;\r
+}\r
+\r
+bool MessageMainView::InitView()\r
+{\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MessageMainView::InitView");\r
+    messageLable = new UILabel();\r
+    if (messageLable == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "messageLable new fail");\r
+        return false;\r
+    }\r
+    messageLable->SetPosition(175, 20, 100, 30);\r
+    messageLable->SetText("通知");\r
+    messageLable->SetAlign(TEXT_ALIGNMENT_CENTER);\r
+    messageLable->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 24);\r
+    messageLable->SetStyle(STYLE_BACKGROUND_COLOR, OPA_TRANSPARENT);\r
+    messageLable->SetViewId("Notify");\r
+    messageLable->SetTouchable(true);\r
+    notifyListener = (UIView::OnClickListener *)OHOS::MainPresenterSample::GetInstance();\r
+    messageLable->SetOnClickListener(notifyListener);\r
+    // 删除图标\r
+    notice = new UIImageView();\r
+    if (notice == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "TimerTimingView:: new startButton fail");\r
+        return false;\r
+    }\r
+    notice->SetPosition(175, 330);\r
+    notice->Resize(100, 100);\r
+    notice->SetSrc(ALARM_TRUE_ADD_PATH);\r
+    notice->SetViewId("Delete");\r
+    notice->SetTouchable(true);\r
+    clickListener = (UIView::OnClickListener *)OHOS::MainPresenterSample::GetInstance();\r
+    notice->SetOnClickListener(clickListener);\r
+    ShowMessageList();\r
+    InitScrollData();\r
+    Add(messageLable);\r
+    Add(notice);\r
+    return true;\r
+}\r
+\r
+void MessageMainView::PreLoad(void)\r
+{\r
+    if (! MessageModel::GetInstance().GetViewStatus()) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "MessageMainView::PreLoad,viewiInitStatus == false");\r
+        InitView();\r
+        DeletionView();\r
+        NoNotify();\r
+        const std::vector<MessageItem> itemInfo = MessageModel::GetInstance().GetMessagelistItems();\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "MessageMainView::PreLoad,itemInfo == %d", itemInfo.size());\r
+        if (itemInfo.size() == 0) {\r
+            messageLable->SetVisible(false);\r
+            notice->SetVisible(false);\r
+            contentList->SetVisible(false);\r
+            deletereminder->SetVisible(false);\r
+            confirm->SetVisible(false);\r
+            cancel->SetVisible(false);\r
+            messageLables->SetVisible(true);\r
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "MessageMainView::PreLoad,itemInfo.size() == 0");\r
+        } else {\r
+            messageLable->SetVisible(true);\r
+            notice->SetVisible(true);\r
+            contentList->SetVisible(true);\r
+            deletereminder->SetVisible(false);\r
+            confirm->SetVisible(false);\r
+            cancel->SetVisible(false);\r
+            messageLables->SetVisible(false);\r
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "MessageMainView::PreLoad,itemInfo.size() != 0");\r
+        }\r
+        MessageModel::GetInstance().SetViewStatus(true);\r
+    }\r
+}\r
+\r
+void MessageMainView::ShowMessageList(void)\r
+{\r
+    contentList = new UIList();\r
+    if (contentList == nullptr) {\r
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MessageMainView::ShowMessageList contentList is nullptr");\r
+        return;\r
+    }\r
+    contentList->SetPosition(32, 70);\r
+    contentList->Resize(HORIZONTAL_RESOLUTION, 318); // 364: height\r
+    contentList->SetSelectPosition(120); // middle position\r
+    contentList->SetDraggable(true);\r
+    contentList->SetThrowDrag(true);\r
+    contentList->EnableAutoAlign(true);\r
+    contentList->SetElastic(true);\r
+    Add(contentList);\r
+}\r
+\r
+void MessageMainView::ConfirmDeletion(void)\r
+{\r
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "MessageMainView::ConfirmDeletion");\r
+    if (notice->IsVisible()) {\r
+        notice->SetVisible(false);\r
+    }\r
+    if (messageLable->IsVisible()) {\r
+        messageLable->SetVisible(false);\r
+    }\r
+    if (contentList->IsVisible()) {\r
+        contentList->SetVisible(false);\r
+    }\r
+    if (! deletereminder->IsVisible()) {\r
+        deletereminder->SetVisible(true);\r
+    }\r
+    if (! confirm->IsVisible()) {\r
+        confirm->SetVisible(true);\r
+    }\r
+    if (! cancel->IsVisible()) {\r
+        cancel->SetVisible(true);\r
+    }\r
+}\r
+\r
+void MessageMainView::NewNotify(void)\r
+{\r
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "MessageMainView::NewNotify");\r
+    if (messageLables->IsVisible()) {\r
+        messageLables->SetVisible(false);\r
+    }\r
+    if (! notice->IsVisible()) {\r
+        notice->SetVisible(true);\r
+    }\r
+    if (! messageLable->IsVisible()) {\r
+        messageLable->SetVisible(true);\r
+    }\r
+    if (! contentList->IsVisible()) {\r
+        contentList->SetVisible(true);\r
+    }\r
+}\r
+\r
+void MessageMainView::DeletionView(void)\r
+{\r
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "MessageMainView::DeletionView");\r
+    // 标题\r
+    deletereminder = new UILabel();\r
+    if (deletereminder == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "deletereminder new fail");\r
+        return;\r
+    }\r
+    deletereminder->SetPosition(177, 145);         // widget's left position and top position\r
+    deletereminder->Resize(260, 204);          // widget's width and height\r
+    deletereminder->SetViewId("deletereminder");// Set style\r
+\r
+    // Set additional property\r
+    deletereminder->SetText("是否删除通知?");\r
+    deletereminder->SetLineBreakMode(UILabel::LINE_BREAK_ADAPT);\r
+    deletereminder->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+    deletereminder->SetRollSpeed(0);\r
+\r
+    // 确认按钮\r
+    confirm = new UILabelButton();\r
+    if (confirm == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "confirm new fail");\r
+        return;\r
+    }\r
+    confirm->SetPosition(88, 255);         // widget's left position and top position\r
+    confirm->Resize(70, 50);          // widget's width and height\r
+    confirm->SetViewId("Confirm");// Set style\r
+\r
+    // Set additional property\r
+    confirm->SetText("确认");\r
+    confirm->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 16);\r
+    confirm->SetStyleForState(STYLE_BORDER_COLOR, 0xff0b1928, UIButton::PRESSED);\r
+    confirmListener = (UIView::OnClickListener *)OHOS::MainPresenterSample::GetInstance();\r
+    confirm->SetOnClickListener(confirmListener);\r
+\r
+    // 取消按钮\r
+    cancel = new UILabelButton();\r
+    if (cancel == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "cancel new fail");\r
+        return;\r
+        // cancel = new UILabelButton();\r
+    }\r
+    cancel->SetPosition(301, 251);         // widget's left position and top position\r
+    cancel->Resize(70, 50);          // widget's width and height\r
+    cancel->SetViewId("Cancel");// Set style\r
+\r
+    // Set additional property\r
+    cancel->SetText("取消");\r
+    cancel->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 16);\r
+    cancel->SetStyleForState(STYLE_BORDER_COLOR, 0xff0b1928, UIButton::PRESSED);\r
+    cancelListener = (UIView::OnClickListener *)OHOS::MainPresenterSample::GetInstance();\r
+    cancel->SetOnClickListener(cancelListener);\r
+    Add(deletereminder);\r
+    Add(confirm);\r
+    Add(cancel);\r
+}\r
+\r
+void MessageMainView::VerticalViewInits(void)\r
+{\r
+    if (deletereminder->IsVisible()) {\r
+        deletereminder->SetVisible(false);\r
+    }\r
+    if (confirm->IsVisible()) {\r
+        confirm->SetVisible(false);\r
+    }\r
+    if (cancel->IsVisible()) {\r
+        cancel->SetVisible(false);\r
+    }\r
+    if (! messageLables->IsVisible()) {\r
+        messageLables->SetVisible(true);\r
+    }\r
+}\r
+\r
+void MessageMainView::NoNotify(void)\r
+{\r
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "MessageMainView::NoNotify");\r
+    messageLables = new UILabel();\r
+    if (messageLables == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "messageLable new fail");\r
+        return;\r
+    }\r
+    messageLables->SetPosition(177, 212, 100, 30);\r
+    messageLables->SetText("无消息");\r
+    messageLables->SetAlign(TEXT_ALIGNMENT_CENTER);\r
+    messageLables->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 24);\r
+    messageLables->SetStyle(STYLE_BACKGROUND_COLOR, OPA_TRANSPARENT);\r
+    messageLables->SetViewId("NoNotify");\r
+    messageLables->SetTouchable(true);\r
+    newNotifyListener = (UIView::OnClickListener *)OHOS::MainPresenterSample::GetInstance();\r
+    messageLables->SetOnClickListener(newNotifyListener);\r
+    Add(messageLables);\r
+}\r
+\r
+void MessageMainView::CancelDeletion(void)\r
+{\r
+    if (deletereminder->IsVisible()) {\r
+        deletereminder->SetVisible(false);\r
+    }\r
+    if (confirm->IsVisible()) {\r
+        confirm->SetVisible(false);\r
+    }\r
+    if (cancel->IsVisible()) {\r
+        cancel->SetVisible(false);\r
+    }\r
+    if (! messageLable->IsVisible()) {\r
+        messageLable->SetVisible(true);\r
+    }\r
+    if (! notice->IsVisible()) {\r
+        notice->SetVisible(true);\r
+    }\r
+    if (! contentList->IsVisible()) {\r
+        contentList->SetVisible(true);\r
+    }\r
+}\r
+\r
+void MessageMainView::RefreshMessageList(std::vector<MessageItem> item)\r
+{\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MessageMainView::RefreshMessageList");\r
+    if (listAdapter == nullptr) {\r
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MessageMainView::RefreshMessageList listAdapter is nullptr");\r
+        listAdapter = new MessageAdapter();\r
+    }\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MessageMainView::RefreshMessageList");\r
+    if (item.size() == 0) {\r
+        return;\r
+    } else {\r
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MessageMainView::RefreshMessageList %d", item.size());\r
+        listAdapter->ClearListItem();\r
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "listAdapter->ClearListItem");\r
+        for (size_t i = 0; i < item.size(); ++i) {\r
+            listAdapter->AddListItem(item[i]);\r
+            WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "listAdapter->AddListItem");\r
+        }\r
+    }\r
+    if (contentList == nullptr) {\r
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MessageMainView::contentList fail");\r
+        return;\r
+    }\r
+    contentList->ScrollTo(0);\r
+    contentList->SetAdapter(listAdapter);\r
+    contentList->RefreshList();\r
+}\r
+\r
+bool MessageMainView::InitScrollData()\r
+{\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "MessageMainView::InitScrollData");\r
+        const std::vector<MessageItem> itemInfo = MessageModel::GetInstance().GetMessagelistItems();\r
+        RefreshMessageList(itemInfo);\r
+        return true;\r
+}\r
+}\r
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/main/src/MessageModel.cpp b/code/sdk/application/wearable/nativeapp/nativeui/main/src/MessageModel.cpp
new file mode 100644 (file)
index 0000000..8bbdf47
--- /dev/null
@@ -0,0 +1,107 @@
+/*\r
+ * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved.\r
+ * Description: MainModel.cpp\r
+ * Author:\r
+ * Create: 2021-11-23\r
+ */\r
+\r
+#include "unistd.h"\r
+#include "main/MessageModel.h"\r
+#include "main/MessageMainView.h"\r
+#include "kv_store.h"\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
+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
+\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
+        }\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
+        }\r
+    }\r
+\r
+    const std::vector<MessageItem> MessageModel::GetMessagelistItems() const\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
index 26c67fb..5971ec4 100644 (file)
@@ -13,7 +13,7 @@
  * limitations under the License.
  */
 
-#include "ModelListenerSample.h"
+#include "main/ModelListenerSample.h"
 
 #include "wearable_log.h"
 namespace OHOS {
index 34eb21d..810d3ab 100644 (file)
@@ -5,13 +5,13 @@
  * Create: 2021-09-11
  */
 
-#include "PullUpDownView.h"
+#include "main/PullUpDownView.h"
 #include "wearable_log.h"
 #include "UiConfig.h"
 #include "common/screen.h"
-#include "MainPresenterSample.h"
-#include "ScreenModels.h"
-#include "SettingModel.h"
+#include "main/MainPresenterSample.h"
+#include "screensetting/ScreenModels.h"
+#include "settings/SettingModel.h"
 #include "ui_resource_image.h"
 
 namespace OHOS {
index 7ca2d4c..1c86925 100644 (file)
@@ -3,20 +3,20 @@
  * Description: VolumeSettingView view\r
  * Create: 2021-09-5\r
  */\r
-#include "VolumeSettingView.h"\r
-#include "VolumeSettingPresenter.h"\r
-#include "PlayersModel.h"\r
+#include "main/VolumeSettingView.h"\r
+#include "main/VolumeSettingPresenter.h"\r
+#include "player/PlayersModel.h"\r
 #include "common/image_cache_manager.h"\r
 #include "UiConfig.h"\r
 #include "ui_resource_image.h"\r
 #include "drag_event.h"\r
-#include "MainCallingView.h"\r
-#include "PhoneService.h"\r
-#include "CallerLogModel.h"\r
+#include "makephone/MainCallingView.h"\r
+#include "phoneservice/PhoneService.h"\r
+#include "callerlog/CallerLogModel.h"\r
 #include "bts_avrcp_controller.h"\r
 #include "bts_avrcp_target.h"\r
 #include "notification_manager.h"\r
-#include "BluetoothHeadsetEvent.h"\r
+#include "bluetooth/BluetoothHeadsetEvent.h"\r
 #include "bts_avrcp_controller.h"\r
 \r
 namespace OHOS {\r
index e8eeb4d..ae64269 100644 (file)
@@ -3,8 +3,8 @@
  * Description: VolumeSettingView view\r
  * Create: 2021-09-5\r
  */\r
-#include "VolumeSettingView.h"\r
-#include "PlayersView.h"\r
+#include "main/VolumeSettingView.h"\r
+#include "player/PlayersView.h"\r
 #include "common/image_cache_manager.h"\r
 #include "UiConfig.h"\r
 #include "ui_resource_image.h"\r
index 02ce99c..fa4a347 100644 (file)
@@ -2,7 +2,7 @@
  * Copyright (c) @CompanyNameMagicTag. 2023. All rights reserved.
  */
 
-#include "DialArcLabelView.h"
+#include "main/dial/DialArcLabelView.h"
 #include "securec.h"
 
 namespace OHOS {
index 67dadd4..d045de8 100644 (file)
@@ -2,7 +2,7 @@
  * Copyright (c) @CompanyNameMagicTag. 2023. All rights reserved.
  */
 
-#include "DialArcProgressView.h"
+#include "main/dial/DialArcProgressView.h"
 
 namespace OHOS {
 DialArcProgressView::DialArcProgressView(void)
@@ -28,4 +28,16 @@ void DialArcProgressView::HandleFloatData(float data)
     value_ = value;
     SetValue(value_);
 }
+
+void DialArcProgressView::OnDraw(BufferInfo& gfxDstBuffer, const Rect& invalidatedArea)
+{
+    if (foregroundStopCount_ != 0) {
+        Rect rect = GetOrigRect();
+        foregroundGradient_.startX = rect.GetX();
+        foregroundGradient_.startY = rect.GetY();
+        foregroundGradient_.endX = rect.GetRight();
+        foregroundGradient_.endY = rect.GetBottom();
+    }
+    UICircleProgress::OnDraw(gfxDstBuffer, invalidatedArea);
+}
 }
\ No newline at end of file
index 8084dfb..b3ce790 100644 (file)
@@ -2,7 +2,7 @@
  * Copyright (c) @CompanyNameMagicTag. 2023. All rights reserved.
  */
 
-#include "DialBoxProgressView.h"
+#include "main/dial/DialBoxProgressView.h"
 
 namespace OHOS {
 DialBoxProgressView::DialBoxProgressView(void)
@@ -28,4 +28,16 @@ void DialBoxProgressView::HandleFloatData(float data)
     value_ = value;
     SetValue(value_);
 }
+
+void DialBoxProgressView::OnDraw(BufferInfo& gfxDstBuffer, const Rect& invalidatedArea)
+{
+    if (foregroundStopCount_ != 0) {
+        Rect rect = GetOrigRect();
+        foregroundGradient_.startX = rect.GetX();
+        foregroundGradient_.startY = rect.GetY();
+        foregroundGradient_.endX = rect.GetRight();
+        foregroundGradient_.endY = rect.GetBottom();
+    }
+    UIBoxProgress::OnDraw(gfxDstBuffer, invalidatedArea);
+}
 }
\ No newline at end of file
index 4f31617..50e7b59 100644 (file)
@@ -2,7 +2,7 @@
  * Copyright (c) @CompanyNameMagicTag. 2023. All rights reserved.
  */
 
-#include "DialDigitalImgView.h"
+#include "main/dial/DialDigitalImgView.h"
 #include <cmath>
 #include "securec.h"
 
index 40fd076..38a544f 100644 (file)
@@ -2,7 +2,7 @@
  * Copyright (c) @CompanyNameMagicTag. 2023. All rights reserved.
  */
 
-#include "DialLabelView.h"
+#include "main/dial/DialLabelView.h"
 #include "securec.h"
 
 namespace OHOS {
index ff82732..d6b6d91 100644 (file)
@@ -5,8 +5,8 @@
  * Create: 2023-12
  */
 
-#include "RegisterDialModel.h"
-#include "DialModelHeartRate.h"
+#include "main/dial/RegisterDialModel.h"
+#include "main/dial/DialModelHeartRate.h"
 
 REGIST_DIAL_MODULE(OHOS::DialDataType::HEART_RATE, OHOS::DialModelHeartRate::GetInstance());
 
index b6a2c5a..dcb3e0d 100644 (file)
@@ -5,16 +5,32 @@
  * Create: 2023-12
  */
 
-#include "RegisterDialModel.h"
-#include "DialModelPower.h"
+#include "main/dial/RegisterDialModel.h"
+#include "main/dial/DialModelPower.h"
 
 REGIST_DIAL_MODULE(OHOS::DialDataType::BATTERY, OHOS::DialModelPower::GetInstance());
 
 namespace OHOS {
+static RegisterDialModel REGIST_BATTERY_LEVEL(DialDataType::BATTERY_LEVEL, DialModelPower::GetInstance());
+static RegisterDialModel REGIST_BATTERY_ENUM(DialDataType::BATTERY_ENUM, DialModelPower::GetInstance());
 bool DialModelPower::GetDialFloatData(DialDataType& type, float& out)
 {
-    (void)type;
-    out = power_;
+    switch (type) {
+    case DialDataType::BATTERY: {
+        out = power_;
+        break;
+    }
+    case DialDataType::BATTERY_LEVEL: {
+        out = static_cast<float>(power_) / 100.0; // 100.0: full power
+        break;
+    }
+    case DialDataType::BATTERY_ENUM: {
+        out = static_cast<float>(power_ / 10); // 10: num
+        break;
+    }
+    default:
+        (void)type;
+    }
     return true;
 }
 }
index a1ad2ed..15fd739 100644 (file)
@@ -5,8 +5,8 @@
  * Create: 2023-12
  */
 
-#include "RegisterDialModel.h"
-#include "DialModelSteps.h"
+#include "main/dial/RegisterDialModel.h"
+#include "main/dial/DialModelSteps.h"
 
 REGIST_DIAL_MODULE(OHOS::DialDataType::STEP_COUNT, OHOS::DialModelSteps::GetInstance());
 
index b626e02..4422425 100644 (file)
@@ -7,8 +7,8 @@
 
 #include <cmath>
 #include "sys/time.h"
-#include "RegisterDialModel.h"
-#include "DialModelTime.h"
+#include "main/dial/RegisterDialModel.h"
+#include "main/dial/DialModelTime.h"
 #include "components/root_view.h"
 
 #define REGIST_DIAL_MODULE_ANGLE_H(type, func) static OHOS::RegisterDialModel(REGIST_ANGLE_H)(type, func)
@@ -41,6 +41,8 @@ REGIST_DIAL_MODULE_YEAR(OHOS::DialDataType::SOLAR_YEAR, OHOS::DialModelTime::Get
 REGIST_DIAL_MODULE_GEAR_POSITIVE(OHOS::DialDataType::SWIVEL_GEAR_POSITIVE, OHOS::DialModelTime::GetInstance());
 REGIST_DIAL_MODULE_GEAR_NEGATIVE(OHOS::DialDataType::SWIVEL_GEAR_NEGATIVE, OHOS::DialModelTime::GetInstance());
 
+static OHOS::RegisterDialModel REGIST_MOUNTH_80(OHOS::DialDataType::MONTH_DATA, OHOS::DialModelTime::GetInstance());
+
 namespace OHOS {
 static constexpr int16_t S_MS_US_TRANS = 1000;      // 1000: seconds, milliseconds, microsecond transform value
 static constexpr uint8_t ONE_MINUTE_IN_SECOND = 60; // 60: 60 seconds per minute
@@ -186,6 +188,10 @@ bool DialModelTime::GetDialFloatData(DialDataType& type, float& out)
             out = static_cast<float>(accleratedAngle * -1.0 + CIRCLE_IN_DEGREE);
             break;
         }
+        case DialDataType::MONTH_DATA: {
+            out = static_cast<float>(tblock_->tm_mon) + 1.0;
+            break;
+        }
         default:
             return false;
     }
index 980d438..4175937 100644 (file)
@@ -2,7 +2,7 @@
  * Copyright (c) @CompanyNameMagicTag. 2023. All rights reserved.
  */
 
-#include "DialOptionImgView.h"
+#include "main/dial/DialOptionImgView.h"
 #include "securec.h"
 
 namespace OHOS {
index bec17ca..171aeea 100644 (file)
@@ -2,7 +2,7 @@
  * Copyright (c) @CompanyNameMagicTag. 2023. All rights reserved.
  */
 
-#include "DialRotateImgView.h"
+#include "main/dial/DialRotateImgView.h"
 
 namespace OHOS {
 DialRotateImgView::DialRotateImgView(void)
index c7d1c24..8741d4c 100644 (file)
@@ -2,7 +2,7 @@
  * Copyright (c) @CompanyNameMagicTag. 2023. All rights reserved.
  */
 
-#include "DialSequenceImgView.h"
+#include "main/dial/DialSequenceImgView.h"
 #include "securec.h"
 #include "common/graphic_utils.h"
 #include "common/image_cache_manager.h"
index ffc87a7..bfa5182 100644 (file)
@@ -2,7 +2,7 @@
  * Copyright (c) @CompanyNameMagicTag. 2023. All rights reserved.
  */
 
-#include "DialStaticImgView.h"
+#include "main/dial/DialStaticImgView.h"
 
 namespace OHOS {
 DialStaticImgView::DialStaticImgView()
index f18e9ea..9ac7b75 100644 (file)
@@ -2,7 +2,7 @@
  * Copyright (c) @CompanyNameMagicTag. 2023. All rights reserved.
  */
 
-#include "DialVideoView.h"
+#include "main/dial/DialVideoView.h"
 
 namespace OHOS {
 static constexpr int16_t JPEG_HEIGHT_DIVISOR = 2;
index 8ed4cf7..198c067 100644 (file)
@@ -5,9 +5,9 @@
  * Create: 2025-02-06
  */
 
-#include "DialViewContainer.h"
-#include "DialDigitalImgView.h"
-#include "ModelDialDataFactory.h"
+#include "main/dial/DialViewContainer.h"
+#include "main/dial/DialDigitalImgView.h"
+#include "main/dial/ModelDialDataFactory.h"
 
 namespace OHOS {
 DialViewContainer::~DialViewContainer()
index 54d1975..3c52dd7 100644 (file)
@@ -1,20 +1,20 @@
-#include "DialViewGroup.h"
+#include "main/dial/DialViewGroup.h"
 #include <cstdio>
 #include <iostream>
 #include "NativeAbility.h"
 #include "msg_center.h"
 #include "securec.h"
-#include "DialBinParser.h"
-#include "ModelDialDataFactory.h"
+#include "main/DialBinParser.h"
+#include "main/dial/ModelDialDataFactory.h"
 #include "common/low_power_manager.h"
 #include "common/image_cache_manager.h"
 #ifdef SUPPORT_OHOSFWK
-#include "ui_screennotify.h"
+#include "screennotify/ui_screennotify.h"
 #endif
-#include "MainPresenterSample.h"
-#include "DialDigitalImgView.h"
+#include "main/MainPresenterSample.h"
+#include "main/dial/DialDigitalImgView.h"
 #include "common/input_device_manager.h"
-#include "DialSequenceImgView.h"
+#include "main/dial/DialSequenceImgView.h"
 #include "engines/gfx/lite_m_gfx_engine.h"
 
 namespace OHOS {
index d17de5b..71ea7a1 100644 (file)
@@ -5,7 +5,7 @@
  * Create: 2023-12
  */
 
-#include "ModelDialDataFactory.h"
+#include "main/dial/ModelDialDataFactory.h"
 namespace OHOS {
 bool ModelDialDataFactory::GetDialTextData(DialDataType& type, std::string*& out, int16_t& strNum)
 {
index c4f9fd1..11f9844 100644 (file)
@@ -6,24 +6,35 @@
  */
 
 #include <string>
+#include <unistd.h>
 #include "dirent.h"
-#include "DialBinParser.h"
+#include "main/DialBinParser.h"
 #include "UiConfig.h"
-#include "WatchInterface.h"
+#include "main/dial/WatchInterface.h"
 #include "gfx_utils/vector.h"
 #include "common/screen.h"
-#include "MainModel.h"
-#include "MainViewSample.h"
-#include "SetDialModel.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 "power_display_service.h"
 
 using namespace OHOS;
 namespace {
-struct {
-    Graphic::Vector<std::string> fileNames;      // only for 3.0
-    Graphic::Vector<watch_dial_info> watchInfo;  // only for 3.0
-} g_info;
+struct WatchInfoInner {
+    std::string fileName;
+    watch_dial_info watchInfo;
+};
+
+Graphic::Vector<WatchInfoInner> g_info;
+GraphicMutex g_mutex;
+GraphicCond g_cond;
+bool g_eventFinished = true;
+const uint16_t INVALID_INFO_INDEX = 0xFFFF;
 
 bool GetActiveWatchPath(std::string &path)
 {
@@ -34,7 +45,7 @@ bool GetActiveWatchPath(std::string &path)
     return false;
 }
 
-bool GetPreviewInfo(const std::string &fileName, DialPreviewInfo &preview)
+bool GetPreviewInfo(const std::string &fileName, DialPreviewInfo &preview, bool isNeedVerify = false)
 {
     const std::string type(".bin");
     if (!(fileName.length() > type.length() &&
@@ -45,7 +56,7 @@ bool GetPreviewInfo(const std::string &fileName, DialPreviewInfo &preview)
     FILE *file = fopen(fileName.c_str(), "rb");
     bool isSuccess = false;
     if (file != nullptr) {
-        isSuccess = DialBinParserManager::GetInstance()->GetDialPreviewInfo(file, &preview);
+        isSuccess = DialBinParserManager::GetInstance()->GetDialPreviewInfo(fileName, file, &preview, isNeedVerify);
         fclose(file);
     }
     return isSuccess;
@@ -70,16 +81,14 @@ bool ConvertPreview2WatchDialInfo(const DialPreviewInfo &preview, watch_dial_inf
     return true;
 }
 
-bool GetAllWatchInfo()
+void RefreshAllWatchInfo()
 {
-    g_info.fileNames.Clear();
-    g_info.watchInfo.Clear();
+    g_info.Clear();
     struct dirent *direntp = nullptr;
 
-    // ´ò¿ªÄ¿Â¼
+    // 打开目录
     DIR *dirp = opendir(APP_DIAL_PATH);
-    bool isSuccess = true;
-    // ±éÀúÎļþ
+    // 遍历文件
     DialPreviewInfo info;
     watch_dial_info watchInfo;
     std::string activePath;
@@ -87,56 +96,133 @@ bool GetAllWatchInfo()
     if (dirp != nullptr) {
         while ((direntp = readdir(dirp)) != nullptr) {
             std::string fileName = std::string(APP_DIAL_PATH) + std::string("/") + std::string(direntp->d_name);
-            isSuccess = GetPreviewInfo(fileName, info);
-            if (!isSuccess) {
+            if (!GetPreviewInfo(fileName, info)) {
                 continue;
             }
 
             const std::string lowestVersion("3.0");
             std::string curVersion(info.protocolVersion);
             if (curVersion >= lowestVersion) {
-                isSuccess = ConvertPreview2WatchDialInfo(info, watchInfo);
-                if (!isSuccess) {
+                if (!ConvertPreview2WatchDialInfo(info, watchInfo)) {
                     break;
                 }
                 watchInfo.install_state = true;
                 watchInfo.is_current_watch = isActiveExist ? (activePath == fileName) : false;
-                g_info.fileNames.PushBack(fileName);
-                g_info.watchInfo.PushBack(watchInfo);
+                g_info.PushBack({fileName, watchInfo});
             }
         }
     }
-    // ¹Ø±ÕĿ¼
+    // 关闭目录
     closedir(dirp);
-    return isSuccess;
 }
-}  // namespace
 
-bool GetAllWatchFaceInfo(watch_dial_info *info, uint8_t *num, uint8_t maxCnt)
+inline bool IsFileExists(const std::string &file)
+{
+    return access(file.c_str(), F_OK) == 0;
+}
+
+uint16_t FindMaxVersionIndex(uint16_t indexArray[], uint16_t num)
+{
+    if (num == 0) {
+        return INVALID_INFO_INDEX;
+    }
+
+    if (num == 0) {
+        return indexArray[0];
+    }
+    std::string version = reinterpret_cast<char *>(g_info[indexArray[0]].watchInfo.watch_version);
+    uint16_t index = 0;
+    for (uint16_t i = 1; i < num; ++i) {
+        std::string curVerion = std::string(reinterpret_cast<char *>(g_info[indexArray[i]].watchInfo.watch_version));
+        if (curVerion > version) {
+            version = curVerion;
+            index = i;
+        }
+    }
+    if (num > 1) {
+        GRAPHIC_LOGE("There are watches with the same uuid. %u", g_info[indexArray[index]].watchInfo.uuid);
+    }
+    index = indexArray[index];
+    return index;
+}
+
+void GetWatchInfo(uint32_t uuid, uint16_t &index)
+{
+    index = INVALID_INFO_INDEX;
+    if (g_info.IsEmpty()) {
+        RefreshAllWatchInfo();
+    }
+    const uint16_t MAX_INFO_NUM = 128;
+    static uint16_t indexArray[MAX_INFO_NUM];
+    uint16_t num = 0;
+    std::string activePath;
+    bool isActive = GetActiveWatchPath(activePath);
+    bool isNeedRequery = false;
+    for (uint16_t i = 0; i < g_info.Size(); ++i) {
+        if (uuid == g_info[i].watchInfo.uuid && num < MAX_INFO_NUM) {
+            if (IsFileExists(g_info[i].fileName)) {
+                g_info[i].watchInfo.is_current_watch = isActive ? (g_info[i].fileName == activePath) : false;
+                indexArray[num++] = i;
+            } else {
+                RefreshAllWatchInfo();
+                isNeedRequery = true;
+                break;
+            }
+        }
+    }
+
+    if (!isNeedRequery) {
+        index = FindMaxVersionIndex(indexArray, num);
+        return;
+    }
+    num = 0;
+    for (uint16_t i = 0; i < g_info.Size(); ++i) {
+        if (uuid == g_info[i].watchInfo.uuid && num < MAX_INFO_NUM) {
+            indexArray[num++] = i;
+        }
+    }
+    index = FindMaxVersionIndex(indexArray, num);
+}
+
+void TryToTurnOnScreen()
+{
+    const power_display_svr_api_t *ctx = power_display_svr_get_api();
+    if (ctx == nullptr) {
+        return;
+    }
+    if (ctx->get_screen_state != nullptr && ctx->get_screen_state() != SCREEN_ON) {
+        if (ctx->turn_on_screen != nullptr) {
+            ctx->turn_on_screen();
+        }
+    }
+}
+}  // anonymous namespace
+
+bool GetAllWatchFaceInfo(watch_dial_info **info, uint8_t *num)
 {
     if (info == nullptr || num == nullptr) {
         GRAPHIC_LOGE("para error!");
         return false;
     }
-    if (!GetAllWatchInfo()) {
-        GRAPHIC_LOGE("failed to get all watch info.");
-        return false;
+    GraphicLockGuard guard(g_mutex);
+    while (!g_eventFinished) {
+        g_cond.Wait(g_mutex);
     }
-    if (g_info.watchInfo.Size() > maxCnt) {
-        GRAPHIC_LOGE("mem is not enough.");
-        return false;
-    }
-    *num = g_info.watchInfo.Size();
+    RefreshAllWatchInfo();
+    *num = g_info.Size();
     if (*num == 0) {
-        return false;
+        *info = nullptr;
+        return true;
     }
-    if (memcpy_s(info,
-            g_info.watchInfo.Size() * sizeof(watch_dial_info),
-            &g_info.watchInfo[0],
-            g_info.watchInfo.Size() * sizeof(watch_dial_info)) != 0) {
-        GRAPHIC_LOGE("copy info error!");
+    watch_dial_info *mem = static_cast<watch_dial_info *>(malloc(*num * sizeof(watch_dial_info)));
+    if (mem == nullptr) {
+        GRAPHIC_LOGE("failed to malloc");
         return false;
     }
+    for (uint16_t i = 0; i < g_info.Size(); ++i) {
+        memcpy_s(&mem[i], sizeof(watch_dial_info), &g_info[i].watchInfo, sizeof(watch_dial_info));
+    }
+    *info = mem;
     return true;
 }
 
@@ -146,17 +232,19 @@ bool GetWatchFaceInfo(uint32_t uuid, watch_dial_info *watch)
         GRAPHIC_LOGE("para error!");
         return false;
     }
-    if (!GetAllWatchInfo()) {
-        GRAPHIC_LOGE("failed to get all watch info.");
+
+    uint16_t index = INVALID_INFO_INDEX;
+    GraphicLockGuard guard(g_mutex);
+    while (!g_eventFinished) {
+        g_cond.Wait(g_mutex);
+    }
+    GetWatchInfo(uuid, index);
+    if (index == INVALID_INFO_INDEX) {
+        GRAPHIC_LOGE("uuid %u does not exist", uuid);
         return false;
     }
-    for (uint16_t i = 0; i < g_info.watchInfo.Size(); ++i) {
-        if (g_info.watchInfo[i].uuid == uuid) {
-            *watch = g_info.watchInfo[i];
-            return true;
-        }
-    }
-    return false;
+    memcpy_s(watch, sizeof(watch_dial_info), &g_info[index].watchInfo, sizeof(watch_dial_info));
+    return true;
 }
 
 bool GetWatchCapability(watch_dev_cap_info *capability)
@@ -235,90 +323,118 @@ bool GetCurrentWatchFaceInfo(watch_dial_info *watch)
 
 bool SetCurrentWatchFace(uint32_t uuid)
 {
-    if (!GetAllWatchInfo()) {
-        GRAPHIC_LOGE("failed to get all watch info.");
+    uint16_t index = INVALID_INFO_INDEX;
+    GraphicLockGuard guard(g_mutex);
+    while (!g_eventFinished) {
+        g_cond.Wait(g_mutex);
+    }
+    GetWatchInfo(uuid, index);
+    if (index == INVALID_INFO_INDEX) {
+        GRAPHIC_LOGE("uuid %u does not exist", uuid);
         return false;
     }
-    watch_dial_info info;
-    uint16_t index = 0;
-    bool isExists = false;
-    for (uint16_t i = 0; i < g_info.watchInfo.Size(); ++i) {
-        if (uuid == g_info.watchInfo[i].uuid) {
-            isExists = true;
-            info = g_info.watchInfo[i];
-            index = i;
-            break;
-        }
-    }
-    if (!isExists) {
-        GRAPHIC_LOGE("uuid does not exist!");
-        return false;
+    DialSetting setting = MainModel::GetInstance().GetDialSetting();
+    setting.dialFlag = 1;
+    setting.dialFullName = g_info[index].fileName;
+    if (NativeAbility::GetInstance().GetCurSliceId() == VIEW_SET_DIAL) {
+        GraphicService::GetInstance()->PostGraphicEvent([setting]() {
+            if (SetDialPresenter::GetCurrentInstance() != nullptr) {
+                SetDialPresenter::GetCurrentInstance()->SpecifyDialSetting(setting);
+            }
+        });
+        NativeAbility::GetInstance().ChangeSlice(VIEW_MAIN_SAMPLE);
+        return true;
     }
-    if (info.is_current_watch) {
+    if (g_info[index].watchInfo.is_current_watch) {
         return true;
     }
-
-    DialSetting setting = MainModel::GetInstance().GetDialSetting();
-    setting.dialFlag = 1;
-    setting.dialFullName = g_info.fileNames[index];
+    g_eventFinished = false;
     GraphicService::GetInstance()->PostGraphicEvent([setting]() {
+        GraphicLockGuard guardGraphic(g_mutex);
         MainModel::GetInstance().GetDialSetting() = setting;
         MainModel::GetInstance().AddDialSetting(setting);
         if (NativeAbility::GetInstance().GetCurSliceId() == VIEW_MAIN_SAMPLE) {
             MainViewSample::GetInstance()->ReloadWatchFace();
         }
+        g_eventFinished = true;
+        g_cond.Signal();
     });
+    TryToTurnOnScreen();
 
     return true;
 }
 
 bool UninstallWatch(uint32_t uuid)
 {
-    if (!GetAllWatchInfo()) {
-        GRAPHIC_LOGE("failed to get all watch info.");
-        return false;
-    }
-    watch_dial_info info;
-    uint16_t index = 0;
-    bool isExists = false;
-    for (uint16_t i = 0; i < g_info.watchInfo.Size(); ++i) {
-        if (uuid == g_info.watchInfo[i].uuid) {
-            isExists = true;
-            info = g_info.watchInfo[i];
-            index = i;
-            break;
-        }
-    }
-    if (!isExists) {
-        GRAPHIC_LOGE("uuid does not exist!");
+    uint16_t index = INVALID_INFO_INDEX;
+    GraphicLockGuard guard(g_mutex);
+    while (!g_eventFinished) {
+        g_cond.Wait(g_mutex);
+    }
+    GetWatchInfo(uuid, index);
+    if (index == INVALID_INFO_INDEX) {
+        GRAPHIC_LOGE("uuid %u does not exist", uuid);
         return false;
     }
 
-    if (info.is_current_watch) {
-        DialSetting setting = MainModel::GetInstance().GetDialSetting();
+    DialSetting setting = MainModel::GetInstance().GetDialSetting();
+    if (g_info[index].watchInfo.is_current_watch) {
         setting.dialFlag = 0;
         setting.dialId = 0;
-        std::string fileName = g_info.fileNames[index];
-        GraphicService::GetInstance()->PostGraphicEvent([setting, fileName]() {
-            MainModel::GetInstance().GetDialSetting() = setting;
-            MainModel::GetInstance().AddDialSetting(setting);
-            if (NativeAbility::GetInstance().GetCurSliceId() == VIEW_MAIN_SAMPLE) {
-                MainViewSample::GetInstance()->ReloadWatchFace();
-            }
-            if (remove(fileName.c_str()) != 0) {
-                GRAPHIC_LOGE("failed to remove file %s", fileName.c_str());
+    }
+    if (NativeAbility::GetInstance().GetCurSliceId() == VIEW_SET_DIAL) {
+        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);
+                }
+            });
+        }
+        NativeAbility::GetInstance().ChangeSlice(VIEW_MAIN_SAMPLE);
+        g_eventFinished = false;
+        GraphicService::GetInstance()->PostGraphicEvent([index]() {
+            GraphicLockGuard guardGraphic(g_mutex);
+            ImageCacheManager::GetInstance().UnloadAllInMultiRes(g_info[index].fileName);
+            if (remove(g_info[index].fileName.c_str()) != 0) {
+                GRAPHIC_LOGE("failed to remove file %s", g_info[index].fileName.c_str());
+                g_eventFinished = true;
+                g_cond.Signal();
+                return;
             }
+            g_info.Erase(index);
+            g_eventFinished = true;
+            g_cond.Signal();
         });
-    } else {
-        if (remove(g_info.fileNames[index].c_str()) != 0) {
-            GRAPHIC_LOGE("failed to remove file %s", g_info.fileNames[index].c_str());
-            return false;
-        }
+        return true;
     }
+
+    g_eventFinished = false;
+    GraphicService::GetInstance()->PostGraphicEvent([index, setting]() {
+        GraphicLockGuard guardGraphic(g_mutex);
+        if (g_info[index].watchInfo.is_current_watch &&
+            NativeAbility::GetInstance().GetCurSliceId() == VIEW_MAIN_SAMPLE) {
+            MainModel::GetInstance().GetDialSetting() = setting;
+            MainModel::GetInstance().AddDialSetting(setting);
+            MainViewSample::GetInstance()->ReloadWatchFace();
+        }
+        ImageCacheManager::GetInstance().UnloadAllInMultiRes(g_info[index].fileName);
+        if (remove(g_info[index].fileName.c_str()) != 0) {
+            GRAPHIC_LOGE("failed to remove file %s", g_info[index].fileName.c_str());
+            g_eventFinished = true;
+            g_cond.Signal();
+            return;
+        }
+        g_info.Erase(index);
+        g_eventFinished = true;
+        g_cond.Signal();
+    });
+    TryToTurnOnScreen();
     return true;
 }
 
-bool InstallWatch(const char *path, uint32_t *uuid)
+bool GetUuidByPath(const char *path, uint32_t *uuid)
 {
     if (path == nullptr || uuid == nullptr) {
         GRAPHIC_LOGE("para error!");
@@ -326,45 +442,31 @@ bool InstallWatch(const char *path, uint32_t *uuid)
     }
 
     DialPreviewInfo preview;
-    if (!GetPreviewInfo(std::string(path), preview)) {
+    if (!GetPreviewInfo(std::string(path), preview, true)) {
         return false;
     }
     if (std::string(preview.protocolVersion) < std::string("3.0")) {
         return false;
     }
-    *uuid = preview.uuid;
 
-    if (!GetAllWatchInfo()) {
-        GRAPHIC_LOGE("failed to get all watchinfo!");
-        return false;
-    }
-    for (uint16_t i = 0; i < g_info.watchInfo.Size(); ++i) {
-        const std::string &fileName = g_info.fileNames[i];
-        const watch_dial_info &info = g_info.watchInfo[i];
-        if (!(info.uuid == *uuid && std::string(path) != fileName)) {
-            continue;
-        }
-
-        if (info.is_current_watch) {
-            DialSetting setting = MainModel::GetInstance().GetDialSetting();
-            setting.dialFlag = 1;
-            setting.dialFullName = std::string(path);
-            GraphicService::GetInstance()->PostGraphicEvent([setting, fileName]() {
-                MainModel::GetInstance().GetDialSetting() = setting;
-                MainModel::GetInstance().AddDialSetting(setting);
-                if (NativeAbility::GetInstance().GetCurSliceId() == VIEW_MAIN_SAMPLE) {
-                    MainViewSample::GetInstance()->ReloadWatchFace();
-                }
-                if (remove(fileName.c_str()) != 0) {
-                    GRAPHIC_LOGE("failed to remove file %s", fileName.c_str());
-                }
-            });
-        } else {
-            if (remove(fileName.c_str()) != 0) {
-                return false;
+    watch_dial_info watchInfo;
+    if (ConvertPreview2WatchDialInfo(preview, watchInfo)) {
+        std::string activePath;
+        std::string appendPath(path);
+        bool isActiveExist = GetActiveWatchPath(activePath);
+        watchInfo.install_state = true;
+        watchInfo.is_current_watch = isActiveExist ? (activePath == appendPath) : false;
+        bool isExist = false;
+        for (uint16_t i = 0; i < g_info.Size(); ++i) {
+            if (g_info[i].fileName == appendPath) {
+                isExist = true;
+                break;
             }
         }
+        if (!isExist) {
+            g_info.PushBack({appendPath, watchInfo});
+        }
     }
-
+    *uuid = preview.uuid;
     return true;
 }
\ No newline at end of file
index 2426ea2..5617586 100644 (file)
@@ -4,8 +4,8 @@
  * Author:\r
  * Create: 2021-10-12\r
  */\r
-#include "CallerDisplayView.h"\r
-#include "MainCallingPresenter.h"\r
+#include "makephone/CallerDisplayView.h"\r
+#include "makephone/MainCallingPresenter.h"\r
 #include "UiConfig.h"\r
 \r
 namespace OHOS {\r
index 2c19d75..953900e 100644 (file)
@@ -4,8 +4,8 @@
  * Author:\r
  * Create: 2021-10-12\r
  */\r
-#include "CallingView.h"\r
-#include "MainCallingPresenter.h"\r
+#include "makephone/CallingView.h"\r
+#include "makephone/MainCallingPresenter.h"\r
 #include "wearable_log.h"\r
 #include "UiConfig.h"\r
 \r
index 99808b2..e18ae2a 100644 (file)
@@ -6,8 +6,8 @@
  */\r
 #include "wearable_log.h"\r
 #include "UiConfig.h"\r
-#include "DialingScreenView.h"\r
-#include "MainCallingPresenter.h"\r
+#include "makephone/DialingScreenView.h"\r
+#include "makephone/MainCallingPresenter.h"\r
 \r
 namespace OHOS {\r
 static constexpr uint16 MATH_ZERO = 0;\r
index db8a0b9..07b4d2c 100644 (file)
@@ -9,14 +9,14 @@
 #include "common/image_cache_manager.h"\r
 #include "UiConfig.h"\r
 #include "ui_resource_image.h"\r
-#include "MainCallingPresenter.h"\r
-#include "CallingView.h"\r
-#include "CallerDisplayView.h"\r
-#include "DialingScreenView.h"\r
-#include "MainCallingView.h"\r
+#include "makephone/MainCallingPresenter.h"\r
+#include "makephone/CallingView.h"\r
+#include "makephone/CallerDisplayView.h"\r
+#include "makephone/DialingScreenView.h"\r
+#include "makephone/MainCallingView.h"\r
 #include "NativeRegisterManager.h"\r
-#include "PhoneService.h"\r
-#include "WaitingHintsView.h"\r
+#include "phoneservice/PhoneService.h"\r
+#include "makephone/WaitingHintsView.h"\r
 \r
 namespace OHOS {\r
 \r
index c4e6af6..d079a96 100644 (file)
@@ -6,9 +6,9 @@
  */\r
 #include "wearable_log.h"\r
 #include "UiConfig.h"\r
-#include "MainCallingView.h"\r
-#include "MainCallingPresenter.h"\r
-#include "CallerLogModel.h"\r
+#include "makephone/MainCallingView.h"\r
+#include "makephone/MainCallingPresenter.h"\r
+#include "callerlog/CallerLogModel.h"\r
 \r
 namespace OHOS {\r
 static MainCallingView *g_pMainView = nullptr;\r
index e27e55d..549e699 100644 (file)
@@ -4,10 +4,10 @@
  * Author:\r
  * Create: 2022-03-14\r
  */\r
-#include "WaitingHintsView.h"\r
+#include "makephone/WaitingHintsView.h"\r
 #include "UiConfig.h"\r
-#include "CallerLogModel.h"\r
-#include "MainCallingPresenter.h"\r
+#include "callerlog/CallerLogModel.h"\r
+#include "makephone/MainCallingPresenter.h"\r
 \r
 namespace OHOS {\r
 static constexpr uint16 MATH_ZERO = 0;\r
index 2b1eb6b..aa90443 100644 (file)
@@ -5,8 +5,8 @@
  * Create: 2022-01-18\r
  */\r
 \r
-#include "MainVocassistView.h"\r
-#include "VocassistPresenter.h"\r
+#include "offlinevoice/MainVocassistView.h"\r
+#include "offlinevoice/VocassistPresenter.h"\r
 \r
 namespace OHOS {\r
 static MainVocassistView *g_pMainVocassistView = nullptr;\r
index adae52d..12b59a0 100644 (file)
@@ -4,10 +4,10 @@
  * Author: CompanyName
  * Create: 2022-01-18
  */
-#include "PhoneService.h"
-#include "MainViewSample.h"
-#include "VocassistView.h"
-#include "VocassistModel.h"
+#include "phoneservice/PhoneService.h"
+#include "main/MainViewSample.h"
+#include "offlinevoice/VocassistView.h"
+#include "offlinevoice/VocassistModel.h"
 #include "AppViewIDs.h"
 
 #include "NativeAbility.h"
index 3a38a9e..49596a4 100644 (file)
@@ -5,9 +5,9 @@
  * Create: 2022-01-18
  */
 #include "AppViewIDs.h"
-#include "VocassistPresenter.h"
-#include "PlayersModel.h"
-#include "ui_service.h"
+#include "offlinevoice/VocassistPresenter.h"
+#include "player/PlayersModel.h"
+#include "uiservice/ui_service.h"
 #include "NativeRegisterManager.h"
 
 namespace OHOS {
@@ -122,7 +122,6 @@ bool VocassistPresenter::OnDrag(UIView& view, const DragEvent& event)
 
 void VocassistPresenter::OnResume(void)
 {
-    Presenter<MainVocassistView>::OnResume();
     ScreenTurnOn(-1);
 }
 
index 70f80a8..e0c2c71 100644 (file)
@@ -9,11 +9,11 @@
 #include "ohos_timer.h"\r
 #include "graphic_timer.h"\r
 #include "AppViewIDs.h"\r
-#include "PlayersModel.h"\r
-#include "CallerLogModel.h"\r
-#include "VocassistModel.h"\r
-#include "VocassistView.h"\r
-#include "VocassistPresenter.h"\r
+#include "player/PlayersModel.h"\r
+#include "callerlog/CallerLogModel.h"\r
+#include "offlinevoice/VocassistModel.h"\r
+#include "offlinevoice/VocassistView.h"\r
+#include "offlinevoice/VocassistPresenter.h"\r
 \r
 static constexpr uint16_t SWITCH_MAP_NUM = 16;\r
 static constexpr uint16_t ANI_X = 84;\r
index 8b695c8..665d146 100644 (file)
@@ -4,8 +4,8 @@
  * Create: 2021-09-22
  */
 
-#include "PhoneAudio.h"
-#include "PhoneService.h"
+#include "phoneservice/PhoneAudio.h"
+#include "phoneservice/PhoneService.h"
 #include <iostream>
 #include <memory>
 #include "audio_manager.h"
index adaf6ce..66b8897 100644 (file)
@@ -4,8 +4,8 @@
  * Create: 2021-09-22
  */
 
-#include "PhoneService.h"
-#include "PhoneAudio.h"
+#include "phoneservice/PhoneService.h"
+#include "phoneservice/PhoneAudio.h"
 #include "securec.h"
 #include <cstdio>
 #include <cstdlib>
@@ -24,7 +24,7 @@
 #include "service_id_define.h"
 #include "graphic_mutex.h"
 #include "samgr_lite.h"
-#include "ui_service.h"
+#include "uiservice/ui_service.h"
 
 #ifdef __cplusplus
 extern "C" {
index dfae528..b05219e 100644 (file)
@@ -3,11 +3,11 @@
  * Description: bluetooth view 设置页面\r
  * Create: 2021-09-5\r
  */\r
-#include "BluetoothView.h"\r
-#include "PlayersView.h"\r
+#include "player/BluetoothView.h"\r
+#include "player/PlayersView.h"\r
 #include "UiConfig.h"\r
-#include "BluetoothEarPhoneView.h"\r
-#include "PlayersPresenter.h"\r
+#include "bluetooth/BluetoothEarPhoneView.h"\r
+#include "player/PlayersPresenter.h"\r
 \r
 namespace OHOS {\r
 static BluetoothView *g_bluetoothView{nullptr};\r
index b9e5502..0677520 100644 (file)
@@ -5,12 +5,12 @@
  * Create: 2021-07-26
  */
 #include <string>
-#include "PlayersCaseListAdapter.h"
+#include "player/PlayersCaseListAdapter.h"
 #include "gfx_utils/list.h"
-#include "PlayersView.h"
-#include "PlayersPresenter.h"
+#include "player/PlayersView.h"
+#include "player/PlayersPresenter.h"
 #include "wearable_log.h"
-#include "PlayersModel.h"
+#include "player/PlayersModel.h"
 
 namespace OHOS {
 constexpr uint16_t TESTCASE_BUTTON_HEIGHT = 64;
index e454449..410d073 100644 (file)
@@ -5,13 +5,13 @@
  * Create: 2021-07-26\r
  */\r
 \r
-#include "PlayersModel.h"\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 "BluetoothModel.h"\r
+#include "bluetooth/BluetoothModel.h"\r
 \r
 namespace OHOS {\r
 \r
@@ -107,7 +107,7 @@ int PlayersModel::PlayerStat()
         interrupt = {AUDIO_STREAM_MUSIC, sessionId, playerInterruptListener};\r
             // 激活音频中断 5s超时\r
         if (amIntance.ActivateAudioInterrupt(interrupt) == INTERRUPT_FAILED) {\r
-            WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ActivateAudioInterrupt faild");\r
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ActivateAudioInterrupt faild");\r
             return OHOS_FAILURE;\r
         }\r
         isActivateAudioInterrupt = true;\r
@@ -667,19 +667,22 @@ void PlayersModel::SetBTMusicPlay(avrcp_key_operation_t notification)
     }\r
 }\r
 // 蓝牙连接和本地的音乐播放\r
-void PlayersModel::ConnectBtAndLocalPlay(int32_t connCtState, int32_t connTgState, int32_t playerState)\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;\r
+        return -1;\r
     }\r
     if (connCtState == HFP_SCO_STATE_CONNECTED || connTgState == HFP_SCO_STATE_CONNECTED) {\r
         if (playerState == PlayerStates::PLAYER_PAUSED) {\r
-                WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BTPLAYER_PAUSED play, 122.");\r
-                PlayersModel::GetInstance()->GetPlayerCtr()->Play(); // 暂停后的播放\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
@@ -691,7 +694,11 @@ void PlayersModel::ConnectBtAndLocalPlay(int32_t connCtState, int32_t connTgStat
     } else {\r
         if (playerState == PlayerStates::PLAYER_PAUSED) {\r
                 WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "PLAYER_PAUSED play, 122.");\r
-                PlayersModel::GetInstance()->GetPlayerCtr()->Play();\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
@@ -699,19 +706,20 @@ void PlayersModel::ConnectBtAndLocalPlay(int32_t connCtState, int32_t connTgStat
                 }\r
         }\r
     }\r
+    return ret;\r
 }\r
 \r
 // 蓝牙连接和本地音乐的暂停\r
-void PlayersModel::ConnectBtAndLocalPause(int32_t connCtState, int32_t connTgState)\r
+int32_t PlayersModel::ConnectBtAndLocalPause(int32_t connCtState, int32_t connTgState)\r
 {\r
-    int ret;\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;\r
+            return -1;\r
         }\r
         ret = PlayersModel::GetInstance()->GetPlayerCtr()->Pause(); // 蓝牙连接暂停\r
         WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BT Music Pause, ret:%d", ret);\r
@@ -721,6 +729,7 @@ void PlayersModel::ConnectBtAndLocalPause(int32_t connCtState, int32_t connTgSta
         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
index e595ee3..8571cc9 100644 (file)
@@ -9,17 +9,17 @@
 #include <iostream>
 #include <cstdlib>
 #include <ctime>
-#include "PlayersPresenter.h"
+#include "player/PlayersPresenter.h"
 #include "wearable_log.h"
 #include "common/image_cache_manager.h"
 #include "UiConfig.h"
 #include "ui_resource_image.h"
-#include "PlayersView.h"
-#include "PlayersModel.h"
-#include "BluetoothPresenter.h"
+#include "player/PlayersView.h"
+#include "player/PlayersModel.h"
+#include "bluetooth/BluetoothPresenter.h"
 #include "graphic_service.h"
-#include "PhoneService.h"
-#include "MainViewSample.h"
+#include "phoneservice/PhoneService.h"
+#include "main/MainViewSample.h"
 
 #include "bts_avrcp_controller.h"
 #include "bts_avrcp_target.h"
@@ -733,6 +733,11 @@ bool PlayerInterruptListener::IsPaused()
     return isPaused_;
 }
 
+bool PlayerInterruptListener::IsInterruptedPaused()
+{
+    return isInterruptedPause_;
+}
+
 bool PlayerInterruptListener::IsDelayed()
 {
     return isDelayed_;
@@ -864,10 +869,12 @@ void PlayerInterruptListener::OnInterrupt(int32_t type, int32_t hint)
     WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "[PlayerInterruptListener::] OnInterrupt go in, type %d, hint %d.", type, hint);
 
     if (type == INTERRUPT_TYPE_BEGIN && hint == INTERRUPT_HINT_PAUSE) {
+        isInterruptedPause_ = true;
         PausePlayer();
     }
 
     if (type == INTERRUPT_TYPE_END && hint == INTERRUPT_HINT_RESUME) {
+        isInterruptedPause_ = false;
         ResumePlayer();
     }
 
index e318718..3c10323 100644 (file)
@@ -8,11 +8,11 @@
 #include <unistd.h>
 #include "common/image_cache_manager.h"
 #include "ui_resource_image.h"
-#include "PlayersView.h"
+#include "player/PlayersView.h"
 #include "UiConfig.h"
-#include "PlayersModel.h"
-#include "PlayersCaseListAdapter.h"
-#include "MainViewSample.h"
+#include "player/PlayersModel.h"
+#include "player/PlayersCaseListAdapter.h"
+#include "main/MainViewSample.h"
 
 namespace OHOS {
 static PlayersView* g_pPlayersView = nullptr;
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/qrcode_conn/src/QrcodeConnModel.cpp b/code/sdk/application/wearable/nativeapp/nativeui/qrcode_conn/src/QrcodeConnModel.cpp
new file mode 100644 (file)
index 0000000..2a78dc6
--- /dev/null
@@ -0,0 +1,20 @@
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: QrcodeConnModel.cpp\r
+ * Author:\r
+ * Create: 2025-04-24\r
+ */\r
+\r
+#include "qrcode_conn/QrcodeConnModel.h"\r
+\r
+namespace OHOS {\r
+QrcodeConnModel::QrcodeConnModel() {}\r
+\r
+QrcodeConnModel::~QrcodeConnModel() {}\r
+\r
+QrcodeConnModel &QrcodeConnModel::GetInstance()\r
+{\r
+    static QrcodeConnModel instance;\r
+    return instance;\r
+}\r
+}\r
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/qrcode_conn/src/QrcodeConnPresenter.cpp b/code/sdk/application/wearable/nativeapp/nativeui/qrcode_conn/src/QrcodeConnPresenter.cpp
new file mode 100644 (file)
index 0000000..cf94db4
--- /dev/null
@@ -0,0 +1,39 @@
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: QrcodeConnPresenter.cpp\r
+ * Author:\r
+ * Create: 2025-04-24\r
+ */\r
+#include "qrcode_conn/QrcodeConnPresenter.h"\r
+#include "uiservice/ui_service.h"\r
+#include "NativeRegisterManager.h"\r
+\r
+namespace OHOS {\r
+\r
+REGIST_MENU(VIEW_QRCODE_CONN, QrcodeConnView, QrcodeConnPresenter, PNG_APPLIST_UI_SAMPLE_IMAGE, PNG_APPLIST_DEFAULT_IMG,\r
+            "二维码连接");\r
+\r
+static QrcodeConnPresenter *g_QrcodeConnPresenter = nullptr;\r
+\r
+QrcodeConnPresenter::QrcodeConnPresenter()\r
+{\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "QrcodeConnPresenter::QrcodeConnPresenter");\r
+    g_QrcodeConnPresenter = this;\r
+}\r
+\r
+QrcodeConnPresenter::~QrcodeConnPresenter() {}\r
+\r
+QrcodeConnPresenter *QrcodeConnPresenter::GetInstance()\r
+{\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "QrcodeConnPresenter GetInstance");\r
+    return g_QrcodeConnPresenter;\r
+}\r
+\r
+bool QrcodeConnPresenter::OnDrag(UIView &view, const DragEvent &event)\r
+{\r
+    std::string id = view.GetViewId();\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "QrcodeConnPresenter::OnDrag [%s]", id.c_str());\r
+    NativeAbility::GetInstance().ChangeSlice(VIEW_APPLIST);\r
+    return false;\r
+}\r
+}\r
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/qrcode_conn/src/QrcodeConnView.cpp b/code/sdk/application/wearable/nativeapp/nativeui/qrcode_conn/src/QrcodeConnView.cpp
new file mode 100644 (file)
index 0000000..02efc59
--- /dev/null
@@ -0,0 +1,91 @@
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: QrcodeConnView.cpp\r
+ * Author:\r
+ * Create: 2025-04-24\r
+ */\r
+\r
+#include "qrcode_conn/QrcodeConnView.h"\r
+#include "qrcode_conn/QrcodeConnPresenter.h"\r
+#include "qrcode_conn/QrcodeConnModel.h"\r
+#include "bluetooth/BluetoothModel.h"\r
+#include "wearable_log.h"\r
+\r
+namespace OHOS {\r
+static const uint32_t QRCODE_POS_X = 76;\r
+static const uint32_t QRCODE_POS_Y = 76;\r
+static const uint32_t QRCODE_WIDTH = 282;\r
+static const uint32_t QRCODE_HEIGHT = 282;\r
+static const uint32_t PAD_SIZE = 10;\r
+\r
+static QrcodeConnView *g_pQrcodeConnView = nullptr;\r
+\r
+QrcodeConnView::QrcodeConnView()\r
+{\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "QrcodeConnView::QrcodeConnView");\r
+    g_pQrcodeConnView = this;\r
+}\r
+\r
+QrcodeConnView::~QrcodeConnView()\r
+{\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "QrcodeConnView::~QrcodeConnView");\r
+    g_pQrcodeConnView = nullptr;\r
+}\r
+\r
+QrcodeConnView *QrcodeConnView::GetInstance()\r
+{\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "QrcodeConnView::GetInstance");\r
+    return g_pQrcodeConnView;\r
+}\r
+\r
+void QrcodeConnView::InitView()\r
+{\r
+    if (group_ == nullptr) {\r
+        group_ = new UIScrollView();\r
+        group_->SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);\r
+        group_->SetStyle(STYLE_BACKGROUND_OPA, 0);\r
+    }\r
+    if (qrcode_ == nullptr) {\r
+        qrcode_ = new UIQrcode();\r
+    }\r
+    qrcode_->SetPosition(QRCODE_POS_X, QRCODE_POS_Y, QRCODE_WIDTH, QRCODE_HEIGHT);\r
+    qrcode_->SetQrcodeInfo(BluetoothModel::GetInstance()->getWatchName());\r
+    qrcode_->SetStyle(STYLE_PADDING_LEFT, PAD_SIZE);\r
+    qrcode_->SetStyle(STYLE_PADDING_RIGHT, PAD_SIZE);\r
+    qrcode_->SetStyle(STYLE_PADDING_TOP, PAD_SIZE);\r
+    qrcode_->SetStyle(STYLE_PADDING_BOTTOM, PAD_SIZE);\r
+    group_->Add(qrcode_);\r
+    UIView::OnDragListener *dragListener = (UIView::OnDragListener *)OHOS::QrcodeConnPresenter::GetInstance();\r
+    group_->SetOnDragListener(dragListener);\r
+    // 更新\r
+    group_->SetVisible(true);\r
+    AddViewToRootContainer(group_);\r
+    GetRootContainer()->Invalidate();\r
+}\r
+\r
+void QrcodeConnView::DeInit()\r
+{\r
+    if (group_ != nullptr) {\r
+        group_->RemoveAll();\r
+        delete group_;\r
+        group_ = nullptr;\r
+    }\r
+    if (qrcode_ != nullptr) {\r
+        delete qrcode_;\r
+        qrcode_ = nullptr;\r
+    }\r
+}\r
+\r
+void QrcodeConnView::OnStart()\r
+{\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "QrcodeConnView::OnStart");\r
+    InitView();\r
+}\r
+\r
+void QrcodeConnView::OnStop()\r
+{\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "QrcodeConnView::OnStop");\r
+    DeInit();\r
+    return;\r
+}\r
+}\r
index d2777a9..60dad05 100644 (file)
@@ -4,10 +4,11 @@
  * Create: 2022-04-28\r
  */\r
 \r
-#include "RebootDeviceView.h"\r
+#include "rebootdevice/RebootDeviceView.h"\r
+#include "PageTransitionMgr.h"\r
 #include "wearable_log.h"\r
 #include "UiConfig.h"\r
-#include "RebootPresenter.h"\r
+#include "rebootdevice/RebootPresenter.h"\r
 \r
 namespace OHOS {\r
 static RebootDeviceView *g_pRebootDeviceView{nullptr};\r
@@ -98,7 +99,7 @@ UIViewGroup *RebootDeviceView::InitShowUpView(void)
         WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "rebootDeviceDragListener GetInstance fail");\r
         return nullptr;\r
     }\r
-    if (PageTransitionMgr::GetInstance().GetTopSlideBackImage() == nullptr) { // support default slide back firstly\r
+    if (!PageTransitionMgr::GetInstance().CanSlideBack()) { // support default slide back firstly\r
         group->SetOnDragListener(rebootDeviceDragListener);\r
     }\r
     group->SetViewId(REBOOTDEVICE_VIEW);\r
index c248e7e..223e102 100644 (file)
@@ -4,9 +4,9 @@
  * Create: 2022-04-28
  */
 
-#include "RebootPresenter.h"
-#include "RebootView.h"
-#include "RebootModel.h"
+#include "rebootdevice/RebootPresenter.h"
+#include "rebootdevice/RebootView.h"
+#include "rebootdevice/RebootModel.h"
 #include "drag_event.h"
 #include "wearable_log.h"
 #include "NativeRegisterManager.h"
index 5d8d437..5c79564 100644 (file)
@@ -4,11 +4,12 @@
  * Create: 2022-04-28
  */
 
-#include "RebootView.h"
-#include "RebootModel.h"
+#include "rebootdevice/RebootView.h"
+#include "PageTransitionMgr.h"
+#include "rebootdevice/RebootModel.h"
 #include "wearable_log.h"
 #include "UiConfig.h"
-#include "RebootPresenter.h"
+#include "rebootdevice/RebootPresenter.h"
 
 namespace OHOS {
 static RebootView *g_pRebootView{nullptr};
@@ -47,6 +48,7 @@ RebootView *RebootView::GetInstance()
 
 void RebootView::OnStart()
 {
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "RebootView::~OnStart");
     if (RebootModel::GetInstance()->GetSelectView() == REBOOT) {
         ChangeView(REBOOT_MAX, REBOOTVIEW);
     } else if (RebootModel::GetInstance()->GetSelectView() == REBOOTDEVICE) {
@@ -161,7 +163,7 @@ UIViewGroup *RebootView::InitShowUpView(void)
         WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "rebootDragListener GetInstance fail");
         return nullptr;
     }
-    if (PageTransitionMgr::GetInstance().GetTopSlideBackImage() == nullptr) { // support default slide back firstly
+    if (!PageTransitionMgr::GetInstance().CanSlideBack()) { // support default slide back firstly
         group->SetOnDragListener(rebootDragListener);
     }
     group->SetViewId(REBOOT_VIEW);
index 24ef4ef..f2acf7e 100644 (file)
@@ -4,10 +4,11 @@
  * Create: 2022-04-28\r
  */\r
 \r
-#include "ShutdownDeviceView.h"\r
+#include "rebootdevice/ShutdownDeviceView.h"\r
+#include "PageTransitionMgr.h"\r
 #include "wearable_log.h"\r
 #include "UiConfig.h"\r
-#include "RebootPresenter.h"\r
+#include "rebootdevice/RebootPresenter.h"\r
 \r
 namespace OHOS {\r
 static ShutdownDeviceView *g_pShutdownDeviceView{nullptr};\r
@@ -98,7 +99,7 @@ UIViewGroup *ShutdownDeviceView::InitShowUpView(void)
         WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "rebootDragListener GetInstance fail");\r
         return nullptr;\r
     }\r
-    if (PageTransitionMgr::GetInstance().GetTopSlideBackImage() == nullptr) { // support default slide back firstly\r
+    if (!PageTransitionMgr::GetInstance().CanSlideBack()) { // support default slide back firstly\r
         group->SetOnDragListener(rebootDragListener);\r
     }\r
     group->SetViewId(SHUTDOWNDEVICE_VIEW);\r
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/recent_app/src/RecentAppPresenter.cpp b/code/sdk/application/wearable/nativeapp/nativeui/recent_app/src/RecentAppPresenter.cpp
new file mode 100644 (file)
index 0000000..63b9a66
--- /dev/null
@@ -0,0 +1,90 @@
+/*
+ * Copyright (c) 2025 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 "recent_app/RecentAppPresenter.h"
+#include "recent_app/RecentAppView.h"
+#include "RecentManager.h"
+#include "NativeRegisterManager.h"
+#include "msg_center_customer.h"
+
+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;
+    }
+}
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/recent_app/src/RecentAppView.cpp b/code/sdk/application/wearable/nativeapp/nativeui/recent_app/src/RecentAppView.cpp
new file mode 100644 (file)
index 0000000..7924320
--- /dev/null
@@ -0,0 +1,204 @@
+/*
+ * Copyright (c) 2025 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 "recent_app/RecentAppView.h"
+#include "wearable_log.h"
+#include "common/image_cache_manager.h"
+#include "common/screen.h"
+#include "Slice.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 (loadingAnim_ != nullptr) {
+        if (loadingAnim_->GetState() != Animator::STOP) {
+            loadingAnim_->Stop();
+        }
+        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();
+
+    loadingLabel_ = new UILabel();
+    if (loadingLabel_ == nullptr) {
+        return;
+    }
+    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);
+}
+
+void RecentAppView::LoadContent()
+{
+    if (viewiInitStatus_) {
+        return;
+    }
+
+    UIViewGroup* rootContainer = GetRootContainer();
+    if (!RecentManager::GetInstance()->IsUpdateCompleted()) {
+        loadingAnim_ = new Animator(&loadingAnimCb_, roller_, 0, true);
+        if (loadingAnim_ == nullptr) {
+            return;
+        }
+        loadingAnim_->Start();
+    } else {
+        LoadRecentAppContent();
+    }
+    viewiInitStatus_ = true;
+}
+
+void RecentAppView::LoadingAnimCb::Callback(UIView* view)
+{
+    if (RecentManager::GetInstance()->IsUpdateCompleted()) {
+        recentAppView_->LoadRecentAppContent();
+    }
+}
+
+void RecentAppView::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) {
+            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;
+        }
+    }
+    roller_->SetCurrentItem(alignItemName);
+}
+
+void RecentAppView::InitRecentApps()
+{
+    if (delBtn_ == nullptr) {
+        delBtn_ = new UILabelButton();
+    }
+    if (delBtn_ == nullptr) {
+        GRAPHIC_LOGE("new delBtn_ failed!");
+        return;
+    }
+
+    if (roller_ == nullptr) {
+        roller_ = new UIRollerView(false);
+    }
+    if (roller_ == nullptr) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new UIRollerView fail");
+        return;
+    }
+
+    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()
+{
+    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;
+    }
+
+    InitRecentApps();
+}
+}
\ No newline at end of file
index 707c2b7..90e10c7 100644 (file)
@@ -4,7 +4,7 @@
  * Create: 2024-08-12\r
  */\r
 \r
-#include "RestoreDefaultsView.h"\r
+#include "restoredefaults/RestoreDefaultsView.h"\r
 #include "components/ui_label.h"\r
 #include "wearable_log.h"\r
 #include "UiConfig.h"\r
index 8fb3a76..47a30ab 100644 (file)
@@ -4,9 +4,9 @@
  * Create: 2024-08-12\r
  */\r
 \r
-#include "RestoreDefaultsPresenter.h"\r
-#include "RestoreDefaultsView.h"\r
-#include "BluetoothModel.h"\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
 #ifdef SUPPORT_ALIPAY_SEC\r
 #include "alipay_feature.h"\r
 #endif\r
+#include "adapter.h"\r
+#include "bundlems_slite_client.h"\r
+#include "abilityms_slite_client.h"\r
+#include "stopwatch/StopwatchModel.h"\r
 \r
 namespace OHOS {\r
 \r
@@ -56,6 +60,11 @@ bool RestoreDefaultsPresenter::OnClick(UIView &view, const ClickEvent &event)
     return true;\r
 }\r
 \r
+static void UninstallCallbackFunc(const uint8_t resultCode, const void *resultMessage)\r
+{\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "UninstallCallbackFunc.");\r
+}\r
+\r
 void RestoreDefaultsPresenter::ConfirmOnClick()\r
 {\r
     bool res = bluetooth_factory_reset();\r
@@ -64,6 +73,53 @@ void RestoreDefaultsPresenter::ConfirmOnClick()
     (void)uapi_alipay_svr_reset();\r
     WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "uapi_alipay_svr_reset process.");\r
 #endif\r
+\r
+    BundleInfo *bundleInfos = nullptr;\r
+    int32_t count = 0;\r
+    int32_t ret = ERRCODE_FAIL;\r
+\r
+    ret = OHOS::BundleMsClient::GetInstance().GetBundleInfos(0, &bundleInfos, &count);\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "GetBundleInfos count = %d bundleRet = 0x%x", count, ret);\r
+    if (ret != 0) {\r
+        WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "Get bundleInfos Failed\n");\r
+    }else {\r
+            WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "\n"\r
+            "----------------- AppList Start --------------------\n");\r
+        for (int32_t i = 0; i < count; i++) {\r
+            WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP,\r
+            "App:%d-----------------\n"\r
+            "label:            %s\n"\r
+            "bundleName:       %s\n",\r
+            i+1,\r
+            bundleInfos[i].label,\r
+            bundleInfos[i].bundleName\r
+            );\r
+            ElementName* topAbility = OHOS::AbilityMsClient::GetInstance().GetTopAbility();\r
+\r
+            if ((topAbility != nullptr) && (strcmp(topAbility->bundleName, bundleInfos[i].bundleName) == 0)) {\r
+                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "js app is active, first need terminate");\r
+                int token = 0;\r
+                OHOS::AbilityMsClient::GetInstance().TerminateAbility(token);\r
+            }\r
+\r
+            InstallParam installParam = { .installLocation = 1, .keepData = false };\r
+            OHOS::BundleMsClient::GetInstance().Uninstall(bundleInfos[i].bundleName, &installParam, UninstallCallbackFunc);\r
+            FreeElement(topAbility);\r
+        }\r
+            WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "\n"\r
+            "----------------- AppList End -----------------------\n");\r
+    }\r
+    if (bundleInfos != nullptr) {\r
+        for (uint8_t i = 0; i < count; i++) {\r
+            ClearBundleInfo(bundleInfos + i);\r
+        }\r
+\r
+        if (bundleInfos != nullptr) {\r
+            AdapterFree(bundleInfos);\r
+            bundleInfos = nullptr;\r
+        }\r
+    }\r
+    StopwatchModel::GetInstance().ClearData();\r
     uapi_system_reboot(SYSTEM_SOFT_REBOOT);\r
     return;\r
 }\r
index 9c04748..d51d35f 100644 (file)
@@ -3,10 +3,11 @@
  * Description: RestoreSelect View\r
  * Create: 2024-08-12\r
  */\r
-#include "RestoreSelectView.h"\r
+#include "restoredefaults/RestoreSelectView.h"\r
+#include "PageTransitionMgr.h"\r
 #include "wearable_log.h"\r
 #include "UiConfig.h"\r
-#include "RestoreDefaultsPresenter.h"\r
+#include "restoredefaults/RestoreDefaultsPresenter.h"\r
 \r
 namespace OHOS {\r
 static RestoreSelectView *g_pRestoreSelectView { nullptr };\r
@@ -110,7 +111,7 @@ UIViewGroup *RestoreSelectView::InitShowUpView()
         WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "connectDragListener GetInstance fail");\r
         return nullptr;\r
     }\r
-    if (PageTransitionMgr::GetInstance().GetTopSlideBackImage() == nullptr) { // support default slide back firstly\r
+    if (!PageTransitionMgr::GetInstance().CanSlideBack()) { // support default slide back firstly\r
         group->SetOnDragListener(connectDragListener);\r
     }\r
     group->SetViewId(RESTORE_SELECT_VIEW);\r
index bd99bcd..5814fee 100644 (file)
@@ -14,8 +14,8 @@
 #include "securec.h"\r
 #include "broadcast_service.h"\r
 \r
-#include "AlmmgrAlarmClockManage.h"\r
-#include "RtcService.h"\r
+#include "alarmclockmanage/AlmmgrAlarmClockManage.h"\r
+#include "rtcservice/RtcService.h"\r
 \r
 #ifdef __cplusplus\r
 extern "C" {\r
index 89cef0a..991ee59 100644 (file)
@@ -9,16 +9,22 @@
 #include "power_display_service.h"
 #include "NativeAbility.h"
 #include "AppViewIDs.h"
-#include "MainViewSample.h"
-#include "ui_screennotify.h"
+#include "main/MainViewSample.h"
+#include "screennotify/ui_screennotify.h"
 #include "components/root_view.h"
 #include "notification_manager.h"
-#include "DialBinTypesV2.h"
+#include "main/DialBinTypesV2.h"
+#include "hal_tick.h"
+#include "abilityms_slite_client.h"
 
 #ifdef __cplusplus
 extern "C" {
 #endif
 static uint32_t g_back_to_home_interval = 5;
+static uint32_t g_back_to_pre_slice = 5;
+static uint32_t g_last_aod_on_stamp = 0;
+static std::string g_pre_bundle_name = "com.huawei.launcher";
+static bool g_is_native = true;
 
 // 需要屏蔽掉的slice,ignore_slice_ids数组中的slice灭屏超时后不会调转到默认界面
 uint16_t ignore_slice_ids[] = {
@@ -59,25 +65,53 @@ static void ChangeToHomeView(void)
     }
 }
 
-static void GuiEnterAod(bool entry)
+static void EnterAod()
 {
     using namespace OHOS;
-    DisplayState newState = entry ? DisplayState::AOD : DisplayState::NORMAL;
-
-    uint16_t current_slice_id = NativeAbility::GetInstance().GetCurSliceId();
-    for (uint16_t i = 0; i < sizeof(ignore_slice_ids) / sizeof(uint16_t); i++) {
-        if (ignore_slice_ids[i] == current_slice_id) {
-            return;
+    g_last_aod_on_stamp = HALTick::GetInstance().GetTime();
+    if (NativeAbility::GetInstance().GetNativeAbilityState() == STATE_ACTIVE) {
+        g_is_native = true;
+    } else {
+        ElementName *elementName = AbilityMsClient::GetInstance().GetTopAbility();
+        if (elementName != nullptr) {
+            g_pre_bundle_name = elementName->bundleName;
         }
+        g_is_native = false;
     }
-    if (NativeAbility::GetInstance().GetNativeAbilityState() == STATE_ACTIVE) {
-        if (newState == DisplayState::AOD) {
-            NativeAbility::GetInstance().ChangeSlice(VIEW_AOD);
-        } else {
-            NativeAbility::GetInstance().ChangeSlice(VIEW_MAIN_SAMPLE);
+    NativeAbility::GetInstance().ChangeSlice(VIEW_AOD);
+}
+
+static void ExitAod()
+{
+    using namespace OHOS;
+    uint32_t aodDur = HALTick::GetInstance().GetElapseTime(g_last_aod_on_stamp) / 1000;  // 1000: 1s = 1000ms
+    if (aodDur > g_back_to_pre_slice) {
+        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);
+                return;
+            }
         }
+        NativeAbility::GetInstance().ChangeSlice(VIEW_MAIN_SAMPLE);
+    } else {
+        if (!g_is_native) {
+            Want *want = new Want();
+            memset_s(want, sizeof(Want), 0, sizeof(Want));
+            ElementName startElement = {};
+            startElement.abilityName = "default";
+            startElement.bundleName = const_cast<char *>(g_pre_bundle_name.c_str());
+            startElement.deviceId = nullptr;
+            SetWantElement(want, startElement);
+            StartAbility(want);
+            ClearWant(want);
+            delete want;
+            return;
+        }
+        uint32_t preId = NativeAbility::GetInstance().GetPreTargetId();
+        NativeAbility::GetInstance().SwitchSlice(preId & SLICE_MASK, preId >> PAGE_OFFSET);
     }
-};
+}
 
 void notify_screen_on_event(void)
 {
@@ -103,12 +137,12 @@ void notify_screen_off_event(void)
 
 void notify_screen_aod_on_event(void)
 {
-    GuiEnterAod(true);
+    EnterAod();
 }
 
 void notify_screen_aod_off_event(void)
 {
-    GuiEnterAod(false);
+    ExitAod();
 }
 
 void set_back_to_home_interval(uint32_t time_sec)
@@ -121,6 +155,16 @@ uint32_t get_back_to_home_interval(void)
     return g_back_to_home_interval;
 }
 
+void set_back_to_pre_slice_interval(uint32_t time_sec)
+{
+    g_back_to_pre_slice = time_sec;
+}
+
+uint32_t get_back_to_pre_slice_interval(void)
+{
+    return g_back_to_pre_slice;
+}
+
 void registerNotifyScreenStatus(ScreenStatusNotifyCallback callback)
 {
     if (callback != nullptr) {
index 5720b83..6be2328 100644 (file)
@@ -13,7 +13,7 @@
 #include <unistd.h>
 #include "kvstore_env.h"
 #include "kv_store.h"
-#include "ScreenModels.h"
+#include "screensetting/ScreenModels.h"
 #include "common/image_cache_manager.h"
 #include "UiConfig.h"
 #include "ui_resource_image.h"
@@ -38,7 +38,7 @@ void ScreenModels::InitKvStorage(void)
 {
 #if !defined(_WIN32)
 #ifndef XTS_SUPPORT
-    int ret = UtilsSetEnv("/user/system");
+    int ret = UtilsSetEnv("/user");
     WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "UtilsSetEnv /user ret = %d", ret);
 #endif
 #else
index c916f4c..f37a50d 100644 (file)
@@ -7,7 +7,7 @@
 \r
 #include "UiConfig.h"\r
 #include <string>\r
-#include "SetCardDeleteView.h"\r
+#include "set_card/SetCardDeleteView.h"\r
 #include "wearable_log.h"\r
 \r
 namespace OHOS {\r
index 4bdd7ba..7d08205 100644 (file)
@@ -1,5 +1,5 @@
-#include "SetCardItem.h"\r
-#include "SetCardPresenter.h"\r
+#include "set_card/SetCardItem.h"\r
+#include "set_card/SetCardPresenter.h"\r
 #include "wearable_log.h"\r
 \r
 namespace OHOS {\r
index 32ca2b5..df4d971 100644 (file)
@@ -5,8 +5,8 @@
  * Create: 2021-11-23
  */
 
-#include "SetCardModel.h"
-#include "MainModel.h"
+#include "set_card/SetCardModel.h"
+#include "main/MainModel.h"
 #include "kv_store.h"
 #include "securec.h"
 
index eadcec9..f093158 100644 (file)
@@ -7,7 +7,7 @@
 \r
 #include "UiConfig.h"\r
 #include <string>\r
-#include "SetCardNoCardView.h"\r
+#include "set_card/SetCardNoCardView.h"\r
 #include "wearable_log.h"\r
 \r
 namespace OHOS {\r
index 1012057..0a93f42 100644 (file)
@@ -5,9 +5,9 @@
  * Create: 2021-11-23
  */
 
-#include "SetCardView.h"
-#include "SetCardModel.h"
-#include "SetCardPresenter.h"
+#include "set_card/SetCardView.h"
+#include "set_card/SetCardModel.h"
+#include "set_card/SetCardPresenter.h"
 #include "hal_tick.h"
 #include "NativeRegisterManager.h"
 
index c375c86..b9d31c3 100644 (file)
@@ -6,8 +6,8 @@
  */
 
 #include <string>
-#include "SetCardView.h"
-#include "SetCardPresenter.h"
+#include "set_card/SetCardView.h"
+#include "set_card/SetCardPresenter.h"
 
 namespace OHOS {
 SetCardView::SetCardView():contentList_(UIList::HORIZONTAL)
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/set_desktop/include/SetDesktopPresenter.h b/code/sdk/application/wearable/nativeapp/nativeui/set_desktop/include/SetDesktopPresenter.h
deleted file mode 100644 (file)
index 93c0587..0000000
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved.
- * Description: SetDesktopPresenter.h
- * Author:
- * Create: 2021-11-23
- */
-
-#ifndef SET_DESKTOP_PRESENTER_H
-#define SET_DESKTOP_PRESENTER_H
-
-#include "Presenter.h"
-#include "components/ui_view.h"
-
-namespace OHOS {
-static const char *SET_DESKTOP_LIST = "setdesktopList";
-static const char *SET_DESKTOP_HEXAGONS = "setdesktopHexagons";
-static const char *SET_DESKTOP_FOOTBALL = "setdesktopFootball";
-static const char *SET_DESKTOP_WATERFALL = "setdesktopWaterfall";
-
-class SetDesktopView;
-class SetDesktopModel;
-class SetDesktopPresenter : public Presenter<SetDesktopView>,
-                         public UIView::OnClickListener,
-                         public UIView::OnDragListener {
-public:
-    SetDesktopPresenter();
-    ~SetDesktopPresenter() override;
-    bool OnClick(UIView &view, const ClickEvent &event) override;
-    bool OnDrag(UIView& view, const DragEvent& event) override;
-    uint8_t GetCurrentStyle(void);
-private:
-};
-}
-
-#endif // SET_DESKTOP_PRESENTER_H
\ No newline at end of file
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/set_desktop/include/SetDesktopView.h b/code/sdk/application/wearable/nativeapp/nativeui/set_desktop/include/SetDesktopView.h
deleted file mode 100644 (file)
index 8de6379..0000000
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved.
- * Description: SetDesktopView.h
- * Author:
- * Create: 2021-11-23
- */
-
-#ifndef SET_DESKTOP_VIEW_H
-#define SET_DESKTOP_VIEW_H
-
-#include "View.h"
-#include "components/ui_scroll_view.h"
-#include "components/ui_view_group.h"
-#include "components/ui_label.h"
-#include "components/ui_image_view.h"
-#include "components/ui_toggle_button.h"
-#include "ChangeSliceListener.h"
-#include "UiConfig.h"
-
-namespace OHOS {
-class SetDesktopPresenter;
-
-class SetDesktopView : public View<SetDesktopPresenter> {
-public:
-    SetDesktopView();
-    ~SetDesktopView() override;
-
-    static SetDesktopView *GetInstance()
-    {
-        static SetDesktopView instance;
-        return &instance;
-    }
-
-    void OnStart() override;
-    void UpdateSelectedStyle(uint8_t selectedStyle);
-    uint8_t GetCurrentSelectedStyle(void);
-
-private:
-    void InitFootballItem();
-    void InitWaterfallItem();
-    UIScrollView *scrollview{nullptr};
-    UILabel titleText;
-    UIToggleButton hexagonsBtn;
-    UIToggleButton listBtn;
-    UIToggleButton footballBtn_;
-    UIToggleButton waterfallBtn_;
-    UIImageView hexagonsImage;
-    UIImageView listImage;
-    UIImageView footballImage_;
-    UIImageView waterfallImage_;
-    UILabel listText;
-    UILabel hexagonsText;
-    UILabel footballText_;
-    UILabel waterfallText_;
-};
-}
-#endif // SET_DESKTOP_VIEW_H
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/set_desktop/src/SetDesktopPresenter.cpp b/code/sdk/application/wearable/nativeapp/nativeui/set_desktop/src/SetDesktopPresenter.cpp
deleted file mode 100644 (file)
index 68b000b..0000000
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved.
- * Description: SettingPresenter.cpp
- * Author:
- * Create: 2021-11-23
- */
-
-#include "SetDesktopView.h"
-#include "SetDesktopModel.h"
-#include "SetDesktopPresenter.h"
-#include "NativeRegisterManager.h"
-
-namespace OHOS {
-
-REGIST_SLICE(VIEW_SET_DESKTOP, SetDesktopView, SetDesktopPresenter);
-
-    SetDesktopPresenter::SetDesktopPresenter()
-    {
-        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SetDesktopPresenter::SetDesktopPresenter");
-    }
-
-    SetDesktopPresenter::~SetDesktopPresenter() {}
-
-    bool SetDesktopPresenter::OnDrag(UIView& view, const DragEvent& event)
-    {
-        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SetDesktopPresenter::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, "SettingPresenter::OnDrag ChangeSlice");
-            uint16_t preSlice = NativeAbility::GetInstance().GetPreSliceId();
-            NativeAbility::GetInstance().ChangeSlice(preSlice);
-        }
-        return false;
-    }
-
-    bool SetDesktopPresenter::OnClick(UIView &view, const ClickEvent &event)
-    {
-        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SetDesktopPresenter::OnClick");
-        if (strcmp(view.GetViewId(), SET_DESKTOP_HEXAGONS) == 0) {
-            SetDesktopModel::GetInstance().SetDesktopStyle(DesktopStyle::HEXAGONS_STYLE);
-        } else if (strcmp(view.GetViewId(), SET_DESKTOP_LIST) == 0) {
-            SetDesktopModel::GetInstance().SetDesktopStyle(DesktopStyle::APPLIST_STYLE);
-        } else if (strcmp(view.GetViewId(), SET_DESKTOP_FOOTBALL) == 0) {
-            SetDesktopModel::GetInstance().SetDesktopStyle(DesktopStyle::FOOTBALL_STYLE);
-        } else if (strcmp(view.GetViewId(), SET_DESKTOP_WATERFALL) == 0) {
-            SetDesktopModel::GetInstance().SetDesktopStyle(DesktopStyle::WATERFALL_STYLE);
-        }
-        uint16_t preSlice = NativeAbility::GetInstance().GetPreSliceId();
-        NativeAbility::GetInstance().ChangeSlice(preSlice);
-        return true;
-    }
-
-    uint8_t SetDesktopPresenter::GetCurrentStyle(void)
-    {
-        DesktopStyle style = SetDesktopModel::GetInstance().GetDesktopStyle();
-        if (style == HEXAGONS_STYLE) {
-            return 1;   // 1: hexagons style enum index
-        } else if (style == FOOTBALL_STYLE) {
-            return 2;   // 2: football style enum index
-        } else if (style == WATERFALL_STYLE) {
-            return 3;   // 3: waterfall style enum index
-        }
-        return 0;
-    }
-}
index 974954c..8f15cfc 100644 (file)
@@ -5,12 +5,12 @@
  * Create: 2021-11-23
  */
 #include <algorithm>
-#include "MainModel.h"
-#include "SetDialModel.h"
+#include "main/MainModel.h"
+#include "set_dial/SetDialModel.h"
 #include "kv_store.h"
 #include "securec.h"
 #include "dirent.h"
-#include "DialBinParser.h"
+#include "main/DialBinParser.h"
 #include "wearable_log.h"
 
 namespace OHOS {
@@ -108,7 +108,7 @@ namespace OHOS {
             return -1;
         }
         DialPreviewInfo preInfo{0};
-        bool ret = DialBinParserManager::GetInstance()->GetDialPreviewInfo(fp, &preInfo);
+        bool ret = DialBinParserManager::GetInstance()->GetDialPreviewInfo(dialFullName, fp, &preInfo);
         if (!ret) {
             WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "GetDialPreviewInfo %s fail",
                           dialFullName.c_str());
index f769b0f..e332673 100644 (file)
@@ -5,14 +5,17 @@
  * Create: 2021-11-23
  */
 
-#include "SetDialView.h"
-#include "SetDialModel.h"
-#include "SetDialPresenter.h"
+#include "set_dial/SetDialView.h"
+#include "set_dial/SetDialModel.h"
+#include "set_dial/SetDialPresenter.h"
 #include "hal_tick.h"
 #include "NativeRegisterManager.h"
 
 
 namespace OHOS {
+namespace {
+SetDialPresenter *g_presenter = nullptr;
+}  // anonymous namespace
 
 REGIST_SLICE(VIEW_SET_DIAL, SetDialView, SetDialPresenter);
 
@@ -22,10 +25,25 @@ REGIST_SLICE(VIEW_SET_DIAL, SetDialView, SetDialPresenter);
         model = &SetDialModel::GetInstance();
         model->LoadAllDial();
         ResetTickTimer();
+        g_presenter = this;
+        specificSetting.dialFlag = 0;
+        specificSetting.dialId = 0;
     }
 
     SetDialPresenter::~SetDialPresenter()
     {
+        g_presenter = nullptr;
+    }
+
+    SetDialPresenter *SetDialPresenter::GetCurrentInstance()
+    {
+        return g_presenter;
+    }
+
+    void SetDialPresenter::SpecifyDialSetting(const DialSetting &setting)
+    {
+        isSpecific = true;
+        specificSetting = setting;
     }
 
     void SetDialPresenter::OnClickAction(void)
@@ -79,6 +97,10 @@ REGIST_SLICE(VIEW_SET_DIAL, SetDialView, SetDialPresenter);
     void SetDialPresenter::OnStop()
     {
         model->ClearDialInfo();
+        if (isSpecific) {
+            MainModel::GetInstance().GetDialSetting() = specificSetting;
+            MainModel::GetInstance().AddDialSetting(specificSetting);
+        }
     }
 
     void SetDialPresenter::ResetTickTimer(void)
index 15bba5f..a932d18 100644 (file)
@@ -6,9 +6,9 @@
  */
 
 #include <string>
-#include "SetDialView.h"
-#include "SetDialPresenter.h"
-#include "SetDialStyleModel.h"
+#include "set_dial/SetDialView.h"
+#include "set_dial/SetDialPresenter.h"
+#include "set_dial_style/SetDialStyleModel.h"
 
 namespace OHOS {
 SetDialView::SetDialView()
index 6980d5f..8c85a6a 100644 (file)
@@ -5,9 +5,9 @@
  * Create: 2024-06-06
  */
 
-#include "SetDialStyleView.h"
-#include "SetDialStyleModel.h"
-#include "SetDialStylePresenter.h"
+#include "set_dial_style/SetDialStyleView.h"
+#include "set_dial_style/SetDialStyleModel.h"
+#include "set_dial_style/SetDialStylePresenter.h"
 #include "NativeRegisterManager.h"
 
 namespace OHOS {
index 7d786aa..85d72a8 100644 (file)
@@ -5,10 +5,11 @@
  * Create: 2024-06-06
  */
 
-#include "SetDialStyleView.h"
-#include "SetDialStyleModel.h"
-#include "SetDialStylePresenter.h"
-#include "MainModel.h"
+#include "set_dial_style/SetDialStyleView.h"
+#include "PageTransitionMgr.h"
+#include "set_dial_style/SetDialStyleModel.h"
+#include "set_dial_style/SetDialStylePresenter.h"
+#include "main/MainModel.h"
 
 namespace OHOS {
 SetDialStyleView::SetDialStyleView()
@@ -23,7 +24,7 @@ void SetDialStyleView::OnStart()
 {
     GetRootContainer()->SetDraggable(true);
     GetRootContainer()->SetTouchable(true);
-    if (PageTransitionMgr::GetInstance().GetTopSlideBackImage() == nullptr) { // support default slide back firstly
+    if (!PageTransitionMgr::GetInstance().CanSlideBack()) { // support default slide back firstly
         GetRootContainer()->SetOnDragListener(presenter_);
     }
     const int16_t BTN_HEIGHT = 55;
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/set_ota/src/OTAModel.cpp b/code/sdk/application/wearable/nativeapp/nativeui/set_ota/src/OTAModel.cpp
new file mode 100644 (file)
index 0000000..60715c5
--- /dev/null
@@ -0,0 +1,150 @@
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025. All rights reserved.\r
+ * Description: ota local update\r
+ * Author: wangle\r
+ * Create: 2025-5-6\r
+ */\r
+#include "set_ota/OTACommon.h"\r
+#include "set_ota/OTAModel.h"\r
+#include "set_ota/OTAPresenter.h"\r
+#include "tcxo.h"\r
+#include "upg.h"\r
+#include "upg_porting.h"\r
+#include "upg_definitions.h"\r
+#include "upg_common_porting.h"\r
+#include "wearable_log.h"\r
+\r
+\r
+namespace OHOS {\r
+OTAModel::OTAModel()\r
+{\r
+    isIdel = true;\r
+    wait.wait = nullptr;\r
+    if (osal_wait_init(&wait) != 0) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ota osal_wait_init error");\r
+        return;\r
+    }\r
+    task = osal_kthread_create(&OTAModel::OSALKthreadCallback, this, "ota_model", MODLE_THREAD_STACK_SIZE);\r
+    if (task == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ota osal_wait_init error");\r
+        osal_wait_destroy(&wait);\r
+        return;\r
+    }\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "model init succ");\r
+}\r
+OTAModel::~OTAModel()\r
+{\r
+    if (task != nullptr) {\r
+        osal_kthread_destroy(task, 0);\r
+    }\r
+    if (wait.wait != nullptr) {\r
+        osal_wait_destroy(&wait);\r
+    }\r
+}\r
+\r
+int OTAModel::WaitCondition(const void *data)\r
+{\r
+    OTAModel *model = (OTAModel *)data;\r
+    return model->isIdel ? 0 : 1;  // 不空闲说明有任务\r
+}\r
+\r
+int OTAModel::OSALKthreadCallback(void *data)\r
+{\r
+    OTAModel *model = (OTAModel *)data;\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "model thread... callback");\r
+    while (true) {  // osal_kthread_destroy规定 线程销毁前必须一直存在\r
+        osal_wait_interruptible(&model->wait, &OTAModel::WaitCondition, data);\r
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "model thread... wait done");\r
+        model->SwitchTask();\r
+    }\r
+    return 0;\r
+}\r
+bool OTAModel::ModelRunTask(TaskType tasktype, void *taskdata)\r
+{\r
+    if (!isIdel)\r
+        return false;\r
+    type = tasktype;\r
+    data = taskdata;\r
+    isIdel = false;\r
+    osal_wait_wakeup(&wait);\r
+    return true;\r
+}\r
+void OTAModel::SwitchTask()\r
+{\r
+    switch (type) {\r
+        case TaskType::UpdateInfo:\r
+            UpdateInfo(data);\r
+            isIdel = true;\r
+            break;\r
+        case TaskType::LocalUpdate:\r
+            LocalUpdate(data);\r
+            isIdel = true;\r
+            break;\r
+        default:\r
+            break;  // 不处理\r
+    }\r
+}\r
+\r
+void OTAModel::UpdateInfo(void *data)\r
+{\r
+    uint32_t total_size = 0;\r
+    do {\r
+        FILE *fp = fopen(upg_get_pkg_file_path(), "rb");\r
+        if (fp == nullptr) {\r
+            break;\r
+        }\r
+        fseek(fp, 0L, SEEK_END);\r
+        total_size = ftell(fp);\r
+        fclose(fp);\r
+    } while (false);\r
+    presenter_->SetPackageInfo(upg_get_pkg_file_path(), total_size);\r
+}\r
+void OTAModel::LocalUpdate(void *data)\r
+{\r
+    upg_prepare_info_t info{((LocalUpdateData *)data)->fileSize};\r
+\r
+    // update 准备工作\r
+    presenter_->SetUpdateProgress("upg_prepare", LOCAL_UPDATE_PROGRESS_5);\r
+    errcode_t ret = uapi_upg_prepare(&info);\r
+    if (ret != ERRCODE_SUCC) {\r
+        presenter_->SetErrorMessage("uapi_upg_prepare error");\r
+        return;\r
+    }\r
+\r
+    // update 申请升级\r
+    presenter_->SetUpdateProgress("upg_request_upgrade", LOCAL_UPDATE_PROGRESS_25);\r
+    ret = uapi_upg_request_upgrade(false);\r
+    if (ret != ERRCODE_SUCC) {\r
+        presenter_->SetErrorMessage("uapi_upg_request_upgrade error");\r
+        return;\r
+    }\r
+    // 备份\r
+    presenter_->SetUpdateProgress("upg_image_backups", LOCAL_UPDATE_PROGRESS_40);\r
+    ret = upg_image_backups_update();\r
+    if (ret != ERRCODE_SUCC) {\r
+        presenter_->SetErrorMessage("upg_image_backups_update error");\r
+        return;\r
+    }\r
+\r
+    // update 开始升级\r
+    presenter_->SetUpdateProgress("upg_start", LOCAL_UPDATE_PROGRESS_50);\r
+    ret = uapi_upg_start();\r
+    if (ret != ERRCODE_SUCC) {\r
+        presenter_->SetErrorMessage("uapi_upg_start error");\r
+        return;\r
+    }\r
+    presenter_->SetUpdateProgress("reboot", LOCAL_UPDATE_PROGRESS_100);\r
+    DelayRebootFor5S();\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "update");\r
+}\r
+void OTAModel::DelayRebootFor5S()\r
+{\r
+    char temp[60] = "";\r
+    for (int i = 5; i > 0; i--) {\r
+        sprintf_s(temp, sizeof(temp), "%ds后系统将进行重启\r\n完成后续升级操作", i);\r
+        presenter_->SetMessage(temp);\r
+        osal_msleep(SLEEP_TIME_S);\r
+    }\r
+    upg_reboot();\r
+}\r
+}  // namespace OHOS\r
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/set_ota/src/OTAPresenter.cpp b/code/sdk/application/wearable/nativeapp/nativeui/set_ota/src/OTAPresenter.cpp
new file mode 100644 (file)
index 0000000..a77f53f
--- /dev/null
@@ -0,0 +1,126 @@
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025. All rights reserved.\r
+ * Description: ota local update\r
+ * Author: wangle\r
+ * Create: 2025-5-6\r
+ */\r
+#include "AppViewIDs.h"\r
+#include "NativeRegisterManager.h"\r
+#include "gfx_utils/graphic_math.h"\r
+#include "set_ota/OTACommon.h"\r
+#include "set_ota/OTAView.h"\r
+#include "set_ota/OTAPresenter.h"\r
+#include "set_ota/OTAModel.h"\r
+#include "main/HealthModel.h"\r
+#include "uiservice/ui_service.h"\r
+\r
+namespace OHOS {\r
+\r
+REGIST_SLICE(VIEW_SET_OTA, OTAView, OTAPresenter);\r
+\r
+void OTAPresenter::OnStart()\r
+{\r
+    if (model_ == nullptr) {\r
+        Attach(new OTAModel);\r
+    }\r
+    if (model_ != nullptr) {\r
+        model_->Attach(this);\r
+    }\r
+    view_->SetUpdateDisable();\r
+    view_->SetMessage("正在获取升级文件信息...");\r
+    view_->SetProgress(0);\r
+    model_->ModelRunTask(TaskType::UpdateInfo, nullptr);\r
+}\r
+void OTAPresenter::OnStop()\r
+{\r
+    if (model_ != nullptr) {\r
+        delete model_;\r
+        model_ = nullptr;\r
+    }\r
+}\r
+bool OTAPresenter::OnClick(UIView &view, const ClickEvent &event)\r
+{\r
+    if (strcmp(view.GetViewId(), "update") == 0) {\r
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "OTA OnClick... update");\r
+        // 调用model升级方法\r
+        model_->ModelRunTask(TaskType::LocalUpdate, nullptr);\r
+        view_->SetMessage("正在升级...");\r
+        view_->SetProgress(0);\r
+        view_->SetUpdateDisable();\r
+        updateEnable = true;  // 升级中, 禁止右滑退出\r
+        SaveSystemScreen();   // 升级中, 设置屏幕常亮\r
+    }\r
+    return true;\r
+}\r
+bool OTAPresenter::OnDrag(UIView &view, const DragEvent &event)\r
+{\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "OTA OnDrag...");\r
+    if (updateEnable && event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT) {\r
+        int16_t deltaX = event.GetDeltaX();\r
+        int16_t deltaY = event.GetDeltaY();\r
+        if (MATH_ABS(deltaX) >= MATH_ABS(deltaY) && MATH_ABS(deltaX) > SLIDING_LENGTH) {\r
+            NativeAbility::GetInstance().ChangeSlice(VIEW_APPLIST, TransitionType::TRANSITION_ZOOM);\r
+        }\r
+    }\r
+    return true;\r
+}\r
+\r
+void OTAPresenter::SetPackageInfo(const char *filePath, uint32_t fileSize)\r
+{\r
+    char tempBuffer[60] = "";\r
+    updateFilePath = filePath;\r
+    updateFileSize = fileSize;\r
+    updateEnable = true;\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "OTA SetPackageInfo");\r
+    if (fileSize != 0) {\r
+        double tempSizeMB = 1.0 * updateFileSize / 1024 / 1024;\r
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "calc");\r
+        sprintf_s(tempBuffer, sizeof(tempBuffer), "升级文件:%s\r\n大小:%.2lfMB", filePath, tempSizeMB);\r
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "sprintf");\r
+        view_->SetUpdateEnable();\r
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "View setEnable");\r
+        view_->SetMessage(tempBuffer);\r
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "view SetMessage");\r
+    } else {\r
+        sprintf_s(tempBuffer, sizeof(tempBuffer), "升级文件:%s\r\n不存在或已损坏", filePath);\r
+        view_->SetUpdateDisable();\r
+        view_->SetMessage(tempBuffer);\r
+    }\r
+}\r
+\r
+void OTAPresenter::SetUpdateProgress(const char *message, uint8_t progress)\r
+{\r
+    char tempBuffer[60] = "";\r
+    sprintf_s(tempBuffer, sizeof(tempBuffer), "正在升级...%u%%...\r\n%s", progress, message);\r
+    view_->SetMessage(tempBuffer);\r
+    view_->SetProgress(progress);\r
+}\r
+void OTAPresenter::SetErrorMessage(const char *message)\r
+{\r
+    char tempBuffer[60] = "";\r
+    sprintf_s(tempBuffer, sizeof(tempBuffer), "升级失败...\r\n%s", message);\r
+    view_->SetMessage(tempBuffer);\r
+    view_->SetUpdateEnable();  // 升级失败后, 允许重新升级\r
+    updateEnable = false;      // 升级失败后, 允许右滑退出\r
+    BackSystemScreen();        // 升级失败后, 回滚屏幕亮屏设置\r
+}\r
+void OTAPresenter::SetMessage(const char *message)\r
+{\r
+    view_->SetMessage(message);\r
+}\r
+void OTAPresenter::SaveSystemScreen()\r
+{\r
+    briScrStatus = HealthModel::GetInstance()->GetBriScrStatus();\r
+    if (briScrStatus == 0) {  // 若系统常亮未打开则打开系统常亮\r
+        ScreenOffEnable(0);\r
+        HealthModel::GetInstance()->UpdateBriScrStatus(1);\r
+    }\r
+}\r
+void OTAPresenter::BackSystemScreen()\r
+{\r
+    if (briScrStatus == 0) {  // 若系统原本未处于常亮则恢复\r
+        ScreenOffEnable(1);\r
+        HealthModel::GetInstance()->UpdateBriScrStatus(0);\r
+    }\r
+}\r
+}  // namespace OHOS
\ No newline at end of file
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/set_ota/src/OTAView.cpp b/code/sdk/application/wearable/nativeapp/nativeui/set_ota/src/OTAView.cpp
new file mode 100644 (file)
index 0000000..1161894
--- /dev/null
@@ -0,0 +1,133 @@
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025. All rights reserved.\r
+ * Description: ota local update\r
+ * Author: wangle\r
+ * Create: 2025-5-6\r
+ */\r
+#include "UiConfig.h"\r
+#include "set_ota/OTACommon.h"\r
+#include "set_ota/OTAView.h"\r
+#include "set_ota/OTAPresenter.h"\r
+#include "wearable_log.h"\r
+\r
+namespace OHOS {\r
+void OTAView::OnStart()\r
+{\r
+    InitMessageCtrl();\r
+    InitProgressCtrl();\r
+    InitUpdateCtrl();\r
+    AddCtrlToView();\r
+}\r
+void OTAView::InitMessageCtrl()\r
+{\r
+    if (message == nullptr) {\r
+        message = new UILabel();\r
+    }\r
+    message->SetPosition(VIEW_MESSAGE_X, VIEW_MESSAGE_Y);\r
+    message->Resize(VIEW_MESSAGE_W, VIEW_MESSAGE_H);\r
+    message->SetViewId("message");\r
+    message->SetStyle(STYLE_BACKGROUND_OPA, 0xff);\r
+    message->SetStyle(STYLE_TEXT_FONT, VIEW_MESSAGE_FONT);\r
+    message->SetStyle(STYLE_LINE_SPACE, 0);\r
+\r
+    message->SetLineBreakMode(UILabel::LINE_BREAK_WRAP);\r
+    message->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+    message->SetRollSpeed(0);\r
+    message->SetFont(DEFAULT_VECTOR_FONT_FILENAME, VIEW_MESSAGE_FONT);\r
+}\r
+void OTAView::InitProgressCtrl()\r
+{\r
+    if (progress == nullptr) {\r
+        progress = new UIBoxProgress();\r
+    }\r
+    progress->SetViewId("progress");\r
+    progress->SetDirection(UIBoxProgress::Direction::DIR_LEFT_TO_RIGHT);\r
+    progress->SetPosition(VIEW_PROGRESS_X, VIEW_PROGRESS_Y, VIEW_PROGRESS_W, VIEW_PROGRESS_H);\r
+    progress->SetValue(0);\r
+    progress->SetBackgroundStyle(STYLE_BACKGROUND_COLOR, Color::Red().full);\r
+    progress->SetForegroundStyle(STYLE_BACKGROUND_COLOR, Color::Green().full);\r
+    progress->SetStyle(STYLE_BORDER_COLOR, Color::Yellow().full);\r
+    progress->SetStep(1);\r
+    progress->EnableBackground(true);\r
+}\r
+void OTAView::InitUpdateCtrl()\r
+{\r
+    if (update == nullptr) {\r
+        update = new UILabelButton();\r
+    }\r
+    update->SetPosition(VIEW_UPDATE_X, VIEW_UPDATE_Y);\r
+    update->Resize(VIEW_UPDATE_W, VIEW_UPDATE_H);\r
+    update->SetViewId("update");\r
+    update->SetText("升级");\r
+    update->SetFont(DEFAULT_VECTOR_FONT_FILENAME, VIEW_UPDATE_FONT);\r
+    update->SetStyleForState(STYLE_BORDER_COLOR, 0xff0b1928, UIButton::PRESSED);\r
+    update->SetOnClickListener(presenter_);\r
+}\r
+void OTAView::AddCtrlToView()\r
+{\r
+    if (GetRootContainer() == nullptr)\r
+        return;\r
+    message->SetVisible(true);\r
+    progress->SetVisible(true);\r
+    update->SetVisible(true);\r
+    GetRootContainer()->Add(message);\r
+    GetRootContainer()->Add(progress);\r
+    GetRootContainer()->Add(update);\r
+    GetRootContainer()->SetTouchable(true);  // 添加滑动响应\r
+    GetRootContainer()->SetDraggable(true);\r
+    GetRootContainer()->SetOnDragListener(presenter_);\r
+}\r
+void OTAView::OnStop()\r
+{\r
+    DeInitMessageCtrl();\r
+    DeInitProgressCtrl();\r
+    DeInitUpdateCtrl();\r
+}\r
+void OTAView::DeInitMessageCtrl()\r
+{\r
+    if (message != nullptr) {\r
+        delete message;\r
+        message = nullptr;\r
+    }\r
+}\r
+void OTAView::DeInitProgressCtrl()\r
+{\r
+    if (progress != nullptr) {\r
+        delete progress;\r
+        progress = nullptr;\r
+    }\r
+}\r
+void OTAView::DeInitUpdateCtrl()\r
+{\r
+    if (update != nullptr) {\r
+        delete update;\r
+        update = nullptr;\r
+    }\r
+}\r
+void OTAView::SetUpdateEnable()\r
+{\r
+    if (update == nullptr)\r
+        return;\r
+    update->Enable();\r
+}\r
+void OTAView::SetUpdateDisable()\r
+{\r
+    if (update == nullptr)\r
+        return;\r
+    update->Disable();\r
+}\r
+\r
+void OTAView::SetMessage(const char *msg)\r
+{\r
+    if (message == nullptr)\r
+        return;\r
+    message->SetText(msg);\r
+}\r
+void OTAView::SetProgress(uint8_t progressNum)\r
+{\r
+    if (progress == nullptr)\r
+        return;\r
+    progress->SetValue(progressNum);\r
+}\r
+\r
+}  // namespace OHOS\r
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/settings/include/SettingPresenter.h b/code/sdk/application/wearable/nativeapp/nativeui/settings/include/SettingPresenter.h
deleted file mode 100644 (file)
index 6edba6a..0000000
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * 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"
-#include "components/ui_view.h"
-#include "SettingAdapter.h"
-
-namespace OHOS {
-class SettingView;
-class SettingModel;
-class SettingAdapter;
-class SettingPresenter : public Presenter<SettingView>,
-                         public UIView::OnClickListener,
-                         public UIView::OnDragListener {
-public:
-    SettingPresenter();
-    ~SettingPresenter() override;
-
-    void OnStart() override;
-    bool OnClick(UIView &view, const ClickEvent &event) override;
-    bool OnDrag(UIView& view, const DragEvent& event) override;
-private:
-    SettingModel *settingModel;
-};
-}
-
-#endif // SETTING_PRESENTER_H
\ No newline at end of file
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/settings/include/SettingView.h b/code/sdk/application/wearable/nativeapp/nativeui/settings/include/SettingView.h
deleted file mode 100644 (file)
index f8936c6..0000000
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved.
- * Description: SettingView.h
- * Author:
- * Create: 2021-11-23
- */
-
-#ifndef SETTING_VIEW_H
-#define SETTING_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 "SettingAdapter.h"
-#include "ChangeSliceListener.h"
-namespace OHOS {
-class SettingPresenter;
-class SettingView : public View<SettingPresenter> {
-public:
-    SettingView();
-    ~SettingView() override;
-
-    void OnStart() override;
-    void RefreshSettingsList(const SettingItem* item, uint8_t count);
-private:
-    SettingAdapter *listAdapter{nullptr};
-    UIScrollView *scrollView{nullptr};
-    UIList *contentList{nullptr};
-    UILabel *title{nullptr};
-};
-}
-#endif // SETTING_VIEW_H
\ No newline at end of file
@@ -1,19 +1,16 @@
 /*
- * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved.
- * Description: SettingModel.cpp
- * Author:
- * Create: 2021-11-23
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.
+ * Description: SetDesktopModel
+ * Author: Hisi Graphic Team
+ * Created: 2025-4
  */
 
-#include "SetDesktopModel.h"
+#include "settings/SetDesktopModel.h"
 #include "kv_store.h"
 #include "securec.h"
 
 namespace OHOS {
     static const int STYLE_VALUE_LEN = 32;
-    SetDesktopModel::SetDesktopModel() {}
-
-    SetDesktopModel::~SetDesktopModel() {}
 
     SetDesktopModel &SetDesktopModel::GetInstance()
     {
@@ -1,24 +1,35 @@
 /*
- * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved.
- * Description: SetDesktopView.cpp
- * Author:
- * Create: 2021-11-23
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.
+ * Description: SettingDesktopPage
+ * Author: Hisi Graphic Team
+ * Created: 2025-4
  */
 
+#include "settings/SettingDesktopPage.h"
 #include <string>
-#include "SetDesktopView.h"
-#include "SetDesktopPresenter.h"
 #include "components/ui_scroll_view_nested.h"
+#include "common/screen.h"
+#include "wearable_log.h"
+#include "NativeAbility.h"
+#include "PageTransitionMgr.h"
+#include "SlicePageFactory.h"
+#include "settings/SettingView.h"
 
 namespace OHOS {
-SetDesktopView::SetDesktopView()
+static const char *SET_DESKTOP_LIST = "setdesktopList";
+static const char *SET_DESKTOP_HEXAGONS = "setdesktopHexagons";
+static const char *SET_DESKTOP_FOOTBALL = "setdesktopFootball";
+static const char *SET_DESKTOP_WATERFALL = "setdesktopWaterfall";
+
+REGIST_SLICE_PAGE(VIEW_SETTING, SETTING_PAGES::SETTING_DESKTOP_PAGE, SettingDesktopPage, false);
+SettingDesktopPage::SettingDesktopPage()
 {
-    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SetDesktopView::SetDesktopView");
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SettingDesktopPage::SettingDesktopPage");
 }
 
-SetDesktopView::~SetDesktopView()
+SettingDesktopPage::~SettingDesktopPage()
 {
-    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SetDesktopView::~SetDesktopView");
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SettingDesktopPage::~SettingDesktopPage");
     if (scrollview != nullptr) {
         scrollview->RemoveAll();
         delete scrollview;
@@ -26,13 +37,11 @@ SetDesktopView::~SetDesktopView()
     }
 }
 
-void SetDesktopView::OnStart()
+void SettingDesktopPage::OnStart(void *data)
 {
-    GetRootContainer()->SetDraggable(true);
-    if (PageTransitionMgr::GetInstance().GetTopSlideBackImage() == nullptr) { // support default slide back firstly
-        GetRootContainer()->SetOnDragListener(presenter_);
+    if (GetBackDragListener() == nullptr) { // support default slide back firstly
+        GetSlicePageContainer()->SetOnDragListener(this);
     }
-    GetRootContainer()->SetTouchable(true);
 
     scrollview = new UIScrollViewNested(UIAbstractScroll::HORIZONTAL);
     UIScrollViewNested *nested = dynamic_cast<UIScrollViewNested*>(scrollview);
@@ -40,14 +49,14 @@ void SetDesktopView::OnStart()
         nested->SetBoundaryIntercept(DragEvent::DIRECTION_LEFT_TO_RIGHT, false);
     }
     scrollview->SetPosition(0, 0, Screen::GetInstance().GetWidth(), Screen::GetInstance().GetHeight());
-    AddViewToRootContainer(scrollview);
+    AddViewToPageContainer(scrollview);
 
     titleText.SetPosition(180, 45, 260, 110);
     titleText.SetText("桌面");
     titleText.SetLineBreakMode(UILabel::LINE_BREAK_ADAPT);
     titleText.SetFont(DEFAULT_VECTOR_FONT_FILENAME, 40);
     titleText.SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);
-    AddViewToRootContainer(&titleText);
+    AddViewToPageContainer(&titleText);
 
     listImage.SetPosition(0, 135, 190, 190);
     listImage.SetSrc(PNG_SET_DESKTOP_BG_IMAGE);
@@ -83,14 +92,14 @@ void SetDesktopView::OnStart()
 
     InitFootballItem();
     InitWaterfallItem();
-    listBtn.SetOnClickListener(presenter_);
-    hexagonsBtn.SetOnClickListener(presenter_);
-    footballBtn_.SetOnClickListener(presenter_);
-    waterfallBtn_.SetOnClickListener(presenter_);
-    UpdateSelectedStyle(presenter_->GetCurrentStyle());
+    listBtn.SetOnClickListener(this);
+    hexagonsBtn.SetOnClickListener(this);
+    footballBtn_.SetOnClickListener(this);
+    waterfallBtn_.SetOnClickListener(this);
+    UpdateSelectedStyle(SetDesktopModel::GetInstance().GetDesktopStyle());
 }
 
-void SetDesktopView::UpdateSelectedStyle(uint8_t selectedStyle)
+void SettingDesktopPage::UpdateSelectedStyle(DesktopStyle selectedStyle)
 {
     hexagonsImage.SetVisible(false);
     hexagonsBtn.SetState(false);
@@ -101,13 +110,13 @@ void SetDesktopView::UpdateSelectedStyle(uint8_t selectedStyle)
     waterfallImage_.SetVisible(false);
     waterfallBtn_.SetState(false);
 
-    if (selectedStyle == 1) { // 1: select hexagons style
+    if (selectedStyle == HEXAGONS_STYLE) { // 1: select hexagons style
         hexagonsImage.SetVisible(true);
         hexagonsBtn.SetState(true);
-    } else if (selectedStyle == 2) { // 2: select football style
+    } else if (selectedStyle == FOOTBALL_STYLE) { // 2: select football style
         footballImage_.SetVisible(true);
         footballBtn_.SetState(true);
-    } else if (selectedStyle == 3) { // 3: select waterfall style
+    } else if (selectedStyle == WATERFALL_STYLE) { // 3: select waterfall style
         waterfallImage_.SetVisible(true);
         waterfallBtn_.SetState(true);
     } else {
@@ -116,7 +125,7 @@ void SetDesktopView::UpdateSelectedStyle(uint8_t selectedStyle)
     }
 }
 
-void SetDesktopView::InitFootballItem()
+void SettingDesktopPage::InitFootballItem()
 {
     footballImage_.SetPosition(300, 135, 190, 190);
     footballImage_.SetSrc(PNG_SET_DESKTOP_BG_IMAGE);
@@ -135,7 +144,7 @@ void SetDesktopView::InitFootballItem()
     scrollview->Add(&footballText_);
 }
 
-void SetDesktopView::InitWaterfallItem()
+void SettingDesktopPage::InitWaterfallItem()
 {
     waterfallImage_.SetPosition(450, 135, 190, 190);
     waterfallImage_.SetSrc(PNG_SET_DESKTOP_BG_IMAGE);
@@ -153,8 +162,34 @@ void SetDesktopView::InitWaterfallItem()
     waterfallText_.SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);
     scrollview->Add(&waterfallText_);
 }
-uint8_t SetDesktopView::GetCurrentSelectedStyle()
+
+bool SettingDesktopPage::OnDrag(UIView& view, const DragEvent& event)
 {
-    return presenter_->GetCurrentStyle();
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SettingDesktopPage::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, "SettingPresenter::OnDrag ChangeSlice");
+        uint16_t preSlice = NativeAbility::GetInstance().GetPreSliceId();
+        NativeAbility::GetInstance().ChangeSlice(preSlice);
+    }
+    return false;
+}
+
+bool SettingDesktopPage::OnClick(UIView &view, const ClickEvent &event)
+{
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SettingDesktopPage::OnClick");
+    if (strcmp(view.GetViewId(), SET_DESKTOP_HEXAGONS) == 0) {
+        SetDesktopModel::GetInstance().SetDesktopStyle(DesktopStyle::HEXAGONS_STYLE);
+    } else if (strcmp(view.GetViewId(), SET_DESKTOP_LIST) == 0) {
+        SetDesktopModel::GetInstance().SetDesktopStyle(DesktopStyle::APPLIST_STYLE);
+    } else if (strcmp(view.GetViewId(), SET_DESKTOP_FOOTBALL) == 0) {
+        SetDesktopModel::GetInstance().SetDesktopStyle(DesktopStyle::FOOTBALL_STYLE);
+    } else if (strcmp(view.GetViewId(), SET_DESKTOP_WATERFALL) == 0) {
+        SetDesktopModel::GetInstance().SetDesktopStyle(DesktopStyle::WATERFALL_STYLE);
+    }
+    uint16_t preSlice = NativeAbility::GetInstance().GetPreSliceId();
+    NativeAbility::GetInstance().ChangeSlice(preSlice);
+    return true;
 }
 }
index 19129a3..9e88a4e 100644 (file)
@@ -6,7 +6,7 @@
  */
 
 #include "wearable_log.h"
-#include "SettingItemView.h"
+#include "settings/SettingItemView.h"
 
 namespace OHOS {
     static constexpr int16 SETTING_ICON_X = 20;
@@ -43,7 +43,6 @@ namespace OHOS {
     void SettingItemView::SetItemInfo(const SettingItem itemInfo)
     {
         sItemInfo = itemInfo;
-        WEARABLE_LOGE("SettingItemView::SetItemInfo: %s", sItemInfo.label);
         sIcon.SetSrc(itemInfo.icon);
         sLabel.SetText(itemInfo.label);
         sNextImage.SetVisible(itemInfo.hasSecondMenu);
@@ -68,9 +67,9 @@ namespace OHOS {
         sNextImage.SetStyle(STYLE_IMAGE_OPA, OPA_OPAQUE);
     }
 
-    AppViewId SettingItemView::GetViewId()
+    uint32_t SettingItemView::GetTargetId()
     {
-        return sItemInfo.viewId;
+        return sItemInfo.targetId;
     }
 
     const char* SettingItemView::GetIconId()
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/settings/src/SettingMainPage.cpp b/code/sdk/application/wearable/nativeapp/nativeui/settings/src/SettingMainPage.cpp
new file mode 100644 (file)
index 0000000..207eef0
--- /dev/null
@@ -0,0 +1,174 @@
+/*
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.
+ * Description: SettingMainPage
+ * Author: Hisi Graphic Team
+ * Created: 2025-4
+ */
+
+#include <string>
+
+#include "settings/SettingMainPage.h"
+#include "components/ui_list_nested.h"
+#include "components/ui_scroll_view_nested.h"
+#include "NativeAbility.h"
+#include "SlicePageFactory.h"
+#include "settings/SettingItem.h"
+#include "settings/SettingPresenter.h"
+#include "settings/SettingView.h"
+#include "PageTransitionMgr.h"
+#include "settings/SetDesktopModel.h"
+#include "rebootdevice/RebootModel.h"
+#include "settings/SettingModel.h"
+
+namespace OHOS {
+REGIST_SLICE_PAGE(VIEW_SETTING, SETTING_PAGES::SETTING_MAIN_PAGE, SettingMainPage, true);
+
+static constexpr uint8_t SETTINGS_ITEM_FONT_SIZE = 40;
+static constexpr int16_t SETTINGS_RESIZE_SIZE_WIDTH = 100;
+static constexpr int16_t SETTINGS_RESIZE_SIZE_HEIGHT = 60;
+static constexpr int16_t SETTING_TITLE_POSITION_X = 187;
+static constexpr int16_t SETTING_LIST_POSITION_X = 32;
+static constexpr int16_t SETTING_LIST_POSITION_Y = 90;
+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;
+
+SettingMainPage::~SettingMainPage()
+{
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SettingMainPage::~SettingMainPage");
+    if (scrollView != nullptr) {
+        scrollView->RemoveAll();
+        delete scrollView;
+        scrollView = nullptr;
+    }
+
+    if (title != nullptr) {
+        delete title;
+        title = nullptr;
+    }
+
+    if (listAdapter != nullptr) {
+        delete listAdapter;
+        listAdapter = nullptr;
+    }
+
+    if (contentList != nullptr) {
+        delete contentList;
+        contentList = nullptr;
+    }
+}
+
+void SettingMainPage::OnStart(void* data)
+{
+    title = new UILabel();
+    if (title == nullptr) {
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SettingMainPage::OnStart::title is nullptr");
+        return;
+    }
+    title->SetPosition(SETTING_TITLE_POSITION_X, 0);
+    title->SetText("设置");
+    title->Resize(SETTINGS_RESIZE_SIZE_WIDTH, SETTINGS_RESIZE_SIZE_HEIGHT);
+    title->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SETTINGS_ITEM_FONT_SIZE);
+    title->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);
+    title->SetStyle(STYLE_TEXT_OPA, OPA_OPAQUE);
+    title->SetStyle(STYLE_TEXT_COLOR, Color::White().full);
+    title->SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);
+    title->SetStyle(STYLE_BACKGROUND_OPA, OPA_OPAQUE);
+
+    contentList = new UIListNested();
+    if (contentList == nullptr) {
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SettingMainPage::OnStart::contentList is nullptr");
+        return;
+    }
+    contentList->SetPosition(SETTING_LIST_POSITION_X, SETTING_LIST_POSITION_Y);
+    contentList->Resize(HORIZONTAL_RESOLUTION, 364); // 364: height
+    contentList->SetScrollBlankSize(SETTING_SCROLLBLANKSIZE);
+    contentList->SetSelectPosition(HORIZONTAL_RESOLUTION / SNUM_2); // middle position
+    contentList->SetDraggable(true);
+    contentList->SetThrowDrag(true);
+    contentList->EnableAutoAlign(true);
+    contentList->SetMaxScrollDistance(MAX_SCR_DIS);
+
+    scrollView = new UIScrollViewNested();
+    if (scrollView == nullptr) {
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SettingMainPage::OnStart::scrollView is nullptr");
+        return;
+    }
+    scrollView->Resize(HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);
+    scrollView->SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);
+    scrollView->SetStyle(STYLE_BACKGROUND_OPA, UN_OPACITY);
+    scrollView->SetThrowDrag(true);
+
+    if (PageTransitionMgr::GetInstance().GetTopSlideBackImage() == nullptr) { // support default slide back firstly
+        scrollView->SetOnDragListener(this);
+    }
+    scrollView->Add(title);
+    scrollView->Add(contentList);
+    SettingModel::GetInstance().InitSettingItem();
+    AddViewToPageContainer(scrollView);
+    RefreshSettingsList(SettingModel::GetInstance().GetSettinglistItems(),
+        SettingModel::GetInstance().GetSettingListNum());
+}
+
+void SettingMainPage::RefreshSettingsList(const SettingItem* item, uint8_t count)
+{
+    listAdapter = new SettingAdapter();
+    if (listAdapter == nullptr) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SettingMainPage::OnStart::listAdapter is nullptr");
+        return;
+    }
+    listAdapter->SetItemClickListener(this);
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SettingMainPage::RefreshSettingsList");
+    for (int i = 0; i < count; i++) {
+        listAdapter->AddListItem(item[i]);
+    }
+    contentList->SetAdapter(listAdapter);
+}
+
+bool SettingMainPage::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())))) {
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SettingPresenter::OnDrag ChangeSlice(VIEW_APPLIST)");
+        if (SetDesktopModel::GetInstance().GetDesktopStyle() == HEXAGONS_STYLE) {
+            NativeAbility::GetInstance().ChangeSlice(VIEW_APPLIST, TransitionType::TRANSITION_BACK_TO_HEXAGONS);
+        } else if (SetDesktopModel::GetInstance().GetDesktopStyle() == WATERFALL_STYLE) {
+            NativeAbility::GetInstance().ChangeSlice(VIEW_APPLIST, TransitionType::TRANSITION_BACK_TO_WATERFALL);
+        } else {
+            NativeAbility::GetInstance().ChangeSlice(VIEW_APPLIST);
+        }
+    }
+    return false;
+}
+
+bool SettingMainPage::OnClick(UIView &view, const ClickEvent &event)
+{
+    UNUSED(event);
+    SettingItemView *settingItemView = static_cast<SettingItemView *>(&view);
+    uint32_t targetId = settingItemView->GetTargetId();
+    uint16_t sliceId = static_cast<uint16_t>(targetId & SLICE_MASK);
+    uint16_t pageId = static_cast<uint16_t>(targetId >> PAGE_OFFSET);
+    if (sliceId == VIEW_REBOOT) {
+        if (strstr(settingItemView->GetIconId(), "REBOOT") != nullptr) {
+            RebootModel::GetInstance()->SetSelectViewId(REBOOTDEVICE);
+            RebootModel::GetInstance()->SetExitsView(true);
+        } else {
+            RebootModel::GetInstance()->SetSelectViewId(SHUTDOWNDEVICE);
+            RebootModel::GetInstance()->SetExitsView(true);
+        }
+    }
+    if (sliceId != VIEW_SETTING) {
+        if (settingItemView->SlideBackEnabled()) {
+            NativeAbility::GetInstance().ChangeSlice(sliceId, TransitionType::TRANSITION_INVALID,
+                gSliceDefaultPriority, true);
+        } else {
+            NativeAbility::GetInstance().ChangeSlice(sliceId);
+        }
+    } else {
+        NativeAbility::GetInstance().SwitchPageInSlice(pageId, nullptr, TransitionType::TRANSITION_INVALID, true);
+    }
+    return true;
+}
+}
index 3345274..d732125 100644 (file)
@@ -5,8 +5,10 @@
  * Create: 2021-11-23
  */
 
-#include "SettingModel.h"
-#include "PullUpDownView.h"
+#include "settings/SettingModel.h"
+#include "Slice.h"
+#include "main/PullUpDownView.h"
+#include "settings/SettingView.h"
 
 namespace OHOS {
     SettingModel::SettingModel() {}
@@ -22,15 +24,20 @@ namespace OHOS {
     void SettingModel::InitSettingItem()
     {
         int index = 0;
-        settings[index++] = {VIEW_BLUETOOTH_EARPHONE, PNG_BLUETOOTH_STITLE, "蓝牙耳机", true, false};
-        settings[index++] = {VIEW_CONNECT_PHONE, PNG_CONNECT_PHONE_IMAGE, "连接手机", true, true};
-        settings[index++] = {VIEW_REBOOT, PNG_SETTTING_REBOOT_IMAGE, "重启", true, true};
-        settings[index++] = {VIEW_REBOOT, PNG_SETTTING_SHUTDOWN_IMAGE, "关机", true, true};
-        settings[index++] = {VIEW_SET_DESKTOP, PNG_SETTTING_DESKTOP_IMAGE, "桌面", true, true};
-        settings[index++] = {VIEW_SET_DIAL, PNG_SETTTING_DESKTOP_IMAGE, "表盘", true, false};
-        settings[index++] = {VIEW_SET_CARD, PNG_SETTTING_DESKTOP_IMAGE, "卡片", true, false};
-        settings[index++] = {VIEW_SET_DIAL_STYLE, PNG_SETTTING_DESKTOP_IMAGE, "表盘风格", true, true};
-        settings[index++] = {VIEW_RESTORE_DEFAULTS, PNG_SETTTING_DESKTOP_IMAGE, "恢复出厂", true, true};
+        settings[index++] = {static_cast<uint32_t>(VIEW_BLUETOOTH_EARPHONE), PNG_BLUETOOTH_STITLE,
+            "蓝牙耳机", true, false};
+        settings[index++] = {static_cast<uint32_t>(VIEW_CONNECT_PHONE), PNG_CONNECT_PHONE_IMAGE, "连接手机", true, true};
+        settings[index++] = {static_cast<uint32_t>(VIEW_REBOOT), PNG_SETTTING_REBOOT_IMAGE, "重启", true, true};
+        settings[index++] = {static_cast<uint32_t>(VIEW_REBOOT), PNG_SETTTING_SHUTDOWN_IMAGE, "关机", true, true};
+        settings[index++] = {static_cast<uint32_t>(VIEW_SET_DIAL), PNG_SETTTING_DESKTOP_IMAGE, "表盘", true, false};
+        settings[index++] = {static_cast<uint32_t>(VIEW_SETTING) | (SETTING_DESKTOP_PAGE << PAGE_OFFSET),
+            PNG_SETTTING_DESKTOP_IMAGE, "桌面", true, true};
+        settings[index++] = {static_cast<uint32_t>(VIEW_SET_CARD), PNG_SETTTING_DESKTOP_IMAGE, "卡片", true, false};
+        settings[index++] = {static_cast<uint32_t>(VIEW_SET_DIAL_STYLE), PNG_SETTTING_DESKTOP_IMAGE,
+            "表盘风格", true, true};
+        settings[index++] = {static_cast<uint32_t>(VIEW_RESTORE_DEFAULTS), PNG_SETTTING_DESKTOP_IMAGE,
+            "恢复出厂", true, true};
+        settings[index++] = {static_cast<uint32_t>(VIEW_SET_OTA), PNG_SETTTING_DESKTOP_IMAGE, "OTA升级", true, true};
         usedLen = index;
     }
 
index 16499b9..fbf508e 100644 (file)
@@ -5,74 +5,10 @@
  * Create: 2021-11-23
  */
 
-#include "SettingView.h"
-#include "SettingModel.h"
-#include "SettingPresenter.h"
-#include "RebootModel.h"
-#include "SetDesktopModel.h"
+#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, "设置");
-
-    SettingPresenter::SettingPresenter()
-    {
-        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SettingPresenter::SettingPresenter()");
-        settingModel = &SettingModel::GetInstance();
-    }
-
-    SettingPresenter::~SettingPresenter() {}
-
-    void SettingPresenter::OnStart()
-    {
-        settingModel->InitSettingItem();
-        if (view_ == nullptr) {
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "view_ is nullptr!!");
-            return;
-        }
-        const SettingItem *itemInfo = settingModel->GetSettinglistItems();
-        view_->RefreshSettingsList(itemInfo, settingModel->GetSettingListNum());
-    }
-
-    bool SettingPresenter::OnDrag(UIView& view, const DragEvent& event)
-    {
-        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SettingPresenter::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, "SettingPresenter::OnDrag ChangeSlice(VIEW_APPLIST)");
-            if (SetDesktopModel::GetInstance().GetDesktopStyle() == HEXAGONS_STYLE) {
-                NativeAbility::GetInstance().ChangeSlice(VIEW_APPLIST, TransitionType::TRANSITION_BACK_TO_HEXAGONS);
-            } else if (SetDesktopModel::GetInstance().GetDesktopStyle() == WATERFALL_STYLE) {
-                NativeAbility::GetInstance().ChangeSlice(VIEW_APPLIST, TransitionType::TRANSITION_BACK_TO_WATERFALL);
-            } else {
-                NativeAbility::GetInstance().ChangeSlice(VIEW_APPLIST);
-            }
-        }
-        return false;
-    }
-
-    bool SettingPresenter::OnClick(UIView &view, const ClickEvent &event)
-    {
-        UNUSED(event);
-        SettingItemView *settingItemView = static_cast<SettingItemView *>(&view);
-        AppViewId viewId = settingItemView->GetViewId();
-        if (viewId == VIEW_REBOOT) {
-            if (strstr(settingItemView->GetIconId(), "REBOOT") != nullptr) {
-                RebootModel::GetInstance()->SetSelectViewId(REBOOTDEVICE);
-                RebootModel::GetInstance()->SetExitsView(true);
-            } else {
-                RebootModel::GetInstance()->SetSelectViewId(SHUTDOWNDEVICE);
-                RebootModel::GetInstance()->SetExitsView(true);
-            }
-        }
-        if (settingItemView->SlideBackEnabled()) {
-            NativeAbility::GetInstance().ChangeSlice(viewId, TransitionType::TRANSITION_INVALID,
-                gSliceDefaultPriority, true);
-        } else {
-            NativeAbility::GetInstance().ChangeSlice(viewId);
-        }
-        return true;
-    }
 }
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/settings/src/SettingView.cpp b/code/sdk/application/wearable/nativeapp/nativeui/settings/src/SettingView.cpp
deleted file mode 100644 (file)
index 2b03b50..0000000
+++ /dev/null
@@ -1,121 +0,0 @@
-/*
- * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved.
- * Description: SettingView.cpp
- * Author:
- * Create: 2021-11-23
- */
-
-#include <string>
-
-#include "SettingView.h"
-#include "SettingItem.h"
-#include "SettingPresenter.h"
-#include "components/ui_list_nested.h"
-#include "components/ui_scroll_view_nested.h"
-
-namespace OHOS {
-static constexpr uint8_t SETTINGS_ITEM_FONT_SIZE = 40;
-static constexpr int16_t SETTINGS_RESIZE_SIZE_WIDTH = 100;
-static constexpr int16_t SETTINGS_RESIZE_SIZE_HEIGHT = 60;
-static constexpr int16_t SETTING_TITLE_POSITION_X = 187;
-static constexpr int16_t SETTING_LIST_POSITION_X = 32;
-static constexpr int16_t SETTING_LIST_POSITION_Y = 90;
-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;
-
-SettingView::SettingView()
-{
-    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SettingView::SettingView");
-}
-
-SettingView::~SettingView()
-{
-    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SettingView::~SettingView");
-    if (scrollView != nullptr) {
-        scrollView->RemoveAll();
-        delete scrollView;
-        scrollView = nullptr;
-    }
-
-    if (title != nullptr) {
-        delete title;
-        title = nullptr;
-    }
-
-    if (listAdapter != nullptr) {
-        delete listAdapter;
-        listAdapter = nullptr;
-    }
-
-    if (contentList != nullptr) {
-        delete contentList;
-        contentList = nullptr;
-    }
-}
-
-void SettingView::OnStart()
-{
-    title = new UILabel();
-    if (title == nullptr) {
-        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SettingView::OnStart::title is nullptr");
-        return;
-    }
-    title->SetPosition(SETTING_TITLE_POSITION_X, 0);
-    title->SetText("设置");
-    title->Resize(SETTINGS_RESIZE_SIZE_WIDTH, SETTINGS_RESIZE_SIZE_HEIGHT);
-    title->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SETTINGS_ITEM_FONT_SIZE);
-    title->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);
-    title->SetStyle(STYLE_TEXT_OPA, OPA_OPAQUE);
-    title->SetStyle(STYLE_TEXT_COLOR, Color::White().full);
-    title->SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);
-    title->SetStyle(STYLE_BACKGROUND_OPA, OPA_OPAQUE);
-
-    contentList = new UIListNested();
-    if (contentList == nullptr) {
-        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SettingView::OnStart::contentList is nullptr");
-        return;
-    }
-    contentList->SetPosition(SETTING_LIST_POSITION_X, SETTING_LIST_POSITION_Y);
-    contentList->Resize(HORIZONTAL_RESOLUTION, 364); // 364: height
-    contentList->SetScrollBlankSize(SETTING_SCROLLBLANKSIZE);
-    contentList->SetSelectPosition(HORIZONTAL_RESOLUTION / SNUM_2); // middle position
-    contentList->SetDraggable(true);
-    contentList->SetThrowDrag(true);
-    contentList->EnableAutoAlign(true);
-    contentList->SetMaxScrollDistance(MAX_SCR_DIS);
-
-    scrollView = new UIScrollViewNested();
-    if (scrollView == nullptr) {
-        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SettingView::OnStart::scrollView is nullptr");
-        return;
-    }
-    scrollView->Resize(HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);
-    scrollView->SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);
-    scrollView->SetStyle(STYLE_BACKGROUND_OPA, UN_OPACITY);
-    scrollView->SetThrowDrag(true);
-
-    if (PageTransitionMgr::GetInstance().GetTopSlideBackImage() == nullptr) { // support default slide back firstly
-        scrollView->SetOnDragListener(presenter_);
-    }
-    scrollView->Add(title);
-    scrollView->Add(contentList);
-    AddViewToRootContainer(scrollView);
-}
-
-void SettingView::RefreshSettingsList(const SettingItem* item, uint8_t count)
-{
-    listAdapter = new SettingAdapter();
-    if (listAdapter == nullptr) {
-        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SettingView::OnStart::listAdapter is nullptr");
-        return;
-    }
-    listAdapter->SetItemClickListener(presenter_);
-    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SettingView::RefreshSettingsList");
-    for (int i = 0; i < count; i++) {
-        listAdapter->AddListItem(item[i]);
-    }
-    contentList->SetAdapter(listAdapter);
-}
-}
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/sleep/src/SleepingDetailsPage.cpp b/code/sdk/application/wearable/nativeapp/nativeui/sleep/src/SleepingDetailsPage.cpp
new file mode 100644 (file)
index 0000000..1341d7b
--- /dev/null
@@ -0,0 +1,635 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SleepingDetailsPage\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/SleepingView.h"\r
+#include "sleep/SleepingModel.h"\r
+#include "sleep/SleepingDetailsPage.h"\r
+\r
+namespace OHOS {\r
+\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 = 48;\r
+static constexpr int16_t SLEEPDETAIL_SOBERINGTIME_HEIGHT = 29;\r
+static constexpr int16_t SLEEPDETAIL_SOBERINGTIME_FONT_SIZE = 24;\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 = 100;\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, SleepingDetailsPage, false);\r
+\r
+SleepingDetailsPage::SleepingDetailsPage()\r
+{\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SleepingDetailsPage::SleepingDetailsPage");\r
+}\r
+\r
+SleepingDetailsPage::~SleepingDetailsPage()\r
+{\r
+    if (group != nullptr) {\r
+        group->RemoveAll();\r
+        delete group;\r
+        group = nullptr;\r
+    }\r
+\r
+    if (detailsSleepView != nullptr) {\r
+        delete detailsSleepView;\r
+        detailsSleepView = nullptr;\r
+    }\r
+\r
+    if (sleep != nullptr) {\r
+        delete sleep;\r
+        sleep = nullptr;\r
+    }\r
+\r
+    if (actualSleepTime != nullptr) {\r
+        delete actualSleepTime;\r
+        actualSleepTime = nullptr;\r
+    }\r
+\r
+    if (actualSleepTimeHours != nullptr) {\r
+        delete actualSleepTimeHours;\r
+        actualSleepTimeHours = nullptr;\r
+    }\r
+\r
+    if (actualSleepTimeHoursText != nullptr) {\r
+        delete actualSleepTimeHoursText;\r
+        actualSleepTimeHoursText = nullptr;\r
+    }\r
+\r
+    if (actualSleepTimeMinutes != nullptr) {\r
+        delete actualSleepTimeMinutes;\r
+        actualSleepTimeMinutes = nullptr;\r
+    }\r
+\r
+    if (actualSleepTimeMinutesText != nullptr) {\r
+        delete actualSleepTimeMinutesText;\r
+        actualSleepTimeMinutesText = nullptr;\r
+    }\r
+\r
+    if (grayBg != nullptr) {\r
+        delete grayBg;\r
+        grayBg = nullptr;\r
+    }\r
+\r
+    if (image1 != nullptr) {\r
+        delete image1;\r
+        image1 = nullptr;\r
+    }\r
+\r
+    if (soberingTime_ != nullptr) {\r
+        delete soberingTime_;\r
+        soberingTime_ = nullptr;\r
+    }\r
+\r
+    if (soberingTimeText != nullptr) {\r
+        delete soberingTimeText;\r
+        soberingTimeText = nullptr;\r
+    }\r
+\r
+    if (image2 != nullptr) {\r
+        delete image2;\r
+        image2 = nullptr;\r
+    }\r
+\r
+    if (rapidEyeMovement_ != nullptr) {\r
+        delete rapidEyeMovement_;\r
+        rapidEyeMovement_ = nullptr;\r
+    }\r
+\r
+    if (rapidEyeMovementText != nullptr) {\r
+        delete rapidEyeMovementText;\r
+        rapidEyeMovementText = nullptr;\r
+    }\r
+\r
+    if (image3 != nullptr) {\r
+        delete image3;\r
+        image3 = nullptr;\r
+    }\r
+\r
+    if (lightSleepTime_ != nullptr) {\r
+        delete lightSleepTime_;\r
+        lightSleepTime_ = nullptr;\r
+    }\r
+\r
+    if (lightSleepTimeText != nullptr) {\r
+        delete lightSleepTimeText;\r
+        lightSleepTimeText = nullptr;\r
+    }\r
+\r
+    if (image4 != nullptr) {\r
+        delete image4;\r
+        image4 = nullptr;\r
+    }\r
+\r
+    if (deepSleepTime_ != nullptr) {\r
+        delete deepSleepTime_;\r
+        deepSleepTime_ = nullptr;\r
+    }\r
+\r
+    if (deepSleepTimeText != nullptr) {\r
+        delete deepSleepTimeText;\r
+        deepSleepTimeText = nullptr;\r
+    }\r
+\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SleepingDetailsPage::~SleepingDetailsPage");\r
+}\r
+\r
+void SleepingDetailsPage::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
+    detailsSleepView = new UIImageView();\r
+    if (detailsSleepView == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "detailsSleepView is nullptr");\r
+        return;\r
+    }\r
+    LOADIMG::LoadImageViewImg(detailsSleepView, SLEEP_IMAGE, IMAGE_CONVERTER_TOOL_BACKGROUND);\r
+    detailsSleepView->SetPosition(0, 0, RESOLUTION_WIDTH, RESOLUTION_HEIGHT);\r
+    group->Add(detailsSleepView);\r
+\r
+    sleep = new UILabel();\r
+    if (sleep == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "sleep is nullptr");\r
+        return;\r
+    }\r
+    sleep->SetPosition(SLEEPDETAIL_SLEEP_X, SLEEPDETAIL_SLEEP_Y);\r
+    sleep->Resize(SLEEPDETAIL_SLEEP_WIDTH, SLEEPDETAIL_SLEEP_HEIGHT);\r
+    sleep->SetText("睡眠");\r
+    sleep->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+    sleep->SetTextColor(Color::White());\r
+    sleep->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SLEEPDETAIL_SLEEP_FONT_SIZE);\r
+    sleep->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+    group->Add(sleep);\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 SleepingDetailsPage::InitSoberingTime()\r
+{\r
+    image1 = new UIImageView();\r
+    if (image1 == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "image1 is nullptr");\r
+        return;\r
+    }\r
+    image1->SetPosition(SLEEPDETAIL_IMAGE1_X, SLEEPDETAIL_IMAGE1_Y);\r
+    LOADIMG::LoadImageViewImg(image1, SLEEP_IMAGE, IMAGE_CONVERTER_TOOL_RED_CIR);\r
+    group->Add(image1);\r
+    soberingTime_ = new UILabel();\r
+    if (soberingTime_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "soberingTime_ is nullptr");\r
+        return;\r
+    }\r
+    soberingTime_->SetPosition(SLEEPDETAIL_SOBERINGTIME_X, SLEEPDETAIL_SOBERINGTIME_Y);\r
+    soberingTime_->Resize(SLEEPDETAIL_SOBERINGTIME_WIDTH, SLEEPDETAIL_SOBERINGTIME_HEIGHT);\r
+    soberingTime_->SetText("清醒");\r
+    soberingTime_->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+    soberingTime_->SetTextColor(Color::White());\r
+    soberingTime_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SLEEPDETAIL_SOBERINGTIME_FONT_SIZE);\r
+    soberingTime_->SetAlign(TEXT_ALIGNMENT_LEFT, TEXT_ALIGNMENT_CENTER);\r
+    group->Add(soberingTime_);\r
+}\r
+\r
+void SleepingDetailsPage::InitRapidEyeMovement()\r
+{\r
+    image2 = new UIImageView();\r
+    if (image2 == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "image2 is nullptr");\r
+        return;\r
+    }\r
+    image2->SetPosition(SLEEPDETAIL_IMAGE1_X, SLEEPDETAIL_IMAGE2_Y);\r
+    LOADIMG::LoadImageViewImg(image2, SLEEP_IMAGE, IMAGE_CONVERTER_TOOL_ORANGE_CIR);\r
+    group->Add(image2);\r
+\r
+    rapidEyeMovement_ = new UILabel();\r
+    if (rapidEyeMovement_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "rapidEyeMovement_ is nullptr");\r
+        return;\r
+    }\r
+    rapidEyeMovement_->SetPosition(SLEEPDETAIL_SOBERINGTIME_X, SLEEPDETAIL_RAPID_Y);\r
+    rapidEyeMovement_->Resize(SLEEPDETAIL_RAPID_WIDTH, SLEEPDETAIL_RAPID_HEIGHT);\r
+    rapidEyeMovement_->SetText("快速动眼");\r
+    rapidEyeMovement_->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+    rapidEyeMovement_->SetTextColor(Color::White());\r
+    rapidEyeMovement_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SLEEPDETAIL_SOBERINGTIME_FONT_SIZE);\r
+    rapidEyeMovement_->SetAlign(TEXT_ALIGNMENT_LEFT, TEXT_ALIGNMENT_CENTER);\r
+    group->Add(rapidEyeMovement_);\r
+}\r
+\r
+void SleepingDetailsPage::InitLightSleepTime()\r
+{\r
+    image3 = new UIImageView();\r
+    if (image3 == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "image3 is nullptr");\r
+        return;\r
+    }\r
+    image3->SetPosition(SLEEPDETAIL_IMAGE1_X, SLEEPDETAIL_IMAGE3_Y);\r
+    LOADIMG::LoadImageViewImg(image3, SLEEP_IMAGE, IMAGE_CONVERTER_TOOL_GREEN_CIR);\r
+    group->Add(image3);\r
+\r
+    lightSleepTime_ = new UILabel();\r
+    if (lightSleepTime_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "lightSleepTime_ is nullptr");\r
+        return;\r
+    }\r
+    lightSleepTime_->SetPosition(SLEEPDETAIL_SOBERINGTIME_X, SLEEPDETAIL_LIGHT_Y);\r
+    lightSleepTime_->Resize(SLEEPDETAIL_SOBERINGTIME_WIDTH, SLEEPDETAIL_SOBERINGTIME_HEIGHT);\r
+    lightSleepTime_->SetText("浅睡");\r
+    lightSleepTime_->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+    lightSleepTime_->SetTextColor(Color::White());\r
+    lightSleepTime_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SLEEPDETAIL_SOBERINGTIME_FONT_SIZE);\r
+    lightSleepTime_->SetAlign(TEXT_ALIGNMENT_LEFT, TEXT_ALIGNMENT_CENTER);\r
+    group->Add(lightSleepTime_);\r
+}\r
+\r
+void SleepingDetailsPage::InitDeepSleepTime()\r
+{\r
+    image4 = new UIImageView();\r
+    if (image4 == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "image4 is nullptr");\r
+        return;\r
+    }\r
+    image4->SetPosition(SLEEPDETAIL_IMAGE1_X, SLEEPDETAIL_IMAGE4_Y);\r
+    LOADIMG::LoadImageViewImg(image4, SLEEP_IMAGE, IMAGE_CONVERTER_TOOL_BLUE_CIR);\r
+    group->Add(image4);\r
+\r
+    deepSleepTime_ = new UILabel();\r
+    if (deepSleepTime_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "deepSleepTime_ is nullptr");\r
+        return;\r
+    }\r
+    deepSleepTime_->SetPosition(SLEEPDETAIL_SOBERINGTIME_X, SLEEPDETAIL_DEEP_Y);\r
+    deepSleepTime_->Resize(SLEEPDETAIL_SOBERINGTIME_WIDTH, SLEEPDETAIL_SOBERINGTIME_HEIGHT);\r
+    deepSleepTime_->SetText("深睡");\r
+    deepSleepTime_->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+    deepSleepTime_->SetTextColor(Color::White());\r
+    deepSleepTime_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SLEEPDETAIL_SOBERINGTIME_FONT_SIZE);\r
+    deepSleepTime_->SetAlign(TEXT_ALIGNMENT_LEFT, TEXT_ALIGNMENT_CENTER);\r
+    group->Add(deepSleepTime_);\r
+}\r
+\r
+void SleepingDetailsPage::InitPage()\r
+{\r
+    grayBg = new UIImageView();\r
+    if (grayBg == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "grayBg is nullptr");\r
+        return;\r
+    }\r
+    grayBg->SetPosition(SLEEPDETAIL_GRAYBG_X, SLEEPDETAIL_GRAYBG_Y);\r
+    LOADIMG::LoadImageViewImg(grayBg, SLEEP_IMAGE, IMAGE_CONVERTER_TOOL_RECORD_BG);\r
+    group->Add(grayBg);\r
+\r
+    // 加载详情四项\r
+    InitSoberingTime();\r
+    InitRapidEyeMovement();\r
+    InitLightSleepTime();\r
+    InitDeepSleepTime();\r
+}\r
+\r
+void SleepingDetailsPage::IoadDeatilActualSleepTime()\r
+{\r
+    actualSleepTimeHours = new UILabel();\r
+    if (actualSleepTimeHours == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "actualSleepTimeHours is nullptr");\r
+        return;\r
+    }\r
+\r
+    actualSleepTimeHours->SetTextColor(Color::White());\r
+    actualSleepTimeHours->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SLEEPDETAIL_ACTUALSLEEPTIMEHOURS_FONT_SIZE);\r
+    actualSleepTimeHours->SetVisible(false);\r
+\r
+    actualSleepTimeHoursText = new UILabel();\r
+    if (actualSleepTimeHoursText == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "actualSleepTimeHoursText is nullptr");\r
+        return;\r
+    }\r
+    actualSleepTimeHoursText->SetText("小时");\r
+    actualSleepTimeHoursText->Resize(SLEEPDETAIL_SOBERINGTIME_WIDTH, SLEEPDETAIL_SOBERINGTIME_HEIGHT);\r
+    actualSleepTimeHoursText->SetTextColor(Color::White());\r
+    actualSleepTimeHoursText->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SLEEPDETAIL_SOBERINGTIME_FONT_SIZE);\r
+    actualSleepTimeHoursText->SetVisible(false);\r
+\r
+    actualSleepTimeMinutes = new UILabel();\r
+    if (actualSleepTimeMinutes == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "actualSleepTimeMinutes is nullptr");\r
+        return;\r
+    }\r
+\r
+    actualSleepTimeMinutes->Resize(SLEEPDETAIL_RAPID_WIDTH, SLEEPDETAIL_ACTUALSLEEPTIMINUTES_HEIGHT);\r
+    actualSleepTimeMinutes->SetTextColor(Color::White());\r
+    actualSleepTimeMinutes->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SLEEPDETAIL_ACTUALSLEEPTIMINUTES_FONT_SIZE);\r
+    actualSleepTimeMinutes->SetVisible(false);\r
+\r
+    actualSleepTimeMinutesText = new UILabel();\r
+    if (actualSleepTimeMinutesText == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "actualSleepTimeHours is nullptr");\r
+        return;\r
+    }\r
+\r
+    actualSleepTimeMinutesText->SetText("分钟");\r
+    actualSleepTimeMinutesText->Resize(SLEEPDETAIL_SOBERINGTIME_WIDTH, SLEEPDETAIL_SOBERINGTIME_HEIGHT);\r
+    actualSleepTimeMinutesText->SetTextColor(Color::White());\r
+    actualSleepTimeMinutesText->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SLEEPDETAIL_SOBERINGTIME_FONT_SIZE);\r
+    actualSleepTimeMinutesText->SetVisible(false);\r
+}\r
+\r
+void SleepingDetailsPage::InitActualSleepTime(std::tuple<uint32_t, uint32_t> timeTuple)\r
+{\r
+    IoadDeatilActualSleepTime();\r
+    uint32_t hours = std::get<0>(timeTuple);\r
+    uint32_t minutes = std::get<1>(timeTuple);\r
+\r
+    if ((hours == 0) && (minutes != 0)) {\r
+        actualSleepTimeMinutes->SetPosition(SLEEPDETAIL_ACTUALSLEEP_X, SLEEPDETAIL_ACTUALSLEEP_Y);\r
+        actualSleepTimeMinutes->SetVisible(true);\r
+        actualSleepTimeMinutes->SetText(std::to_string(minutes).c_str());\r
+        group->Add(actualSleepTimeMinutes);\r
+\r
+        actualSleepTimeMinutesText->SetPosition(SLEEPDETAIL_ACTUALMINUTE_X, SLEEPDETAIL_ACTUALMINUTE_Y);\r
+        actualSleepTimeMinutesText->SetVisible(true);\r
+        group->Add(actualSleepTimeMinutesText);\r
+    } else if ((hours != 0) && (minutes == 0)) {\r
+        actualSleepTimeHours->SetPosition(SLEEPDETAIL_ACTUALSLEEP_X, SLEEPDETAIL_ACTUALSLEEP_Y);\r
+        actualSleepTimeHours->Resize(SLEEPDETAIL_ACTUALSLEEPTIMINUTES_HEIGHT, SLEEPDETAIL_ACTUALSLEEPTIMINUTES_HEIGHT);\r
+        actualSleepTimeHours->SetVisible(true);\r
+        actualSleepTimeHours->SetText(std::to_string(hours).c_str());\r
+        group->Add(actualSleepTimeHours);\r
+\r
+        actualSleepTimeHoursText->SetPosition(SLEEPDETAIL_ACTUALMINUTE_X, SLEEPDETAIL_ACTUALMINUTE_Y);\r
+        actualSleepTimeHoursText->SetVisible(true);\r
+        group->Add(actualSleepTimeHoursText);\r
+    } else if ((hours != 0) && (minutes != 0)) {\r
+        actualSleepTimeHours->SetPosition(SLEEPDETAIL_ACTUALHOUR_X, SLEEPDETAIL_ACTUALHOUR_Y);\r
+        actualSleepTimeHours->Resize(SLEEPDETAIL_ACTUALSLEEPTIMINUTES_HEIGHT, SLEEPDETAIL_ACTUALSLEEPTIMINUTES_HEIGHT);\r
+\r
+        actualSleepTimeHours->SetVisible(true);\r
+        actualSleepTimeHours->SetText(std::to_string(hours).c_str());\r
+        group->Add(actualSleepTimeHours);\r
+\r
+        actualSleepTimeHoursText->SetPosition(SLEEPDETAIL_ACTUALHOURTEXT_X, SLEEPDETAIL_ACTUALMINUTE_Y);\r
+        actualSleepTimeHoursText->SetVisible(true);\r
+        group->Add(actualSleepTimeHoursText);\r
+\r
+        actualSleepTimeMinutes->SetPosition(SLEEPDETAIL_ACTUALMINUTE_X, SLEEPDETAIL_ACTUALHOUR_Y);\r
+        actualSleepTimeMinutes->SetVisible(true);\r
+        actualSleepTimeMinutes->SetText(std::to_string(minutes).c_str());\r
+        group->Add(actualSleepTimeMinutes);\r
+\r
+        actualSleepTimeMinutesText->SetPosition(SLEEPDETAIL_ACTUALMINUTETEXT_X, SLEEPDETAIL_ACTUALMINUTE_Y);\r
+        actualSleepTimeMinutesText->SetVisible(true);\r
+        group->Add(actualSleepTimeMinutesText);\r
+    }   else if ((hours == 0) && (minutes == 0)) {\r
+        actualSleepTimeHours->SetPosition(ACTUALHOURS_X, SLEEPDETAIL_ACTUALHOUR_Y);\r
+        actualSleepTimeHours->Resize(SLEEPDETAIL_ACTUALSLEEPTIMINUTES_HEIGHT, SLEEPDETAIL_ACTUALSLEEPTIMINUTES_HEIGHT);\r
+        actualSleepTimeHours->SetVisible(true);\r
+        actualSleepTimeHours->SetText("--");\r
+        group->Add(actualSleepTimeHours);\r
+\r
+        actualSleepTimeHoursText->SetPosition(ACTUALHOURSTEXT_X, SLEEPDETAIL_ACTUALMINUTE_Y);\r
+        actualSleepTimeHoursText->SetVisible(true);\r
+        group->Add(actualSleepTimeHoursText);\r
+\r
+        actualSleepTimeMinutes->SetPosition(SLEEPDETAIL_ACTUALMINUTE_X, SLEEPDETAIL_ACTUALHOUR_Y);\r
+        actualSleepTimeMinutes->SetVisible(true);\r
+        actualSleepTimeMinutes->SetText("--");\r
+        group->Add(actualSleepTimeMinutes);\r
+\r
+        actualSleepTimeMinutesText->SetPosition(ACTUALMINUTESTEXT_X, SLEEPDETAIL_ACTUALMINUTE_Y);\r
+        actualSleepTimeMinutesText->SetVisible(true);\r
+        group->Add(actualSleepTimeMinutesText);\r
+    }\r
+}\r
+\r
+void SleepingDetailsPage::InitDetailPage()\r
+{\r
+    InitActualSleepTime(SleepingModel::GetInstance().GetSleepTime());\r
+\r
+    soberingTimeText = new UILabel();\r
+    if (soberingTimeText == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "soberingTimeText is nullptr");\r
+        return;\r
+    }\r
+    soberingTimeText->SetText((SetTimeText(SleepingModel::GetInstance().GetSoberingTime())).c_str());\r
+    soberingTimeText->SetPosition(SLEEPDETAIL_SOBERINGTEXT_X, SLEEPDETAIL_SOBERINGTIME_Y);\r
+\r
+    soberingTimeText->Resize(SLEEPDETAIL_LABEL_WIDTH, SLEEPDETAIL_RAPID_HEIGHT);\r
+    soberingTimeText->SetTextColor(Color::White());\r
+    soberingTimeText->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SLEEPDETAIL_SOBERINGTIME_FONT_SIZE);\r
+    soberingTimeText->SetAlign(TEXT_ALIGNMENT_RIGHT, TEXT_ALIGNMENT_CENTER);\r
+    soberingTimeText->SetStyle(STYLE_PADDING_RIGHT, SLEEPDETAIL_PADDING_RIGHT);\r
+    group->Add(soberingTimeText);\r
+\r
+    rapidEyeMovementText = new UILabel();\r
+    if (rapidEyeMovementText == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "rapidEyeMovementText is nullptr");\r
+        return;\r
+    }\r
+    rapidEyeMovementText->SetText((SetTimeText(SleepingModel::GetInstance().GetRapidEyeMovementTime())).c_str());\r
+    rapidEyeMovementText->SetPosition(SLEEPDETAIL_SOBERINGTEXT_X, SLEEPDETAIL_RAPID_Y);\r
+\r
+    rapidEyeMovementText->Resize(SLEEPDETAIL_LABEL_WIDTH, SLEEPDETAIL_RAPID_HEIGHT);\r
+    rapidEyeMovementText->SetTextColor(Color::White());\r
+    rapidEyeMovementText->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SLEEPDETAIL_SOBERINGTIME_FONT_SIZE);\r
+    rapidEyeMovementText->SetAlign(TEXT_ALIGNMENT_RIGHT, TEXT_ALIGNMENT_CENTER);\r
+    rapidEyeMovementText->SetStyle(STYLE_PADDING_RIGHT, SLEEPDETAIL_PADDING_RIGHT);\r
+    group->Add(rapidEyeMovementText);\r
+\r
+    lightSleepTimeText = new UILabel();\r
+    if (lightSleepTimeText == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "lightSleepTimeText is nullptr");\r
+        return;\r
+    }\r
+    lightSleepTimeText->SetText((SetTimeText(SleepingModel::GetInstance().GetLightSleepTime())).c_str());\r
+    lightSleepTimeText->SetPosition(SLEEPDETAIL_SOBERINGTEXT_X, SLEEPDETAIL_LIGHT_Y);\r
+    lightSleepTimeText->Resize(SLEEPDETAIL_LABEL_WIDTH, SLEEPDETAIL_RAPID_HEIGHT);\r
+    lightSleepTimeText->SetTextColor(Color::White());\r
+    lightSleepTimeText->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SLEEPDETAIL_SOBERINGTIME_FONT_SIZE);\r
+    lightSleepTimeText->SetAlign(TEXT_ALIGNMENT_RIGHT, TEXT_ALIGNMENT_CENTER);\r
+    lightSleepTimeText->SetStyle(STYLE_PADDING_RIGHT, SLEEPDETAIL_PADDING_RIGHT);\r
+    group->Add(lightSleepTimeText);\r
+\r
+    deepSleepTimeText = new UILabel();\r
+    if (deepSleepTimeText == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "deepSleepTimeText is nullptr");\r
+        return;\r
+    }\r
+    deepSleepTimeText->SetText((SetTimeText(SleepingModel::GetInstance().GetDeepSleepTime())).c_str());\r
+    deepSleepTimeText->SetPosition(SLEEPDETAIL_SOBERINGTEXT_X, SLEEPDETAIL_DEEP_Y);\r
+    deepSleepTimeText->Resize(SLEEPDETAIL_LABEL_WIDTH, SLEEPDETAIL_RAPID_HEIGHT);\r
+    deepSleepTimeText->SetTextColor(Color::White());\r
+    deepSleepTimeText->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SLEEPDETAIL_SOBERINGTIME_FONT_SIZE);\r
+    deepSleepTimeText->SetAlign(TEXT_ALIGNMENT_RIGHT, TEXT_ALIGNMENT_CENTER);\r
+    deepSleepTimeText->SetStyle(STYLE_PADDING_RIGHT, SLEEPDETAIL_PADDING_RIGHT);\r
+    group->Add(deepSleepTimeText);\r
+}\r
+\r
+void SleepingDetailsPage::InitNoDeatilPage()\r
+{\r
+    actualSleepTime = new UILabel();\r
+    if (actualSleepTime == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "actualSleepTime is nullptr");\r
+        return;\r
+    }\r
+    actualSleepTime->SetText("无记录");\r
+    actualSleepTime->SetPosition(SLEEPDETAIL_ACTUALSLEEP_NORECORD_X, SLEEPDETAIL_ACTUALSLEEP_NORECORD_Y);\r
+    actualSleepTime->Resize(SLEEPDETAIL_ACTUAL_NORECODE_X, SLEEPDETAIL_SOBERINGTIME_WIDTH);\r
+    actualSleepTime->SetTextColor(Color::White());\r
+    actualSleepTime->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SLEEPDETAIL_ACTUALSLEEP_FONT_SIZE);\r
+    group->Add(actualSleepTime);\r
+\r
+    soberingTimeText = new UILabel();\r
+    if (soberingTimeText == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "soberingTimeText is nullptr");\r
+        return;\r
+    }\r
+    soberingTimeText->SetText("--");\r
+    soberingTimeText->SetPosition(SLEEPDETAIL_SOBERTIMETEXT_X, SLEEPDETAIL_SOBERTIMETEXT_Y);\r
+    soberingTimeText->Resize(SLEEPDETAIL_RAPID_WIDTH, SLEEPDETAIL_RAPID_HEIGHT);\r
+    soberingTimeText->SetTextColor(Color::White());\r
+    soberingTimeText->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SLEEPDETAIL_SOBERINGTIME_FONT_SIZE);\r
+    soberingTimeText->SetAlign(TEXT_ALIGNMENT_RIGHT, TEXT_ALIGNMENT_CENTER);\r
+    group->Add(soberingTimeText);\r
+\r
+    rapidEyeMovementText = new UILabel();\r
+    if (rapidEyeMovementText == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "rapidEyeMovementText is nullptr");\r
+        return;\r
+    }\r
+    rapidEyeMovementText->SetText("--");\r
+    rapidEyeMovementText->SetPosition(SLEEPDETAIL_SOBERTIMETEXT_X, SLEEPDETAIL_RAPIDTIMETEXT_Y);\r
+    rapidEyeMovementText->Resize(SLEEPDETAIL_RAPID_WIDTH, SLEEPDETAIL_RAPID_HEIGHT);\r
+    rapidEyeMovementText->SetTextColor(Color::White());\r
+    rapidEyeMovementText->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SLEEPDETAIL_SOBERINGTIME_FONT_SIZE);\r
+    rapidEyeMovementText->SetAlign(TEXT_ALIGNMENT_RIGHT, TEXT_ALIGNMENT_CENTER);\r
+    group->Add(rapidEyeMovementText);\r
+\r
+    lightSleepTimeText = new UILabel();\r
+    if (lightSleepTimeText == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "lightSleepTimeText is nullptr");\r
+        return;\r
+    }\r
+    lightSleepTimeText->SetText("--");\r
+    lightSleepTimeText->SetPosition(SLEEPDETAIL_SOBERTIMETEXT_X, SLEEPDETAIL_LIGHTIMETEXT_Y);\r
+    lightSleepTimeText->Resize(SLEEPDETAIL_RAPID_WIDTH, SLEEPDETAIL_RAPID_HEIGHT);\r
+    lightSleepTimeText->SetTextColor(Color::White());\r
+    lightSleepTimeText->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SLEEPDETAIL_SOBERINGTIME_FONT_SIZE);\r
+    lightSleepTimeText->SetAlign(TEXT_ALIGNMENT_RIGHT, TEXT_ALIGNMENT_CENTER);\r
+    group->Add(lightSleepTimeText);\r
+\r
+    deepSleepTimeText = new UILabel();\r
+    if (deepSleepTimeText == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "deepSleepTimeText is nullptr");\r
+        return;\r
+    }\r
+    deepSleepTimeText->SetText("--");\r
+    deepSleepTimeText->SetPosition(SLEEPDETAIL_SOBERTIMETEXT_X, SLEEPDETAIL_DEEPIMETEXT_Y);\r
+    deepSleepTimeText->Resize(SLEEPDETAIL_RAPID_WIDTH, SLEEPDETAIL_RAPID_HEIGHT);\r
+    deepSleepTimeText->SetTextColor(Color::White());\r
+    deepSleepTimeText->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SLEEPDETAIL_SOBERINGTIME_FONT_SIZE);\r
+    deepSleepTimeText->SetAlign(TEXT_ALIGNMENT_RIGHT, TEXT_ALIGNMENT_CENTER);\r
+    group->Add(deepSleepTimeText);\r
+}\r
+\r
+std::string SleepingDetailsPage::SetTimeText(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 SleepingDetailsPage::OnDrag(UIView &view, const DragEvent &event)\r
+{\r
+    UNUSED(view);\r
+    if (event.GetDragDirection() == DragEvent::DIRECTION_TOP_TO_BOTTOM) {\r
+        NativeAbility::GetInstance().SwitchSlice(VIEW_SLEEPING, SLEEPING_PAGES::SLEEPING_MAIN_PAGE);\r
+    }\r
+    return true;\r
+}\r
+\r
+bool SleepingDetailsPage::GetRecord()\r
+{\r
+    if (SleepingModel::GetInstance().GetRecord()) {\r
+        return true;\r
+    }\r
+    return false;\r
+}\r
+}\r
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/sleep/src/SleepingMainPage.cpp b/code/sdk/application/wearable/nativeapp/nativeui/sleep/src/SleepingMainPage.cpp
new file mode 100644 (file)
index 0000000..d88a582
--- /dev/null
@@ -0,0 +1,705 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SleepingMainPage\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 "settings/SetDesktopModel.h"\r
+#include "rebootdevice/RebootModel.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/TargetSleepTime.h"\r
+#include "sleep/SleepingMainPage.h"\r
+#include "sleep/SleepingPresenter.h"\r
+#include "sleep/SleepingView.h"\r
+\r
+namespace OHOS {\r
+\r
+REGIST_SLICE_PAGE(VIEW_SLEEPING, SLEEPING_PAGES::SLEEPING_MAIN_PAGE, SleepingMainPage, true);\r
+\r
+static constexpr int16_t SLEEPMAIN_SLEEP_X = 190;\r
+static constexpr int16_t SLEEPMAIN_SLEEP_Y = 50;\r
+static constexpr int16_t SLEEPMAIN_SLEEP_WIDTH = 64;\r
+static constexpr int16_t SLEEPMAIN_SLEEP_HEIGHT = 38;\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 = 179;\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 = 38;\r
+static constexpr int16_t SLEEPMAIN_TIPS_X = 93;\r
+static constexpr int16_t SLEEPMAIN_TIPS_Y = 321;\r
+static constexpr int16_t SLEEPMAIN_TIPS_WIDTH = 188;\r
+static constexpr int16_t SLEEPMAIN_TIPS_HEIGHT = 87;\r
+static constexpr int16_t SLEEPMAIN_TIPS_FONT_SIZE = 24;\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 = 154;\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 ACTUALHOURS_X = 140;\r
+static constexpr int16_t ACTUALMINUTES_X = 180;\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 SLEEPDETAIL_ACTUALSLEEPTIMINUTES_FONT_SIZE = 40;\r
+static constexpr int16_t SLEEPMAIN_ACTUALMINUTETEXT_X = 280;\r
+static constexpr int16_t SLEEPMAIN_ACTUALH_X = 170;\r
+static constexpr int16_t SLEEPMAIN_ACTUALMINUTETEXT2_X = 270;\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 TARGETTIMETEXT_Y = 363;\r
+static constexpr int16_t TARGETTIMEBUTTON_X = 137;\r
+static constexpr int16_t TARGETTIMETEXT_WIDTH = 184;\r
+static constexpr int16_t TARGETTIMETEXT_HIGHT = 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
+\r
+int posX[MAIN_SLEEP_STAR_NUM] = {MAIN_SLEEP_STAR1_X, MAIN_SLEEP_STAR2_X, MAIN_SLEEP_STAR3_X, MAIN_SLEEP_STAR4_X, MAIN_SLEEP_STAR5_X};\r
+int posY = MAIN_SLEEP_STAR_Y;\r
+\r
+SleepingMainPage::SleepingMainPage()\r
+{\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SleepingMainPage::SleepingMainPage");\r
+}\r
+\r
+SleepingMainPage::~SleepingMainPage()\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 (sleep != nullptr) {\r
+        delete sleep;\r
+        sleep = nullptr;\r
+    }\r
+\r
+    if (moonNoRecord != nullptr) {\r
+        delete moonNoRecord;\r
+        moonNoRecord = nullptr;\r
+    }\r
+\r
+    if (moon != nullptr) {\r
+        delete moon;\r
+        moon = nullptr;\r
+    }\r
+\r
+    if (noRecord != nullptr) {\r
+        delete noRecord;\r
+        noRecord = nullptr;\r
+    }\r
+\r
+    if (tips != nullptr) {\r
+        delete tips;\r
+        tips = nullptr;\r
+    }\r
+\r
+    if (sleepScores_ != nullptr) {\r
+        delete sleepScores_;\r
+        sleepScores_ = nullptr;\r
+    }\r
+\r
+    if (scoreText != nullptr) {\r
+        delete scoreText;\r
+        scoreText = nullptr;\r
+    }\r
+\r
+    if (sleepScore != nullptr) {\r
+        delete sleepScore;\r
+        sleepScore = nullptr;\r
+    }\r
+\r
+    if (scoreDisplayPicture1 != nullptr) {\r
+        delete scoreDisplayPicture1;\r
+        scoreDisplayPicture1 = nullptr;\r
+    }\r
+\r
+    if (scoreDisplayPicture2 != nullptr) {\r
+        delete scoreDisplayPicture2;\r
+        scoreDisplayPicture2 = nullptr;\r
+    }\r
+\r
+    if (scoreDisplayPicture3 != nullptr) {\r
+        delete scoreDisplayPicture3;\r
+        scoreDisplayPicture3 = nullptr;\r
+    }\r
+    if (scoreDisplayPicture4 != nullptr) {\r
+        delete scoreDisplayPicture4;\r
+        scoreDisplayPicture4 = nullptr;\r
+    }\r
+\r
+    if (scoreDisplayPicture5 != nullptr) {\r
+        delete scoreDisplayPicture5;\r
+        scoreDisplayPicture5 = nullptr;\r
+    }\r
+\r
+    if (setting != nullptr) {\r
+        delete setting;\r
+        setting = nullptr;\r
+    }\r
+\r
+    if (targetTimeText != nullptr) {\r
+        delete targetTimeText;\r
+        targetTimeText = nullptr;\r
+    }\r
+\r
+    if (actualSleepTimeHours != nullptr) {\r
+        delete actualSleepTimeHours;\r
+        actualSleepTimeHours = nullptr;\r
+    }\r
+\r
+    if (actualSleepTimeHoursText != nullptr) {\r
+        delete actualSleepTimeHoursText;\r
+        actualSleepTimeHoursText = nullptr;\r
+    }\r
+\r
+    if (actualSleepTimeMinutes != nullptr) {\r
+        delete actualSleepTimeMinutes;\r
+        actualSleepTimeMinutes = nullptr;\r
+    }\r
+\r
+    if (actualSleepTimeMinutesText != nullptr) {\r
+        delete actualSleepTimeMinutesText;\r
+        actualSleepTimeMinutesText = 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
+\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SleepingMainPage::~SleepingMainPage");\r
+}\r
+\r
+void SleepingMainPage::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_CONVERTER_TOOL_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 SleepingMainPage::InitNoRecordPage()\r
+{\r
+    sleep = new UILabel();\r
+    if (sleep == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "sleep is nullptr");\r
+        return;\r
+    }\r
+    sleep->SetPosition(SLEEPMAIN_SLEEP_X, SLEEPMAIN_SLEEP_Y);\r
+    sleep->Resize(SLEEPMAIN_SLEEP_WIDTH, SLEEPMAIN_SLEEP_HEIGHT);\r
+    sleep->SetText("睡眠");\r
+    sleep->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+    sleep->SetTextColor(Color::White());\r
+    sleep->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SLEEPMAIN_SLEEP_FONT_SIZE);\r
+    sleep->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+    group->Add(sleep);\r
+\r
+    moonNoRecord = new UIImageView();\r
+    if (moonNoRecord == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "moonNoRecord is nullptr");\r
+        return;\r
+    }\r
+    LOADIMG::LoadImageViewImg(moonNoRecord, SLEEP_IMAGE, IMAGE_CONVERTER_TOOL_NORECORD_SLEEP);\r
+    moonNoRecord->SetPosition(SLEEPMAIN_MOONNORECORD_X, SLEEPMAIN_MOONNORECORD_Y);\r
+    group->Add(moonNoRecord);\r
+\r
+    noRecord = new UILabel();\r
+    if (noRecord == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "noRecord is nullptr");\r
+        return;\r
+    }\r
+    noRecord->SetPosition(SLEEPMAIN_NORECORD_X, SLEEPMAIN_NORECORD_Y);\r
+    noRecord->Resize(SLEEPMAIN_NORECORD_WIDTH, SLEEPMAIN_NORECORD_HEIGHT);\r
+    noRecord->SetText("无记录");\r
+    noRecord->SetTextColor(Color::White());\r
+    noRecord->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SLEEPMAIN_NORECORD_FONT_SIZE);\r
+    noRecord->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+    group->Add(noRecord);\r
+\r
+    tips = new UILabel();\r
+    if (tips == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "tips is nullptr");\r
+        return;\r
+    }\r
+    tips->SetPosition(SLEEPMAIN_TIPS_X, SLEEPMAIN_TIPS_Y);\r
+    tips->Resize(SLEEPMAIN_TIPS_WIDTH, SLEEPMAIN_TIPS_HEIGHT);\r
+    tips->SetText("睡眠时间过短或睡眠中动作幅度大,手表可能检测不到睡眠");\r
+    tips->SetTextColor(Color::White());\r
+    tips->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SLEEPMAIN_TIPS_FONT_SIZE);\r
+    tips->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+    group->Add(tips);\r
+}\r
+\r
+void SleepingMainPage::InitRecordPage()\r
+{\r
+    SleepingModel::GetInstance().SendData();\r
+    CircleProgress();\r
+    moon = new UIImageView();\r
+    if (moon == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "moon is nullptr");\r
+        return;\r
+    }\r
+\r
+    moon->SetPosition(MAIN_SLEEP_MOON_POSX, TARGETTIMETEXT_HIGHT);\r
+    LOADIMG::LoadImageViewImg(moon, SLEEP_IMAGE, IMAGE_CONVERTER_TOOL_RECORD_SLEEP);\r
+    group->Add(moon);\r
+\r
+    sleepScores_ = new UILabel();\r
+    if (sleepScores_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "sleepScores_ is nullptr");\r
+        return;\r
+    }\r
+\r
+    sleepScores_->SetText(std::to_string(GetSleepingScores()).c_str());\r
+    sleepScores_->SetPosition(SLEEPMAIN_SCORE_X, SLEEPMAIN_SCORE_Y);\r
+    sleepScores_->Resize(SLEEPMAIN_SCORE_WIDTH, SLEEPMAIN_SCORE_HEIGHT);\r
+    sleepScores_->SetTextColor(Color::White());\r
+    sleepScores_->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+    sleepScores_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SLEEPMAIN_SCORE_FONT_SIZE);\r
+    sleepScores_->SetAlign(TEXT_ALIGNMENT_RIGHT, TEXT_ALIGNMENT_CENTER);\r
+    group->Add(sleepScores_);\r
+\r
+    scoreText = new UILabel();\r
+    if (scoreText == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "scoreText is nullptr");\r
+        return;\r
+    }\r
+    scoreText->SetText("分");\r
+    scoreText->SetPosition(SLEEPMAIN_SCORETEXT_X, SLEEPMAIN_SCORETEXT_Y);\r
+    scoreText->Resize(MAIN_SLEEP_SCORE_TEXT_FONT_SIZE, SLEEPMAIN_TIPS_FONT_SIZE);\r
+    scoreText->SetTextColor(Color::White());\r
+    scoreText->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SLEEPMAIN_SCORETEXT_FONT_SIZE);\r
+    group->Add(scoreText);\r
+    ScoreDisplay();\r
+    sleepScore = new UILabel();\r
+    if (sleepScore == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "sleepScore is nullptr");\r
+        return;\r
+    }\r
+    sleepScore->SetText("夜间睡眠得分");\r
+    sleepScore->Resize(MAIN_SLEEP_SCORE_HEIGHT, SLEEPMAIN_NORECORD_HEIGHT);\r
+    sleepScore->SetPosition(MAIN_SLEEP_SCORE_X, MAIN_SLEEP_SCORE_Y);\r
+    sleepScore->SetTextColor(Color::White());\r
+    sleepScore->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SLEEPDETAIL_ACTUALSLEEPTIMEHOURS_FONT_SIZE);\r
+    group->Add(sleepScore);\r
+\r
+    // 显示具体睡觉时间\r
+    IoadActualSleepTime(SleepingModel::GetInstance().GetSleepTime());\r
+\r
+    // 加载目标按钮\r
+    IoadTargetTimeButton(SleepingModel::GetInstance().GetTime());\r
+}\r
+void SleepingMainPage::InitScoreDisplayPicture()\r
+{\r
+    if (scoreDisplayPicture1 == nullptr) {\r
+        scoreDisplayPicture1 = new UIImageView();\r
+    }\r
+    scoreDisplayPicture1->SetPosition(posX[0], posY);\r
+    group->Add(scoreDisplayPicture1);\r
+\r
+    if (scoreDisplayPicture2 == nullptr) {\r
+        scoreDisplayPicture2 = new UIImageView();\r
+    }\r
+    scoreDisplayPicture2->SetPosition(posX[1], posY);\r
+    group->Add(scoreDisplayPicture2);\r
+\r
+    if (scoreDisplayPicture3 == nullptr) {\r
+        scoreDisplayPicture3 = new UIImageView();\r
+    }\r
+    scoreDisplayPicture3->SetPosition(posX[MAIN_SLEEP_POSX_2], posY);\r
+    group->Add(scoreDisplayPicture3);\r
+\r
+    if (scoreDisplayPicture4 == nullptr) {\r
+        scoreDisplayPicture4 = new UIImageView();\r
+    }\r
+    scoreDisplayPicture4->SetPosition(posX[MAIN_SLEEP_POSX_3], posY);\r
+    group->Add(scoreDisplayPicture4);\r
+\r
+    if (scoreDisplayPicture5 == nullptr) {\r
+        scoreDisplayPicture5 = new UIImageView();\r
+    }\r
+\r
+    scoreDisplayPicture5->SetPosition(posX[MAIN_SLEEP_POSX_4], posY);\r
+    group->Add(scoreDisplayPicture5);\r
+}\r
+\r
+void SleepingMainPage::ScoreDisplay()\r
+{\r
+    InitScoreDisplayPicture();\r
+    if (GetSleepingScores() < SLEEP_SCORE_THRESHOLD_1) {\r
+        LOADIMG::LoadImageViewImg(scoreDisplayPicture1, SLEEP_IMAGE, IMAGE_CONVERTER_TOOL_STAR_GRAY);\r
+        LOADIMG::LoadImageViewImg(scoreDisplayPicture2, SLEEP_IMAGE, IMAGE_CONVERTER_TOOL_STAR_GRAY);\r
+        LOADIMG::LoadImageViewImg(scoreDisplayPicture3, SLEEP_IMAGE, IMAGE_CONVERTER_TOOL_STAR_GRAY);\r
+        LOADIMG::LoadImageViewImg(scoreDisplayPicture4, SLEEP_IMAGE, IMAGE_CONVERTER_TOOL_STAR_GRAY);\r
+        LOADIMG::LoadImageViewImg(scoreDisplayPicture5, SLEEP_IMAGE, IMAGE_CONVERTER_TOOL_STAR_GRAY);\r
+    } else if (GetSleepingScores() >= SLEEP_SCORE_THRESHOLD_1 && GetSleepingScores() < SLEEP_SCORE_THRESHOLD_2) {\r
+        LOADIMG::LoadImageViewImg(scoreDisplayPicture1, SLEEP_IMAGE, IMAGE_CONVERTER_TOOL_STAR_YELLOW);\r
+        LOADIMG::LoadImageViewImg(scoreDisplayPicture2, SLEEP_IMAGE, IMAGE_CONVERTER_TOOL_STAR_GRAY);\r
+        LOADIMG::LoadImageViewImg(scoreDisplayPicture3, SLEEP_IMAGE, IMAGE_CONVERTER_TOOL_STAR_GRAY);\r
+        LOADIMG::LoadImageViewImg(scoreDisplayPicture4, SLEEP_IMAGE, IMAGE_CONVERTER_TOOL_STAR_GRAY);\r
+        LOADIMG::LoadImageViewImg(scoreDisplayPicture5, SLEEP_IMAGE, IMAGE_CONVERTER_TOOL_STAR_GRAY);\r
+    } else if (GetSleepingScores() >= SLEEP_SCORE_THRESHOLD_2 && GetSleepingScores() < SLEEP_SCORE_THRESHOLD_3) {\r
+        LOADIMG::LoadImageViewImg(scoreDisplayPicture1, SLEEP_IMAGE, IMAGE_CONVERTER_TOOL_STAR_YELLOW);\r
+        LOADIMG::LoadImageViewImg(scoreDisplayPicture2, SLEEP_IMAGE, IMAGE_CONVERTER_TOOL_STAR_YELLOW);\r
+        LOADIMG::LoadImageViewImg(scoreDisplayPicture3, SLEEP_IMAGE, IMAGE_CONVERTER_TOOL_STAR_GRAY);\r
+        LOADIMG::LoadImageViewImg(scoreDisplayPicture4, SLEEP_IMAGE, IMAGE_CONVERTER_TOOL_STAR_GRAY);\r
+        LOADIMG::LoadImageViewImg(scoreDisplayPicture5, SLEEP_IMAGE, IMAGE_CONVERTER_TOOL_STAR_GRAY);\r
+    } else if (GetSleepingScores() >= SLEEP_SCORE_THRESHOLD_3 && GetSleepingScores() < SLEEP_SCORE_THRESHOLD_4) {\r
+        LOADIMG::LoadImageViewImg(scoreDisplayPicture1, SLEEP_IMAGE, IMAGE_CONVERTER_TOOL_STAR_YELLOW);\r
+        LOADIMG::LoadImageViewImg(scoreDisplayPicture2, SLEEP_IMAGE, IMAGE_CONVERTER_TOOL_STAR_YELLOW);\r
+        LOADIMG::LoadImageViewImg(scoreDisplayPicture3, SLEEP_IMAGE, IMAGE_CONVERTER_TOOL_STAR_YELLOW);\r
+        LOADIMG::LoadImageViewImg(scoreDisplayPicture4, SLEEP_IMAGE, IMAGE_CONVERTER_TOOL_STAR_GRAY);\r
+        LOADIMG::LoadImageViewImg(scoreDisplayPicture5, SLEEP_IMAGE, IMAGE_CONVERTER_TOOL_STAR_GRAY);\r
+    } else if (GetSleepingScores() >= SLEEP_SCORE_THRESHOLD_4 && GetSleepingScores() < SLEEP_SCORE_THRESHOLD_5) {\r
+        LOADIMG::LoadImageViewImg(scoreDisplayPicture1, SLEEP_IMAGE, IMAGE_CONVERTER_TOOL_STAR_YELLOW);\r
+        LOADIMG::LoadImageViewImg(scoreDisplayPicture2, SLEEP_IMAGE, IMAGE_CONVERTER_TOOL_STAR_YELLOW);\r
+        LOADIMG::LoadImageViewImg(scoreDisplayPicture3, SLEEP_IMAGE, IMAGE_CONVERTER_TOOL_STAR_YELLOW);\r
+        LOADIMG::LoadImageViewImg(scoreDisplayPicture4, SLEEP_IMAGE, IMAGE_CONVERTER_TOOL_STAR_YELLOW);\r
+        LOADIMG::LoadImageViewImg(scoreDisplayPicture5, SLEEP_IMAGE, IMAGE_CONVERTER_TOOL_STAR_GRAY);\r
+    } else if (GetSleepingScores() == SLEEP_SCORE_THRESHOLD_5) {\r
+        LOADIMG::LoadImageViewImg(scoreDisplayPicture1, SLEEP_IMAGE, IMAGE_CONVERTER_TOOL_STAR_YELLOW);\r
+        LOADIMG::LoadImageViewImg(scoreDisplayPicture2, SLEEP_IMAGE, IMAGE_CONVERTER_TOOL_STAR_YELLOW);\r
+        LOADIMG::LoadImageViewImg(scoreDisplayPicture3, SLEEP_IMAGE, IMAGE_CONVERTER_TOOL_STAR_YELLOW);\r
+        LOADIMG::LoadImageViewImg(scoreDisplayPicture4, SLEEP_IMAGE, IMAGE_CONVERTER_TOOL_STAR_YELLOW);\r
+        LOADIMG::LoadImageViewImg(scoreDisplayPicture5, SLEEP_IMAGE, IMAGE_CONVERTER_TOOL_STAR_YELLOW);\r
+    }\r
+}\r
+\r
+void SleepingMainPage::InitSleepTimeLabel()\r
+{\r
+    actualSleepTimeHours = new UILabel();\r
+    if (actualSleepTimeHours == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "actualSleepTimeHours is nullptr");\r
+        return;\r
+    }\r
+\r
+    actualSleepTimeHours->SetTextColor(Color::White());\r
+    actualSleepTimeHours->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SLEEP_FONT_SIZE_LARGE);\r
+    actualSleepTimeHours->SetVisible(false);\r
+\r
+    actualSleepTimeHoursText = new UILabel();\r
+    if (actualSleepTimeHoursText == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "actualSleepTimeHoursText is nullptr");\r
+        return;\r
+    }\r
+    actualSleepTimeHoursText->SetText("小时");\r
+    actualSleepTimeHoursText->Resize(SLEEP_LABEL_WIDTH, SLEEP_LABEL_HEIGHT);\r
+    actualSleepTimeHoursText->SetTextColor(Color::White());\r
+    actualSleepTimeHoursText->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SLEEPMAIN_TIPS_FONT_SIZE);\r
+    actualSleepTimeHoursText->SetVisible(false);\r
+\r
+    actualSleepTimeMinutes = new UILabel();\r
+    if (actualSleepTimeMinutes == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "actualSleepTimeMinutes is nullptr");\r
+        return;\r
+    }\r
+\r
+    actualSleepTimeMinutes->Resize(SLEEP_TIME_LABEL_WIDTH, SLEEP_TIME_LABEL_HEIGHT);\r
+    actualSleepTimeMinutes->SetTextColor(Color::White());\r
+    actualSleepTimeMinutes->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SLEEP_FONT_SIZE_LARGE);\r
+    actualSleepTimeMinutes->SetVisible(false);\r
+\r
+    actualSleepTimeMinutesText = new UILabel();\r
+    if (actualSleepTimeMinutesText == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "actualSleepTimeMinutesText is nullptr");\r
+        return;\r
+    }\r
+\r
+    actualSleepTimeMinutesText->SetText("分钟");\r
+    actualSleepTimeMinutesText->Resize(SLEEP_LABEL_WIDTH, SLEEP_LABEL_HEIGHT);\r
+    actualSleepTimeMinutesText->SetTextColor(Color::White());\r
+    actualSleepTimeMinutesText->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SLEEPMAIN_TIPS_FONT_SIZE);\r
+    actualSleepTimeMinutesText->SetVisible(false);\r
+}\r
+\r
+void SleepingMainPage::IoadTargetTimeButton(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
+        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, TARGETTIMETEXT_Y);\r
+    targetTimeButton->SetViewId("targetTime");\r
+    targetTimeButton->SetOnClickListener(this);\r
+    targetTimeButton->SetStyle(STYLE_BACKGROUND_COLOR,\r
+        Color::GetColorFromRGBA(MAIN_SLEEP_COLOR_R, MAIN_SLEEP_COLOR_G,\r
+        MAIN_SLEEP_COLOR_B, MAIN_SLEEP_OPT).full);\r
+    targetTimeButton->SetStyleForState (\r
+        STYLE_BACKGROUND_COLOR, Color::GetColorFromRGBA(\r
+            MAIN_SLEEP_COLOR_R, MAIN_SLEEP_COLOR_G, MAIN_SLEEP_COLOR_B, MAIN_SLEEP_OPT).full, UIButton::PRESSED);\r
+    targetTimeButton->Resize(TARGETTIMETEXT_WIDTH, TARGETTIMETEXT_HIGHT);\r
+    targetTimeButton->SetTextColor(Color::White());\r
+    targetTimeButton->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SLEEPMAIN_TIPS_FONT_SIZE);\r
+    group->Add(targetTimeButton);\r
+\r
+    targetTimeText = new UILabel();\r
+    if (targetTimeText == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "targetTimeText is nullptr");\r
+        return;\r
+    }\r
+    std::string targetText = "目标" + str;\r
+    targetTimeText->SetText(targetText.c_str());\r
+    targetTimeText->SetPosition(SLEEPMAIN_MOONNORECORD_X, TARGETTIMETEXT_Y);\r
+    targetTimeText->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+    targetTimeText->Resize(TARGETTIMETEXT_WIDTH, TARGETTIMETEXT_HIGHT);\r
+    targetTimeText->SetTextColor(Color::White());\r
+    targetTimeText->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SLEEPMAIN_TIPS_FONT_SIZE);\r
+    targetTimeText->SetAlign(TEXT_ALIGNMENT_LEFT, TEXT_ALIGNMENT_CENTER);\r
+    group->Add(targetTimeText);\r
+\r
+    if (setting == nullptr) {\r
+        setting = new UIImageView();\r
+    }\r
+    setting->SetPosition(SLEEPMAIN_SETTING_X, SLEEPMAIN_SETTING_Y);\r
+    LOADIMG::LoadImageViewImg(setting, SLEEP_IMAGE, IMAGE_CONVERTER_TOOL_SETTING);\r
+    group->Add(setting);\r
+}\r
+\r
+void SleepingMainPage::IoadActualSleepTime(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
+\r
+    if ((hours == 0) && (minutes != 0)) {\r
+        actualSleepTimeMinutes->SetPosition(ACTUALMINUTES_X, ACTUALMINUTES_Y);\r
+        actualSleepTimeMinutes->SetVisible(true);\r
+        actualSleepTimeMinutes->SetText(std::to_string(minutes).c_str());\r
+        group->Add(actualSleepTimeMinutes);\r
+\r
+        actualSleepTimeMinutesText->SetPosition(SLEEPMAIN_ACTUALMINUTE_X, SLEEPMAIN_ACTUALMINUTE_Y);\r
+        actualSleepTimeMinutesText->SetVisible(true);\r
+        group->Add(actualSleepTimeMinutesText);\r
+    } else if ((hours != 0) && (minutes == 0)) {\r
+        actualSleepTimeHours->SetPosition(ACTUALMINUTES_X, ACTUALMINUTES_Y);\r
+        actualSleepTimeHours->Resize(SLEEPMAIN_HEIGHT, SLEEPMAIN_HEIGHT);\r
+\r
+        actualSleepTimeHours->SetVisible(true);\r
+        actualSleepTimeHours->SetText(std::to_string(hours).c_str());\r
+        group->Add(actualSleepTimeHours);\r
+\r
+        actualSleepTimeHoursText->SetPosition(SLEEPMAIN_ACTUALMINUTE_X, SLEEPMAIN_ACTUALMINUTE_Y);\r
+        actualSleepTimeHoursText->SetVisible(true);\r
+        group->Add(actualSleepTimeHoursText);\r
+    } else if ((hours != 0) && (minutes != 0)) {\r
+        actualSleepTimeHours->SetPosition(SLEEPMAIN_ACTUALHOUR_X, ACTUALMINUTES_Y);\r
+        actualSleepTimeHours->Resize(SLEEPMAIN_HEIGHT, SLEEPMAIN_HEIGHT);\r
+\r
+        actualSleepTimeHours->SetVisible(true);\r
+        actualSleepTimeHours->SetText(std::to_string(hours).c_str());\r
+        group->Add(actualSleepTimeHours);\r
+\r
+        actualSleepTimeHoursText->SetPosition(SLEEPMAIN_ACTUALHOURTEXT_X, SLEEPMAIN_ACTUALMINUTE_Y);\r
+        actualSleepTimeHoursText->SetVisible(true);\r
+        group->Add(actualSleepTimeHoursText);\r
+\r
+        actualSleepTimeMinutes->SetPosition(SLEEPMAIN_ACTUALMINUTE_X, ACTUALMINUTES_Y);\r
+        actualSleepTimeMinutes->SetVisible(true);\r
+        actualSleepTimeMinutes->SetText(std::to_string(minutes).c_str());\r
+        group->Add(actualSleepTimeMinutes);\r
+\r
+        actualSleepTimeMinutesText->SetPosition(SLEEPMAIN_ACTUALMINUTETEXT_X, SLEEPMAIN_ACTUALMINUTE_Y);\r
+        actualSleepTimeMinutesText->SetVisible(true);\r
+        group->Add(actualSleepTimeMinutesText);\r
+    } else if ((hours == 0) && (minutes == 0)) {\r
+        actualSleepTimeHours->SetPosition(ACTUALHOURS_X, ACTUALMINUTES_Y);\r
+        actualSleepTimeHours->Resize(SLEEPMAIN_HEIGHT, SLEEPMAIN_HEIGHT);\r
+        actualSleepTimeHours->SetVisible(true);\r
+        actualSleepTimeHours->SetText("--");\r
+        group->Add(actualSleepTimeHours);\r
+\r
+        actualSleepTimeHoursText->SetPosition(ACTUALMINUTES_X, SLEEPMAIN_ACTUALMINUTE_Y);\r
+        actualSleepTimeHoursText->SetVisible(true);\r
+        group->Add(actualSleepTimeHoursText);\r
+\r
+        actualSleepTimeMinutes->SetPosition(SLEEPMAIN_ACTUALMINUTE_X, ACTUALMINUTES_Y);\r
+        actualSleepTimeMinutes->SetVisible(true);\r
+        actualSleepTimeMinutes->SetText("--");\r
+        group->Add(actualSleepTimeMinutes);\r
+\r
+        actualSleepTimeMinutesText->SetPosition(SLEEPMAIN_ACTUALMINUTETEXT2_X, SLEEPMAIN_ACTUALMINUTE_Y);\r
+        actualSleepTimeMinutesText->SetVisible(true);\r
+        group->Add(actualSleepTimeMinutesText);\r
+    }\r
+}\r
+\r
+void SleepingMainPage::CircleProgress()\r
+{\r
+    if (circleProgress == nullptr) {\r
+        circleProgress = new UICircleProgress();\r
+    }\r
+    circleProgress->SetPosition(0, 0);\r
+    circleProgress->Resize(SLEEPMAIN_CIR_HIGHT, SLEEPMAIN_CIR_HIGHT);\r
+\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
+\r
+    group->Add(circleProgress);\r
+    circleProgress->SetValue(GetSleepingScores());\r
+    circleProgress->Invalidate();\r
+}\r
+\r
+uint32_t SleepingMainPage::GetSleepingScores()\r
+{\r
+    uint32_t hours = SleepingModel::GetInstance().GetSleepTimeHours();\r
+    uint32_t minutes = SleepingModel::GetInstance().GetSleepTimeMinutes();\r
+    std::tuple<uint32_t, uint32_t> timeTuple = SleepingModel::GetInstance().GetTime();\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 SleepingMainPage::GetRecord()\r
+{\r
+    if (SleepingModel::GetInstance().GetRecord()) {\r
+        return true;\r
+    }\r
+    return false;\r
+}\r
+\r
+bool SleepingMainPage::OnClick(UIView &view, const ClickEvent &event)\r
+{\r
+    UNUSED(view);\r
+    if (strcmp(view.GetViewId(), "targetTime") == 0) {\r
+        NativeAbility::GetInstance().SwitchSlice(VIEW_SLEEPING, SLEEPING_PAGES::SLEEPING_TARGET_PAGE);\r
+    }\r
+    return true;\r
+}\r
+\r
+bool SleepingMainPage::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, "SleepingMainPage::OnDrag ChangeSlice(VIEW_APPLIST)");\r
+    } else if (event.GetDragDirection() == DragEvent::DIRECTION_BOTTOM_TO_TOP) {\r
+        NativeAbility::GetInstance().SwitchSlice(VIEW_SLEEPING, SLEEPING_PAGES::SLEEPING_DEATIL_PAGE);\r
+    }\r
+    return true;\r
+}\r
+}\r
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/sleep/src/SleepingModel.cpp b/code/sdk/application/wearable/nativeapp/nativeui/sleep/src/SleepingModel.cpp
new file mode 100644 (file)
index 0000000..fc25450
--- /dev/null
@@ -0,0 +1,283 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SleepingModel\r
+ * Created: 2025-06-05\r
+ */\r
+\r
+#include <sys/time.h>\r
+#include <time.h>\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 "wearable_onlinelog.h"\r
+#include "sleep/SleepingModel.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
+static constexpr uint64_t SLEEPMODEL_DEEP = 4;\r
+static constexpr uint64_t SLEEPMODEL_LIGHT = 3;\r
+static constexpr uint64_t SLEEPMODEL_EYEMOVE = 2;\r
+static constexpr uint64_t SLEEPMODEL_EIGHT_HOUR = 480;\r
+\r
+SleepingModel::SleepingModel()\r
+{\r
+    SetSleepData();\r
+    SetSoberingTime();\r
+    SetRapidEyeMovementTime();\r
+    SetLightSleepTime();\r
+    SetDeepSleepTime();\r
+    SetTime(SLEEPMODEL_EIGHT_HOUR);\r
+}\r
+\r
+SleepingModel::~SleepingModel()\r
+{\r
+}\r
+\r
+bool SleepingModel::GetRecord()\r
+{\r
+    if (sleepDataVector.empty() == true) {\r
+        return false;\r
+    }\r
+    return true;\r
+}\r
+\r
+uint8_t* SleepingModel::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->isSend ? 1 : 0;\r
+    memcpy_s(buffer, sizeof(isSendValue), &isSendValue, sizeof(isSendValue));\r
+    memcpy_s(buffer + offsetof(SleepData, date), sizeof(sleepData->date),\r
+             sleepData->date, sizeof(sleepData->date));\r
+    memcpy_s(buffer + offsetof(SleepData, type), sizeof(sleepData->type),\r
+             &sleepData->type, sizeof(sleepData->type));\r
+    memcpy_s(buffer + offsetof(SleepData, start), sizeof(sleepData->start),\r
+             sleepData->start, sizeof(sleepData->start));\r
+    memcpy_s(buffer + offsetof(SleepData, end), sizeof(sleepData->end),\r
+             sleepData->end, sizeof(sleepData->end));\r
+    memcpy_s(buffer + offsetof(SleepData, sleepStart), sizeof(sleepData->sleepStart),\r
+             sleepData->sleepStart, sizeof(sleepData->sleepStart));\r
+    memcpy_s(buffer + offsetof(SleepData, sleepEnd), sizeof(sleepData->sleepEnd),\r
+             sleepData->sleepEnd, sizeof(sleepData->sleepEnd));\r
+    return buffer;\r
+}\r
+\r
+void SleepingModel::SendData()\r
+{\r
+#ifndef _WIN32\r
+    // 发送数据\r
+    size_t dataSize;\r
+    for (int i = 0; i < sleepDataVector.size(); i++) {\r
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "send Date number: %d\n", i+1);\r
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "send front isSend: %s\n\n",\r
+            sleepDataVector[i].isSend ? "true" : "false");\r
+        if (sleepDataVector[i].isSend == true) {\r
+            continue;\r
+        }\r
+        PrintSleepData(&sleepDataVector[i]);\r
+        uint8_t* serializedData = SerializeSleepData(&sleepDataVector[i], &dataSize);\r
+        errcode_t ret = uapi_diag_service_send_log(msg_center_get_trans_channel(),\r
+            MSGCENTER_TYPE_ID_SLEEP_DATA, serializedData, dataSize);\r
+        delete[] serializedData;\r
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MSGCENTER_TYPE_ID_SLEEP_DATA ret = %d", ret);\r
+        if (ret == 0) {\r
+            sleepDataVector[i].isSend = true;\r
+        }\r
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "isSend after: %s\n\n", sleepDataVector[i].isSend ? "true" : "false");\r
+    }\r
+#endif\r
+}\r
+\r
+void SleepingModel::SetSleepData()\r
+{\r
+#ifndef _WIN32\r
+    sleepDataVector.push_back({\r
+        false, "2025-06-03", 4, "2025-06-03 00:00:00", "2025-06-03 00:30:00",\r
+        "2025-06-03 00:00:00", "2025-06-03 07:50:00"\r
+    });\r
+    sleepDataVector.push_back({\r
+        false, "2025-06-03", 2, "2025-06-03 00:30:00", "2025-06-03 03:00:00",\r
+        "2025-06-03 00:00:00", "2025-06-03 07:50:00"\r
+    });\r
+    sleepDataVector.push_back({\r
+        false, "2025-06-03", 3, "2025-06-03 03:00:00", "2025-06-03 03:30:00",\r
+        "2025-06-03 00:00:00", "2025-06-03 07:50:00"\r
+    });\r
+    sleepDataVector.push_back({\r
+        false, "2025-06-03", 1, "2025-06-03 03:30:00", "2025-06-03 05:30:00",\r
+        "2025-06-03 00:00:00", "2025-06-03 07:50:00"\r
+    });\r
+    sleepDataVector.push_back({\r
+        false, "2025-06-03", 3, "2025-06-03 05:30:00", "2025-06-03 06:00:00",\r
+        "2025-06-03 00:00:00", "2025-06-03 07:50:00"\r
+    });\r
+    sleepDataVector.push_back({\r
+        false, "2025-06-03", 2, "2025-06-03 06:00:00", "2025-06-03 07:30:00",\r
+        "2025-06-03 00:00:00", "2025-06-03 07:50:00"\r
+    });\r
+    sleepDataVector.push_back({\r
+        false, "2025-06-03", 4, "2025-06-03 07:30:00", "2025-06-03 07:50:00",\r
+        "2025-06-03 00:00:00", "2025-06-03 07:50:00"\r
+    });\r
+#endif\r
+}\r
+\r
+void SleepingModel::PrintSleepData(const SleepData *data)\r
+{\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "isSend: %s\n\n", data->isSend ? "true" : "false");\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "PrintSleepData Date: %s\n", data->date);\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Sleep type: %u\n", data->type);\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Start: %s\n", data->start);\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "End: %s\n", data->end);\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Sleep Start: %s\n", data->sleepStart);\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Sleep End: %s\n", data->sleepEnd);\r
+}\r
+\r
+SleepingModel &SleepingModel::GetInstance()\r
+{\r
+    static SleepingModel instance;\r
+    return instance;\r
+}\r
+\r
+std::tuple<uint32_t, uint32_t> SleepingModel::GetSoberingTime()\r
+{\r
+    return MinutesToHours(soberingTime);\r
+}\r
+\r
+std::tuple<uint32_t, uint32_t> SleepingModel::GetRapidEyeMovementTime()\r
+{\r
+    return MinutesToHours(eyeMoveTime);\r
+}\r
+\r
+std::tuple<uint32_t, uint32_t> SleepingModel::GetLightSleepTime()\r
+{\r
+    return MinutesToHours(lightTime);\r
+}\r
+\r
+std::tuple<uint32_t, uint32_t> SleepingModel::GetDeepSleepTime()\r
+{\r
+    return MinutesToHours(deepTime);\r
+}\r
+\r
+std::tuple<uint32_t, uint32_t> SleepingModel::GetSleepTime()\r
+{\r
+    return MinutesToHours(GetTotalSleepTime());\r
+}\r
+\r
+std::tuple<uint32_t, uint32_t> SleepingModel::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 SleepingModel::GetSleepTimeHours()\r
+{\r
+    std::tuple<uint32_t, uint32_t> timeTuple = GetSleepTime();\r
+    return std::get<0>(timeTuple);\r
+}\r
+\r
+uint32_t SleepingModel::GetSleepTimeMinutes()\r
+{\r
+    std::tuple<uint32_t, uint32_t> timeTuple = GetSleepTime();\r
+    return std::get<1>(timeTuple);\r
+}\r
+\r
+void SleepingModel::SetTime(uint32_t minute)\r
+{\r
+    sleepTarget = minute;\r
+}\r
+\r
+std::tuple<uint32_t, uint32_t> SleepingModel::GetTime()\r
+{\r
+    return MinutesToHours(sleepTarget);\r
+}\r
+\r
+uint32_t SleepingModel::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 SleepingModel::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].start, sleepDataVector[i].end);\r
+        }\r
+    }\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "GetDetailData type: %d\n", type);\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "GetDetailData min: %d\n", min);\r
+    return min;\r
+}\r
+\r
+// 获取总睡觉时间的时间差\r
+uint32_t SleepingModel::GetTotalSleepTime()\r
+{\r
+    uint32_t time = TimeDiffInMinutes(sleepDataVector[0].sleepStart, sleepDataVector[0].sleepEnd);\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "GetTotalSleepTime time: %d\n", time);\r
+    return time;\r
+}\r
+\r
+void SleepingModel::SetSoberingTime()\r
+{\r
+    soberingTime = GetDetailData(SLEEPMODEL_DEEP);\r
+}\r
+void SleepingModel::SetRapidEyeMovementTime()\r
+{\r
+    eyeMoveTime=GetDetailData(SLEEPMODEL_LIGHT);\r
+}\r
+void SleepingModel::SetLightSleepTime()\r
+{\r
+    lightTime = GetDetailData(SLEEPMODEL_EYEMOVE);\r
+}\r
+void SleepingModel::SetDeepSleepTime()\r
+{\r
+    deepTime = GetDetailData(1);\r
+}\r
+}\r
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/sleep/src/SleepingPresenter.cpp b/code/sdk/application/wearable/nativeapp/nativeui/sleep/src/SleepingPresenter.cpp
new file mode 100644 (file)
index 0000000..e1b9bf8
--- /dev/null
@@ -0,0 +1,13 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SleepingPresenter\r
+ * Created: 2025-06-05\r
+ */\r
+\r
+#include "NativeRegisterManager.h"\r
+#include "sleep/SleepingView.h"\r
+#include "sleep/SleepingPresenter.h"\r
+\r
+namespace OHOS {\r
+REGIST_MENU(VIEW_SLEEPING, SleepingView, SleepingPresenter, SLEEP_ICON, PNG_APPLIST_DEFAULT_IMG, "睡眠");\r
+}
\ No newline at end of file
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/sleep/src/TargetSleepTime.cpp b/code/sdk/application/wearable/nativeapp/nativeui/sleep/src/TargetSleepTime.cpp
new file mode 100644 (file)
index 0000000..4eab1f3
--- /dev/null
@@ -0,0 +1,335 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: TargetSleepTime\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 "settings/SetDesktopModel.h"\r
+#include "rebootdevice/RebootModel.h"\r
+#include "common/image_cache_manager.h"\r
+#include "sleep/TargetSleepTime.h"\r
+#include "sleep/SleepingMainPage.h"\r
+#include "sleep/SleepingPresenter.h"\r
+#include "sleep/SleepingView.h"\r
+\r
+namespace OHOS {\r
+constexpr uint8_t BACKGROUND_FONT = 40;\r
+constexpr uint8_t HIGHTLIGHT_FONT = 50;\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 = 188;\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 = 63;\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_PICKER_HOUR_RANGE = 23;\r
+static constexpr int16_t TARGET_SLEEP_PICKER_MINUTE_RANGE = 59;\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 NUM_PICKER = 2;\r
+static constexpr int16_t TARGET_SLEEP_PICKER1_X = 115;\r
+static constexpr int16_t TARGET_SLEEP_PICKER2_Y = 255;\r
+\r
+// 时间选择器分钟列\r
+const char *uiPickerMinute[] = {"00", "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"};\r
+\r
+// 时间选择器小时列\r
+const char *uiPickerHour[] = {"00", "01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11", "12", "13", "14",\r
+                              "15", "16", "17", "18", "19", "20", "21", "22", "23"};\r
+\r
+REGIST_SLICE_PAGE(VIEW_SLEEPING, SLEEPING_PAGES::SLEEPING_TARGET_PAGE, TargetSleepTime, false);\r
+\r
+TargetSleepTime::~TargetSleepTime()\r
+{\r
+    if (group != nullptr) {\r
+        group->RemoveAll();\r
+        delete group;\r
+        group = nullptr;\r
+    }\r
+\r
+    if (setTraget != nullptr) {\r
+        delete setTraget;\r
+        setTraget = nullptr;\r
+    }\r
+\r
+    if (timerLabel != nullptr) {\r
+        delete timerLabel;\r
+        timerLabel = nullptr;\r
+    }\r
+\r
+    if (startButton != nullptr) {\r
+        delete startButton;\r
+        startButton = nullptr;\r
+    }\r
+\r
+    if (backgroundImage != nullptr) {\r
+        delete backgroundImage;\r
+        backgroundImage = nullptr;\r
+    }\r
+\r
+    for (int i = 0; i < NUM_PICKER; i++) {\r
+        if (timerPicker[i] != nullptr) {\r
+            delete timerPicker[i];\r
+            timerPicker[i] = nullptr;\r
+        }\r
+    }\r
+\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "TargetSleepTime::~TargetSleepTime");\r
+}\r
+\r
+void TargetSleepTime::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(VERTICAL_RESOLUTION, HORIZONTAL_RESOLUTION);\r
+\r
+    backgroundImage = new UIImageView();\r
+    if (backgroundImage == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "backgroundImage is nullptr");\r
+        return;\r
+    }\r
+    backgroundImage->SetPosition(0, 0);\r
+    LOADIMG::LoadImageViewImg(backgroundImage, SLEEP_IMAGE, IMAGE_CONVERTER_TOOL_BLACK_BG);\r
+    group->Add(backgroundImage);\r
+\r
+    setTraget = new UILabel();\r
+    if (setTraget == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "setTraget is nullptr");\r
+        return;\r
+    }\r
+    setTraget->SetPosition(TARGET_SLEEP_SETTARGET_X, TARGET_SLEEP_SETTARGET_Y);\r
+    setTraget->Resize(TARGET_SLEEP_SETTARGET_WIDTH, TARGET_SLEEP_SETTARGET_HIGHT);\r
+    setTraget->SetText("设置目标");\r
+    setTraget->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+    setTraget->SetTextColor(Color::White());\r
+    setTraget->SetFont(DEFAULT_VECTOR_FONT_FILENAME, TARGET_SLEEP_SETTARGET_FONT_SIZE);\r
+    setTraget->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+    group->Add(setTraget);\r
+\r
+    TargetTimeButton();\r
+    CreateLabel();\r
+    CreatePicker();\r
+\r
+    group->SetOnDragListener(this);\r
+    group->SetDraggable(true);\r
+    group->SetTouchable(true);\r
+    AddViewToPageContainer(group);\r
+}\r
+\r
+void TargetSleepTime::TargetTimeButton()\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_TRANSPARENT);\r
+    startButton->SetAlign(TEXT_ALIGNMENT_CENTER);\r
+    startButton->SetViewId("start");\r
+\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
+    LOADIMG::LoadBtnImage(startButton, SLEEP_IMAGE, IMAGE_CONVERTER_TOOL_SETTIMEBTN, IMAGE_CONVERTER_TOOL_SETTIMEBTN);\r
+    startButton->SetText("开始");\r
+    startButton->SetTextColor(Color::White());\r
+    startButton->Enable();\r
+    startButton->SetOnClickListener(this);\r
+    group->Add(startButton);\r
+}\r
+\r
+void TargetSleepTime::SetPickerTime()\r
+{\r
+    std::tuple<uint32_t, uint32_t> time = SleepingModel::GetInstance().GetTime();\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 TargetSleepTime::CreatePicker()\r
+{\r
+    int posX[NUM_PICKER] = {TARGET_SLEEP_PICKER1_X, TARGET_SLEEP_PICKER2_Y};\r
+    int posY = TARGET_SLEEP_PICKER_Y;\r
+    for (int i = 0; i < NUM_PICKER; 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(uiPickerHour, TARGET_SLEEP_PICKER_HOUR);\r
+                timerPicker[i]->SetSelected(TARGET_SLEEP_PICKER_HOUR_RANGE);\r
+            } else {\r
+                timerPicker[i]->SetValues(uiPickerMinute, TARGET_SLEEP_PICKER_MINUTE);\r
+                timerPicker[i]->SetSelected(TARGET_SLEEP_PICKER_MINUTE_RANGE);\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("hourPicker");\r
+        timerPicker[1]->SetViewId("minPicker");\r
+        SetPickerTime();\r
+}\r
+\r
+bool TargetSleepTime::OnClick(UIView &view, const ClickEvent &event)\r
+{\r
+    UNUSED(event);\r
+    std::string viewId = view.GetViewId();\r
+    if (viewId == "start") {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "TimerMainPage::OnClick viewId == ONE_MIN");\r
+        int hour = std::stoi(uiPickerHour[timerPicker[0]->GetSelected()]);\r
+        uint8_t minute = std::stoi(uiPickerMinute[timerPicker[1]->GetSelected()]);\r
+        SleepingModel::GetInstance().SetTime((hour * TARGET_SLEEP_PICKER_MINUTE) + minute);\r
+        NativeAbility::GetInstance().SwitchSlice(VIEW_SLEEPING, SLEEPING_PAGES::SLEEPING_MAIN_PAGE);\r
+    }\r
+    return false;\r
+}\r
+\r
+void TargetSleepTime::CreateLabel()\r
+{\r
+    if (timerLabel == nullptr) {\r
+        timerLabel = new UILabel();\r
+    }\r
+    timerLabel->SetPosition(TARGET_SLEEP_TIMERLABEL_X, TARGET_SLEEP_TIMERLABEL_Y);\r
+    timerLabel->Resize(TARGET_SLEEP_TIMERLABEL_WIDTH, TARGET_SLEEP_TIMERLABEL_HEIGHT);\r
+    timerLabel->SetStyle(STYLE_BACKGROUND_OPA, OPA_OPAQUE);\r
+    timerLabel->SetText("小时");\r
+    timerLabel->SetStyle(STYLE_BACKGROUND_COLOR, 0xFFB566FF);\r
+    timerLabel->SetTextColor(Color::Black());\r
+    timerLabel->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+    timerLabel->SetFont(DEFAULT_VECTOR_FONT_FILENAME, TIMERLABEL_FONT);\r
+    timerLabel->SetVisible(false);\r
+\r
+    group->Add(timerLabel);\r
+}\r
+\r
+bool TargetSleepTime::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
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "TargetSleepTime::OnDrag ChangeSlice(VIEW_APPLIST)");\r
+        NativeAbility::GetInstance().SwitchSlice(VIEW_SLEEPING, SLEEPING_PAGES::SLEEPING_MAIN_PAGE);\r
+    }\r
+    if (view.GetViewId() == "hourPicker") {\r
+        timerPicker[0]->SetStyle(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
+        timerLabel->SetVisible(true);\r
+        timerLabel->SetPosition(TARGET_SLEEP_TIMERLABEL_X, TARGET_SLEEP_TIMERLABEL2_Y);\r
+        timerLabel->SetText("小时");\r
+        timerLabel->Invalidate();\r
+    } else if (view.GetViewId() == "minPicker") {\r
+        timerPicker[1]->SetStyle(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
+        timerLabel->SetVisible(true);\r
+        timerLabel->SetPosition(TARGET_SLEEP_TIMERLABEL2_X, TARGET_SLEEP_TIMERLABEL2_Y);\r
+        timerLabel->SetText("分钟");\r
+        timerLabel->Invalidate();\r
+    }\r
+    return true;\r
+}\r
+\r
+void TargetSleepTime::OnPickerStoped(UIPicker& picker)\r
+{\r
+    if (picker.GetViewId() == "hourPicker") {\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->SetText("");\r
+            startButton->Disable();\r
+            LOADIMG::LoadBtnImage(startButton, SLEEP_IMAGE, IMAGE_CONVERTER_TOOL_START_GRAY,\r
+                                  IMAGE_CONVERTER_TOOL_START_GRAY);\r
+        } else {\r
+            startButton->SetText("开始");\r
+            startButton->SetTextColor(Color::White());\r
+            startButton->Enable();\r
+            LOADIMG::LoadBtnImage(startButton, SLEEP_IMAGE,\r
+                                  IMAGE_CONVERTER_TOOL_SETTIMEBTN, IMAGE_CONVERTER_TOOL_SETTIMEBTN);\r
+        }\r
+        timerLabel->SetVisible(true);\r
+        timerLabel->SetPosition(TARGET_SLEEP_TIMERLABEL_X, TARGET_SLEEP_TIMERLABEL2_Y);\r
+        timerLabel->SetText("小时");\r
+        timerLabel->Invalidate();\r
+    } else {\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->SetText("");\r
+            startButton->Disable();\r
+            LOADIMG::LoadBtnImage(startButton, SLEEP_IMAGE, IMAGE_CONVERTER_TOOL_START_GRAY,\r
+                IMAGE_CONVERTER_TOOL_START_GRAY);\r
+        } else {\r
+            startButton->SetText("开始");\r
+            startButton->SetTextColor(Color::White());\r
+            startButton->Enable();\r
+            LOADIMG::LoadBtnImage(startButton, SLEEP_IMAGE, IMAGE_CONVERTER_TOOL_SETTIMEBTN,\r
+                IMAGE_CONVERTER_TOOL_SETTIMEBTN);\r
+        }\r
+        timerLabel->SetVisible(true);\r
+        timerLabel->SetPosition(TARGET_SLEEP_TIMERLABEL2_X, TARGET_SLEEP_TIMERLABEL2_Y);\r
+        timerLabel->SetText("分钟");\r
+        timerLabel->Invalidate();\r
+    }\r
+}\r
+}\r
+\r
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/sports/src/SportsModel.cpp b/code/sdk/application/wearable/nativeapp/nativeui/sports/src/SportsModel.cpp
new file mode 100644 (file)
index 0000000..4854d19
--- /dev/null
@@ -0,0 +1,266 @@
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: Sports Model\r
+ * Create: 2025-04-28\r
+ */\r
+\r
+#include "sports/SportsView.h"\r
+#include "sports/SportsModel.h"\r
+#include "samgr_lite.h"\r
+#include "broadcast_feature.h"\r
+#include "broadcast_service.h"\r
+#include "wearable_log.h"\r
+#include "heartrate/HeartModel.h"\r
+#include "device_location.h"\r
+\r
+#ifdef __cplusplus\r
+extern "C" {\r
+#endif\r
+\r
+using namespace OHOS;\r
+static sport_data_t g_sportData = {0};\r
+static void Notify(void *args, const Topic topic, Request *request);\r
+\r
+Subscriber sportsSubscirber = {\r
+    .identity = nullptr,\r
+    .args = nullptr,\r
+    .Notify = Notify,\r
+};\r
+\r
+void SportsSubscribeTopic(Topic topic)\r
+{\r
+#if !defined(_WIN32)\r
+    BroadcastApi *broadcastApi = nullptr;\r
+    IUnknown *api = SAMGR_GetInstance()->GetFeatureApi(BROADCAST_SERVICE_NAME, BROADCAST_FEATURE_NAME);\r
+    if (api == nullptr) {\r
+        return;\r
+    }\r
+    int result = api->QueryInterface(api, DEFAULT_VERSION, (void **)&broadcastApi);\r
+    if (result != 0 || broadcastApi == nullptr) {\r
+        return;\r
+    }\r
+    int ret = broadcastApi->SubscribeTopic((IUnknown *)broadcastApi, topic, &sportsSubscirber);\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SportsSubscribeTopic ret = %d, topic = %u", ret, topic);\r
+    broadcastApi->Release((IUnknown *)broadcastApi);\r
+#endif\r
+}\r
+\r
+void SportsUnsubscribeTopic(Topic topic)\r
+{\r
+#if !defined(_WIN32)\r
+    BroadcastApi *broadcastApi = nullptr;\r
+    IUnknown *api = SAMGR_GetInstance()->GetFeatureApi(BROADCAST_SERVICE_NAME, BROADCAST_FEATURE_NAME);\r
+    if (api == nullptr) {\r
+        return;\r
+    }\r
+    int result = api->QueryInterface(api, DEFAULT_VERSION, (void **)&broadcastApi);\r
+    if (result != 0 || broadcastApi == nullptr) {\r
+        return;\r
+    }\r
+    broadcastApi->UnsubscribeTopic((IUnknown *)broadcastApi, topic, &sportsSubscirber);\r
+    broadcastApi->Release((IUnknown *)broadcastApi);\r
+#endif\r
+}\r
+\r
+static void Notify(void *args, const Topic topic, Request *request)\r
+{\r
+    UNUSED(args);\r
+    UNUSED(topic);\r
+    if (request == nullptr) {\r
+        return;\r
+    }\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "topic=[%d,%d]\n", topic, request->msgId);\r
+    SportsView *sportView = SportsView::GetInstance();\r
+    bool active = OHOS::SportsModel::GetInstance()->IsActive();\r
+    if (sportView != nullptr && active) {\r
+        if (request->msgId == TOPIC_EVENT_HEARTRATE_UPDATA) {\r
+            HeartDatas *sportsInfo = (HeartDatas *)request->data;\r
+            g_sportData.heartrate = sportsInfo->perSec;\r
+            WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "heartrate=[%d]\n", g_sportData.heartrate);\r
+            sportView->SetHeartRate(g_sportData.heartrate);\r
+        }\r
+        if (request->msgId == TOPIC_EVENT_STEPDATA_UPDATE) {\r
+            g_sportData.step += *(uint32_t *)request->data;\r
+            WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "step=[%d]\n", g_sportData.step);\r
+            sportView->SetStep(g_sportData.step);\r
+        }\r
+        if (request->msgId == TOPIC_EVENT_SPORT_DISTANCE) {\r
+            g_sportData.distance += *(uint32_t *)request->data;\r
+            WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "distance=[%d]\n", g_sportData.distance);\r
+            sportView->SetDistance(g_sportData.distance);\r
+            uint32_t speed = OHOS::SportsModel::GetInstance()->CalculateSpeed(g_sportData.distance);\r
+            g_sportData.speed = speed;\r
+            WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "speed=[%d]\n", g_sportData.speed);\r
+            sportView->SetSpeed(speed);\r
+        }\r
+        if (request->msgId == TOPIC_EVENT_LOCATION) {\r
+            LocationInfo_t *locationData = (LocationInfo_t *)request->data;\r
+            g_sportData.lat = locationData->latitude_;\r
+            g_sportData.lng = locationData->longitude_;\r
+            WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "location=[%d,%d]\n", g_sportData.lat, g_sportData.lng);\r
+        }\r
+    }\r
+}\r
+\r
+#ifdef __cplusplus\r
+}\r
+#endif\r
+\r
+namespace OHOS {\r
+\r
+static constexpr uint16_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 uint32_t NUM_TIME_DAY = 86400;\r
+\r
+SportsModel::SportsModel()\r
+{\r
+    InitSportsTimer();\r
+}\r
+\r
+SportsModel::~SportsModel()\r
+{\r
+    StopSportsTimer(true);\r
+    SportsUnsubscribeTopic(TOPIC_EVENT_HEARTRATE_UPDATA);\r
+    SportsUnsubscribeTopic(TOPIC_EVENT_STEPDATA_UPDATE);\r
+    SportsUnsubscribeTopic(TOPIC_EVENT_SPORT_DISTANCE);\r
+    SportsUnsubscribeTopic(TOPIC_EVENT_LOCATION);\r
+}\r
+\r
+SportsModel *SportsModel::GetInstance(void)\r
+{\r
+    static SportsModel instance;\r
+    return &instance;\r
+}\r
+\r
+void SportsModel::Init()\r
+{\r
+    SportsSubscribeTopic(TOPIC_EVENT_HEARTRATE_UPDATA);\r
+    SportsSubscribeTopic(TOPIC_EVENT_STEPDATA_UPDATE);\r
+    SportsSubscribeTopic(TOPIC_EVENT_SPORT_DISTANCE);\r
+    SportsSubscribeTopic(TOPIC_EVENT_LOCATION);\r
+}\r
+\r
+std::string SportsModel::CountingSportsTime()\r
+{\r
+    std::string strSportTime;\r
+    std::string hours;\r
+    std::string minute;\r
+    std::string seconds;\r
+    if (uiSportTime_ >= NUM_TIME_DAY) {\r
+        uiSportTime_ = 0;\r
+    }\r
+    int hour = uiSportTime_ / NUM_TIME_HOUR;\r
+    int min = (uiSportTime_ % NUM_TIME_HOUR) / NUM_TIME_MIN;\r
+    int sec = (uiSportTime_ % 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
+    strSportTime = hours + ":" + minute + ":" + seconds;\r
+    return strSportTime;\r
+}\r
+\r
+void SportsModel::IncrSportsTime()\r
+{\r
+    uiSportTime_++;\r
+}\r
+\r
+/* 定时器回调函数 */\r
+static void SportsTimerCallback(void *data)\r
+{\r
+    (void)data;\r
+    SportsModel::GetInstance()->IncrSportsTime();\r
+    SportsView *view = SportsView::GetInstance();\r
+    if (view != nullptr) {\r
+        std::string sportTime = SportsModel::GetInstance()->CountingSportsTime();\r
+        view->SetTime(sportTime.c_str());\r
+    }\r
+}\r
+\r
+/* 创建定时器 */\r
+void SportsModel::InitSportsTimer()\r
+{\r
+    if (pGraphicTimer_ != nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SportsModel::InitSportsTimer GraphicTimer already exists!!");\r
+        return;\r
+    }\r
+    uint32_t tick = GetOSTick(MS_ONE_SECONDS);\r
+    pGraphicTimer_ = new GraphicTimer(tick, SportsTimerCallback, nullptr, true);\r
+    if (pGraphicTimer_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SportsModel::InitSportsTimer new GraphicTimer failed!!");\r
+        return;\r
+    }\r
+}\r
+\r
+/* 开启定时器 */\r
+bool SportsModel::StartSportsTimer()\r
+{\r
+    if (pGraphicTimer_ != nullptr) {\r
+        bool retTimer = pGraphicTimer_->Start();\r
+        if (!retTimer) {\r
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "StartSportsTimer GraphicTimer Start failed!!");\r
+            if (pGraphicTimer_ != nullptr) {\r
+                delete pGraphicTimer_;\r
+                pGraphicTimer_ = nullptr;\r
+            }\r
+            return false;\r
+        }\r
+        isActive_ = true;\r
+        return true;\r
+    }\r
+    return false;\r
+}\r
+\r
+/* 关闭定时器 */\r
+void SportsModel::StopSportsTimer(bool isDelete)\r
+{\r
+    if (pGraphicTimer_ != nullptr) {\r
+        pGraphicTimer_->Stop();\r
+        isActive_ = false;\r
+        if (isDelete) {\r
+            delete pGraphicTimer_;\r
+            pGraphicTimer_ = nullptr;\r
+            uiSportTime_ = 0;\r
+        }\r
+    }\r
+}\r
+\r
+bool SportsModel::IsActive()\r
+{\r
+    return isActive_;\r
+}\r
+\r
+sport_data_t *SportsModel::GetSportsData()\r
+{\r
+    return &g_sportData;\r
+}\r
+\r
+void SportsModel::ResetSportsData()\r
+{\r
+    uiSportTime_ = 0;\r
+    memset_s(&g_sportData, sizeof(sport_data_t), 0, sizeof(sport_data_t));\r
+}\r
+\r
+uint32_t SportsModel::CalculateSpeed(uint32_t distance)\r
+{\r
+    uint32_t speed_multiply100 = 0;\r
+    if (uiSportTime_ != 0) {\r
+        speed_multiply100 = (distance * NUM_TIME_HOUR) / (uiSportTime_ * NUM_TEN);\r
+    }\r
+    return speed_multiply100;\r
+}\r
+}
\ No newline at end of file
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/sports/src/SportsPresenter.cpp b/code/sdk/application/wearable/nativeapp/nativeui/sports/src/SportsPresenter.cpp
new file mode 100644 (file)
index 0000000..363bf93
--- /dev/null
@@ -0,0 +1,48 @@
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SPorts Presenter\r
+ * Create: 2025-04-28\r
+ */\r
+\r
+#include "sports/SportsPresenter.h"\r
+#include "sports/SportsView.h"\r
+#include "sports/SportsModel.h"\r
+#include "wearable_log.h"\r
+#include "NativeRegisterManager.h"\r
+\r
+namespace OHOS {\r
+\r
+REGIST_SLICE(VIEW_SPORTS, SportsView, SportsPresenter);\r
+\r
+static SportsPresenter *g_pSportsPresenter = nullptr;\r
+\r
+SportsPresenter::SportsPresenter()\r
+{\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SportsPresenter::SportsPresenter");\r
+    g_pSportsPresenter = this;\r
+}\r
+\r
+SportsPresenter::~SportsPresenter()\r
+{\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SportsPresenter::~SportsPresenter");\r
+    g_pSportsPresenter = nullptr;\r
+}\r
+\r
+SportsPresenter *SportsPresenter::GetInstance()\r
+{\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SportsPresenter GetInstance");\r
+    return g_pSportsPresenter;\r
+}\r
+\r
+bool SportsPresenter::OnDrag(UIView &view, const DragEvent &event)\r
+{\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SportsPresenter::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, "SportsPresenter::OnDrag ChangeSlice");\r
+        NativeAbility::GetInstance().ChangeSlice(VIEW_MAIN_SAMPLE);\r
+    }\r
+    return true;\r
+}\r
+}\r
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/sports/src/SportsView.cpp b/code/sdk/application/wearable/nativeapp/nativeui/sports/src/SportsView.cpp
new file mode 100644 (file)
index 0000000..2b3b50b
--- /dev/null
@@ -0,0 +1,213 @@
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: Sports View\r
+ * Create: 2025-04-28\r
+ */\r
+\r
+#include "sports/SportsView.h"\r
+#include "sports/SportsModel.h"\r
+#include "sports/SportsPresenter.h"\r
+#include "wearable_log.h"\r
+#include "UiConfig.h"\r
+#include "uiservice/ui_service.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 LEFT1_X = 47;\r
+static constexpr uint16_t LEFT1_Y = 100;\r
+static constexpr uint16_t LEFT1_W = 180;\r
+static constexpr uint16_t RIGHT1_X = 227;\r
+static constexpr uint16_t RIGHT1_Y = 100;\r
+static constexpr uint16_t RIGHT1_W = 180;\r
+static constexpr uint16_t LEFT2_X = 47;\r
+static constexpr uint16_t LEFT2_Y = 210;\r
+static constexpr uint16_t LEFT2_W = 180;\r
+static constexpr uint16_t RIGHT2_X = 227;\r
+static constexpr uint16_t RIGHT2_Y = 210;\r
+static constexpr uint16_t RIGHT2_W = 180;\r
+static constexpr uint16_t BOTTOM_X = 92;\r
+static constexpr uint16_t BOTTOM_Y = 320;\r
+static constexpr uint16_t BOTTOM_W = 270;\r
+static constexpr uint16_t LABLE_H = 70;\r
+static constexpr uint16_t UNIT_LEFT1_Y = 150;\r
+static constexpr uint16_t UNIT_RIGHT1_Y = 150;\r
+static constexpr uint16_t UNIT_LEFT2_Y = 260;\r
+static constexpr uint16_t UNIT_RIGHT2_Y = 260;\r
+static constexpr uint16_t UNIT_BOTTOM_Y = 370;\r
+static constexpr uint16_t UNIT_H = 50;\r
+static constexpr uint16_t CONTENT_FONT = 40;\r
+static constexpr uint16_t TITLE_FONT = 30;\r
+\r
+static SportsView *g_pSportsView{nullptr};\r
+SportsView::SportsView()\r
+{\r
+    ScreenTurnOn(-1);\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SportsView::SportsView");\r
+    g_pSportsView = this;\r
+}\r
+\r
+SportsView::~SportsView()\r
+{\r
+    ScreenTurnOff();\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SportsView::~SportsView");\r
+    if (group != nullptr) {\r
+        group->RemoveAll();\r
+    }\r
+    if (backGround != nullptr) {\r
+        delete backGround;\r
+        backGround = nullptr;\r
+    }\r
+    delete group;\r
+    group = nullptr;\r
+    g_pSportsView = nullptr;\r
+}\r
+\r
+SportsView *SportsView::GetInstance()\r
+{\r
+    return g_pSportsView;\r
+}\r
+\r
+bool SportsView::InitLableView(int index, const char *text, uint16_t x, uint16_t y1, uint16_t w, uint16_t y2)\r
+{\r
+    if (index < SPORT_TIME || index >= SPORT_MAX) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SportsView::InitLableView index param error");\r
+        return false;\r
+    }\r
+\r
+    ContentLabel[index].SetPosition(x, y1, w, LABLE_H);\r
+    ContentLabel[index].SetFont(DEFAULT_VECTOR_FONT_FILENAME, CONTENT_FONT);\r
+    ContentLabel[index].SetStyle(STYLE_BACKGROUND_COLOR, OPA_TRANSPARENT);\r
+    ContentLabel[index].SetAlign(UITextLanguageAlignment::TEXT_ALIGNMENT_CENTER,\r
+                                 UITextLanguageAlignment::TEXT_ALIGNMENT_CENTER);\r
+    group->Add(&ContentLabel[index]);\r
+\r
+    TitleLabel[index].SetPosition(x, y2, w, UNIT_H);\r
+    TitleLabel[index].SetText(text);\r
+    TitleLabel[index].SetFont(DEFAULT_VECTOR_FONT_FILENAME, TITLE_FONT);\r
+    TitleLabel[index].SetStyle(STYLE_BACKGROUND_COLOR, OPA_TRANSPARENT);\r
+    TitleLabel[index].SetAlign(UITextLanguageAlignment::TEXT_ALIGNMENT_CENTER,\r
+                               UITextLanguageAlignment::TEXT_ALIGNMENT_CENTER);\r
+    group->Add(&TitleLabel[index]);\r
+    return true;\r
+}\r
+\r
+void SportsView::InitSportDataLabel()\r
+{\r
+    ContentLabel[SPORT_TIME].SetText("00:00:00");\r
+    ContentLabel[SPORT_SETP].SetText("0");\r
+    ContentLabel[SPORT_DISTANCE].SetText("0.00");\r
+    ContentLabel[SPORT_HEARTRATE].SetText("0");\r
+    ContentLabel[SPORT_SPEED].SetText("0.00");\r
+}\r
+\r
+bool SportsView::InitView()\r
+{\r
+    bool ret = false;\r
+    group = new UIViewGroup();\r
+    if (group == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "group new fail");\r
+        return false;\r
+    }\r
+    group->SetPosition(0, 0);  // 0:x; 0:y\r
+    group->SetWidth(HORIZONTAL_RESOLUTION);\r
+    group->SetHeight(VERTICAL_RESOLUTION);\r
+    group->SetStyle(STYLE_BACKGROUND_OPA, 0);\r
+    group->SetDraggable(true);\r
+    group->SetTouchable(true);\r
+\r
+    backGround = new UIImageView();\r
+    if (backGround == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "backGroundFirst new fail");\r
+        return false;\r
+    }\r
+    backGround->SetPosition(0, 0);  // 0 : X; 0 : Y\r
+    backGround->SetSrc(PNG_WALK_BACK_GROUND);\r
+    group->Add(backGround);\r
+\r
+    InitSportDataLabel();\r
+    ret = InitLableView(SPORT_SETP, "步数", LEFT1_X, LEFT1_Y, LEFT1_W, UNIT_LEFT1_Y);\r
+    if (!ret) {\r
+        return false;\r
+    }\r
+    ret = InitLableView(SPORT_DISTANCE, "距离(km)", RIGHT1_X, RIGHT1_Y, RIGHT1_W, UNIT_RIGHT1_Y);\r
+    if (!ret) {\r
+        return false;\r
+    }\r
+    ret = InitLableView(SPORT_HEARTRATE, "心率(bpm)", LEFT2_X, LEFT2_Y, LEFT2_W, UNIT_LEFT2_Y);\r
+    if (!ret) {\r
+        return false;\r
+    }\r
+    ret = InitLableView(SPORT_SPEED, "速度(km/h)", RIGHT2_X, RIGHT2_Y, RIGHT2_W, UNIT_RIGHT2_Y);\r
+    if (!ret) {\r
+        return false;\r
+    }\r
+    ret = InitLableView(SPORT_TIME, "时间", BOTTOM_X, BOTTOM_Y, BOTTOM_W, UNIT_BOTTOM_Y);\r
+    if (!ret) {\r
+        return false;\r
+    }\r
+    UIView::OnDragListener *dragListener = static_cast<UIView::OnDragListener *>(SportsPresenter::GetInstance());\r
+    group->SetOnDragListener(dragListener);\r
+\r
+    AddViewToRootContainer(group);\r
+    return true;\r
+}\r
+\r
+void SportsView::OnStart()\r
+{\r
+    if (!InitView()) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SportsView::OnStart InitView fail");\r
+    }\r
+    return;\r
+}\r
+\r
+void SportsView::SetStep(uint32_t step)\r
+{\r
+    ContentLabel[SPORT_SETP].SetText(std::to_string(step).c_str());\r
+    ContentLabel[SPORT_SETP].Invalidate();\r
+}\r
+\r
+void SportsView::SetHeartRate(uint16_t heartrate)\r
+{\r
+    ContentLabel[SPORT_HEARTRATE].SetText(std::to_string(heartrate).c_str());\r
+    ContentLabel[SPORT_HEARTRATE].Invalidate();\r
+}\r
+\r
+void SportsView::SetDistance(uint32_t distance)\r
+{\r
+    std::string distance_str;\r
+    uint32_t distance_int_part = distance / NUM_THOUSAND;\r
+    uint32_t distance_fractional_part = (distance % NUM_THOUSAND) / NUM_TEN;\r
+    if (distance_fractional_part < NUM_TEN) {\r
+        distance_str = std::to_string(distance_int_part) + ".0" + std::to_string(distance_fractional_part);\r
+    } else {\r
+        distance_str = std::to_string(distance_int_part) + "." + std::to_string(distance_fractional_part);\r
+    }\r
+    ContentLabel[SPORT_DISTANCE].SetText(distance_str.c_str());\r
+    ContentLabel[SPORT_DISTANCE].Invalidate();\r
+}\r
+\r
+void SportsView::SetSpeed(uint32_t speed)\r
+{\r
+    std::string speed_str;\r
+    uint32_t speed_int_part = speed / NUM_HUNDRED;\r
+    uint32_t speed_fractional_part = speed % NUM_HUNDRED;\r
+\r
+    if (speed_fractional_part < NUM_TEN) {\r
+        speed_str = std::to_string(speed_int_part) + ".0" + std::to_string(speed_fractional_part);\r
+    } else {\r
+        speed_str = std::to_string(speed_int_part) + "." + std::to_string(speed_fractional_part);\r
+    }\r
+\r
+    ContentLabel[SPORT_SPEED].SetText(speed_str.c_str());\r
+    ContentLabel[SPORT_SPEED].Invalidate();\r
+}\r
+\r
+void SportsView::SetTime(const char *time)\r
+{\r
+    ContentLabel[SPORT_TIME].SetText(time);\r
+    ContentLabel[SPORT_TIME].Invalidate();\r
+}\r
+\r
+}\r
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/stopwatch/src/StopwatchAdapter.cpp b/code/sdk/application/wearable/nativeapp/nativeui/stopwatch/src/StopwatchAdapter.cpp
new file mode 100644 (file)
index 0000000..4195950
--- /dev/null
@@ -0,0 +1,63 @@
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: StopwatchAdapter\r
+ * Create: 2025-06-06\r
+ */\r
+#include "stopwatch/StopwatchAdapter.h"\r
+#include "stopwatch/StopwatchItemView.h"\r
+\r
+namespace OHOS {\r
+StopwatchAdapter::StopwatchAdapter() {}\r
+\r
+StopwatchAdapter::~StopwatchAdapter()\r
+{\r
+    listData_.Clear();\r
+}\r
+\r
+uint16_t StopwatchAdapter::GetCount(void)\r
+{\r
+    return listData_.Size();\r
+}\r
+\r
+void StopwatchAdapter::SetData(const List<StopwatchItem> &data)\r
+{\r
+    if (!listData_.IsEmpty()) {\r
+        listData_.Clear();\r
+    }\r
+    ListNode<StopwatchItem> *node = data.Head();\r
+    while (node != data.End()) {\r
+        listData_.PushBack(node->data_);\r
+        node = node->next_;\r
+    }\r
+}\r
+\r
+UIView *StopwatchAdapter::GetView(UIView *inView, int16_t index)\r
+{\r
+    if (listData_.IsEmpty()) {\r
+        return nullptr;\r
+    }\r
+    if (index < 0) {\r
+        return nullptr;\r
+    }\r
+    size_t uindex = index;\r
+    if (uindex >= listData_.Size()) {\r
+        return nullptr;\r
+    }\r
+\r
+    ListNode<StopwatchItem> *node = listData_.Head();\r
+    for (int i = 0; i < index; i++) {\r
+        node = node->next_;\r
+    }\r
+    StopwatchItem itemData = node->data_;\r
+    StopwatchItemView *item = nullptr;\r
+    if (inView == nullptr) {\r
+        item = new StopwatchItemView();\r
+    } else {\r
+        item = static_cast<StopwatchItemView *>(inView);\r
+    }\r
+    size_t rindex = listData_.Size() - index;\r
+    item->SetItemInfo(rindex, itemData);\r
+    return item;\r
+}\r
+\r
+}  // namespace OHOS\r
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/stopwatch/src/StopwatchItemView.cpp b/code/sdk/application/wearable/nativeapp/nativeui/stopwatch/src/StopwatchItemView.cpp
new file mode 100644 (file)
index 0000000..80c4cfe
--- /dev/null
@@ -0,0 +1,80 @@
+/*\r
+ * Copyright (c) Huawei 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
+static constexpr uint16_t STOPWATCH_ITEM_BG_HEIGHT = 44;\r
+static constexpr uint16_t STOPWATCH_ITEM_BG_OPA = 100;\r
+static constexpr uint16_t STOPWATCH_ITEM_NAME_LABEL_XPOS = 33;\r
+static constexpr uint16_t STOPWATCH_ITEM_RECORD_LABEL_XPOS = 154;\r
+static constexpr uint16_t STOPWATCH_ITEM_LABEL_YPOS = 12;\r
+static constexpr uint16_t STOPWATCH_ITEM_NAME_LABEL_WIDTH = 100;\r
+static constexpr uint16_t STOPWATCH_ITEM_RECORD_LABEL_WIDTH = 126;\r
+static constexpr uint16_t STOPWATCH_ITEM_LABEL_HEIGHT = 36;\r
+static constexpr uint16_t STOPWATCH_ITEM_FONT_SIZE = 32;\r
+static constexpr uint32_t STOPWATCH_ITEM_FONT_COLOR = 0xffff8530;\r
+\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
+    itemBg_.SetStyle(STYLE_BACKGROUND_OPA, STOPWATCH_ITEM_BG_OPA);\r
+    itemBg_.SetTouchable(false);\r
+\r
+    nameLabel_.SetPosition(STOPWATCH_ITEM_NAME_LABEL_XPOS, STOPWATCH_ITEM_LABEL_YPOS);\r
+    nameLabel_.Resize(STOPWATCH_ITEM_NAME_LABEL_WIDTH, STOPWATCH_ITEM_LABEL_HEIGHT);\r
+    nameLabel_.SetFont(DEFAULT_VECTOR_FONT_FILENAME, STOPWATCH_ITEM_FONT_SIZE);\r
+    nameLabel_.SetAlign(TEXT_ALIGNMENT_LEFT, TEXT_ALIGNMENT_CENTER);\r
+    nameLabel_.SetStyle(STYLE_TEXT_OPA, OPA_OPAQUE);\r
+    nameLabel_.SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+\r
+    recordLabel_.SetPosition(STOPWATCH_ITEM_RECORD_LABEL_XPOS, STOPWATCH_ITEM_LABEL_YPOS);\r
+    recordLabel_.Resize(STOPWATCH_ITEM_RECORD_LABEL_WIDTH, STOPWATCH_ITEM_LABEL_HEIGHT);\r
+    recordLabel_.SetFont(DEFAULT_VECTOR_FONT_FILENAME, STOPWATCH_ITEM_FONT_SIZE);\r
+    recordLabel_.SetAlign(TEXT_ALIGNMENT_RIGHT, TEXT_ALIGNMENT_CENTER);\r
+    recordLabel_.SetStyle(STYLE_TEXT_OPA, OPA_OPAQUE);\r
+    recordLabel_.SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+\r
+    Add(&itemBg_);\r
+    Add(&nameLabel_);\r
+    Add(&recordLabel_);\r
+}\r
+\r
+StopwatchItemView::~StopwatchItemView()\r
+{\r
+    Remove(&nameLabel_);\r
+    Remove(&recordLabel_);\r
+    Remove(&itemBg_);\r
+}\r
+\r
+void StopwatchItemView::SetItemInfo(int16_t index, const StopwatchItem &itemInfo)\r
+{\r
+    nameLabel_.SetText(("分段" + std::to_string(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
+        recordLabel_.SetStyle(STYLE_TEXT_COLOR, STOPWATCH_ITEM_FONT_COLOR);\r
+    } else {\r
+        nameLabel_.SetStyle(STYLE_TEXT_COLOR, Color::White().full);\r
+        recordLabel_.SetStyle(STYLE_TEXT_COLOR, Color::White().full);\r
+    }\r
+}\r
+}
\ No newline at end of file
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/stopwatch/src/StopwatchModel.cpp b/code/sdk/application/wearable/nativeapp/nativeui/stopwatch/src/StopwatchModel.cpp
new file mode 100644 (file)
index 0000000..d73b785
--- /dev/null
@@ -0,0 +1,120 @@
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: StopwatchModel\r
+ * Create: 2025-06-06\r
+ */\r
+#include <sys/time.h>\r
+#include "stopwatch/StopwatchModel.h"\r
+#include "wearable_log.h"\r
+\r
+namespace OHOS {\r
+static constexpr uint16_t UNIT_SEC_TO_MSEC = 1000;\r
+StopwatchModel::StopwatchModel()\r
+{\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "StopwatchModel::StopwatchModel");\r
+}\r
+\r
+StopwatchModel::~StopwatchModel()\r
+{\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "StopwatchModel::~StopwatchModel");\r
+}\r
+\r
+StopwatchModel &StopwatchModel::GetInstance()\r
+{\r
+    static StopwatchModel instance;\r
+    return instance;\r
+}\r
+\r
+void StopwatchModel::SetStartTime()\r
+{\r
+#ifdef _WIN32\r
+    gettimeofday(&startTime_, NULL);\r
+#else\r
+    gettimeofday64(&startTime_, NULL);\r
+#endif\r
+}\r
+\r
+void StopwatchModel::SaveElapsedTime()\r
+{\r
+    uiSavedElapsedTime_ += uiElapsedTime_;\r
+    uiElapsedTime_ = 0;\r
+}\r
+\r
+uint64_t StopwatchModel::GetElapsedTime()\r
+{\r
+    return uiSavedElapsedTime_ + uiElapsedTime_;\r
+}\r
+\r
+uint64_t StopwatchModel::UpdateElapsedTime()\r
+{\r
+#ifdef _WIN32\r
+    struct timeval currTime = {0};\r
+    gettimeofday(&currTime, NULL);\r
+#else\r
+    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
+}\r
+\r
+void StopwatchModel::ResetCounter()\r
+{\r
+    uiElapsedTime_ = 0;\r
+    uiSavedElapsedTime_ = 0;\r
+    records_.Clear();\r
+}\r
+\r
+bool StopwatchModel::GetActiveState()\r
+{\r
+    return bIsActive_;\r
+}\r
+\r
+void StopwatchModel::SetActiveState()\r
+{\r
+    bIsActive_ = true;\r
+}\r
+\r
+void StopwatchModel::SetInactiveState()\r
+{\r
+    bIsActive_ = false;\r
+}\r
+\r
+List<StopwatchItem> &StopwatchModel::GetRecordsList()\r
+{\r
+    return records_;\r
+}\r
+\r
+void StopwatchModel::AddRecordToList(const StopwatchItem &record)\r
+{\r
+    ListNode<StopwatchItem> *node = records_.Head();\r
+    while (node != records_.End()) {\r
+        StopwatchItem &itemData = node->data_;\r
+        itemData.isLatest = false;\r
+        node = node->next_;\r
+    }\r
+    records_.PushFront(record);\r
+}\r
+\r
+bool StopwatchModel::IsInRecordView()\r
+{\r
+    return bIsRecordView_;\r
+}\r
+\r
+void StopwatchModel::SetRecordViewState(bool state)\r
+{\r
+    bIsRecordView_ = state;\r
+}\r
+\r
+void StopwatchModel::ClearData()\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
+}\r
+}\r
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/stopwatch/src/StopwatchPage.cpp b/code/sdk/application/wearable/nativeapp/nativeui/stopwatch/src/StopwatchPage.cpp
new file mode 100644 (file)
index 0000000..0652df3
--- /dev/null
@@ -0,0 +1,588 @@
+/*\r
+ * Copyright (c) Huawei 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 "main/LoadImg.h"\r
+#ifdef BUILD_IN_LINUX\r
+#include "localtime.h"\r
+#endif\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 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_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
+static constexpr uint16_t STOPWATCH_LABEL_CURTIME_HEIGHT = 24;\r
+static constexpr uint16_t STOPWATCH_LABEL_CURTIME_FONT_SIZE = 24;\r
+static constexpr uint16_t STOPWATCH_LABEL_APPNAME_XPOS = 197;\r
+static constexpr uint16_t STOPWATCH_LABEL_APPNAME_YPOS = 82;\r
+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_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_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
+static constexpr uint16_t STOPWATCH_BUTTON_PAUSE_YPOS = 302;\r
+static constexpr uint16_t STOPWATCH_BUTTON_WIDTH = 96;\r
+static constexpr uint16_t STOPWATCH_BUTTON_HEIGHT = 96;\r
+static constexpr uint16_t STOPWATCH_LIST_RECORD_XPOS = 73;\r
+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
+\r
+REGIST_SLICE_PAGE(VIEW_STOPWATCH, STOPWATCH_PAGES::STOPWATCH_MAIN_PAGE, StopwatchPage, true);\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
+static uint64_t GetMilliSeconds(uint64_t uiElapsedTime)\r
+{\r
+    return (uiElapsedTime % (UNIT_SECS_PER_HOUR * UNIT_SEC_TO_MSEC)) % (UNIT_SECS_PER_MIN * UNIT_SEC_TO_MSEC);\r
+}\r
+\r
+static std::string FormatElapsedTime(uint64_t uiElapsedTime)\r
+{\r
+    std::string strElapsedTime;\r
+    std::string hours;\r
+    std::string minute;\r
+    std::string seconds;\r
+    std::string centisecs;\r
+    uint64_t hour = uiElapsedTime / (UNIT_SECS_PER_HOUR * UNIT_SEC_TO_MSEC);\r
+    uiElapsedTime %= (UNIT_SECS_PER_HOUR * UNIT_SEC_TO_MSEC);\r
+    uint64_t min = uiElapsedTime / (UNIT_SECS_PER_MIN * UNIT_SEC_TO_MSEC);\r
+    uiElapsedTime %= (UNIT_SECS_PER_MIN * UNIT_SEC_TO_MSEC);\r
+    uint64_t sec = uiElapsedTime / UNIT_SEC_TO_MSEC;\r
+    uiElapsedTime %= UNIT_SEC_TO_MSEC;\r
+    uint64_t csec = uiElapsedTime / NUM_TEN;\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
+    if (csec >= 0 && csec < NUM_TEN) {\r
+        centisecs = "0" + std::to_string(csec);\r
+    } else {\r
+        centisecs = std::to_string(csec);\r
+    }\r
+    strElapsedTime = minute + ":" + seconds + "." + centisecs;\r
+    return strElapsedTime;\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
+    std::string strElapsedTime = FormatElapsedTime(uiElapsedTime);\r
+    stopwatchPage->GetElapsedTimeLabel()->SetText(strElapsedTime.c_str());\r
+    if (uiElapsedTime >= UNIT_SECS_PER_HOUR * UNIT_SEC_TO_MSEC) {\r
+        stopwatchPage->Overflowing();\r
+    }\r
+}\r
+\r
+void StopwatchPage::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
+\r
+StopwatchPage::StopwatchPage()\r
+{\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "StopwatchPage::StopwatchPage");\r
+}\r
+\r
+StopwatchPage::~StopwatchPage()\r
+{\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "StopwatchPage::~StopwatchPage");\r
+    bool ret = ImageCacheManager::GetInstance().UnloadAllInMultiRes(PNG_APPLIST_STOPWATCH_IMAGE);\r
+    if (ret == false) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "UnloadStopwatchImage fail");\r
+    }\r
+    if (sweepClock_ != nullptr) {\r
+        sweepClock_->RemoveAll();\r
+        delete sweepClock_;\r
+        sweepClock_ = nullptr;\r
+    }\r
+    if (currentTime_ != nullptr) {\r
+        delete currentTime_;\r
+        currentTime_ = nullptr;\r
+    }\r
+    if (appName_ != nullptr) {\r
+        delete appName_;\r
+        appName_ = nullptr;\r
+    }\r
+    if (elapsedTime_ != nullptr) {\r
+        delete elapsedTime_;\r
+        elapsedTime_ = nullptr;\r
+    }\r
+    if (startButton_ != nullptr) {\r
+        delete startButton_;\r
+        startButton_ = nullptr;\r
+    }\r
+    if (resetButton_ != nullptr) {\r
+        delete resetButton_;\r
+        resetButton_ = nullptr;\r
+    }\r
+    if (recordsList_ != nullptr) {\r
+        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
+    }\r
+    if (imgScale_ != nullptr) {\r
+        delete imgScale_;\r
+        imgScale_ = 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 (animatorCallback_ != nullptr) {\r
+        delete animatorCallback_;\r
+        animatorCallback_ = 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
+}\r
+\r
+void StopwatchPage::OnStart(void *data)\r
+{\r
+    bool ret = ImageCacheManager::GetInstance().LoadAllInMultiRes(PNG_APPLIST_STOPWATCH_IMAGE);\r
+    if (ret == false) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "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
+        return;\r
+    }\r
+    sweepClock_->SetPosition(STOPWATCH_CONTAINER_XPOS, STOPWATCH_CONTAINER_YPOS);\r
+    sweepClock_->Resize(HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);\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
+    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
+    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
+    sweepClock_->SetHandLine(UISweepClock::HandType::HOUR_HAND,\r
+                             {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
+    sweepClock_->SetHandLine(UISweepClock::HandType::MINUTE_HAND,\r
+                             {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
+    sweepClock_->SetSweepTime24Hour(0, 0, millisecs);\r
+\r
+    backGround_ = new UIImageView();\r
+    if (backGround_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "backGroundFirst new fail");\r
+        return;\r
+    }\r
+    backGround_->SetPosition(0, 0);\r
+    LOADIMG::LoadImageViewImg(backGround_, PNG_APPLIST_STOPWATCH_IMAGE, IMAGE_STOPWATCH_STOPWATCH06);\r
+    sweepClock_->Add(backGround_);\r
+\r
+    imgScale_ = new UIImageView();\r
+    if (imgScale_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "backGroundFirst new fail");\r
+        return;\r
+    }\r
+    imgScale_->SetPosition(OFFSET, OFFSET);\r
+    LOADIMG::LoadImageViewImg(imgScale_, PNG_APPLIST_STOPWATCH_IMAGE, IMAGE_STOPWATCH_STOPWATCH04);\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
+        return;\r
+    }\r
+    currentTime_->SetPosition(STOPWATCH_LABEL_CURTIME_XPOS, STOPWATCH_LABEL_CURTIME_YPOS);\r
+    currentTime_->Resize(STOPWATCH_LABEL_CURTIME_WIDTH, STOPWATCH_LABEL_CURTIME_HEIGHT);\r
+    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
+        return;\r
+    }\r
+    appName_->SetPosition(STOPWATCH_LABEL_APPNAME_XPOS, STOPWATCH_LABEL_APPNAME_YPOS);\r
+    appName_->Resize(STOPWATCH_LABEL_APPNAME_WIDTH, STOPWATCH_LABEL_APPNAME_HEIGHT);\r
+    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_->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
+        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_->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
+        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_->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
+    startButton_->SetOnClickListener(this);\r
+    sweepClock_->Add(startButton_);\r
+\r
+    resetButton_ = new UILabelButton();\r
+    if (resetButton_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "StopwatchPage::SetupButton new UILabelButton resetButton_ 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_->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
+    if (recordsList_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "StopwatchPage::SetupRecordsList new UIList recordsList_ 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_->SetThrowDrag(true);\r
+    recordsList_->SetDraggable(true);\r
+    recordsList_->SetReboundSize(STOPWATCH_LABEL_REBOUND_SIZE);\r
+    recordsList_->EnableAutoAlign(true);\r
+    recordsList_->SetElastic(true);\r
+    recordsList_->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+    recordsList_->SetAdapter(listAdapter_);\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
+        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
+        return;\r
+    }\r
+\r
+    timeCallback_ = new TimeAnimatorCallback();\r
+    if (timeCallback_ == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "callBack new fail\n");\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
+        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
+    }\r
+    DrawContainRecordListView(state);\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
+        }\r
+    }\r
+    if (timeAnimator_ != nullptr) {\r
+        if (timeAnimator_->GetState() != Animator::STOP) {\r
+            timeAnimator_->Stop();\r
+        }\r
+    }\r
+}\r
+\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
+        }\r
+    }\r
+    if (timeAnimator_ != nullptr) {\r
+        if (timeAnimator_->GetState() == Animator::STOP) {\r
+            timeAnimator_->Start();\r
+        }\r
+    }\r
+}\r
+\r
+void StopwatchPage::DrawButtonStatusView(bool isActive)\r
+{\r
+    if (isActive) {\r
+        LOADIMG::LoadBtnImage(startButton_, PNG_APPLIST_STOPWATCH_IMAGE, IMAGE_STOPWATCH_STOPWATCH08,\r
+                              IMAGE_STOPWATCH_STOPWATCH08);\r
+        startButton_->Invalidate();\r
+\r
+        resetButton_->Enable();\r
+        LOADIMG::LoadBtnImage(resetButton_, PNG_APPLIST_STOPWATCH_IMAGE, IMAGE_STOPWATCH_STOPWATCH14,\r
+                              IMAGE_STOPWATCH_STOPWATCH14);\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
+        }\r
+        resetButton_->Invalidate();\r
+    } else {\r
+        LOADIMG::LoadBtnImage(startButton_, PNG_APPLIST_STOPWATCH_IMAGE, IMAGE_STOPWATCH_STOPWATCH12,\r
+                              IMAGE_STOPWATCH_STOPWATCH12);\r
+        startButton_->Invalidate();\r
+\r
+        resetButton_->Enable();\r
+        // 复位\r
+        LOADIMG::LoadBtnImage(resetButton_, PNG_APPLIST_STOPWATCH_IMAGE, IMAGE_STOPWATCH_STOPWATCH19,\r
+                              IMAGE_STOPWATCH_STOPWATCH19);\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
+        }\r
+        resetButton_->Invalidate();\r
+    }\r
+}\r
+\r
+void StopwatchPage::DrawContainRecordListView(bool isContainRecordList)\r
+{\r
+    if (isContainRecordList) {\r
+        appName_->SetVisible(false);\r
+        recordsList_->SetVisible(true);\r
+        elapsedTime_->SetPosition(STOPWATCH_LABEL_ELSTIME_XPOS, STOPWATCH_LABEL_ELSTIME_YPOS2);\r
+    } else {\r
+        appName_->SetVisible(true);\r
+        recordsList_->SetVisible(false);\r
+        elapsedTime_->SetPosition(STOPWATCH_LABEL_ELSTIME_XPOS, STOPWATCH_LABEL_ELSTIME_YPOS1);\r
+    }\r
+    RefreshRecordsList();\r
+}\r
+\r
+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_->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
+            DrawButtonStatusView(false);\r
+            animator_->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
+            }\r
+            DrawButtonStatusView(true);\r
+            StopwatchModel::GetInstance().SetStartTime();\r
+            animator_->Start();\r
+        }\r
+    } else if (strcmp(view.GetViewId(), STOPWATCH_RESET) == 0) {\r
+        if (isActive) {\r
+            StopwatchModel::GetInstance().SetRecordViewState(true);\r
+            uint64_t uiElapsedTime = StopwatchModel::GetInstance().GetElapsedTime();\r
+            std::string strElapsedTime = FormatElapsedTime(uiElapsedTime);\r
+            StopwatchItem item = {strElapsedTime, true};\r
+            StopwatchModel::GetInstance().AddRecordToList(item);\r
+            DrawContainRecordListView(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().ResetCounter();\r
+            elapsedTime_->SetText("00:00.00");\r
+            sweepClock_->SetInitTime24Hour(0, 0, 0);\r
+            sweepClock_->Invalidate();\r
+            DrawContainRecordListView(false);\r
+            DrawButtonStatusView(false);\r
+            WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "StopwatchPresenter::OnClick reset a record");\r
+        }\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
+    }\r
+    return true;\r
+}\r
+\r
+void StopwatchPage::Overflowing()\r
+{\r
+    animator_->Stop();\r
+    elapsedTime_->SetText("59:59.99");\r
+    sweepClock_->SetSweepTime24Hour(0, 0, 0);\r
+    sweepClock_->Invalidate();\r
+    StopwatchModel::GetInstance().SetInactiveState();\r
+    DrawButtonStatusView(false);\r
+    StopwatchModel::GetInstance().ResetCounter();\r
+    StopwatchModel::GetInstance().SetOverflowState(true);\r
+}\r
+}\r
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/stopwatch/src/StopwatchPresenter.cpp b/code/sdk/application/wearable/nativeapp/nativeui/stopwatch/src/StopwatchPresenter.cpp
new file mode 100644 (file)
index 0000000..90fcfe2
--- /dev/null
@@ -0,0 +1,14 @@
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: StopwatchPresenter\r
+ * Create: 2025-06-06\r
+ */\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
+}
\ No newline at end of file
index f56dc3a..45982b5 100644 (file)
@@ -8,7 +8,7 @@
 #include "UiConfig.h"\r
 #include <string>\r
 #include "font/ui_font.h"\r
-#include "TempClickMea.h"\r
+#include "temperature/TempClickMea.h"\r
 \r
 namespace OHOS {\r
 static TempClickMea *g_tempClickMea = nullptr;\r
index 25acea9..e8f599d 100644 (file)
@@ -7,7 +7,7 @@
 \r
 #include "UiConfig.h"\r
 #include <string>\r
-#include "TempContinueWarn.h"\r
+#include "temperature/TempContinueWarn.h"\r
 \r
 namespace OHOS {\r
 static TempContinueWarn *g_tempContinueWarn = nullptr;\r
index b2538b0..215e468 100644 (file)
@@ -9,7 +9,7 @@
 #include "layout/grid_layout.h"\r
 #include "font/ui_font.h"\r
 #include <string>\r
-#include "TempExitInter.h"\r
+#include "temperature/TempExitInter.h"\r
 \r
 namespace OHOS {\r
 static TempExitInter *g_tempExitInter = nullptr;\r
index 34359aa..d4155fc 100644 (file)
@@ -8,7 +8,7 @@
 #include "UiConfig.h"\r
 #include "layout/grid_layout.h"\r
 #include <string>\r
-#include "TempExitPrompt.h"\r
+#include "temperature/TempExitPrompt.h"\r
 \r
 namespace OHOS {\r
 static TempExitPrompt *g_tempExitPrompt = nullptr;\r
index dc00359..da8a03a 100644 (file)
@@ -7,7 +7,7 @@
 \r
 #include "UiConfig.h"\r
 #include <string>\r
-#include "TempInitInter.h"\r
+#include "temperature/TempInitInter.h"\r
 \r
 namespace OHOS {\r
 static TempInitInter *g_tempInitInter = nullptr;\r
index bf089b5..2215399 100644 (file)
@@ -8,7 +8,7 @@
 #include "UiConfig.h"\r
 #include "layout/grid_layout.h"\r
 #include <string>\r
-#include "TempJoinStudy.h"\r
+#include "temperature/TempJoinStudy.h"\r
 \r
 namespace OHOS {\r
 static TempJoinStudy *g_tempJoinStudy = nullptr;\r
index 8c6c018..5f4d4fa 100644 (file)
@@ -7,7 +7,7 @@
 \r
 #include "UiConfig.h"\r
 #include <string>\r
-#include "TempLittleTip.h"\r
+#include "temperature/TempLittleTip.h"\r
 \r
 namespace OHOS {\r
 static TempLittleTip *g_tempJoinStudy = nullptr;\r
index 5c533c7..10cbbae 100644 (file)
@@ -5,10 +5,10 @@
  * Create: 2022-02-15\r
  */\r
 \r
-#include "TempMainView.h"\r
+#include "temperature/TempMainView.h"\r
 #include "UiConfig.h"\r
-#include "TempMeaProcess.h"\r
-#include "TempWarn.h"\r
+#include "temperature/TempMeaProcess.h"\r
+#include "temperature/TempWarn.h"\r
 \r
 namespace OHOS {\r
 static TempMainView *g_tempMainView = nullptr;\r
index 76918d1..7a8fa1d 100644 (file)
@@ -7,8 +7,8 @@
 \r
 #include "UiConfig.h"\r
 #include <string>\r
-#include "TempMeaProcess.h"\r
-#include "TempMainView.h"\r
+#include "temperature/TempMeaProcess.h"\r
+#include "temperature/TempMainView.h"\r
 \r
 namespace OHOS {\r
 static TempMeaProcess *g_tempMeaProcess = nullptr;\r
index a3c01d9..2ea184b 100644 (file)
@@ -7,7 +7,7 @@
 \r
 #include "UiConfig.h"\r
 #include <string>\r
-#include "TempMeasure.h"\r
+#include "temperature/TempMeasure.h"\r
 \r
 namespace OHOS {\r
 static TempMeasure *g_tempMeasure = nullptr;\r
index b52c38c..2078ffd 100644 (file)
@@ -5,9 +5,9 @@
  * Create: 2022-02-15\r
  */\r
 \r
-#include "TempModel.h"\r
+#include "temperature/TempModel.h"\r
 #include "UiConfig.h"\r
-#include "TempModel.h"\r
+#include "temperature/TempModel.h"\r
 \r
 namespace OHOS {\r
 TempModel::TempModel()\r
index b1b9fc6..9b9a818 100644 (file)
@@ -5,11 +5,11 @@
  * Create: 2022-02-15\r
  */\r
 \r
-#include "TempPresenter.h"\r
-#include "TempMainView.h"\r
+#include "temperature/TempPresenter.h"\r
+#include "temperature/TempMainView.h"\r
 #include "ChangeSliceListener.h"\r
 #include "graphic_service.h"\r
-#include "ui_service.h"\r
+#include "uiservice/ui_service.h"\r
 #include "string"\r
 #include "iostream"\r
 #include "sstream"\r
@@ -45,7 +45,6 @@ TempPresenter *TempPresenter::GetInstance()
 \r
 void TempPresenter::OnResume(void) \r
 {\r
-    Presenter<TempMainView>::OnResume();\r
     SendMsgToUIService(UI_ADD_SLEEP_VETO, 0, nullptr, 0);\r
 }\r
 \r
index 47ec2b0..856e772 100644 (file)
@@ -7,7 +7,7 @@
 \r
 #include "UiConfig.h"\r
 #include <string>\r
-#include "TempPromptWear.h"\r
+#include "temperature/TempPromptWear.h"\r
 \r
 namespace OHOS {\r
 static TempPromptWear *g_tempPromptWear = nullptr;\r
index a6ffbf5..b44a828 100644 (file)
@@ -7,7 +7,7 @@
 \r
 #include "UiConfig.h"\r
 #include <string>\r
-#include "TempRemindWear.h"\r
+#include "temperature/TempRemindWear.h"\r
 \r
 namespace OHOS {\r
 static TempRemindWear *g_tempRemindWear = nullptr;\r
index 46cf911..2f7166d 100644 (file)
@@ -9,7 +9,7 @@
 #include "layout/grid_layout.h"\r
 #include "font/ui_font.h"\r
 #include <string>\r
-#include "TempReport.h"\r
+#include "temperature/TempReport.h"\r
 \r
 namespace OHOS {\r
 static TempReport *g_tempReport = nullptr;\r
index 8db30bd..b1fe71b 100644 (file)
@@ -7,7 +7,7 @@
 
 #include "UiConfig.h"
 #include <string>
-#include "TempStudyAbout.h"
+#include "temperature/TempStudyAbout.h"
 
 namespace OHOS {
 static TempStudyAbout *g_tempStudyAbout = nullptr;
index 8df8eb9..879fd41 100644 (file)
@@ -7,7 +7,7 @@
 \r
 #include "UiConfig.h"\r
 #include <string>\r
-#include "TempWarn.h"\r
+#include "temperature/TempWarn.h"\r
 \r
 namespace OHOS {\r
 static TempWarn *g_tempWarn = nullptr;\r
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/timers/src/TimerMainPage.cpp b/code/sdk/application/wearable/nativeapp/nativeui/timers/src/TimerMainPage.cpp
new file mode 100644 (file)
index 0000000..35f8c4b
--- /dev/null
@@ -0,0 +1,199 @@
+/*\r
+ * Copyright (c) Huawei 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
+\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
+static constexpr int16_t MAIN_TITLE_POSITION_X = 150;\r
+static constexpr int16_t MAIN_TITLE_POSITION_Y = 20;\r
+static constexpr int16_t MAIN_ADDBUTTON_POSITION_X = 111;\r
+static constexpr int16_t MAIN_ADDBUTTON_POSITION_Y = 347;\r
+static constexpr int16_t MAIN_ADDBUTTON_SIZE_WIDTH = 232;\r
+static constexpr int16_t MAIN_ADDBUTTON_SIZE_HEIGHT = 76;\r
+static constexpr int16_t SELECTMIN_POX = 86;\r
+static constexpr int16_t SELECTMIN_POXS = 252;\r
+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 uint8_t MIN = 60;\r
+\r
+REGIST_SLICE_PAGE(VIEW_TIMER, TIMER_PAGES::TIMER_MAIN_PAGE, TimerMainPage, true);\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
+    }\r
+\r
+    if (group != nullptr) {\r
+        group->RemoveAll();\r
+        delete group;\r
+        group = nullptr;\r
+    }\r
+\r
+    if (title != nullptr) {\r
+        delete title;\r
+        title = nullptr;\r
+    }\r
+\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
+        }\r
+    }\r
+\r
+    if (backround != nullptr) {\r
+        delete backround;\r
+        backround = nullptr;\r
+    }\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "TimerMainPage::~TimerMainPage()");\r
+}\r
+\r
+void TimerMainPage::OnStart(void* data)\r
+{\r
+    bool ret = ImageCacheManager::GetInstance().LoadAllInMultiRes(TIMER_IMAGE);\r
+    if (ret == false) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "LoadTimerImage 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
+    }\r
+    if (backround == nullptr) {\r
+        backround = new UIImageView();\r
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "TimerMainPage::OnStart new backround");\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
+    InitView();\r
+    LabelTitle();\r
+    group->SetOnDragListener(this);\r
+    group->SetVisible(false);\r
+    AddViewToPageContainer(group);\r
+    if (TimerModel::GetInstance().GetExistTimer()) {\r
+        // 定时器存在,进入计时页面\r
+        NativeAbility::GetInstance().SwitchSlice(VIEW_TIMER, TIMER_PAGES::TIMER_TIMING_PAGE);\r
+    } else {\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
+}\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
+        }\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
+    }\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
+        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
+        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
+    }\r
+    return true;\r
+}\r
+\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
+    }\r
+    return true;\r
+}\r
+}\r
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/timers/src/TimerModel.cpp b/code/sdk/application/wearable/nativeapp/nativeui/timers/src/TimerModel.cpp
new file mode 100644 (file)
index 0000000..83c3b84
--- /dev/null
@@ -0,0 +1,103 @@
+/*\r
+ * Copyright (c) Huawei 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
+\r
+namespace OHOS {\r
+static int g_motionTimes{0};\r
+static constexpr uint64_t MS_ONE_SECONDS = 1000;\r
+TimerModel::TimerModel()\r
+{\r
+}\r
+\r
+TimerModel::~TimerModel()\r
+{\r
+}\r
+\r
+TimerModel &TimerModel::GetInstance()\r
+{\r
+    static TimerModel instance;\r
+    return instance;\r
+}\r
+\r
+uint32_t TimerModel::GetSaveTime()\r
+{\r
+    return save_time;\r
+}\r
+\r
+void TimerModel::SetSaveTime(bool falg, uint32_t value)\r
+{\r
+    if (falg) {\r
+        save_time = 0;\r
+    } else {\r
+        save_time += value;\r
+    }\r
+}\r
+\r
+void TimerModel::SetDurationTime(uint32_t time)\r
+{\r
+    durationTime = time;\r
+}\r
+\r
+uint32_t TimerModel::GetDurationTime()\r
+{\r
+    return durationTime;\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
+    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
+        TimerModel::GetInstance().SetExistTimer(false);\r
+        TimerModel::GetInstance().DisableTimer();\r
+    }\r
+}\r
+\r
+/* 开启定时器 */\r
+void TimerModel::InitTimer()\r
+{\r
+    if (g_startCounting != nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "TimerModel::InitTimer g_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
+        return;\r
+    }\r
+    bool retTimer = g_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
+        }\r
+        return;\r
+    }\r
+}\r
+\r
+/* 关闭定时器 */\r
+void TimerModel::DisableTimer()\r
+{\r
+    if (g_startCounting != nullptr) {\r
+        delete g_startCounting;\r
+        g_startCounting = nullptr;\r
+        g_motionTimes = 0;\r
+    }\r
+}\r
+}
\ No newline at end of file
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/timers/src/TimerPresenter.cpp b/code/sdk/application/wearable/nativeapp/nativeui/timers/src/TimerPresenter.cpp
new file mode 100644 (file)
index 0000000..b739064
--- /dev/null
@@ -0,0 +1,15 @@
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: TimerPresenter\r
+ * Create: 2025-06-09\r
+ */\r
+\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
+}
\ No newline at end of file
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/timers/src/TimerSettingPage.cpp b/code/sdk/application/wearable/nativeapp/nativeui/timers/src/TimerSettingPage.cpp
new file mode 100644 (file)
index 0000000..0f01e93
--- /dev/null
@@ -0,0 +1,386 @@
+/*\r
+ * Copyright (c) Huawei 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
+\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
+static constexpr uint16_t SETTING_TITLE_POSITION_X = 100;\r
+static constexpr uint16_t SETTING_TITLE_POSITION_Y = 31;\r
+static constexpr uint16_t SETTING_TITLE_SIZE_WIDTH = 253;\r
+static constexpr uint16_t SETTING_TITLE_SIZE_HEIGHT = 53;\r
+static constexpr uint16_t SETTING_TITLE_TEXT_SIZE = 38;\r
+static constexpr uint16_t SETTING_TIMERLABEL_POSITION_X = 86;\r
+static constexpr uint16_t SETTING_TIMERLABEL_POSITION_Y = 88;\r
+static constexpr uint16_t SETTING_TIMERLABEL_SIZE_WIDTH = 48;\r
+static constexpr uint16_t SETTING_TIMERLABEL_SIZE_HEIGHT = 42;\r
+static constexpr uint16_t SETTING_TIMERLABEL_FONT = 18;\r
+static constexpr uint16_t SETTING_START_POSITION_X = 112;\r
+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 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_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 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
+\r
+REGIST_SLICE_PAGE(VIEW_TIMER, TIMER_PAGES::TIMER_SETTING_PAGE, TimerSettingPage, false);\r
+\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
+\r
+    if (title != nullptr) {\r
+        delete title;\r
+        title = nullptr;\r
+    }\r
+\r
+    if (back != nullptr) {\r
+        delete back;\r
+        back = 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
+        }\r
+    }\r
+\r
+    if (start != nullptr) {\r
+        delete start;\r
+        start = nullptr;\r
+    }\r
+\r
+    if (timerLabel != nullptr) {\r
+        delete timerLabel;\r
+        timerLabel = nullptr;\r
+    }\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
+        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
+    }\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
+        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
+    CreateLabel();\r
+    CreateStartButton();\r
+    CreatePicker();\r
+    group->Add(title);\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
+    }\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
+}\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
+    }\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
+}\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 posY = TIMERPICKER_POSY;\r
+    for (int i = 0; i < TIMERPICKER_MAX; i++) {\r
+        if (timerPicker[i] == nullptr) {\r
+            timerPicker[i] = new UIPicker();\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
+        if (i == 0) {\r
+            timerPicker[i]->SetValues(uiPicker5Data, SETTING_TIMERPICKER_HOUR);\r
+            timerPicker[i]->SetSelected(SETTING_TIMERPICKER_HOURS);\r
+        } else {\r
+            timerPicker[i]->SetValues(uiPickerData, SETTING_TIMERPICKER_MIN);\r
+            timerPicker[i]->SetSelected(SETTING_TIMERPICKER_MINS);\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
+    }\r
+\r
+    timerPicker[0]->SetViewId("hourPicker"); // Set style\r
+    timerPicker[1]->SetViewId("minPicker");  // Set style\r
+    timerPicker[SUM_2]->SetViewId("secPicker");  // Set style\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
+    }\r
+    timerLabel->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
+    }\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
+    }\r
+    return true;\r
+}\r
+\r
+void TimerSettingPage::OnPickerStoped(UIPicker& picker)\r
+{\r
+    if (picker.GetViewId() == "hourPicker") {\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
+        } else {\r
+            start->SetTouchable(true);\r
+            start->SetSrc(image2);\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
+        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
+        } else {\r
+            start->SetTouchable(true);\r
+            start->SetSrc(image2);\r
+        }\r
+        timerLabel->SetVisible(true);\r
+        timerLabel->SetPosition(POX2_MIN, SETTING_TIMERLABEL_POSITION_Y);\r
+        timerLabel->SetText("分钟");\r
+        timerLabel->Invalidate();\r
+    } else {\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
+        } else {\r
+            start->SetTouchable(true);\r
+            start->SetSrc(image2);\r
+        }\r
+        timerLabel->SetVisible(true);\r
+        timerLabel->SetPosition(POX3_MIN, SETTING_TIMERLABEL_POSITION_Y);\r
+        timerLabel->SetText("秒");\r
+        timerLabel->Invalidate();\r
+    }\r
+}\r
+}
\ No newline at end of file
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/timers/src/TimerTimingPage.cpp b/code/sdk/application/wearable/nativeapp/nativeui/timers/src/TimerTimingPage.cpp
new file mode 100644 (file)
index 0000000..f9da1e9
--- /dev/null
@@ -0,0 +1,548 @@
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: TimerTimingPage\r
+ * Create: 2025-06-09\r
+ */\r
+\r
+#include <cmath>\r
+#include <string>\r
+#include "timers/TimerTimingPage.h"\r
+#include "ui_test_group.h"\r
+#include "timers/TimerPresenter.h"\r
+#include "wearable_log.h"\r
+#include "timers/TimerView.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
+\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 = 199;\r
+static constexpr uint16_t TIMING_LABEL_CURTIME_YPOS = 54;\r
+static constexpr uint16_t TIMING_LABEL_CURTIME_WIDTH = 67;\r
+static constexpr uint16_t TIMING_LABEL_CURTIME_HEIGHT = 24;\r
+static constexpr uint16_t TIMING_LABEL_CURTIME_FONT_SIZE = 24;\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 MAX_SCR_DIS = 1000;\r
+static constexpr uint32_t HOUR_RANGE = 60000;\r
+static constexpr uint16_t TIMING_HAND_POSITION_XPOS = 224;\r
+static constexpr uint16_t TIMING_HAND_POSITION_YPOS = 4;\r
+static constexpr uint16_t TIMING_HAND_CENTER_XPOS = 3;\r
+static constexpr uint16_t TIMING_HAND_CENTER_YPOS = 223;\r
+static constexpr uint16_t TIMING_HAND_WIDTH = 2;\r
+static constexpr uint16_t TIMING_HAND_HEIGHT = 5;\r
+\r
+REGIST_SLICE_PAGE(VIEW_TIMER, TIMER_PAGES::TIMER_TIMING_PAGE, TimerTimingPage, false);\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
+TimerTimingPage::~TimerTimingPage()\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
+\r
+    if (sweepClock_ != nullptr) {\r
+        sweepClock_->RemoveAll();\r
+        delete sweepClock_;\r
+        sweepClock_ = nullptr;\r
+    }\r
+\r
+    if (dClock != nullptr) {\r
+        delete dClock;\r
+        dClock = nullptr;\r
+    }\r
+\r
+    if (title != nullptr) {\r
+        delete title;\r
+        title = nullptr;\r
+    }\r
+\r
+    if (timerTime != nullptr) {\r
+        delete timerTime;\r
+        timerTime = nullptr;\r
+    }\r
+\r
+    if (reset != nullptr) {\r
+        delete reset;\r
+        reset = nullptr;\r
+    }\r
+\r
+    if (start != nullptr) {\r
+        delete start;\r
+        start = 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 (timeCallback_ != nullptr) {\r
+        delete timeCallback_;\r
+        timeCallback_ = nullptr;\r
+    }\r
+\r
+    if (timeAnimator_ != nullptr) {\r
+        delete timeAnimator_;\r
+        timeAnimator_ = 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 (secondHand_ != nullptr) {\r
+        delete secondHand_;\r
+        secondHand_ = nullptr;\r
+    }\r
+\r
+    if (backround != nullptr) {\r
+        delete backround;\r
+        backround = nullptr;\r
+    }\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "TimerTimingPage::~TimerTimingPage");\r
+}\r
+\r
+void TimerTimingPage::OnStart(void *data)\r
+{\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "TimerTimingPage::OnStart() Start!");\r
+    bool ret = ImageCacheManager::GetInstance().LoadAllInMultiRes(TIMER_IMAGE);\r
+    if (ret == false) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "LoadTimerImage fail");\r
+        return;\r
+    }\r
+    if (group == nullptr) {\r
+        group = new UIScrollView();\r
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "TimerTimingPage::OnStart new group");\r
+    }\r
+    group->SetPosition(0, 0, VERTICAL_RESOLUTION, HORIZONTAL_RESOLUTION);\r
+    group->SetThrowDrag(true);\r
+\r
+    if (backround == nullptr) {\r
+        backround = new UIImageView();\r
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "TimerTimingPage::OnStart new backround");\r
+    }\r
+    ImageInfo *image =\r
+        ImageCacheManager::GetInstance().LoadOneInMultiRes(IMAGE_CONVERTER_TOOL_TIMER_BG, TIMER_IMAGE);\r
+    if (image == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "TimerTimingPage::OnStart backround source fail");\r
+        return;\r
+    }\r
+    backround->SetSrc(image);\r
+    backround->SetPosition(0, 0, VERTICAL_RESOLUTION, HORIZONTAL_RESOLUTION);\r
+\r
+    if (sweepClock_ == nullptr) {\r
+        sweepClock_ = new UISweepClock();\r
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "TimerTimingPage::OnStart new sweepClock_");\r
+    }\r
+    sweepClock_->SetPosition(0, 0);\r
+    sweepClock_->Resize(HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);\r
+    sweepClock_->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+\r
+    if (secondHand_ == nullptr) {\r
+        secondHand_ = new Image();\r
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "TimerTimingPage::OnStart new secondHand_");\r
+    }\r
+    ImageInfo *second =\r
+        ImageCacheManager::GetInstance().LoadOneInMultiRes(IMAGE_CONVERTER_TOOL_TIMER_POINTER, TIMER_IMAGE);\r
+    if (second == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "TimerTimingPage::OnStart second source fail");\r
+        return;\r
+    }\r
+    secondHand_->SetSrc(second);\r
+    sweepClock_->SetHandImage(UISweepClock::HandType::SECOND_HAND, *secondHand_,\r
+        {TIMING_HAND_POSITION_XPOS, TIMING_HAND_POSITION_YPOS}, {TIMING_HAND_CENTER_XPOS, TIMING_HAND_CENTER_YPOS});\r
+    sweepClock_->SetHandLine(UISweepClock::HandType::HOUR_HAND, {TIMING_HAND_POSITION_XPOS, TIMING_HAND_POSITION_YPOS},\r
+        {TIMING_HAND_CENTER_XPOS, TIMING_HAND_CENTER_YPOS}, Color::White(), TIMING_HAND_WIDTH, TIMING_HAND_HEIGHT,\r
+        OPA_TRANSPARENT);\r
+    sweepClock_->SetHandLine(UISweepClock::HandType::MINUTE_HAND,\r
+        {TIMING_HAND_POSITION_XPOS, TIMING_HAND_POSITION_YPOS}, {TIMING_HAND_CENTER_XPOS, TIMING_HAND_CENTER_YPOS},\r
+        Color::White(), TIMING_HAND_WIDTH, TIMING_HAND_HEIGHT, OPA_TRANSPARENT);\r
+\r
+    // 标题\r
+    if (title == nullptr) {\r
+        title = new UILabel();\r
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "TimerTimingPage::OnStart new title");\r
+    }\r
+    title->SetPosition(TIMING_TITLE_POSITION_X, TIMING_TITLE_POSITION_Y);\r
+    title->Resize(TIMING_TITLE_SIZE_WIDTH, TIMING_TITLE_SIZE_HEIGHT);\r
+    title->SetText("计时器");\r
+    title->SetFont(DEFAULT_VECTOR_FONT_FILENAME, TIMING_TITLE_FONT);\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
+\r
+    if (currentTime_ == nullptr) {\r
+        currentTime_ = new UILabel();\r
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "TimerTimingPage::OnStart new currentTime_");\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(DEFAULT_VECTOR_FONT_FILENAME, TIMING_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
+\r
+    group->Add(backround);\r
+    CircleProgress();\r
+    group->Add(sweepClock_);\r
+    CreateButton();\r
+    CreateTimerTime();\r
+    group->Add(title);\r
+    group->Add(currentTime_);\r
+    group->SetOnDragListener(this);\r
+    AddViewToPageContainer(group);\r
+\r
+    if (timeCallback_ == nullptr) {\r
+        timeCallback_ = new TimeAnimatorCallback();\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "TimerTimingPage::OnStart new timeCallback_");\r
+    }\r
+\r
+    if (timeAnimator_ == nullptr) {\r
+        timeAnimator_ = new Animator(timeCallback_, currentTime_, 0, true);\r
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "TimerTimingPage::OnStart new Animator timeAnimator_");\r
+    }\r
+    timeAnimator_->Start();\r
+}\r
+\r
+void TimerTimingPage::OnResume()\r
+{\r
+    if (TimerModel::GetInstance().GetExistTimer()) {\r
+        SetAnimatorStatus(true);\r
+        TimerModel::GetInstance().SetExistTimer(false);\r
+    }\r
+    if (timeAnimator_ != nullptr) {\r
+        if (timeAnimator_->GetState() == Animator::STOP) {\r
+            timeAnimator_->Start();\r
+        }\r
+    }\r
+    if (!start->IsTouchable()) {\r
+        LOADIMG::LoadImageViewImg(start, TIMER_IMAGE, IMAGE_CONVERTER_TOOL_TIMER_PAUSE);\r
+    }\r
+}\r
+\r
+void TimerTimingPage::OnPause()\r
+{\r
+    if (TimerModel::GetInstance().GetIsTiming()) {\r
+        TimerModel::GetInstance().SetExistTimer(true);\r
+    }\r
+    if (timeAnimator_ != nullptr) {\r
+        if (timeAnimator_->GetState() != Animator::STOP) {\r
+            timeAnimator_->Stop();\r
+        }\r
+    }\r
+    SetAnimatorStatus(false);\r
+}\r
+\r
+void TimerTimingPage::CreateButton()\r
+{\r
+    ImageInfo *image1 = ImageCacheManager::GetInstance().LoadOneInMultiRes(\r
+        IMAGE_CONVERTER_TOOL_TIMER_PLAY, TIMER_IMAGE);\r
+    ImageInfo *image = ImageCacheManager::GetInstance().LoadOneInMultiRes(\r
+        IMAGE_CONVERTER_TOOL_TIMER_EXIT, TIMER_IMAGE);\r
+    // 开始/暂停按钮\r
+    if (start == nullptr) {\r
+        start = new UIImageView();\r
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "TimerTimingPage::CreateButton new start");\r
+    }\r
+    start->SetPosition(TIMING_START_IMAGE_XPOS, TIMING_START_IMAGE_YPOS);\r
+    start->Resize(TIMING_START_IMAGE_SIZE, TIMING_START_IMAGE_SIZE);\r
+    start->SetViewId(START_PAUSE);\r
+    start->SetTouchable(true);\r
+    start->SetOnClickListener(this);\r
+    start->SetSrc(image1);\r
+    group->Add(start);\r
+\r
+    // 复位按钮\r
+    ImageInfo *image2 = ImageCacheManager::GetInstance().LoadOneInMultiRes(\r
+        IMAGE_CONVERTER_TOOL_TIMER_EXIT, TIMER_IMAGE);\r
+    if (reset == nullptr) {\r
+        reset = new UIImageView();\r
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "TimerTimingPage::CreateButton new reset");\r
+    }\r
+    reset->SetPosition(TIMING_RESET_IMAGE_XPOS, TIMING_RESET_IMAGE_YPOS);\r
+    reset->Resize(TIMING_RESET_IMAGE_SIZE, TIMING_RESET_IMAGE_SIZE);\r
+    reset->SetViewId(RESET);\r
+    reset->SetTouchable(true);\r
+    reset->SetOnClickListener(this);\r
+    reset->SetSrc(image2);\r
+    group->Add(reset);\r
+}\r
+\r
+void TimerTimingPage::CreateTimerTime()\r
+{\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "TimerTimingPage::CreateTimerTime() Start!");\r
+    if (timerTime == nullptr) {\r
+        timerTime = new UIDigitalClock();\r
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "TimerTimingPage::CreateTimerTime()  new timerTime!");\r
+    }\r
+    timerTime->SetPosition(TIMING_TIMER_TIME_XPOS, TIMING_TIMER_TIME_YPOS);\r
+    timerTime->Resize(TIMING_TIMER_TIME_WIDTH, TIMING_TIMER_TIME_HEIGHT);\r
+    timerTime->SetFont(DEFAULT_VECTOR_FONT_FILENAME, TIMING_TIMER_TIME_FONT_SIZE);\r
+    timerTime->SetDisplayMode(UIDigitalClock::DISPLAY_24_HOUR);\r
+    timerTime->SetStyle(STYLE_BACKGROUND_COLOR, Color::Blue().full);\r
+    uint32_t durationTime = TimerModel::GetInstance().GetDurationTime();\r
+    uint8_t hour = durationTime / HOUR_TIME;\r
+    uint8_t minute = durationTime % HOUR_TIME / MIN_TIME;\r
+    uint8_t second = durationTime % MIN_TIME;\r
+    timerTime->SetTime24Hour(hour, minute, second);\r
+    group->Add(timerTime);\r
+}\r
+\r
+void TimerTimingPage::CircleProgress()\r
+{\r
+    // 动态计时圈\r
+    if (circleProgress == nullptr) {\r
+        circleProgress = new UICircleProgress();\r
+    }\r
+    circleProgress->SetPosition(0, 0); // widget's left position and top position\r
+    circleProgress->Resize(RESOLUTION_WIDTH, RESOLUTION_HEIGHT);  // widget's width and height\r
+    ImageInfo *image = ImageCacheManager::GetInstance().LoadOneInMultiRes(\r
+        IMAGE_CONVERTER_TOOL_BG_CIR, TIMER_IMAGE);\r
+    ImageInfo *image1 = ImageCacheManager::GetInstance().LoadOneInMultiRes(\r
+        IMAGE_CONVERTER_TOOL_TIMER_PBG, TIMER_IMAGE);\r
+    circleProgress->SetImage(image1, image);\r
+    circleProgress->EnableBackground(true);\r
+    circleProgress->SetBackgroundStyle(STYLE_LINE_WIDTH, TIMING_CIRCLE_LINE_WIDTH);\r
+    circleProgress->SetForegroundStyle(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
+    // Add to rootView\r
+    SetupAnimator();\r
+    group->Add(circleProgress);\r
+}\r
+\r
+// 单位为毫秒计算\r
+void TimerTimingPage::SetTimerTime(uint32_t onTime)\r
+{\r
+    uint64_t time = onTime / MAX_SCR_DIS;\r
+    uint8_t hour = time / HOUR_TIME;\r
+    uint8_t minute = time % HOUR_TIME / MIN_TIME;\r
+    uint8_t second = time % MIN_TIME;\r
+    timerTime->SetTime24Hour(hour, minute, second);\r
+    uint32_t totalTime = TimerModel::GetInstance().GetDurationTime();\r
+    double percentage = static_cast<double>(onTime) / (totalTime * MAX_SCR_DIS);\r
+    double value = round(percentage * TIMING_CIRCLE_RANGE);\r
+    circleProgress->SetValue(value);\r
+    sweepClock_->SetSweepTime24Hour(0, 0, percentage * HOUR_RANGE);\r
+\r
+    if (onTime <= 0) {\r
+        ImageInfo *image = ImageCacheManager::GetInstance().LoadOneInMultiRes(\r
+            IMAGE_CONVERTER_TOOL_TIMER_PAUSE, TIMER_IMAGE);\r
+        ImageInfo *image1 = ImageCacheManager::GetInstance().LoadOneInMultiRes(\r
+            IMAGE_CONVERTER_TOOL_TIMER_EXIT, TIMER_IMAGE);\r
+        start->SetSrc(image);\r
+        start->SetTouchable(false);\r
+        reset->SetSrc(image1);\r
+        TimerModel::GetInstance().SetIsPause(false);\r
+        TimerModel::GetInstance().SetIsTiming(false);\r
+        start->Invalidate();\r
+        reset->Invalidate();\r
+    }\r
+    circleProgress->Invalidate();\r
+    timerTime->Invalidate();\r
+}\r
+\r
+void TimerTimingPage::SetupAnimator()\r
+{\r
+    callBack_ = new TimerTimingCallback(this);\r
+    animator_ = new Animator(callBack_, nullptr, 0, true);\r
+}\r
+\r
+void TimerTimingPage::TimerTimingCallback::Callback(UIView *view)\r
+{\r
+    (void)view;\r
+    static int count = 0;\r
+    struct timeval current_time;\r
+    gettimeofday(&current_time, nullptr);\r
+\r
+    uint32_t overTime = TimerModel::GetInstance().GetDurationTime();\r
+    uint32_t s_time = TimerModel::GetInstance().GetStartTime();\r
+    uint32_t saveTime = TimerModel::GetInstance().GetSaveTime();\r
+    uint64_t c_time = current_time.tv_sec * MAX_SCR_DIS + current_time.tv_usec / MAX_SCR_DIS;\r
+    int32_t remTime = overTime * MAX_SCR_DIS - (c_time - s_time) - saveTime;\r
+\r
+    page_->SetTimerTime(remTime);\r
+    if (remTime <= 0) {\r
+        page_->animator_->Stop();\r
+        page_->SetTimerTime(0);\r
+        // 调用pwm接口实现马达震动,客户自实现\r
+    }\r
+}\r
+\r
+void TimerTimingPage::SetAnimatorStatus(bool status)\r
+{\r
+    ImageInfo *image = ImageCacheManager::GetInstance().LoadOneInMultiRes(\r
+        IMAGE_CONVERTER_TOOL_TIMER_PAUSE_ORANGE, TIMER_IMAGE);\r
+    ImageInfo *image1 = ImageCacheManager::GetInstance().LoadOneInMultiRes(\r
+        IMAGE_CONVERTER_TOOL_TIMER_PLAY, TIMER_IMAGE);\r
+    ImageInfo *image2 = ImageCacheManager::GetInstance().LoadOneInMultiRes(\r
+        IMAGE_CONVERTER_TOOL_TIMER_RESTART, TIMER_IMAGE);\r
+    if (status) {\r
+        start->SetSrc(image);\r
+        reset->SetSrc(image2);\r
+        animator_->Start();\r
+        TimerModel::GetInstance().InitTimer();\r
+    } else {\r
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "TimerTimingPage::SetAnimatorStatus status == false");\r
+        animator_->Stop();\r
+        start->SetSrc(image1);\r
+        TimerModel::GetInstance().DisableTimer();\r
+    }\r
+}\r
+\r
+bool TimerTimingPage::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
+        if (TimerModel::GetInstance().GetIsTiming()) {\r
+            NativeAbility::GetInstance().ChangeSlice(VIEW_APPLIST);\r
+            WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "TimerTimingPage::OnDrag ChangeSlice(VIEW_APPLIST)");\r
+        } else {\r
+            NativeAbility::GetInstance().SwitchSlice(VIEW_TIMER, TIMER_PAGES::TIMER_MAIN_PAGE);\r
+        }\r
+    }\r
+    return true;\r
+}\r
+\r
+bool TimerTimingPage::OnClick(UIView &view, const ClickEvent &event)\r
+{\r
+    UNUSED(event);\r
+    std::string viewId = view.GetViewId();\r
+    if (viewId == RESET) {\r
+        if (TimerModel::GetInstance().GetIsTiming()) {\r
+            // 停止计时器 修改复位图标 重新将时间复原\r
+            SetAnimatorStatus(false);\r
+            TimerModel::GetInstance().SetIsTiming(false);\r
+            uint32_t durationTime = TimerModel::GetInstance().GetDurationTime();\r
+            uint8_t hour = durationTime / HOUR_TIME;\r
+            uint8_t minute = durationTime % HOUR_TIME / MIN_TIME;\r
+            uint8_t second = durationTime % MIN_TIME;\r
+            timerTime->SetTime24Hour(hour, minute, second);\r
+            TimerModel::GetInstance().SetSaveTime(true, 0);\r
+            ImageInfo *image = ImageCacheManager::GetInstance().LoadOneInMultiRes(\r
+                IMAGE_CONVERTER_TOOL_TIMER_EXIT, TIMER_IMAGE);\r
+            reset->SetSrc(image);\r
+            circleProgress->SetValue(TIMING_CIRCLE_RANGE);\r
+            sweepClock_->SetSweepTime24Hour(0, 0, 0);\r
+        } else if (! TimerModel::GetInstance().GetIsTiming() && TimerModel::GetInstance().GetIsPause()) {\r
+            TimerModel::GetInstance().SetIsTiming(false);\r
+            uint32_t durationTime = TimerModel::GetInstance().GetDurationTime();\r
+            uint8_t hour = durationTime / HOUR_TIME;\r
+            uint8_t minute = durationTime % HOUR_TIME / MIN_TIME;\r
+            uint8_t second = durationTime % MIN_TIME;\r
+            timerTime->SetTime24Hour(hour, minute, second);\r
+            TimerModel::GetInstance().SetSaveTime(true, 0);\r
+            ImageInfo *image = ImageCacheManager::GetInstance().LoadOneInMultiRes(\r
+                IMAGE_CONVERTER_TOOL_TIMER_EXIT, TIMER_IMAGE);\r
+            reset->SetSrc(image);\r
+            circleProgress->SetValue(TIMING_CIRCLE_RANGE);\r
+            sweepClock_->SetSweepTime24Hour(0, 0, 0);\r
+            TimerModel::GetInstance().SetIsPause(false);\r
+        } else {\r
+            NativeAbility::GetInstance().SwitchSlice(VIEW_TIMER, TIMER_PAGES::TIMER_MAIN_PAGE);\r
+        }\r
+    } else if (viewId == START_PAUSE) {\r
+        if (TimerModel::GetInstance().GetIsTiming()) {\r
+            SetAnimatorStatus(false);\r
+            TimerModel::GetInstance().SetIsTiming(false);\r
+            struct timeval current_time;\r
+            gettimeofday(&current_time, nullptr);\r
+            uint32_t time = (current_time.tv_sec * MAX_SCR_DIS + current_time.tv_usec / MAX_SCR_DIS) -\r
+                TimerModel::GetInstance().GetStartTime();\r
+            TimerModel::GetInstance().SetSaveTime(false, time);\r
+            TimerModel::GetInstance().SetIsPause(true);\r
+        } else {\r
+            SetAnimatorStatus(true);\r
+            TimerModel::GetInstance().SetIsTiming(true);\r
+            struct timeval current_time;\r
+            gettimeofday(&current_time, nullptr);\r
+            uint32_t s_time = current_time.tv_sec * MAX_SCR_DIS + current_time.tv_usec / MAX_SCR_DIS; // 转换成ms\r
+            TimerModel::GetInstance().SetStartTime(s_time);\r
+            TimerModel::GetInstance().SetIsPause(false);\r
+        }\r
+    } else {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "TimerTimingPage::OnClick");\r
+        return false;\r
+    }\r
+    return true;\r
+}\r
+\r
+void TimerTimingPage::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
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/training/src/DataView.cpp b/code/sdk/application/wearable/nativeapp/nativeui/training/src/DataView.cpp
new file mode 100644 (file)
index 0000000..0abd0f6
--- /dev/null
@@ -0,0 +1,363 @@
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: Data View\r
+ * Create: 2025-03-22\r
+ */\r
+#include "training/DataView.h"\r
+#include "wearable_log.h"\r
+#include "UiConfig.h"\r
+#include "training/TrainingPresenter.h"\r
+\r
+namespace OHOS {\r
+static constexpr uint16_t TOP_VALUE_LABEL_FONT = 80;\r
+static constexpr uint16_t VALUE_LABEL_FONT = 60;\r
+static constexpr uint16_t UNIT_LABEL_FONT = 30;\r
+static constexpr uint16_t TOP_VALUE_LABEL_X = 164;\r
+static constexpr uint16_t TOP_VALUE_LABEL_Y = 45;\r
+static constexpr uint16_t TOP_VALUE_LABEL_W = 200;\r
+static constexpr uint16_t TOP_VALUE_LABEL_H = 60;\r
+static constexpr uint16_t TOP_UNIT_LABEL_X = 184;\r
+static constexpr uint16_t TOP_UNIT_LABEL_Y = 135;\r
+static constexpr uint16_t TOP_UNIT_LABEL_W = 200;\r
+static constexpr uint16_t TOP_UNIT_LABEL_H = 60;\r
+static constexpr uint16_t LEFT_VALUE_LABEL_X = 52;\r
+static constexpr uint16_t LEFT_VALUE_LABEL_Y = 176;\r
+static constexpr uint16_t LEFT_VALUE_LABEL_W = 200;\r
+static constexpr uint16_t LEFT_VALUE_LABEL_H = 60;\r
+static constexpr uint16_t LEFT_UNIT_LABEL_X = 71;\r
+static constexpr uint16_t LEFT_UNIT_LABEL_Y = 247;\r
+static constexpr uint16_t LEFT_UNIT_LABEL_W = 200;\r
+static constexpr uint16_t LEFT_UNIT_LABEL_H = 60;\r
+static constexpr uint16_t RIGHT_VALUE_LABEL_X = 310;\r
+static constexpr uint16_t RIGHT_VALUE_LABEL_Y = 181;\r
+static constexpr uint16_t RIGHT_VALUE_LABEL_W = 200;\r
+static constexpr uint16_t RIGHT_VALUE_LABEL_H = 60;\r
+static constexpr uint16_t RIGHT_UNIT_LABEL_X = 323;\r
+static constexpr uint16_t RIGHT_UNIT_LABEL_Y = 253;\r
+static constexpr uint16_t RIGHT_UNIT_LABEL_W = 200;\r
+static constexpr uint16_t RIGHT_UNIT_LABEL_H = 60;\r
+static constexpr uint16_t BOTTOM_VALUE_LABEL_X = 113;\r
+static constexpr uint16_t BOTTOM_VALUE_LABEL_Y = 297;\r
+static constexpr uint16_t BOTTOM_VALUE_LABEL_W = 200;\r
+static constexpr uint16_t BOTTOM_VALUE_LABEL_H = 60;\r
+static constexpr uint16_t BOTTOM_UNIT_LABEL_X = 217;\r
+static constexpr uint16_t BOTTOM_UNIT_LABEL_Y = 374;\r
+static constexpr uint16_t BOTTOM_UNIT_LABEL_W = 200;\r
+static constexpr uint16_t BOTTOM_UNIT_LABEL_H = 60;\r
+static constexpr uint16_t SEP_LINE_X = 234;\r
+static constexpr uint16_t SEP_LINE_Y = 181;\r
+static constexpr uint16_t SEP_LINE_W = 4;\r
+static constexpr uint16_t SEP_LINE_H = 85;\r
+\r
+static DataView *g_pDataView{nullptr};\r
+\r
+DataView::DataView()\r
+{\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "DataView::DataView");\r
+    g_pDataView = this;\r
+}\r
+\r
+DataView::~DataView()\r
+{\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "DataView::~DataView");\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 (heartrate != nullptr) {\r
+        delete heartrate;\r
+        heartrate = nullptr;\r
+    }\r
+    if (sepLine != nullptr) {\r
+        delete sepLine;\r
+        sepLine = 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
+    g_pDataView = nullptr;\r
+}\r
+\r
+DataView *DataView::GetInstance()\r
+{\r
+    return g_pDataView;\r
+}\r
+\r
+void DataView::ShowupBackgroup()\r
+{\r
+    backGround = new UIImageView();\r
+    if (backGround == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "backGroundFirst new fail");\r
+        return;\r
+    }\r
+    backGround->SetPosition(0, 0);\r
+    backGround->SetSrc(PNG_WALK_BACK_GROUND);\r
+    group->Add(backGround);\r
+}\r
+\r
+void DataView::ShowupTopView()\r
+{\r
+    // Add Label to App\r
+    if (topValueLabel == nullptr) {\r
+        topValueLabel = new UILabel();\r
+    }\r
+    topValueLabel->SetPosition(TOP_VALUE_LABEL_X, TOP_VALUE_LABEL_Y);\r
+    topValueLabel->Resize(TOP_VALUE_LABEL_W, TOP_VALUE_LABEL_H);\r
+\r
+    // Set additional property\r
+    topValueLabel->SetLineBreakMode(UILabel::LINE_BREAK_ADAPT);\r
+    topValueLabel->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+    topValueLabel->SetFont(DEFAULT_VECTOR_FONT_FILENAME, VALUE_LABEL_FONT);\r
+\r
+    // Add to rootView\r
+    group->Add(topValueLabel);\r
+\r
+    // Add Label to App\r
+    if (topUnitLabel == nullptr) {\r
+        topUnitLabel = new UILabel();\r
+    }\r
+    topUnitLabel->SetPosition(TOP_UNIT_LABEL_X, TOP_UNIT_LABEL_Y);\r
+    topUnitLabel->Resize(TOP_UNIT_LABEL_W, TOP_UNIT_LABEL_H);\r
+\r
+    // Set additional property\r
+    topUnitLabel->SetLineBreakMode(UILabel::LINE_BREAK_ADAPT);\r
+    topUnitLabel->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+    topUnitLabel->SetFont(DEFAULT_VECTOR_FONT_FILENAME, UNIT_LABEL_FONT);\r
+\r
+    // Add to rootView\r
+    group->Add(topUnitLabel);\r
+}\r
+\r
+void DataView::ShowupLeftView()\r
+{\r
+    // Add Label to App\r
+    if (leftValueLabel == nullptr) {\r
+        leftValueLabel = new UILabel();\r
+    }\r
+    leftValueLabel->SetPosition(LEFT_VALUE_LABEL_X, LEFT_VALUE_LABEL_Y);\r
+    leftValueLabel->Resize(LEFT_VALUE_LABEL_W, LEFT_VALUE_LABEL_H);\r
+\r
+    // Set additional property\r
+    leftValueLabel->SetLineBreakMode(UILabel::LINE_BREAK_ADAPT);\r
+    leftValueLabel->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+    leftValueLabel->SetFont(DEFAULT_VECTOR_FONT_FILENAME, VALUE_LABEL_FONT);\r
+\r
+    // Add to rootView\r
+    group->Add(leftValueLabel);\r
+\r
+    // Add Label to App\r
+    if (leftUnitLabel == nullptr) {\r
+        leftUnitLabel = new UILabel();\r
+    }\r
+    leftUnitLabel->SetPosition(LEFT_UNIT_LABEL_X, LEFT_UNIT_LABEL_Y);\r
+    leftUnitLabel->Resize(LEFT_UNIT_LABEL_W, LEFT_UNIT_LABEL_H);\r
+\r
+    // Set additional property\r
+    leftUnitLabel->SetLineBreakMode(UILabel::LINE_BREAK_ADAPT);\r
+    leftUnitLabel->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+    leftUnitLabel->SetFont(DEFAULT_VECTOR_FONT_FILENAME, UNIT_LABEL_FONT);\r
+\r
+    // Add to rootView\r
+    group->Add(leftUnitLabel);\r
+}\r
+\r
+void DataView::ShowupRightView()\r
+{\r
+    // Add Label to App\r
+    if (rightValueLabel == nullptr) {\r
+        rightValueLabel = new UILabel();\r
+    }\r
+    rightValueLabel->SetPosition(RIGHT_VALUE_LABEL_X, RIGHT_VALUE_LABEL_Y);\r
+    rightValueLabel->Resize(RIGHT_VALUE_LABEL_W, RIGHT_VALUE_LABEL_H);\r
+\r
+    // Set additional property\r
+    rightValueLabel->SetLineBreakMode(UILabel::LINE_BREAK_ADAPT);\r
+    rightValueLabel->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+    rightValueLabel->SetFont(DEFAULT_VECTOR_FONT_FILENAME, VALUE_LABEL_FONT);\r
+\r
+    // Add to rootView\r
+    group->Add(rightValueLabel);\r
+\r
+    // Add Label to App\r
+    if (rightUnitLabel == nullptr) {\r
+        rightUnitLabel = new UILabel();\r
+    }\r
+    rightUnitLabel->SetPosition(RIGHT_UNIT_LABEL_X, RIGHT_UNIT_LABEL_Y);\r
+    rightUnitLabel->Resize(RIGHT_UNIT_LABEL_W, RIGHT_UNIT_LABEL_H);\r
+\r
+    // Set additional property\r
+    rightUnitLabel->SetLineBreakMode(UILabel::LINE_BREAK_ADAPT);\r
+    rightUnitLabel->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+    rightUnitLabel->SetFont(DEFAULT_VECTOR_FONT_FILENAME, UNIT_LABEL_FONT);\r
+\r
+    // Add to rootView\r
+    group->Add(rightUnitLabel);\r
+}\r
+\r
+void DataView::ShowupBottomView()\r
+{\r
+    // Add Label to App\r
+    if (bottomValueLabel == nullptr) {\r
+        bottomValueLabel = new UILabel();\r
+    }\r
+    bottomValueLabel->SetPosition(BOTTOM_VALUE_LABEL_X, BOTTOM_VALUE_LABEL_Y);\r
+    bottomValueLabel->Resize(BOTTOM_VALUE_LABEL_W, BOTTOM_VALUE_LABEL_H);\r
+\r
+    // Set additional property\r
+    bottomValueLabel->SetText("00:12:15");\r
+    bottomValueLabel->SetLineBreakMode(UILabel::LINE_BREAK_ADAPT);\r
+    bottomValueLabel->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+    bottomValueLabel->SetFont(DEFAULT_VECTOR_FONT_FILENAME, VALUE_LABEL_FONT);\r
+\r
+    // Add to rootView\r
+    group->Add(bottomValueLabel);\r
+\r
+    // Add Label to App\r
+    if (bottomUnitLabel == nullptr) {\r
+        bottomUnitLabel = new UILabel();\r
+    }\r
+    bottomUnitLabel->SetPosition(BOTTOM_UNIT_LABEL_X, BOTTOM_UNIT_LABEL_Y);\r
+    bottomUnitLabel->Resize(BOTTOM_UNIT_LABEL_W, BOTTOM_UNIT_LABEL_H);\r
+\r
+    // Set additional property\r
+    bottomUnitLabel->SetText("时间");\r
+    bottomUnitLabel->SetLineBreakMode(UILabel::LINE_BREAK_ADAPT);\r
+    bottomUnitLabel->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+    bottomUnitLabel->SetFont(DEFAULT_VECTOR_FONT_FILENAME, UNIT_LABEL_FONT);\r
+\r
+    // Add to rootView\r
+    group->Add(bottomUnitLabel);\r
+}\r
+\r
+void DataView::ShowupSepLine()\r
+{\r
+    sepLine = new UICanvas();\r
+    if (sepLine == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ShowupSepLine new fail");\r
+        return;\r
+    }\r
+    sepLine->SetPosition(SEP_LINE_X, SEP_LINE_Y, SEP_LINE_W, SEP_LINE_H);\r
+    sepLine->SetStyle(STYLE_BACKGROUND_COLOR, Color::Gray().full);\r
+    sepLine->SetStyle(STYLE_BACKGROUND_OPA, OPA_OPAQUE);\r
+    group->Add(sepLine);\r
+}\r
+\r
+UIViewGroup *DataView::InitShowUpView()\r
+{\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "DataView init");\r
+    if (group == nullptr) {\r
+        group = new UIViewGroup();\r
+        if (group == nullptr) {\r
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "group new fail");\r
+            return nullptr;\r
+        }\r
+        group->SetPosition(0, 0);\r
+        group->SetWidth(HORIZONTAL_RESOLUTION);\r
+        group->SetHeight(VERTICAL_RESOLUTION);\r
+    }\r
+    ShowupBackgroup();\r
+    ShowupTopView();\r
+    ShowupLeftView();\r
+    ShowupRightView();\r
+    ShowupBottomView();\r
+    ShowupSepLine();\r
+    UIView::OnDragListener *trainingDragListener = (UIView::OnDragListener *)OHOS::TrainingPresenter::GetInstance();\r
+    if (trainingDragListener == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "trainingDragListener GetInstance fail");\r
+        return nullptr;\r
+    }\r
+    group->SetOnDragListener(trainingDragListener);\r
+    group->SetViewId(DATA_VIEW_ID);\r
+    group->SetDraggable(true);\r
+    group->SetTouchable(true);\r
+    return group;\r
+}\r
+\r
+void DataView::UpdateDataViewByType()\r
+{\r
+    uint8_t trainingType = TrainingModel::GetInstance().GetCurTrainingType();\r
+    if (trainingType == TRAINING_TYPE_OUTDOOR_RUNNING) {\r
+        topValueLabel->SetText("105");\r
+        topUnitLabel->SetText("心率(次/分钟)");\r
+        leftValueLabel->SetText("00'35\"");\r
+        leftUnitLabel->SetText("配速(/km)");\r
+        rightValueLabel->SetText("3.25");\r
+        rightUnitLabel->SetText("距离(km)");\r
+    } else if (trainingType == TRAINING_TYPE_INDOOR_RUNNING) {\r
+        topValueLabel->SetText("105");\r
+        topUnitLabel->SetText("心率(次/分钟)");\r
+        leftValueLabel->SetText("00'35\"");\r
+        leftUnitLabel->SetText("配速(/km)");\r
+        rightValueLabel->SetText("3.25");\r
+        rightUnitLabel->SetText("距离(km)");\r
+    } else if (trainingType == TRAINING_TYPE_CYCLING) {\r
+        topValueLabel->SetText("105");\r
+        topUnitLabel->SetText("心率(次/分钟)");\r
+        leftValueLabel->SetText("00'35\"");\r
+        leftUnitLabel->SetText("配速(/km)");\r
+        rightValueLabel->SetText("3.25");\r
+        rightUnitLabel->SetText("距离(km)");\r
+    } else if (trainingType == TRAINING_TYPE_CLIMBING) {\r
+        topValueLabel->SetText("198");\r
+        topUnitLabel->SetText("海拔(m)");\r
+        leftValueLabel->SetText("535");\r
+        leftUnitLabel->SetText("累计上升(m)");\r
+        rightValueLabel->SetText("180");\r
+        rightUnitLabel->SetText("累计下降(m)");\r
+    } else if (trainingType == TRAINING_TYPE_INDOOR_SWIMMING) {\r
+        topValueLabel->SetText("105");\r
+        topUnitLabel->SetText("心率(次/分钟)");\r
+        leftValueLabel->SetText("235");\r
+        leftUnitLabel->SetText("热量(kcal)");\r
+        rightValueLabel->SetText("125");\r
+        rightUnitLabel->SetText("距离(km)");\r
+    } else if (trainingType == TRAINING_TYPE_OUTDOOR_SWIMMING) {\r
+        topValueLabel->SetText("105");\r
+        topUnitLabel->SetText("心率(次/分钟)");\r
+        leftValueLabel->SetText("235");\r
+        leftUnitLabel->SetText("热量(kcal)");\r
+        rightValueLabel->SetText("125");\r
+        rightUnitLabel->SetText("距离(km)");\r
+    }\r
+    topValueLabel->Invalidate();\r
+    topUnitLabel->Invalidate();\r
+    leftValueLabel->Invalidate();\r
+    leftUnitLabel->Invalidate();\r
+    rightValueLabel->Invalidate();\r
+    rightUnitLabel->Invalidate();\r
+}\r
+}
\ No newline at end of file
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/training/src/MenuView.cpp b/code/sdk/application/wearable/nativeapp/nativeui/training/src/MenuView.cpp
new file mode 100644 (file)
index 0000000..e313fd6
--- /dev/null
@@ -0,0 +1,133 @@
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: Menu View\r
+ * Create: 2025-03-22\r
+ */\r
+#include "training/MenuView.h"\r
+#include "wearable_log.h"\r
+#include "UiConfig.h"\r
+#include "training/TrainingPresenter.h"\r
+\r
+namespace OHOS {\r
+static constexpr uint16_t TITLI_LABEL_FONT = 50;\r
+static constexpr uint16_t TITLI_LABEL_X = 133;\r
+static constexpr uint16_t TITLI_LABEL_Y = 36;\r
+static constexpr uint16_t TITLI_LABEL_W = 200;\r
+static constexpr uint16_t TITLI_LABEL_H = 60;\r
+static constexpr uint16_t LIST_X = 42;\r
+static constexpr uint16_t LIST_Y = 95;\r
+static constexpr uint16_t LIST_W = 420;\r
+static constexpr uint16_t LIST_H = 305;\r
+\r
+static MenuView *g_pMenuView{nullptr};\r
+\r
+MenuView::MenuView()\r
+{\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MenuView::MenuView");\r
+    g_pMenuView = this;\r
+}\r
+\r
+MenuView::~MenuView()\r
+{\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MenuView::~MenuView");\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 (trainingList != nullptr) {\r
+        delete trainingList;\r
+        trainingList = nullptr;\r
+    }\r
+    if (listAdapter_ != nullptr) {\r
+        delete listAdapter_;\r
+        listAdapter_ = nullptr;\r
+    }\r
+    g_pMenuView = nullptr;\r
+}\r
+\r
+MenuView *MenuView::GetInstance()\r
+{\r
+    return g_pMenuView;\r
+}\r
+\r
+void MenuView::CreateUILabel()\r
+{\r
+    // Add Label to App\r
+    if (titleLabel == nullptr) {\r
+        titleLabel = new UILabel();\r
+    }\r
+    titleLabel->SetPosition(TITLI_LABEL_X, TITLI_LABEL_Y);\r
+    titleLabel->Resize(TITLI_LABEL_W, TITLI_LABEL_H);\r
+\r
+    // Set additional property\r
+    titleLabel->SetText("体能训练");\r
+    titleLabel->SetLineBreakMode(UILabel::LINE_BREAK_ADAPT);\r
+    titleLabel->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+    titleLabel->SetFont(DEFAULT_VECTOR_FONT_FILENAME, TITLI_LABEL_FONT);\r
+\r
+    // Add to rootView\r
+    group->Add(titleLabel);\r
+}\r
+\r
+void MenuView::CreateUIList()\r
+{\r
+    UIView::OnClickListener *clickListener = (UIView::OnClickListener *)OHOS::TrainingPresenter::GetInstance();\r
+    if (clickListener == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "clickListener nullptr");\r
+        return;\r
+    }\r
+\r
+    // Add List to App\r
+    if (trainingList == nullptr) {\r
+        trainingList = new UIList();\r
+    }\r
+    trainingList->SetPosition(LIST_X, LIST_Y);\r
+    trainingList->Resize(LIST_W, LIST_H);\r
+\r
+    // Set additional property\r
+    if (listAdapter_ == nullptr) {\r
+        listAdapter_ = new TrainingAdapter();\r
+    }\r
+    listAdapter_->SetItemClickListener(clickListener);\r
+    std::list<TrainingItem> trainingItemList(trainings, trainings + TRAINING_TYPE_MAX);\r
+    listAdapter_->SetData(trainingItemList);\r
+\r
+    trainingList->SetAdapter(listAdapter_);\r
+    trainingList->RefreshList();\r
+\r
+    // Add to rootView\r
+    group->Add(trainingList);\r
+}\r
+\r
+UIViewGroup *MenuView::InitShowUpView()\r
+{\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MenuView init");\r
+    if (group == nullptr) {\r
+        group = new UIViewGroup();\r
+        if (group == nullptr) {\r
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "group new fail");\r
+            return nullptr;\r
+        }\r
+        group->SetPosition(0, 0);\r
+        group->SetWidth(HORIZONTAL_RESOLUTION);\r
+        group->SetHeight(VERTICAL_RESOLUTION);\r
+    }\r
+    CreateUILabel();\r
+    CreateUIList();\r
+    UIView::OnDragListener *trainingDragListener = (UIView::OnDragListener *)OHOS::TrainingPresenter::GetInstance();\r
+    if (trainingDragListener == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "trainingDragListener GetInstance fail");\r
+        return nullptr;\r
+    }\r
+    group->SetOnDragListener(trainingDragListener);\r
+    group->SetViewId(MENU_VIEW_ID);\r
+    group->SetDraggable(true);\r
+    group->SetTouchable(true);\r
+    return group;\r
+}\r
+}
\ No newline at end of file
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/training/src/PauseView.cpp b/code/sdk/application/wearable/nativeapp/nativeui/training/src/PauseView.cpp
new file mode 100644 (file)
index 0000000..17e3434
--- /dev/null
@@ -0,0 +1,179 @@
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ */\r
+/*\r
+ * Copyright (c) CompanyNameMagicTag 2022-2022. All rights reserved.\r
+ * Description: Pause View\r
+ * Create: 2025-03-22\r
+ */\r
+#include "training/PauseView.h"\r
+#include "wearable_log.h"\r
+#include "UiConfig.h"\r
+#include "training/TrainingPresenter.h"\r
+\r
+namespace OHOS {\r
+static constexpr uint16_t TIME_LABEL_FONT = 30;\r
+static constexpr uint16_t TIME_LABEL_X = 194;\r
+static constexpr uint16_t TIME_LABEL_Y = 42;\r
+static constexpr uint16_t TIME_LABEL_W = 200;\r
+static constexpr uint16_t TIME_LABEL_H = 60;\r
+static constexpr uint16_t TEXT_LABEL_FONT = 70;\r
+static constexpr uint16_t TEXT_LABEL_X = 128;\r
+static constexpr uint16_t TEXT_LABEL_Y = 133;\r
+static constexpr uint16_t TEXT_LABEL_W = 337;\r
+static constexpr uint16_t TEXT_LABEL_H = 152;\r
+static constexpr uint16_t BUTTON_FONT = 40;\r
+static constexpr uint16_t BUTTON_X = 136;\r
+static constexpr uint16_t BUTTON_Y1 = 236;\r
+static constexpr uint16_t BUTTON_Y2 = 329;\r
+static constexpr uint16_t BUTTON_W = 193;\r
+static constexpr uint16_t BUTTON_H = 75;\r
+\r
+#define BUTTON_TEXT_CONTINUE "继续"\r
+#define BUTTON_TEXT_FINISH "结束"\r
+\r
+static PauseView *g_pPauseView{nullptr};\r
+\r
+PauseView::PauseView()\r
+{\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "PauseView::PauseView");\r
+    g_pPauseView = this;\r
+}\r
+\r
+PauseView::~PauseView()\r
+{\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "PauseView::~PauseView");\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
+    g_pPauseView = nullptr;\r
+}\r
+\r
+PauseView *PauseView::GetInstance()\r
+{\r
+    return g_pPauseView;\r
+}\r
+\r
+void PauseView::CreateUILabel()\r
+{\r
+    // Add Label to App\r
+    if (timeLabel == nullptr) {\r
+        timeLabel = new UILabel();\r
+    }\r
+    timeLabel->SetPosition(TIME_LABEL_X, TIME_LABEL_Y);\r
+    timeLabel->Resize(TIME_LABEL_W, TIME_LABEL_H);\r
+\r
+    // Set additional property\r
+    timeLabel->SetText("11:59");\r
+    timeLabel->SetLineBreakMode(UILabel::LINE_BREAK_ADAPT);\r
+    timeLabel->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+    timeLabel->SetFont(DEFAULT_VECTOR_FONT_FILENAME, TIME_LABEL_FONT);\r
+\r
+    // Add to rootView\r
+    group->Add(timeLabel);\r
+\r
+    // Add Label to App\r
+    if (textLabel == nullptr) {\r
+        textLabel = new UILabel();\r
+    }\r
+    textLabel->SetPosition(TEXT_LABEL_X, TEXT_LABEL_Y);\r
+    textLabel->Resize(TEXT_LABEL_W, TEXT_LABEL_H);\r
+\r
+    // Set additional property\r
+    textLabel->SetText("已暂停");\r
+    textLabel->SetLineBreakMode(UILabel::LINE_BREAK_ADAPT);\r
+    textLabel->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+    textLabel->SetFont(DEFAULT_VECTOR_FONT_FILENAME, TEXT_LABEL_FONT);\r
+\r
+    // Add to rootView\r
+    group->Add(textLabel);\r
+}\r
+\r
+void PauseView::CreateUIButton()\r
+{\r
+    UIView::OnClickListener *clickListener = (UIView::OnClickListener *)OHOS::TrainingPresenter::GetInstance();\r
+    if (clickListener == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "clickListener nullptr");\r
+        return;\r
+    }\r
+    // Add LabelButtonExt to App\r
+    if (continueButton == nullptr) {\r
+        continueButton = new UILabelButton();\r
+    }\r
+    continueButton->SetPosition(BUTTON_X, BUTTON_Y1);\r
+    continueButton->Resize(BUTTON_W, BUTTON_H);\r
+    continueButton->SetViewId(TRAINING_PAUSE_CONTINUE_BUTTON);\r
+\r
+    // Set additional property\r
+    continueButton->SetText(BUTTON_TEXT_CONTINUE);\r
+    continueButton->SetFont(DEFAULT_VECTOR_FONT_FILENAME, BUTTON_FONT);\r
+    continueButton->SetStyleForState(STYLE_BORDER_COLOR, 0xff0b1928, UIButton::PRESSED);\r
+    continueButton->SetOnClickListener(clickListener);\r
+\r
+    // Add to rootView\r
+    group->Add(continueButton);\r
+\r
+    // Add LabelButtonExt to App\r
+    if (finishButton == nullptr) {\r
+        finishButton = new UILabelButton();\r
+    }\r
+    finishButton->SetPosition(BUTTON_X, BUTTON_Y2);\r
+    finishButton->Resize(BUTTON_W, BUTTON_H);\r
+    finishButton->SetViewId(TRAINING_PAUSE_FINISH_BUTTON);\r
+    finishButton->SetStyle(STYLE_BACKGROUND_COLOR, 0xffbc321e);\r
+\r
+    // Set additional property\r
+    finishButton->SetText(BUTTON_TEXT_FINISH);\r
+    finishButton->SetFont(DEFAULT_VECTOR_FONT_FILENAME, BUTTON_FONT);\r
+    finishButton->SetStyleForState(STYLE_BORDER_COLOR, 0xff0b1928, UIButton::PRESSED);\r
+    finishButton->SetOnClickListener(clickListener);\r
+\r
+    // Add to rootView\r
+    group->Add(finishButton);\r
+}\r
+\r
+UIViewGroup *PauseView::InitShowUpView()\r
+{\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "PauseView init");\r
+    if (group == nullptr) {\r
+        group = new UIViewGroup();\r
+        if (group == nullptr) {\r
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "group new fail");\r
+            return nullptr;\r
+        }\r
+        group->SetPosition(0, 0);\r
+        group->SetWidth(HORIZONTAL_RESOLUTION);\r
+        group->SetHeight(VERTICAL_RESOLUTION);\r
+    }\r
+    CreateUILabel();\r
+    CreateUIButton();\r
+    UIView::OnDragListener *trainingDragListener = (UIView::OnDragListener *)OHOS::TrainingPresenter::GetInstance();\r
+    if (trainingDragListener == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "trainingDragListener GetInstance fail");\r
+        return nullptr;\r
+    }\r
+    group->SetOnDragListener(trainingDragListener);\r
+    group->SetViewId(PAUSE_VIEW_ID);\r
+    group->SetDraggable(true);\r
+    group->SetTouchable(true);\r
+    return group;\r
+}\r
+}
\ No newline at end of file
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/training/src/PrepareView.cpp b/code/sdk/application/wearable/nativeapp/nativeui/training/src/PrepareView.cpp
new file mode 100644 (file)
index 0000000..1e2e14a
--- /dev/null
@@ -0,0 +1,345 @@
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: Prepare View\r
+ * Create: 2025-03-22\r
+ */\r
+#include "training/PrepareView.h"\r
+#include "wearable_log.h"\r
+#include "UiConfig.h"\r
+#include "training/TrainingPresenter.h"\r
+#include "screensetting/ScreenModels.h"\r
+#include "ui_resource_image.h"\r
+\r
+namespace OHOS {\r
+\r
+static constexpr uint16_t HEARTBEAT_IMAGE_X = 366;\r
+static constexpr uint16_t HEARTBEAT_IMAGE_Y = 165;\r
+static constexpr uint16_t HEARTBEAT_IMAGE_W = 56;\r
+static constexpr uint16_t HEARTBEAT_IMAGE_H = 56;\r
+static constexpr uint16_t HEARTBEAT_IMAGE_NUM = 19;\r
+static constexpr uint16_t HEARTBEAT_DELAY = 50;\r
+static constexpr uint16_t HEARTBEAT_LABEL_X = 363;\r
+static constexpr uint16_t HEARTBEAT_LABEL_Y = 241;\r
+static constexpr uint16_t HEARTBEAT_LABEL_W = 86;\r
+static constexpr uint16_t HEARTBEAT_LABEL_H = 30;\r
+static constexpr uint16_t HEARTBEAT_LABEL_FONT = 30;\r
+static constexpr uint16_t BATTERY_X = 175;\r
+static constexpr uint16_t BATTERY_Y = 84;\r
+static constexpr uint16_t BATTERY_LABEL_FONT = 30;\r
+static constexpr uint16_t BATTERY_LABEL_X = 232;\r
+static constexpr uint16_t BATTERY_LABEL_Y = 75;\r
+static constexpr uint16_t BATTERY_LABEL_W = 86;\r
+static constexpr uint16_t BATTERY_LABEL_H = 30;\r
+static constexpr uint16_t GPS_X = 30;\r
+static constexpr uint16_t GPS_Y = 167;\r
+static constexpr uint16_t GPS_W = 56;\r
+static constexpr uint16_t GPS_H = 56;\r
+static constexpr uint16_t GPS_LABEL_FONT = 30;\r
+static constexpr uint16_t GPS_LABEL_X = 29;\r
+static constexpr uint16_t GPS_LABEL_Y = 227;\r
+static constexpr uint16_t GPS_LABEL_W = 200;\r
+static constexpr uint16_t GPS_LABEL_H = 60;\r
+static constexpr uint16_t TIME_LABEL_FONT = 30;\r
+static constexpr uint16_t TIME_LABEL_X = 177;\r
+static constexpr uint16_t TIME_LABEL_Y = 36;\r
+static constexpr uint16_t TIME_LABEL_W = 100;\r
+static constexpr uint16_t TIME_LABEL_H = 30;\r
+static constexpr uint16_t LOCATING_LABEL_FONT = 25;\r
+static constexpr uint16_t LOCATING_LABEL_X = 127;\r
+static constexpr uint16_t LOCATING_LABEL_Y = 348;\r
+static constexpr uint16_t LOCATING_LABEL_W = 200;\r
+static constexpr uint16_t LOCATING_LABEL_H = 80;\r
+static constexpr uint16_t WALK_BUTTON_X = 138;\r
+static constexpr uint16_t WALK_BUTTON_Y = 136;\r
+static constexpr uint16_t WALK_BUTTON_W = 180;\r
+static constexpr uint16_t WALK_BUTTON_H = 180;\r
+static constexpr uint16_t START_BUTTON_X = 196;\r
+static constexpr uint16_t START_BUTTON_Y = 373;\r
+static constexpr uint16_t START_BUTTON_W = 73;\r
+static constexpr uint16_t START_BUTTON_H = 73;\r
+static constexpr uint16_t START_BUTTON_FONT = 30;\r
+\r
+static PrepareView *g_pPrepareView{nullptr};\r
+\r
+PrepareView::PrepareView()\r
+{\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "PrepareView::PrepareView");\r
+    g_pPrepareView = this;\r
+}\r
+\r
+PrepareView::~PrepareView()\r
+{\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "PrepareView::~PrepareView");\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 (battery != nullptr) {\r
+        delete battery;\r
+        battery = 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 (gpsLabel != nullptr) {\r
+        delete gpsLabel;\r
+        gpsLabel = 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 (startButton != nullptr) {\r
+        delete startButton;\r
+        startButton = nullptr;\r
+    }\r
+    if (iconImageView != nullptr) {\r
+        delete iconImageView;\r
+        iconImageView = nullptr;\r
+    }\r
+    g_pPrepareView = nullptr;\r
+}\r
+\r
+PrepareView *PrepareView::GetInstance()\r
+{\r
+    return g_pPrepareView;\r
+}\r
+\r
+bool PrepareView::InitTimeLableVIew()\r
+{\r
+    timeLabel = new UILabel();\r
+    if (timeLabel == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "timeLabel new fail");\r
+        return false;\r
+    }\r
+    timeLabel->SetPosition(TIME_LABEL_X, TIME_LABEL_Y, TIME_LABEL_W, TIME_LABEL_H);\r
+    timeLabel->SetText("11:59");\r
+    timeLabel->SetFont(DEFAULT_VECTOR_FONT_FILENAME, TIME_LABEL_FONT);\r
+    timeLabel->SetStyle(STYLE_BACKGROUND_COLOR, OPA_TRANSPARENT);\r
+    timeLabel->SetAlign(UITextLanguageAlignment::TEXT_ALIGNMENT_CENTER, UITextLanguageAlignment::TEXT_ALIGNMENT_CENTER);\r
+    group->Add(timeLabel);\r
+    return true;\r
+}\r
+\r
+bool PrepareView::InitLocatingLableVIew()\r
+{\r
+    locatingLabel = new UILabel();\r
+    if (locatingLabel == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "locatingLabel new fail");\r
+        return false;\r
+    }\r
+    locatingLabel->SetPosition(LOCATING_LABEL_X, LOCATING_LABEL_Y, LOCATING_LABEL_W, LOCATING_LABEL_H);\r
+    locatingLabel->SetText("定位中\n请在空旷处等待");\r
+    locatingLabel->SetFont(DEFAULT_VECTOR_FONT_FILENAME, LOCATING_LABEL_FONT);\r
+    locatingLabel->SetStyle(STYLE_BACKGROUND_COLOR, OPA_TRANSPARENT);\r
+    locatingLabel->SetAlign(UITextLanguageAlignment::TEXT_ALIGNMENT_CENTER,\r
+                            UITextLanguageAlignment::TEXT_ALIGNMENT_CENTER);\r
+    group->Add(locatingLabel);\r
+    return true;\r
+}\r
+\r
+bool PrepareView::InitBatteryView()  // 加载电量\r
+{\r
+    battery = new UIImageView();  // 电量状态显示\r
+    if (battery == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "battery new fail");\r
+        return false;\r
+    }\r
+    battery->SetPosition(BATTERY_X, BATTERY_Y);\r
+    ScreenModels::GetInstance()->LoadAppImages(DROPDOWN_IAMGES, battery, DROPDOWN_DROPDOWN_BATTERY);\r
+    group->Add(battery);\r
+\r
+    batteryLabel = new UILabel();\r
+    if (batteryLabel == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "batteryLabel new fail");\r
+        return false;\r
+    }\r
+    batteryLabel->SetPosition(BATTERY_LABEL_X, BATTERY_LABEL_Y, BATTERY_LABEL_W, BATTERY_LABEL_H);\r
+    batteryLabel->SetText("30%");\r
+    batteryLabel->SetFont(DEFAULT_VECTOR_FONT_FILENAME, BATTERY_LABEL_FONT);\r
+    batteryLabel->SetStyle(STYLE_BACKGROUND_COLOR, OPA_TRANSPARENT);\r
+    group->Add(batteryLabel);\r
+    return true;\r
+}\r
+\r
+bool PrepareView::InitCenterView()\r
+{\r
+    iconImageView = new UIButton();  // 步行状态显示\r
+    if (iconImageView == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "iconImageView new fail");\r
+        return false;\r
+    }\r
+\r
+    iconImageView->SetPosition(WALK_BUTTON_X, WALK_BUTTON_Y, WALK_BUTTON_W, WALK_BUTTON_H);\r
+\r
+    group->Add(iconImageView);\r
+    return true;\r
+}\r
+\r
+bool PrepareView::InitGPSView()\r
+{\r
+    // Add ImageView to App\r
+    if (gpsImageView == nullptr) {\r
+        gpsImageView = new UIImageView();\r
+    }\r
+    gpsImageView->SetPosition(GPS_X, GPS_Y);\r
+    gpsImageView->Resize(GPS_W, GPS_H);\r
+\r
+    // Set additional property\r
+\r
+    // Add to rootView\r
+    group->Add(gpsImageView);\r
+\r
+    // Add Label to App\r
+    if (gpsLabel == nullptr) {\r
+        gpsLabel = new UILabel();\r
+    }\r
+    gpsLabel->SetPosition(GPS_LABEL_X, GPS_LABEL_Y);\r
+    gpsLabel->Resize(GPS_LABEL_W, GPS_LABEL_H);\r
+\r
+    // Set additional property\r
+    gpsLabel->SetText("GPS");\r
+    gpsLabel->SetLineBreakMode(UILabel::LINE_BREAK_ADAPT);\r
+    gpsLabel->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+    gpsLabel->SetFont(DEFAULT_VECTOR_FONT_FILENAME, GPS_LABEL_FONT);\r
+\r
+    // Add to rootView\r
+    group->Add(gpsLabel);\r
+    return true;\r
+}\r
+\r
+bool PrepareView::InitHeartrateView()\r
+{\r
+    // Add ImageView to App\r
+    if (heartRateImageView == nullptr) {\r
+        heartRateImageView = new UIImageView();\r
+    }\r
+    heartRateImageView->SetPosition(HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y);\r
+    heartRateImageView->Resize(HEARTBEAT_IMAGE_W, HEARTBEAT_IMAGE_H);\r
+\r
+    // Add to rootView\r
+    group->Add(heartRateImageView);\r
+\r
+    heartRateLabel = new UILabel();\r
+    if (heartRateLabel == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "heartRateLabel new fail");\r
+        return false;\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->SetStyle(STYLE_BACKGROUND_COLOR, OPA_OPAQUE);\r
+    group->Add(heartRateLabel);\r
+    return true;\r
+}\r
+\r
+bool PrepareView::InitStartButtonView()\r
+{\r
+    UIView::OnClickListener *clickListener = (UIView::OnClickListener *)OHOS::TrainingPresenter::GetInstance();\r
+    if (clickListener == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "clickListener nullptr");\r
+        return false;\r
+    }\r
+\r
+    // Add LabelButtonExt to App\r
+    if (startButton == nullptr) {\r
+        startButton = new UILabelButton();\r
+    }\r
+    startButton->SetPosition(START_BUTTON_X, START_BUTTON_Y);  // widget's left position and top position\r
+    startButton->Resize(START_BUTTON_W, START_BUTTON_H);       // widget's width and height\r
+    startButton->SetViewId(TRAINING_PREPARE_START_BUTTON);     // Set style\r
+    startButton->SetStyle(STYLE_BACKGROUND_COLOR, 0xffff1500);\r
+\r
+    // Set additional property\r
+    startButton->SetText("开始");\r
+    startButton->SetFont(DEFAULT_VECTOR_FONT_FILENAME, START_BUTTON_FONT);\r
+    startButton->SetStyleForState(STYLE_BORDER_COLOR, 0xff0b1928, UIButton::PRESSED);\r
+    startButton->SetOnClickListener(clickListener);\r
+\r
+    // Add to rootView\r
+    group->Add(startButton);\r
+    return true;\r
+}\r
+\r
+UIViewGroup *PrepareView::InitShowUpView()\r
+{\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "PrepareView init");\r
+    if (group == nullptr) {\r
+        group = new UIViewGroup();\r
+        if (group == nullptr) {\r
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "group new fail");\r
+            return nullptr;\r
+        }\r
+        group->SetPosition(0, 0);\r
+        group->SetWidth(HORIZONTAL_RESOLUTION);\r
+        group->SetHeight(VERTICAL_RESOLUTION);\r
+    }\r
+    InitTimeLableVIew();\r
+    InitBatteryView();\r
+    // InitLocatingLableVIew();\r
+    InitCenterView();\r
+    InitGPSView();\r
+    InitHeartrateView();\r
+    InitStartButtonView();\r
+    UIView::OnDragListener *trainingDragListener = (UIView::OnDragListener *)OHOS::TrainingPresenter::GetInstance();\r
+    if (trainingDragListener == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "trainingDragListener GetInstance fail");\r
+        return nullptr;\r
+    }\r
+    group->SetOnDragListener(trainingDragListener);\r
+    group->SetViewId(PREPARE_VIEW_ID);\r
+    group->SetDraggable(true);\r
+    group->SetTouchable(true);\r
+    return group;\r
+}\r
+\r
+void PrepareView::UpdateViewByTrainingType(uint8_t trainingType)\r
+{\r
+    if (trainingType == TRAINING_TYPE_OUTDOOR_RUNNING) {\r
+        gpsImageView->SetVisible(true);\r
+        gpsLabel->SetVisible(true);\r
+        iconImageView->SetImageSrc(PNG_WALK_IMAGE, PNG_WALK_IMAGE);\r
+    } else if (trainingType == TRAINING_TYPE_INDOOR_RUNNING) {\r
+        gpsImageView->SetVisible(false);\r
+        gpsLabel->SetVisible(false);\r
+        iconImageView->SetImageSrc(PNG_WALK_IMAGE, PNG_WALK_IMAGE);\r
+    } else if (trainingType == TRAINING_TYPE_CYCLING) {\r
+        gpsImageView->SetVisible(true);\r
+        gpsLabel->SetVisible(true);\r
+        iconImageView->SetImageSrc(PNG_WALK_IMAGE, PNG_WALK_IMAGE);\r
+    } else if (trainingType == TRAINING_TYPE_CLIMBING) {\r
+        gpsImageView->SetVisible(true);\r
+        gpsLabel->SetVisible(true);\r
+        iconImageView->SetImageSrc(PNG_WALK_IMAGE, PNG_WALK_IMAGE);\r
+    } else if (trainingType == TRAINING_TYPE_INDOOR_SWIMMING) {\r
+        gpsImageView->SetVisible(false);\r
+        gpsLabel->SetVisible(false);\r
+        iconImageView->SetImageSrc(PNG_WALK_IMAGE, PNG_WALK_IMAGE);\r
+    } else if (trainingType == TRAINING_TYPE_OUTDOOR_SWIMMING) {\r
+        gpsImageView->SetVisible(true);\r
+        gpsLabel->SetVisible(true);\r
+        iconImageView->SetImageSrc(PNG_WALK_IMAGE, PNG_WALK_IMAGE);\r
+    }\r
+    iconImageView->Invalidate();\r
+    gpsImageView->Invalidate();\r
+    gpsLabel->Invalidate();\r
+}\r
+}
\ No newline at end of file
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/training/src/PromptView.cpp b/code/sdk/application/wearable/nativeapp/nativeui/training/src/PromptView.cpp
new file mode 100644 (file)
index 0000000..581a2c5
--- /dev/null
@@ -0,0 +1,138 @@
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: Prompt View\r
+ * Create: 2025-03-22\r
+ */\r
+#include "training/PromptView.h"\r
+#include "wearable_log.h"\r
+#include "UiConfig.h"\r
+#include "training/TrainingPresenter.h"\r
+\r
+namespace OHOS {\r
+static constexpr uint16_t LABELS_X = 65;\r
+static constexpr uint16_t LABELS_Y = 100;\r
+static constexpr uint16_t LABELS_W = 324;\r
+static constexpr uint16_t LABELS_H = 160;\r
+static constexpr uint16_t LABELS_FONT = 35;\r
+static constexpr uint16_t BUTTON_X1 = 85;\r
+static constexpr uint16_t BUTTON_X2 = 279;\r
+static constexpr uint16_t BUTTON_Y = 320;\r
+static constexpr uint16_t BUTTON_W = 90;\r
+static constexpr uint16_t BUTTON_H = 90;\r
+static const char *PROMPT_CONTENT = "本次运动距离过短,不会记录数据。是否结束?";\r
+static PromptView *g_pPromptView{nullptr};\r
+\r
+PromptView::PromptView()\r
+{\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "PromptView::PromptView");\r
+    g_pPromptView = this;\r
+}\r
+\r
+PromptView::~PromptView()\r
+{\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "PromptView::~PromptView");\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 (cancelButton != nullptr) {\r
+        delete cancelButton;\r
+        cancelButton = nullptr;\r
+    }\r
+    if (confirmButton != nullptr) {\r
+        delete confirmButton;\r
+        confirmButton = nullptr;\r
+    }\r
+    g_pPromptView = nullptr;\r
+}\r
+\r
+PromptView *PromptView::GetInstance()\r
+{\r
+    return g_pPromptView;\r
+}\r
+\r
+void PromptView::CreateUILabel()\r
+{\r
+    if (titleLabel == nullptr) {\r
+        titleLabel = new UILabel();\r
+        if (titleLabel == nullptr) {\r
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "PromptView titleLabel new fail");\r
+            return;\r
+        }\r
+        titleLabel->SetPosition(LABELS_X, LABELS_Y, LABELS_W, LABELS_H);\r
+        titleLabel->SetText(PROMPT_CONTENT);\r
+        titleLabel->SetFont(DEFAULT_VECTOR_FONT_FILENAME, LABELS_FONT);\r
+        titleLabel->SetStyle(STYLE_BACKGROUND_COLOR, OPA_OPAQUE);\r
+        titleLabel->SetAlign(UITextLanguageAlignment::TEXT_ALIGNMENT_CENTER,\r
+                             UITextLanguageAlignment::TEXT_ALIGNMENT_CENTER);\r
+        titleLabel->SetLineBreakMode(UILabel::LINE_BREAK_WRAP);\r
+        group->Add(titleLabel);\r
+    }\r
+}\r
+\r
+void PromptView::CreateUIButton()\r
+{\r
+    UIView::OnClickListener *clickListener = (UIView::OnClickListener *)OHOS::TrainingPresenter::GetInstance();\r
+    if (clickListener == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "clickListener nullptr");\r
+        return;\r
+    }\r
+\r
+    if (cancelButton == nullptr) {\r
+        cancelButton = new UIButton();\r
+        if (cancelButton == nullptr) {\r
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "PromptView cancelButton new fail");\r
+            return;\r
+        }\r
+        cancelButton->SetPosition(BUTTON_X1, BUTTON_Y, BUTTON_W, BUTTON_H);\r
+        cancelButton->SetViewId(TRAINING_PROMPT_CANCEL_BUTTON);\r
+        cancelButton->SetImageSrc(ALARM_DELETE_ADD_PATH, ALARM_DELETE_ADD_PATH);\r
+        cancelButton->SetOnClickListener(clickListener);\r
+        group->Add(cancelButton);\r
+    }\r
+    if (confirmButton == nullptr) {\r
+        confirmButton = new UIButton();\r
+        if (confirmButton == nullptr) {\r
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "PromptView confirmButton new fail");\r
+            return;\r
+        }\r
+        confirmButton->SetPosition(BUTTON_X2, BUTTON_Y, BUTTON_W, BUTTON_H);\r
+        confirmButton->SetViewId(TRAINING_PROMPT_CONFIRM_BUTTON);\r
+        confirmButton->SetImageSrc(ALARM_TRUE_ADD_PATH, ALARM_TRUE_ADD_PATH);\r
+        confirmButton->SetOnClickListener(clickListener);\r
+        group->Add(confirmButton);\r
+    }\r
+}\r
+\r
+UIViewGroup *PromptView::InitShowUpView()\r
+{\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "PromptView InitShowUpView");\r
+    if (group == nullptr) {\r
+        group = new UIViewGroup();\r
+        if (group == nullptr) {\r
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "group new fail");\r
+            return nullptr;\r
+        }\r
+        group->SetPosition(0, 0);\r
+        group->SetWidth(HORIZONTAL_RESOLUTION);\r
+        group->SetHeight(VERTICAL_RESOLUTION);\r
+    }\r
+    CreateUILabel();\r
+    CreateUIButton();\r
+    UIView::OnDragListener *trainingDragListener = (UIView::OnDragListener *)OHOS::TrainingPresenter::GetInstance();\r
+    if (trainingDragListener == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "trainingDragListener GetInstance fail");\r
+        return nullptr;\r
+    }\r
+    group->SetOnDragListener(trainingDragListener);\r
+    group->SetViewId(PROMPT_VIEW_ID);\r
+    group->SetDraggable(true);\r
+    group->SetTouchable(true);\r
+    return group;\r
+}\r
+}
\ No newline at end of file
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/training/src/TargetAdapter.cpp b/code/sdk/application/wearable/nativeapp/nativeui/training/src/TargetAdapter.cpp
new file mode 100644 (file)
index 0000000..a19958b
--- /dev/null
@@ -0,0 +1,64 @@
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: TargetAdapter\r
+ * Author:\r
+ * Create: 2025-11-23\r
+ */\r
+#include "training/TargetAdapter.h"\r
+#include "training/TargetItemView.h"\r
+\r
+namespace OHOS {\r
+TargetAdapter::TargetAdapter() {}\r
+\r
+TargetAdapter::~TargetAdapter()\r
+{\r
+    listData_.clear();\r
+}\r
+\r
+uint16_t TargetAdapter::GetCount(void)\r
+{\r
+    return listData_.size();\r
+}\r
+\r
+void TargetAdapter::SetData(const std::list<TargetItem> &data)\r
+{\r
+    if (!listData_.empty()) {\r
+        listData_.clear();\r
+    }\r
+    listData_ = data;\r
+}\r
+\r
+UIView *TargetAdapter::GetView(UIView *inView, int16_t index)\r
+{\r
+    if (listData_.empty()) {\r
+        return nullptr;\r
+    }\r
+    if (index < 0) {\r
+        return nullptr;\r
+    }\r
+    size_t uindex = index;\r
+    if (uindex >= listData_.size()) {\r
+        return nullptr;\r
+    }\r
+\r
+    std::list<TargetItem>::iterator it = listData_.begin();\r
+    for (int i = 0; i < index; i++) {\r
+        it++;\r
+    }\r
+    TargetItem itemData = *it;\r
+    TargetItemView *item = nullptr;\r
+    if (inView == nullptr) {\r
+        item = new TargetItemView();\r
+    } else {\r
+        item = static_cast<TargetItemView *>(inView);\r
+    }\r
+    item->SetItemInfo(itemData);\r
+    item->SetOnClickListener(itemClickListener);\r
+    return item;\r
+}\r
+\r
+void TargetAdapter::AddListItem(const TargetItem &item)\r
+{\r
+    listData_.push_back(item);\r
+}\r
+}  // namespace OHOS\r
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/training/src/TargetItemView.cpp b/code/sdk/application/wearable/nativeapp/nativeui/training/src/TargetItemView.cpp
new file mode 100644 (file)
index 0000000..6814bb1
--- /dev/null
@@ -0,0 +1,76 @@
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: TargetItemView\r
+ * Author:\r
+ * Create: 2025-02-15\r
+ */\r
+\r
+#include "wearable_log.h"\r
+#include "UiConfig.h"\r
+#include "training/TargetItemView.h"\r
+\r
+namespace OHOS {\r
+static constexpr uint16_t ITEM_X = 0;\r
+static constexpr uint16_t ITEM_Y = 0;\r
+static constexpr uint16_t ITEM_W = 382;\r
+static constexpr uint16_t ITEM_H = 100;\r
+static constexpr uint16_t ICON_X = 0;\r
+static constexpr uint16_t ICON_Y = 0;\r
+static constexpr uint16_t LABEL_X = 100;\r
+static constexpr uint16_t LABEL_Y = 0;\r
+static constexpr uint16_t LABEL_W = 200;\r
+static constexpr uint16_t LABEL_H = 100;\r
+static constexpr uint16_t LABEL_FONT = 35;\r
+static constexpr uint16_t IMAGE_W = 300;\r
+static constexpr uint16_t IMAGE_H = 0;\r
+\r
+TargetItemView::TargetItemView()\r
+{\r
+    InitView();\r
+}\r
+\r
+TargetItemView::~TargetItemView()\r
+{\r
+    Remove(&sIcon);\r
+    Remove(&sLabel);\r
+    Remove(&sNextImage);\r
+}\r
+\r
+bool TargetItemView::InitView()\r
+{\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "TargetItemView::InitView");\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
+\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
+    sNextImage.SetSrc(PNG_SETTING_NEXT_IMAGE);\r
+    sNextImage.SetPosition(IMAGE_W, IMAGE_H);\r
+    sNextImage.SetStyle(STYLE_IMAGE_OPA, OPA_OPAQUE);\r
+\r
+    Add(&sIcon);\r
+    Add(&sLabel);\r
+    Add(&sNextImage);\r
+    return true;\r
+}\r
+\r
+void TargetItemView::SetItemInfo(const TargetItem itemInfo)\r
+{\r
+    sItemInfo = itemInfo;\r
+    sIcon.SetSrc(itemInfo.icon);\r
+    sLabel.SetText(itemInfo.label);\r
+    SetViewId(itemInfo.viewId);\r
+}\r
+}
\ No newline at end of file
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/training/src/TargetSettingView.cpp b/code/sdk/application/wearable/nativeapp/nativeui/training/src/TargetSettingView.cpp
new file mode 100644 (file)
index 0000000..1e2eee8
--- /dev/null
@@ -0,0 +1,185 @@
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: TargetSetting View\r
+ * Create: 2025-03-22\r
+ */\r
+#include "training/TargetSettingView.h"\r
+#include "wearable_log.h"\r
+#include "UiConfig.h"\r
+#include "training/TrainingPresenter.h"\r
+\r
+namespace OHOS {\r
+static constexpr uint16_t LABELS_X = 153;\r
+static constexpr uint16_t LABELS_Y = 30;\r
+static constexpr uint16_t LABELS_W = 200;\r
+static constexpr uint16_t LABELS_H = 50;\r
+static constexpr uint16_t LABELS_FONT = 40;\r
+static constexpr uint16_t PICKER_X = 160;\r
+static constexpr uint16_t PICKER_Y = 85;\r
+static constexpr uint16_t PICKER_W = 199;\r
+static constexpr uint16_t PICKER_H = 241;\r
+static constexpr uint16_t PICKER_ITEM_H = 50;\r
+static constexpr uint16_t BUTTON_X = 87;\r
+static constexpr uint16_t BUTTON_Y = 351;\r
+static constexpr uint16_t BUTTON_W = 279;\r
+static constexpr uint16_t BUTTON_H = 116;\r
+static constexpr uint16_t BUTTON_FONT = 40;\r
+static constexpr uint8_t BACKGROUND_FONT = 40;\r
+static constexpr uint8_t HIGHTLIGHT_FONT = 50;\r
+\r
+static TargetSettingView *g_pTargetSettingView{nullptr};\r
+\r
+TargetSettingView::TargetSettingView()\r
+{\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "TargetSettingView::TargetSettingView");\r
+    g_pTargetSettingView = this;\r
+}\r
+\r
+TargetSettingView::~TargetSettingView()\r
+{\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "TargetSettingView::~TargetSettingView");\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
+    g_pTargetSettingView = nullptr;\r
+}\r
+\r
+TargetSettingView *TargetSettingView::GetInstance()\r
+{\r
+    return g_pTargetSettingView;\r
+}\r
+\r
+void TargetSettingView::CreateUILabel()\r
+{\r
+    // Add Label to App\r
+    if (titleLabel == nullptr) {\r
+        titleLabel = new UILabel();\r
+    }\r
+    titleLabel->SetPosition(LABELS_X, LABELS_Y);\r
+    titleLabel->Resize(LABELS_W, LABELS_H);\r
+    titleLabel->SetStyle(STYLE_BACKGROUND_OPA, OPA_OPAQUE);\r
+\r
+    // Set additional property\r
+    titleLabel->SetLineBreakMode(UILabel::LINE_BREAK_ADAPT);\r
+    titleLabel->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+    titleLabel->SetFont(DEFAULT_VECTOR_FONT_FILENAME, LABELS_FONT);\r
+\r
+    // Add to rootView\r
+    group->Add(titleLabel);\r
+}\r
+\r
+void TargetSettingView::CreateUIPicker()\r
+{\r
+    // Add Picker to App\r
+    if (picker == nullptr) {\r
+        picker = new UIPicker();\r
+    }\r
+    picker->SetPosition(PICKER_X, PICKER_Y);\r
+    picker->Resize(PICKER_W, PICKER_H);\r
+    picker->SetStyle(STYLE_BACKGROUND_OPA, OPA_OPAQUE);\r
+\r
+    // Set additional property\r
+    picker->SetItemHeight(PICKER_ITEM_H);\r
+\r
+    picker->SetBackgroundFont(DEFAULT_VECTOR_FONT_FILENAME, BACKGROUND_FONT);\r
+    picker->SetHighlightFont(DEFAULT_VECTOR_FONT_FILENAME, HIGHTLIGHT_FONT);\r
+\r
+    // Add to rootView\r
+    group->Add(picker);\r
+}\r
+\r
+void TargetSettingView::CreateUIButton()\r
+{\r
+    UIView::OnClickListener *clickListener = (UIView::OnClickListener *)OHOS::TrainingPresenter::GetInstance();\r
+    if (clickListener == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "clickListener nullptr");\r
+        return;\r
+    }\r
+\r
+    // Add LabelButtonExt to App\r
+    if (confirmButton == nullptr) {\r
+        confirmButton = new UILabelButton();\r
+    }\r
+    confirmButton->SetPosition(BUTTON_X, BUTTON_Y);\r
+    confirmButton->Resize(BUTTON_W, BUTTON_H);\r
+    confirmButton->SetViewId(TARGET_SETTING_CONFIRM_BUTTON);\r
+    confirmButton->SetTouchable(true);\r
+\r
+    // Set additional property\r
+    confirmButton->SetText("确定");\r
+    confirmButton->SetFont(DEFAULT_VECTOR_FONT_FILENAME, BUTTON_FONT);\r
+\r
+    confirmButton->SetOnClickListener(clickListener);\r
+\r
+    // Add to rootView\r
+    group->Add(confirmButton);\r
+}\r
+\r
+UIViewGroup *TargetSettingView::InitShowUpView()\r
+{\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "TargetSettingView InitShowUpView");\r
+    if (group == nullptr) {\r
+        group = new UIViewGroup();\r
+        if (group == nullptr) {\r
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "group new fail");\r
+            return nullptr;\r
+        }\r
+        group->SetPosition(0, 0);\r
+        group->SetWidth(HORIZONTAL_RESOLUTION);\r
+        group->SetHeight(VERTICAL_RESOLUTION);\r
+    }\r
+    CreateUILabel();\r
+    CreateUIPicker();\r
+    CreateUIButton();\r
+    UIView::OnDragListener *trainingDragListener = (UIView::OnDragListener *)OHOS::TrainingPresenter::GetInstance();\r
+    if (trainingDragListener == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "trainingDragListener GetInstance fail");\r
+        return nullptr;\r
+    }\r
+    group->SetOnDragListener(trainingDragListener);\r
+    group->SetViewId(TARGET_SETTING_VIEW_ID);\r
+    group->SetDraggable(true);\r
+    group->SetTouchable(true);\r
+    return group;\r
+}\r
+\r
+void TargetSettingView::UpdateViewByTargetType(uint8_t targetType)\r
+{\r
+    if (targetType == TRAINING_TARGET_DISTANCE) {\r
+        titleLabel->SetText("距离");\r
+        const char *uiDistanceData[] = {"1km", "3km", "5km", "10km"};\r
+        picker->SetValues(uiDistanceData, sizeof(uiDistanceData) / sizeof(uiDistanceData[0]));\r
+        picker->SetTextColor(Color::Gray(), Color::Teal());\r
+        confirmButton->SetStyle(STYLE_BACKGROUND_COLOR, Color::Teal().full);\r
+    } else if (targetType == TRAINING_TARGET_TIME) {\r
+        titleLabel->SetText("时间");\r
+        const char *uiTimeData[] = {"10分钟", "20分钟", "30分钟", "60分钟"};\r
+        picker->SetValues(uiTimeData, sizeof(uiTimeData) / sizeof(uiTimeData[0]));\r
+        picker->SetTextColor(Color::Gray(), Color::Orange());\r
+        confirmButton->SetStyle(STYLE_BACKGROUND_COLOR, Color::Orange().full);\r
+    } else if (targetType == TRAINING_TARGET_CALORIE) {\r
+        titleLabel->SetText("热量");\r
+        const char *uiCalorieData[] = {"100千卡", "200千卡", "300千卡", "500千卡", "1000千卡"};\r
+        picker->SetValues(uiCalorieData, sizeof(uiCalorieData) / sizeof(uiCalorieData[0]));\r
+        picker->SetTextColor(Color::Gray(), Color::Magenta());\r
+        confirmButton->SetStyle(STYLE_BACKGROUND_COLOR, Color::Magenta().full);\r
+    }\r
+    titleLabel->Invalidate();\r
+    picker->Invalidate();\r
+    confirmButton->Invalidate();\r
+}\r
+}
\ No newline at end of file
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/training/src/TargetView.cpp b/code/sdk/application/wearable/nativeapp/nativeui/training/src/TargetView.cpp
new file mode 100644 (file)
index 0000000..46d55c0
--- /dev/null
@@ -0,0 +1,134 @@
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: Target View\r
+ * Create: 2025-03-22\r
+ */\r
+#include "training/TargetView.h"\r
+#include "wearable_log.h"\r
+#include "UiConfig.h"\r
+#include "training/TrainingPresenter.h"\r
+\r
+namespace OHOS {\r
+static constexpr uint16_t LABELS_X = 133;\r
+static constexpr uint16_t LABELS_Y = 36;\r
+static constexpr uint16_t LABELS_W = 200;\r
+static constexpr uint16_t LABELS_H = 60;\r
+static constexpr uint16_t LABELS_FONT = 50;\r
+static constexpr uint16_t LIST_X = 42;\r
+static constexpr uint16_t LIST_Y = 95;\r
+static constexpr uint16_t LIST_W = 382;\r
+static constexpr uint16_t LIST_H = 305;\r
+\r
+static TargetView *g_pTargetView{nullptr};\r
+\r
+TargetView::TargetView()\r
+{\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "TargetView::TargetView");\r
+    g_pTargetView = this;\r
+}\r
+\r
+TargetView::~TargetView()\r
+{\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "TargetView::~TargetView");\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 (targetList != nullptr) {\r
+        delete targetList;\r
+        targetList = nullptr;\r
+    }\r
+    if (listAdapter_ != nullptr) {\r
+        delete listAdapter_;\r
+        listAdapter_ = nullptr;\r
+    }\r
+    g_pTargetView = nullptr;\r
+}\r
+\r
+TargetView *TargetView::GetInstance()\r
+{\r
+    return g_pTargetView;\r
+}\r
+\r
+void TargetView::CreateUILabel()\r
+{\r
+    // Add Label to App\r
+    if (titleLabel == nullptr) {\r
+        titleLabel = new UILabel();\r
+    }\r
+    titleLabel->SetPosition(LABELS_X, LABELS_Y);\r
+    titleLabel->Resize(LABELS_W, LABELS_H);\r
+\r
+    // Set additional property\r
+    titleLabel->SetText("目标");\r
+    titleLabel->SetLineBreakMode(UILabel::LINE_BREAK_ADAPT);\r
+    titleLabel->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+    titleLabel->SetFont(DEFAULT_VECTOR_FONT_FILENAME, LABELS_FONT);\r
+\r
+    // Add to rootView\r
+    group->Add(titleLabel);\r
+}\r
+\r
+void TargetView::CreateUIList()\r
+{\r
+    UIView::OnClickListener *clickListener = (UIView::OnClickListener *)OHOS::TrainingPresenter::GetInstance();\r
+    if (clickListener == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "clickListener nullptr");\r
+        return;\r
+    }\r
+\r
+    // Add List to App\r
+    if (targetList == nullptr) {\r
+        targetList = new UIList();\r
+    }\r
+    targetList->SetPosition(LIST_X, LIST_Y);\r
+    targetList->Resize(LIST_W, LIST_H);\r
+    targetList->SetStyle(STYLE_BACKGROUND_COLOR, 0xff000000);\r
+\r
+    // Set additional property\r
+    if (listAdapter_ == nullptr) {\r
+        listAdapter_ = new TargetAdapter();\r
+    }\r
+    listAdapter_->SetItemClickListener(clickListener);\r
+    std::list<TargetItem> targetItemList(targets, targets + TRAINING_TARGET_MAX);\r
+    listAdapter_->SetData(targetItemList);\r
+\r
+    targetList->SetAdapter(listAdapter_);\r
+    targetList->RefreshList();\r
+\r
+    // Add to rootView\r
+    group->Add(targetList);\r
+}\r
+\r
+UIViewGroup *TargetView::InitShowUpView()\r
+{\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "TargetView InitShowUpView");\r
+    if (group == nullptr) {\r
+        group = new UIViewGroup();\r
+        if (group == nullptr) {\r
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "group new fail");\r
+            return nullptr;\r
+        }\r
+        group->SetPosition(0, 0);\r
+        group->SetWidth(HORIZONTAL_RESOLUTION);\r
+        group->SetHeight(VERTICAL_RESOLUTION);\r
+    }\r
+    CreateUILabel();\r
+    CreateUIList();\r
+    UIView::OnDragListener *trainingDragListener = (UIView::OnDragListener *)OHOS::TrainingPresenter::GetInstance();\r
+    if (trainingDragListener == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "trainingDragListener GetInstance fail");\r
+        return nullptr;\r
+    }\r
+    group->SetOnDragListener(trainingDragListener);\r
+    group->SetViewId(TARGET_VIEW_ID);\r
+    group->SetDraggable(true);\r
+    group->SetTouchable(true);\r
+    return group;\r
+}\r
+}
\ No newline at end of file
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/training/src/TrainingAdapter.cpp b/code/sdk/application/wearable/nativeapp/nativeui/training/src/TrainingAdapter.cpp
new file mode 100644 (file)
index 0000000..9ae2d4c
--- /dev/null
@@ -0,0 +1,64 @@
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: TrainingAdapter.cpp\r
+ * Author:\r
+ * Create: 2025-11-23\r
+ */\r
+#include "training/TrainingAdapter.h"\r
+#include "training/TrainingItemView.h"\r
+\r
+namespace OHOS {\r
+TrainingAdapter::TrainingAdapter() {}\r
+\r
+TrainingAdapter::~TrainingAdapter()\r
+{\r
+    listData_.clear();\r
+}\r
+\r
+uint16_t TrainingAdapter::GetCount(void)\r
+{\r
+    return listData_.size();\r
+}\r
+\r
+void TrainingAdapter::SetData(const std::list<TrainingItem> &data)\r
+{\r
+    if (!listData_.empty()) {\r
+        listData_.clear();\r
+    }\r
+    listData_ = data;\r
+}\r
+\r
+UIView *TrainingAdapter::GetView(UIView *inView, int16_t index)\r
+{\r
+    if (listData_.empty()) {\r
+        return nullptr;\r
+    }\r
+    if (index < 0) {\r
+        return nullptr;\r
+    }\r
+    size_t uindex = index;\r
+    if (uindex >= listData_.size()) {\r
+        return nullptr;\r
+    }\r
+\r
+    std::list<TrainingItem>::iterator it = listData_.begin();\r
+    for (int i = 0; i < index; i++) {\r
+        it++;\r
+    }\r
+    TrainingItem itemData = *it;\r
+    TrainingItemView *item = nullptr;\r
+    if (inView == nullptr) {\r
+        item = new TrainingItemView();\r
+    } else {\r
+        item = static_cast<TrainingItemView *>(inView);\r
+    }\r
+    item->SetItemInfo(itemData);\r
+    item->SetOnClickListener(itemClickListener);\r
+    return item;\r
+}\r
+\r
+void TrainingAdapter::AddListItem(const TrainingItem &item)\r
+{\r
+    listData_.push_back(item);\r
+}\r
+}  // namespace OHOS\r
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/training/src/TrainingItemView.cpp b/code/sdk/application/wearable/nativeapp/nativeui/training/src/TrainingItemView.cpp
new file mode 100644 (file)
index 0000000..ff03e79
--- /dev/null
@@ -0,0 +1,78 @@
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: temperature\r
+ * Author:\r
+ * Create: 2025-02-15\r
+ */\r
+\r
+#include "wearable_log.h"\r
+#include "UiConfig.h"\r
+#include "ui_resource_image.h"\r
+#include "training/TrainingItemView.h"\r
+#include "screensetting/ScreenModels.h"\r
+\r
+namespace OHOS {\r
+static constexpr uint16_t ITEM_X = 0;\r
+static constexpr uint16_t ITEM_Y = 0;\r
+static constexpr uint16_t ITEM_W = 382;\r
+static constexpr uint16_t ITEM_H = 100;\r
+static constexpr uint16_t ICON_X = 0;\r
+static constexpr uint16_t ICON_Y = 0;\r
+static constexpr uint16_t LABEL_X = 100;\r
+static constexpr uint16_t LABEL_Y = 0;\r
+static constexpr uint16_t LABEL_W = 200;\r
+static constexpr uint16_t LABEL_H = 100;\r
+static constexpr uint16_t LABEL_FONT = 35;\r
+static constexpr uint16_t IMAGE_W = 300;\r
+static constexpr uint16_t IMAGE_H = 0;\r
+\r
+TrainingItemView::TrainingItemView()\r
+{\r
+    InitView();\r
+}\r
+\r
+TrainingItemView::~TrainingItemView()\r
+{\r
+    Remove(&sIcon);\r
+    Remove(&sLabel);\r
+    Remove(&sSettingImage);\r
+}\r
+\r
+bool TrainingItemView::InitView()\r
+{\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "TrainingItemView::InitView");\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
+\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
+    ScreenModels::GetInstance()->LoadAppImages(DROPDOWN_IAMGES, &sSettingImage, DROPDOWN_DROPDOWN_SETTING);\r
+    sSettingImage.SetPosition(IMAGE_W, IMAGE_H);\r
+    sSettingImage.SetStyle(STYLE_IMAGE_OPA, OPA_OPAQUE);\r
+\r
+    Add(&sIcon);\r
+    Add(&sLabel);\r
+    Add(&sSettingImage);\r
+    return true;\r
+}\r
+\r
+void TrainingItemView::SetItemInfo(const TrainingItem itemInfo)\r
+{\r
+    sItemInfo = itemInfo;\r
+    sIcon.SetSrc(itemInfo.icon);\r
+    sLabel.SetText(itemInfo.label);\r
+    SetViewId(itemInfo.viewId);\r
+}\r
+}
\ No newline at end of file
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/training/src/TrainingModel.cpp b/code/sdk/application/wearable/nativeapp/nativeui/training/src/TrainingModel.cpp
new file mode 100644 (file)
index 0000000..9efb702
--- /dev/null
@@ -0,0 +1,40 @@
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: TrainingModel.cpp\r
+ * Author:\r
+ * Create: 2025-11-23\r
+ */\r
+\r
+#include "training/TrainingModel.h"\r
+\r
+namespace OHOS {\r
+TrainingModel::TrainingModel() {}\r
+\r
+TrainingModel::~TrainingModel() {}\r
+\r
+TrainingModel &TrainingModel::GetInstance()\r
+{\r
+    static TrainingModel instance;\r
+    return instance;\r
+}\r
+\r
+void TrainingModel::SetCurView(int16_t viewNum)\r
+{\r
+    curView_ = viewNum;\r
+}\r
+\r
+int16_t TrainingModel::GetCurView(void)\r
+{\r
+    return curView_;\r
+}\r
+\r
+void TrainingModel::SetCurTrainingType(int8_t trainingType)\r
+{\r
+    trainingType_ = trainingType;\r
+}\r
+\r
+int8_t TrainingModel::GetCurTrainingType(void)\r
+{\r
+    return trainingType_;\r
+}\r
+}\r
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/training/src/TrainingPresenter.cpp b/code/sdk/application/wearable/nativeapp/nativeui/training/src/TrainingPresenter.cpp
new file mode 100644 (file)
index 0000000..5c34aa1
--- /dev/null
@@ -0,0 +1,213 @@
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SettingPresenter.cpp\r
+ * Author:\r
+ * Create: 2025-11-23\r
+ */\r
+\r
+#include "training/TrainingModel.h"\r
+#include "training/TrainingPresenter.h"\r
+#include "NativeRegisterManager.h"\r
+namespace OHOS {\r
+\r
+REGIST_MENU(VIEW_TRAINING, TrainingView, TrainingPresenter, PNG_APPLIST_WALK_IMAGE, PNG_APPLIST_DEFAULT_IMG,\r
+            "体能训练");\r
+\r
+static TrainingPresenter *g_trainingPresenter = nullptr;\r
+TrainingPresenter::TrainingPresenter()\r
+{\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "TrainingPresenter::TrainingPresenter");\r
+    trainingModel_ = &TrainingModel::GetInstance();\r
+    g_trainingPresenter = this;\r
+}\r
+\r
+TrainingPresenter::~TrainingPresenter()\r
+{\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "TrainingPresenter::~TrainingPresenter");\r
+    g_trainingPresenter = nullptr;\r
+}\r
+\r
+TrainingPresenter *TrainingPresenter::GetInstance(void)\r
+{\r
+    return g_trainingPresenter;\r
+}\r
+\r
+void TrainingPresenter::OnResume(void)\r
+{\r
+    Presenter<TrainingView>::OnResume();\r
+}\r
+\r
+void TrainingPresenter::OnPause(void)\r
+{\r
+    Presenter<TrainingView>::OnPause();\r
+    return;\r
+}\r
+\r
+void TrainingPresenter::ClickStartButton(void)\r
+{\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "TrainingPresenter::OnClick ClickStartButton");\r
+    view_->ChangeView(TRAINING_VIEW_PREPARE, TRAINING_VIEW_DATA);\r
+    DataView::GetInstance()->UpdateDataViewByType();\r
+}\r
+\r
+void TrainingPresenter::ClickCountineButton(void)\r
+{\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "TrainingPresenter::OnClick ClickCountineButton");\r
+    view_->ChangeView(TRAINING_VIEW_PAUSE, TRAINING_VIEW_DATA);\r
+    DataView::GetInstance()->UpdateDataViewByType();\r
+}\r
+\r
+void TrainingPresenter::ClickFinishButton(void)\r
+{\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "TrainingPresenter::OnClick ClickFinishButton");\r
+    view_->ChangeView(TRAINING_VIEW_PAUSE, TRAINING_VIEW_PROMPT);\r
+}\r
+\r
+void TrainingPresenter::ClickCancelButton(void)\r
+{\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "TrainingPresenter::OnClick ClickCancelButton");\r
+    view_->ChangeView(TRAINING_VIEW_PROMPT, TRAINING_VIEW_PAUSE);\r
+}\r
+\r
+void TrainingPresenter::ClickConfirmButton(void)\r
+{\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "TrainingPresenter::OnClick ClickConfirmButton");\r
+    view_->ChangeView(TRAINING_VIEW_PROMPT, TRAINING_VIEW_MENU);\r
+}\r
+\r
+void TrainingPresenter::TrainingSetting(uint8_t trainingType)\r
+{\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "TrainingPresenter::OnClick TrainingSetting, type = %d", trainingType);\r
+    view_->ChangeView(TRAINING_VIEW_MENU, TRAINING_VIEW_SETTING);\r
+}\r
+\r
+void TrainingPresenter::StartTraining(uint8_t trainingType)\r
+{\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "TrainingPresenter::OnClick TrainingSetting, type = %d", trainingType);\r
+    view_->ChangeView(TRAINING_VIEW_MENU, TRAINING_VIEW_PREPARE);\r
+    trainingModel_->SetCurTrainingType(trainingType);\r
+    PrepareView::GetInstance()->UpdateViewByTrainingType(trainingType);\r
+}\r
+\r
+void TrainingPresenter::EnterTarget(void)\r
+{\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "TrainingPresenter::OnClick EnterTarget");\r
+    view_->ChangeView(TRAINING_VIEW_SETTING, TRAINING_VIEW_TARGET);\r
+}\r
+\r
+void TrainingPresenter::SettingTarget(uint8_t targetType)\r
+{\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "TrainingPresenter::OnClick SettingTarget, type = %d", targetType);\r
+    view_->ChangeView(TRAINING_VIEW_TARGET, TRAINING_VIEW_TARGET_SETTING);\r
+    TargetSettingView::GetInstance()->UpdateViewByTargetType(targetType);\r
+}\r
+\r
+void TrainingPresenter::ConfirmTargetSetting(void)\r
+{\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "TrainingPresenter::OnClick ConfirmTargetSetting");\r
+    view_->ChangeView(TRAINING_VIEW_TARGET_SETTING, TRAINING_VIEW_SETTING);\r
+}\r
+\r
+bool TrainingPresenter::OnClick(UIView &view, const ClickEvent &event)\r
+{\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "TrainingPresent::OnClick view:%s", view.GetViewId());\r
+    bool isSettingClicked = event.GetCurrentPos().x > 350 ? true : false;\r
+    if (strcmp(view.GetViewId(), TRAINING_PREPARE_START_BUTTON) == 0) {\r
+        ClickStartButton();\r
+    } else if (strcmp(view.GetViewId(), TRAINING_PAUSE_CONTINUE_BUTTON) == 0) {\r
+        ClickCountineButton();\r
+    } else if (strcmp(view.GetViewId(), TRAINING_PAUSE_FINISH_BUTTON) == 0) {\r
+        ClickFinishButton();\r
+    } else if (strcmp(view.GetViewId(), TRAINING_PROMPT_CANCEL_BUTTON) == 0) {\r
+        ClickCancelButton();\r
+    } else if (strcmp(view.GetViewId(), TRAINING_PROMPT_CONFIRM_BUTTON) == 0) {\r
+        ClickConfirmButton();\r
+    } else if (strcmp(view.GetViewId(), TRAINING_SETTING_ITEM_TARGET) == 0) {\r
+        EnterTarget();\r
+    } else if (strcmp(view.GetViewId(), TRAINING_TARGET_ITEM_DISTANCE) == 0) {\r
+        SettingTarget(TRAINING_TARGET_DISTANCE);\r
+    } else if (strcmp(view.GetViewId(), TRAINING_TARGET_ITEM_TIME) == 0) {\r
+        SettingTarget(TRAINING_TARGET_TIME);\r
+    } else if (strcmp(view.GetViewId(), TRAINING_TARGET_ITEM_CALORIE) == 0) {\r
+        SettingTarget(TRAINING_TARGET_CALORIE);\r
+    } else if (strcmp(view.GetViewId(), TARGET_SETTING_CONFIRM_BUTTON) == 0) {\r
+        ConfirmTargetSetting();\r
+    } else if (strcmp(view.GetViewId(), TRAINING_ITEM_OUTDOOR_RUNNING) == 0) {\r
+        if (isSettingClicked) {\r
+            TrainingSetting(TRAINING_TYPE_OUTDOOR_RUNNING);\r
+        } else {\r
+            StartTraining(TRAINING_TYPE_OUTDOOR_RUNNING);\r
+        }\r
+    } else if (strcmp(view.GetViewId(), TRAINING_ITEM_INDOOR_RUNNING) == 0) {\r
+        if (isSettingClicked) {\r
+            TrainingSetting(TRAINING_TYPE_INDOOR_RUNNING);\r
+        } else {\r
+            StartTraining(TRAINING_TYPE_INDOOR_RUNNING);\r
+        }\r
+    } else if (strcmp(view.GetViewId(), TRAINING_ITEM_CYCLING) == 0) {\r
+        if (isSettingClicked) {\r
+            TrainingSetting(TRAINING_TYPE_CYCLING);\r
+        } else {\r
+            StartTraining(TRAINING_TYPE_CYCLING);\r
+        }\r
+    } else if (strcmp(view.GetViewId(), TRAINING_ITEM_CLIMBING) == 0) {\r
+        if (isSettingClicked) {\r
+            TrainingSetting(TRAINING_TYPE_CLIMBING);\r
+        } else {\r
+            StartTraining(TRAINING_TYPE_CLIMBING);\r
+        }\r
+    } else if (strcmp(view.GetViewId(), TRAINING_ITEM_INDOOR_SWIMMING) == 0) {\r
+        if (isSettingClicked) {\r
+            TrainingSetting(TRAINING_TYPE_INDOOR_SWIMMING);\r
+        } else {\r
+            StartTraining(TRAINING_TYPE_INDOOR_SWIMMING);\r
+        }\r
+    } else if (strcmp(view.GetViewId(), TRAINING_ITEM_OUTDOOR_SWIMMING) == 0) {\r
+        if (isSettingClicked) {\r
+            TrainingSetting(TRAINING_TYPE_OUTDOOR_SWIMMING);\r
+        } else {\r
+            StartTraining(TRAINING_TYPE_OUTDOOR_SWIMMING);\r
+        }\r
+    }\r
+    return true;\r
+}\r
+\r
+bool TrainingPresenter::OnDrag(UIView &view, const DragEvent &event)\r
+{\r
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "TrainingOnDragListener::OnDrag");\r
+    if (event.GetDragDirection() == DragEvent::DIRECTION_RIGHT_TO_LEFT) {\r
+        if (strcmp(view.GetViewId(), MENU_VIEW_ID) == 0) {\r
+            // view_->ChangeView(TRAINING_VIEW_MENU, TRAINING_VIEW_PREPARE);\r
+        } else if (strcmp(view.GetViewId(), PREPARE_VIEW_ID) == 0) {\r
+            // view_->ChangeView(TRAINING_VIEW_PREPARE, TRAINING_VIEW_DATA);\r
+            // DataView::GetInstance()->UpdateDataViewByType();\r
+        } else if (strcmp(view.GetViewId(), DATA_VIEW_ID) == 0) {\r
+            view_->ChangeView(TRAINING_VIEW_DATA, TRAINING_VIEW_PAUSE);\r
+        } else if (strcmp(view.GetViewId(), PAUSE_VIEW_ID) == 0) {\r
+            // view_->ChangeView(TRAINING_VIEW_PAUSE, TRAINING_VIEW_PROMPT);\r
+        } else if (strcmp(view.GetViewId(), PROMPT_VIEW_ID) == 0) {\r
+            // view_->ChangeView(TRAINING_VIEW_PROMPT, TRAINING_VIEW_MENU);\r
+        }\r
+    } else if (event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT) {\r
+        if (strcmp(view.GetViewId(), MENU_VIEW_ID) == 0) {\r
+            NativeAbility::GetInstance().ChangeSlice(VIEW_APPLIST);\r
+        } else if (strcmp(view.GetViewId(), PREPARE_VIEW_ID) == 0) {\r
+            view_->ChangeView(TRAINING_VIEW_PREPARE, TRAINING_VIEW_MENU);\r
+        } else if (strcmp(view.GetViewId(), DATA_VIEW_ID) == 0) {\r
+            view_->ChangeView(TRAINING_VIEW_DATA, TRAINING_VIEW_PREPARE);\r
+        } else if (strcmp(view.GetViewId(), PAUSE_VIEW_ID) == 0) {\r
+            view_->ChangeView(TRAINING_VIEW_PAUSE, TRAINING_VIEW_DATA);\r
+        } else if (strcmp(view.GetViewId(), PROMPT_VIEW_ID) == 0) {\r
+            view_->ChangeView(TRAINING_VIEW_PROMPT, TRAINING_VIEW_PAUSE);\r
+        } else if (strcmp(view.GetViewId(), SETTING_VIEW_ID) == 0) {\r
+            view_->ChangeView(TRAINING_VIEW_SETTING, TRAINING_VIEW_MENU);\r
+        } else if (strcmp(view.GetViewId(), TARGET_VIEW_ID) == 0) {\r
+            view_->ChangeView(TRAINING_VIEW_TARGET, TRAINING_VIEW_SETTING);\r
+        } else if (strcmp(view.GetViewId(), TARGET_SETTING_VIEW_ID) == 0) {\r
+            view_->ChangeView(TRAINING_VIEW_TARGET_SETTING, TRAINING_VIEW_TARGET);\r
+        }\r
+    }\r
+    return false;\r
+}\r
+\r
+}\r
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/training/src/TrainingSettingAdapter.cpp b/code/sdk/application/wearable/nativeapp/nativeui/training/src/TrainingSettingAdapter.cpp
new file mode 100644 (file)
index 0000000..f7fa899
--- /dev/null
@@ -0,0 +1,64 @@
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: TrainingSettingAdapter.cpp\r
+ * Author:\r
+ * Create: 2025-11-23\r
+ */\r
+#include "training/TrainingSettingAdapter.h"\r
+#include "training/TrainingSettingItemView.h"\r
+\r
+namespace OHOS {\r
+TrainingSettingAdapter::TrainingSettingAdapter() {}\r
+\r
+TrainingSettingAdapter::~TrainingSettingAdapter()\r
+{\r
+    listData_.clear();\r
+}\r
+\r
+uint16_t TrainingSettingAdapter::GetCount(void)\r
+{\r
+    return listData_.size();\r
+}\r
+\r
+void TrainingSettingAdapter::SetData(const std::list<TrainingSettingItem> &data)\r
+{\r
+    if (!listData_.empty()) {\r
+        listData_.clear();\r
+    }\r
+    listData_ = data;\r
+}\r
+\r
+UIView *TrainingSettingAdapter::GetView(UIView *inView, int16_t index)\r
+{\r
+    if (listData_.empty()) {\r
+        return nullptr;\r
+    }\r
+    if (index < 0) {\r
+        return nullptr;\r
+    }\r
+    size_t uindex = index;\r
+    if (uindex >= listData_.size()) {\r
+        return nullptr;\r
+    }\r
+\r
+    std::list<TrainingSettingItem>::iterator it = listData_.begin();\r
+    for (int i = 0; i < index; i++) {\r
+        it++;\r
+    }\r
+    TrainingSettingItem itemData = *it;\r
+    TrainingSettingItemView *item = nullptr;\r
+    if (inView == nullptr) {\r
+        item = new TrainingSettingItemView();\r
+    } else {\r
+        item = static_cast<TrainingSettingItemView *>(inView);\r
+    }\r
+    item->SetItemInfo(itemData);\r
+    item->SetOnClickListener(itemClickListener);\r
+    return item;\r
+}\r
+\r
+void TrainingSettingAdapter::AddListItem(const TrainingSettingItem &item)\r
+{\r
+    listData_.push_back(item);\r
+}\r
+}  // namespace OHOS\r
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/training/src/TrainingSettingItemView.cpp b/code/sdk/application/wearable/nativeapp/nativeui/training/src/TrainingSettingItemView.cpp
new file mode 100644 (file)
index 0000000..4d135b4
--- /dev/null
@@ -0,0 +1,75 @@
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: TrainingSettingItemView.cpp\r
+ * Author:\r
+ * Create: 2025-02-15\r
+ */\r
+\r
+#include "wearable_log.h"\r
+#include "UiConfig.h"\r
+#include "training/TrainingSettingItemView.h"\r
+\r
+namespace OHOS {\r
+static constexpr uint16_t ITEM_X = 0;\r
+static constexpr uint16_t ITEM_Y = 0;\r
+static constexpr uint16_t ITEM_W = 382;\r
+static constexpr uint16_t ITEM_H = 100;\r
+static constexpr uint16_t ICON_X = 0;\r
+static constexpr uint16_t ICON_Y = 0;\r
+static constexpr uint16_t LABEL_X = 100;\r
+static constexpr uint16_t LABEL_Y = 0;\r
+static constexpr uint16_t LABEL_W = 200;\r
+static constexpr uint16_t LABEL_H = 100;\r
+static constexpr uint16_t LABEL_FONT = 35;\r
+static constexpr uint16_t IMAGE_W = 300;\r
+static constexpr uint16_t IMAGE_H = 0;\r
+\r
+TrainingSettingItemView::TrainingSettingItemView()\r
+{\r
+    InitView();\r
+}\r
+\r
+TrainingSettingItemView::~TrainingSettingItemView()\r
+{\r
+    Remove(&sIcon);\r
+    Remove(&sLabel);\r
+    Remove(&sNextImage);\r
+}\r
+\r
+bool TrainingSettingItemView::InitView()\r
+{\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "TrainingSettingItemView::InitView");\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
+\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
+    sNextImage.SetSrc(PNG_SETTING_NEXT_IMAGE);\r
+    sNextImage.SetPosition(IMAGE_W, IMAGE_H);\r
+    sNextImage.SetStyle(STYLE_IMAGE_OPA, OPA_OPAQUE);\r
+    Add(&sIcon);\r
+    Add(&sLabel);\r
+    Add(&sNextImage);\r
+    return true;\r
+}\r
+\r
+void TrainingSettingItemView::SetItemInfo(const TrainingSettingItem itemInfo)\r
+{\r
+    sItemInfo = itemInfo;\r
+    sIcon.SetSrc(itemInfo.icon);\r
+    sLabel.SetText(itemInfo.label);\r
+    SetViewId(itemInfo.viewId);\r
+}\r
+}
\ No newline at end of file
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/training/src/TrainingSettingView.cpp b/code/sdk/application/wearable/nativeapp/nativeui/training/src/TrainingSettingView.cpp
new file mode 100644 (file)
index 0000000..04d8686
--- /dev/null
@@ -0,0 +1,134 @@
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: TrainingSettingView\r
+ * Create: 2025-03-22\r
+ */\r
+#include "training/TrainingSettingView.h"\r
+#include "wearable_log.h"\r
+#include "UiConfig.h"\r
+#include "training/TrainingPresenter.h"\r
+\r
+namespace OHOS {\r
+static constexpr uint16_t LABELS_X = 133;\r
+static constexpr uint16_t LABELS_Y = 36;\r
+static constexpr uint16_t LABELS_W = 200;\r
+static constexpr uint16_t LABELS_H = 60;\r
+static constexpr uint16_t LABELS_FONT = 50;\r
+static constexpr uint16_t LIST_X = 42;\r
+static constexpr uint16_t LIST_Y = 95;\r
+static constexpr uint16_t LIST_W = 382;\r
+static constexpr uint16_t LIST_H = 305;\r
+\r
+static TrainingSettingView *g_pSettingView{nullptr};\r
+\r
+TrainingSettingView::TrainingSettingView()\r
+{\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "TrainingSettingView::TrainingSettingView");\r
+    g_pSettingView = this;\r
+}\r
+\r
+TrainingSettingView::~TrainingSettingView()\r
+{\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "TrainingSettingView::~TrainingSettingView");\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 (settingList != nullptr) {\r
+        delete settingList;\r
+        settingList = nullptr;\r
+    }\r
+    if (listAdapter_ != nullptr) {\r
+        delete listAdapter_;\r
+        listAdapter_ = nullptr;\r
+    }\r
+    g_pSettingView = nullptr;\r
+}\r
+\r
+TrainingSettingView *TrainingSettingView::GetInstance()\r
+{\r
+    return g_pSettingView;\r
+}\r
+\r
+void TrainingSettingView::CreateUILabel()\r
+{\r
+    // Add Label to App\r
+    if (titleLabel == nullptr) {\r
+        titleLabel = new UILabel();\r
+    }\r
+    titleLabel->SetPosition(LABELS_X, LABELS_Y);\r
+    titleLabel->Resize(LABELS_W, LABELS_H);\r
+\r
+    // Set additional property\r
+    titleLabel->SetText("设置");\r
+    titleLabel->SetLineBreakMode(UILabel::LINE_BREAK_ADAPT);\r
+    titleLabel->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+    titleLabel->SetFont(DEFAULT_VECTOR_FONT_FILENAME, LABELS_FONT);\r
+\r
+    // Add to rootView\r
+    group->Add(titleLabel);\r
+}\r
+\r
+void TrainingSettingView::CreateUIList()\r
+{\r
+    UIView::OnClickListener *clickListener = (UIView::OnClickListener *)OHOS::TrainingPresenter::GetInstance();\r
+    if (clickListener == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "clickListener nullptr");\r
+        return;\r
+    }\r
+\r
+    // Add List to App\r
+    if (settingList == nullptr) {\r
+        settingList = new UIList();\r
+    }\r
+    settingList->SetPosition(LIST_X, LIST_Y);\r
+    settingList->Resize(LIST_W, LIST_H);\r
+    settingList->SetStyle(STYLE_BACKGROUND_COLOR, 0xff000000);\r
+\r
+    // Set additional property\r
+    if (listAdapter_ == nullptr) {\r
+        listAdapter_ = new TrainingSettingAdapter();\r
+    }\r
+    listAdapter_->SetItemClickListener(clickListener);\r
+    std::list<TrainingSettingItem> trainingSettingItemList(settings, settings + TRAINING_SETTING_MAX);\r
+    listAdapter_->SetData(trainingSettingItemList);\r
+\r
+    settingList->SetAdapter(listAdapter_);\r
+    settingList->RefreshList();\r
+\r
+    // Add to rootView\r
+    group->Add(settingList);\r
+}\r
+\r
+UIViewGroup *TrainingSettingView::InitShowUpView()\r
+{\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "TrainingSettingView InitShowUpView");\r
+    if (group == nullptr) {\r
+        group = new UIViewGroup();\r
+        if (group == nullptr) {\r
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "group new fail");\r
+            return nullptr;\r
+        }\r
+        group->SetPosition(0, 0);\r
+        group->SetWidth(HORIZONTAL_RESOLUTION);\r
+        group->SetHeight(VERTICAL_RESOLUTION);\r
+    }\r
+    CreateUILabel();\r
+    CreateUIList();\r
+    UIView::OnDragListener *trainingDragListener = (UIView::OnDragListener *)OHOS::TrainingPresenter::GetInstance();\r
+    if (trainingDragListener == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "trainingDragListener GetInstance fail");\r
+        return nullptr;\r
+    }\r
+    group->SetOnDragListener(trainingDragListener);\r
+    group->SetViewId(SETTING_VIEW_ID);\r
+    group->SetDraggable(true);\r
+    group->SetTouchable(true);\r
+    return group;\r
+}\r
+}
\ No newline at end of file
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/training/src/TrainingView.cpp b/code/sdk/application/wearable/nativeapp/nativeui/training/src/TrainingView.cpp
new file mode 100644 (file)
index 0000000..0b2d1fa
--- /dev/null
@@ -0,0 +1,297 @@
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: TrainingView.cpp\r
+ * Author:\r
+ * Create: 2025-11-23\r
+ */\r
+\r
+#include "training/TrainingView.h"\r
+#include "training/TrainingPresenter.h"\r
+#include "wearable_log.h"\r
+\r
+namespace OHOS {\r
+static TrainingView *g_pTrainingView = nullptr;\r
+\r
+TrainingView::TrainingView()\r
+{\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "TrainingView::TrainingView");\r
+    preProcessView[TRAINING_VIEW_MENU] = &TrainingView::ChangeMenuView;\r
+    preProcessView[TRAINING_VIEW_PREPARE] = &TrainingView::ChangePrepareView;\r
+    preProcessView[TRAINING_VIEW_DATA] = &TrainingView::ChangeDataView;\r
+    preProcessView[TRAINING_VIEW_PAUSE] = &TrainingView::ChangePauseView;\r
+    preProcessView[TRAINING_VIEW_PROMPT] = &TrainingView::ChangePromptView;\r
+    preProcessView[TRAINING_VIEW_SETTING] = &TrainingView::ChangeSettingView;\r
+    preProcessView[TRAINING_VIEW_TARGET] = &TrainingView::ChangeTargetView;\r
+    preProcessView[TRAINING_VIEW_TARGET_SETTING] = &TrainingView::ChangeTargetSettingView;\r
+    g_pTrainingView = this;\r
+}\r
+\r
+TrainingView::~TrainingView()\r
+{\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "TrainingView::~TrainingView");\r
+    g_pTrainingView = nullptr;\r
+}\r
+\r
+TrainingView *TrainingView::GetInstance()\r
+{\r
+    return g_pTrainingView;\r
+}\r
+\r
+void TrainingView::OnStart()\r
+{\r
+    ChangeView(TRAINING_VIEW_MAX, TRAINING_VIEW_MENU);\r
+}\r
+\r
+void TrainingView::OnStop()\r
+{\r
+    if (menuView != nullptr) {\r
+        delete menuView;\r
+        menuView = nullptr;\r
+    }\r
+    if (prepareView != nullptr) {\r
+        delete prepareView;\r
+        prepareView = nullptr;\r
+    }\r
+    if (dataView != nullptr) {\r
+        delete dataView;\r
+        dataView = nullptr;\r
+    }\r
+    if (pauseView != nullptr) {\r
+        delete pauseView;\r
+        pauseView = nullptr;\r
+    }\r
+    if (promptView != nullptr) {\r
+        delete promptView;\r
+        promptView = nullptr;\r
+    }\r
+    if (settingView != nullptr) {\r
+        delete settingView;\r
+        settingView = nullptr;\r
+    }\r
+    if (targetView != nullptr) {\r
+        delete targetView;\r
+        targetView = nullptr;\r
+    }\r
+    if (targetSettingView != nullptr) {\r
+        delete targetSettingView;\r
+        targetSettingView = nullptr;\r
+    }\r
+}\r
+\r
+bool TrainingView::ChangeMenuView(int16_t hideView, int16_t thisView)\r
+{\r
+    UNUSED(hideView);\r
+    if (container[thisView] == nullptr) {\r
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ChangeMenuView");\r
+        menuView = new MenuView();\r
+        if (menuView == nullptr) {\r
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "TrainingView new fail");\r
+            return false;\r
+        }\r
+        // init view\r
+        UIViewGroup *group = menuView->InitShowUpView();\r
+        if (group == nullptr) {\r
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "group nullptr fail");\r
+            return false;\r
+        }\r
+        container[thisView] = group;\r
+        AddViewToRootContainer(container[thisView]);\r
+    }\r
+    return true;\r
+}\r
+\r
+bool TrainingView::ChangePrepareView(int16_t hideView, int16_t thisView)\r
+{\r
+    UNUSED(hideView);\r
+    if (container[thisView] == nullptr) {\r
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ChangePrepareView");\r
+        prepareView = new PrepareView();\r
+        if (prepareView == nullptr) {\r
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "TrainingView new fail");\r
+            return false;\r
+        }\r
+        // init view\r
+        UIViewGroup *group = prepareView->InitShowUpView();\r
+        if (group == nullptr) {\r
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "group nullptr fail");\r
+            return false;\r
+        }\r
+        container[thisView] = group;\r
+        AddViewToRootContainer(container[thisView]);\r
+    }\r
+    return true;\r
+}\r
+\r
+bool TrainingView::ChangeDataView(int16_t hideView, int16_t thisView)\r
+{\r
+    UNUSED(hideView);\r
+    if (container[thisView] == nullptr) {\r
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ChangeDataView");\r
+        dataView = new DataView();\r
+        if (dataView == nullptr) {\r
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "TrainingView new fail");\r
+            return false;\r
+        }\r
+        // init view\r
+        UIViewGroup *group = dataView->InitShowUpView();\r
+        if (group == nullptr) {\r
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "group nullptr fail");\r
+            return false;\r
+        }\r
+        container[thisView] = group;\r
+        AddViewToRootContainer(container[thisView]);\r
+    }\r
+    return true;\r
+}\r
+\r
+bool TrainingView::ChangePauseView(int16_t hideView, int16_t thisView)\r
+{\r
+    UNUSED(hideView);\r
+    if (container[thisView] == nullptr) {\r
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ChangePauseView");\r
+        pauseView = new PauseView();\r
+        if (pauseView == nullptr) {\r
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "TrainingView new fail");\r
+            return false;\r
+        }\r
+        // init view\r
+        UIViewGroup *group = pauseView->InitShowUpView();\r
+        if (group == nullptr) {\r
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "group nullptr fail");\r
+            return false;\r
+        }\r
+        container[thisView] = group;\r
+        AddViewToRootContainer(container[thisView]);\r
+    }\r
+    return true;\r
+}\r
+\r
+bool TrainingView::ChangePromptView(int16_t hideView, int16_t thisView)\r
+{\r
+    UNUSED(hideView);\r
+    if (container[thisView] == nullptr) {\r
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ChangePromptView");\r
+        promptView = new PromptView();\r
+        if (promptView == nullptr) {\r
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "TrainingView new fail");\r
+            return false;\r
+        }\r
+        // init view\r
+        UIViewGroup *group = promptView->InitShowUpView();\r
+        if (group == nullptr) {\r
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "group nullptr fail");\r
+            return false;\r
+        }\r
+        container[thisView] = group;\r
+        AddViewToRootContainer(container[thisView]);\r
+    }\r
+    return true;\r
+}\r
+\r
+bool TrainingView::ChangeSettingView(int16_t hideView, int16_t thisView)\r
+{\r
+    UNUSED(hideView);\r
+    if (container[thisView] == nullptr) {\r
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ChangeSettingView");\r
+        settingView = new TrainingSettingView();\r
+        if (settingView == nullptr) {\r
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "TrainingView new fail");\r
+            return false;\r
+        }\r
+        // init view\r
+        UIViewGroup *group = settingView->InitShowUpView();\r
+        if (group == nullptr) {\r
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "group nullptr fail");\r
+            return false;\r
+        }\r
+        container[thisView] = group;\r
+        AddViewToRootContainer(container[thisView]);\r
+    }\r
+    return true;\r
+}\r
+\r
+bool TrainingView::ChangeTargetView(int16_t hideView, int16_t thisView)\r
+{\r
+    UNUSED(hideView);\r
+    if (container[thisView] == nullptr) {\r
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ChangeTargetView");\r
+        targetView = new TargetView();\r
+        if (targetView == nullptr) {\r
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "TrainingView new fail");\r
+            return false;\r
+        }\r
+        // init view\r
+        UIViewGroup *group = targetView->InitShowUpView();\r
+        if (group == nullptr) {\r
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "group nullptr fail");\r
+            return false;\r
+        }\r
+        container[thisView] = group;\r
+        AddViewToRootContainer(container[thisView]);\r
+    }\r
+    return true;\r
+}\r
+\r
+bool TrainingView::ChangeTargetSettingView(int16_t hideView, int16_t thisView)\r
+{\r
+    UNUSED(hideView);\r
+    if (container[thisView] == nullptr) {\r
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ChangeTargetSettingView");\r
+        targetSettingView = new TargetSettingView();\r
+        if (targetSettingView == nullptr) {\r
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "TrainingView new fail");\r
+            return false;\r
+        }\r
+        // init view\r
+        UIViewGroup *group = targetSettingView->InitShowUpView();\r
+        if (group == nullptr) {\r
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "group nullptr fail");\r
+            return false;\r
+        }\r
+        container[thisView] = group;\r
+        AddViewToRootContainer(container[thisView]);\r
+    }\r
+    return true;\r
+}\r
+\r
+bool TrainingView::CheckViewParam(int16_t hideView, int16_t showView)\r
+{\r
+    if (showView < 0 || showView >= TRAINING_VIEW_MAX) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "TrainingView::CheckViewParam showView err.");\r
+        return false;\r
+    }\r
+\r
+    if (hideView < 0 || hideView > TRAINING_VIEW_MAX) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "TrainingView::CheckViewParam hideView err.");\r
+        return false;\r
+    }\r
+\r
+    return true;\r
+}\r
+\r
+void TrainingView::ChangeView(int16_t hideView, int16_t showView)\r
+{\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "TrainingView::ChangeView %d, %d", hideView, showView);\r
+\r
+    if (!CheckViewParam(hideView, showView)) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "TrainingView::CheckViewParam failed.");\r
+        return;\r
+    }\r
+\r
+    PreprosssChangeView tmpPreProcessView = preProcessView[showView];\r
+\r
+    if (!(this->*tmpPreProcessView)(hideView, showView)) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "TrainingView::ChangeView %d %dfailed", showView, hideView);\r
+        return;\r
+    }\r
+    if (hideView != TRAINING_VIEW_MAX) {\r
+        if (container[hideView] == nullptr) {\r
+            return;\r
+        }\r
+        container[hideView]->SetVisible(false);\r
+    }\r
+    container[showView]->SetVisible(true);\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "TrainingView:: ChangeView end!!!%d", showView);\r
+    Draw();\r
+}\r
+}\r
index 4336484..68a7572 100644 (file)
@@ -5,7 +5,7 @@
  * Create: 2021-11-23
  */
 
-#include "UISampleModel.h"
+#include "uisample/UISampleModel.h"
 
 namespace OHOS {
     UISampleModel::UISampleModel() {}
index ff790b6..7d42911 100644 (file)
@@ -5,10 +5,10 @@
  * Create: 2021-11-23
  */
 
-#include "UISampleView.h"
-#include "UISampleModel.h"
-#include "UISamplePresenter.h"
-#include "ui_service.h"
+#include "uisample/UISampleView.h"
+#include "uisample/UISampleModel.h"
+#include "uisample/UISamplePresenter.h"
+#include "uiservice/ui_service.h"
 #include "NativeRegisterManager.h"
 
 namespace OHOS {
@@ -25,13 +25,11 @@ REGIST_MENU(VIEW_UISAMPLE, UISampleView, UISamplePresenter, PNG_APPLIST_UI_SAMPL
 
     void UISamplePresenter::OnResume(void)
     {
-        Presenter<UISampleView>::OnResume();
         SendMsgToUIService(UI_ADD_SLEEP_VETO, 0, nullptr, 0);
     }
 
     void UISamplePresenter::OnPause(void)
     {
-        Presenter<UISampleView>::OnPause();
         SendMsgToUIService(UI_RM_SLEEP_VETO, 0, nullptr, 0);
         return;
     }
index d2d7777..4dbb809 100644 (file)
@@ -7,8 +7,8 @@
 
 #include <string>
 
-#include "UISampleView.h"
-#include "UISamplePresenter.h"
+#include "uisample/UISampleView.h"
+#include "uisample/UISamplePresenter.h"
 #include "ui_test_group.h"
 
 namespace OHOS {
index e47e34e..c2188a4 100644 (file)
@@ -40,6 +40,7 @@
 #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"
 namespace OHOS {
 void UITestGroup::AddTestCase(TestCaseInfo testCaseInfo)
 {
@@ -81,6 +82,7 @@ void UITestGroup::SetUpTestCase()
     testCaseList_->PushBack(TestCaseInfo{"足球效果", new UITestIcosahedron()});
     testCaseList_->PushBack(TestCaseInfo{"滑动冲突", new UITestNested()});
     testCaseList_->PushBack(TestCaseInfo{"粒子效果", new UITestParticle()});
+    testCaseList_->PushBack(TestCaseInfo{"Lottie", new UITestLottie()});
 }
 
 List<TestCaseInfo>& UITestGroup::GetTestCase()
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/uiservice/src/ui_language.cpp b/code/sdk/application/wearable/nativeapp/nativeui/uiservice/src/ui_language.cpp
new file mode 100644 (file)
index 0000000..60adfc1
--- /dev/null
@@ -0,0 +1,72 @@
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025. All rights reserved.\r
+ * Description: Breath Ease\r
+ * Author: wangle\r
+ * Create: 2025-4-23\r
+ */\r
+#include "uiservice/ui_language.h"\r
+#include "ui_resource_string.h"\r
+#include "font/font_global_manager.h"\r
+#include "nv.h"\r
+#include "wearable_log.h"\r
+\r
+#include "nv_config/include/key_id.h"\r
+#include "nv_config/include/common.h"\r
+#include "nv.h"\r
+\r
+namespace OHOS {\r
+static constexpr const char *BIN_LANG_EN = "/music/font/en.lang";\r
+static constexpr const char *BIN_LANG_ZH = "/music/font/zh.lang";\r
+\r
+const char* UILanguage::GetText(uint16_t textId)\r
+{\r
+    if (RegisterGlobalManager()) {\r
+        return FontGlobalManager::GetInstance()->GetText(textId);\r
+    }\r
+    return nullptr;\r
+}\r
+void UILanguage::SetLanguage(uint8_t id)\r
+{\r
+    sys_language_id_t lang_id = {.language_id = id};\r
+\r
+    errcode_t ret = uapi_nv_write(NV_ID_SYS_LANGUAGE_ID, (uint8_t*)&lang_id, sizeof(sys_language_id_t));\r
+    if (ret != ERRCODE_SUCC) {\r
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "nv set language id error, ret=%u", ret);\r
+        return;\r
+    }\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "set language id = %u", lang_id.language_id);\r
+    UpdateLanguage();\r
+}\r
+void UILanguage::UpdateLanguage()\r
+{\r
+    sys_language_id_t lang_id = {0};\r
+    uint16_t  nvsize = 0;\r
+\r
+    errcode_t ret = uapi_nv_read(NV_ID_SYS_LANGUAGE_ID, sizeof(sys_language_id_t), &nvsize, (uint8_t*)&lang_id);\r
+    if (ret != ERRCODE_SUCC) {\r
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "nv get language id error, ret=%u", ret);\r
+        return;\r
+    }\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "language nvsize=%u id = %u", nvsize, lang_id.language_id);\r
+    if (RegisterGlobalManager()) {\r
+        if (lang_id.language_id<0 || lang_id.language_id > OHOS::LANGUAGE_ID_MAX) {\r
+            lang_id.language_id = OHOS::LANGUAGE_ID_ZH;\r
+        }\r
+        FontGlobalManager::GetInstance()->SetCurrentLangId(lang_id.language_id);\r
+    }\r
+}\r
+bool UILanguage::RegisterGlobalManager()\r
+{\r
+    static bool isRegister = false;\r
+    if (!isRegister) {\r
+        const char *resFiles[] = {BIN_LANG_ZH, BIN_LANG_EN};\r
+        if (!FontGlobalManager::GetInstance()->RegisterLanguageInfo(\r
+            resFiles, OHOS::LANGUAGE_ID_MAX, OHOS::LANGUAGE_ID_ZH)) {\r
+            WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "register global manager error");\r
+            return isRegister;\r
+        }\r
+        isRegister = true;\r
+    }\r
+    return isRegister;\r
+}\r
+}
\ No newline at end of file
index 955c25d..ef81ce7 100644 (file)
  * limitations under the License.
  */
 
-#include "ui_service.h"
+#include "uiservice/ui_service.h"
 #include "wearable_log.h"
 #include "samgr_lite.h"
-#include "SettingModel.h"
-#include "UiServersMsg.h"
+#include "settings/SettingModel.h"
+#include "main/UiServersMsg.h"
 #include "ohos_init.h"
 #include "memory_adapter.h"
 #include <cstdio>
 #include "service_id_define.h"
 #include "bundle_install_msg.h"
 #include "graphic_service.h"
-#include "ApplistModel.h"
+#include "applist/ApplistModel.h"
 #if defined(SUPPORT_POWER_MANAGER)
 #include "power_display_service.h"
 #endif
-#include "ui_screennotify.h"
-#include "HealthModel.h"
+#include "screennotify/ui_screennotify.h"
+#include "main/HealthModel.h"
 #include "bts_br_gap.h"
 #include "bts_le_gap.h"
 
+#include "uiservice/ui_language.h"
+
 #include "errcode.h"
 #include "pm_definition.h"
+#include "NativeAbility.h"
+#include "TransitionType.h"
+
 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);
 
@@ -194,6 +199,14 @@ void ServiceMsgProcess(Request *request)
         case CONNECT_NEW_PHONE:
             ConnectNewPhone();
             break;
+        case UI_UPDATE_LANGUAGE:
+            OHOS::UILanguage::UpdateLanguage();
+            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);
+            break;
     }
 }
 
index 4bd5cc7..e97fa8f 100644 (file)
@@ -1,17 +1,17 @@
 #include <cstdio>
 #include <iostream>
-#include "VideoCard.h"
+#include "videocard/VideoCard.h"
 #include "NativeAbility.h"
 #include "msg_center.h"
 #include "securec.h"
-#include "DialBinParser.h"
-#include "ModelDialDataFactory.h"
+#include "main/DialBinParser.h"
+#include "main/dial/ModelDialDataFactory.h"
 #include "common/low_power_manager.h"
 #include "common/image_cache_manager.h"
 #ifdef SUPPORT_OHOSFWK
-#include "ui_screennotify.h"
+#include "screennotify/ui_screennotify.h"
 #endif
-#include "MainPresenterSample.h"
+#include "main/MainPresenterSample.h"
 #include "common/graphic_utils.h"
 
 namespace OHOS {
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/weather/src/WeatherAdapter.cpp b/code/sdk/application/wearable/nativeapp/nativeui/weather/src/WeatherAdapter.cpp
new file mode 100644 (file)
index 0000000..65aae4f
--- /dev/null
@@ -0,0 +1,67 @@
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: WeatherAdapter\r
+ * Create: 2025-03-23\r
+ */\r
+\r
+#include "weather/WeatherAdapter.h"\r
+\r
+namespace OHOS {\r
+WeatherAdapter::WeatherAdapter() {}\r
+\r
+WeatherAdapter::~WeatherAdapter()\r
+{\r
+    listData.clear();\r
+}\r
+\r
+uint16_t WeatherAdapter::GetCount(void)\r
+{\r
+    return listData.size();\r
+}\r
+\r
+void WeatherAdapter::SetData(std::list<WeatherItem> &data)\r
+{\r
+    if (!listData.empty()) {\r
+        listData.clear();\r
+    }\r
+    std::list<WeatherItem>::iterator it;\r
+    for (it = data.begin(); it != data.end(); it++) {\r
+        listData.push_back(*it);\r
+    }\r
+}\r
+\r
+UIView *WeatherAdapter::GetView(UIView *inView, int16_t index)\r
+{\r
+    if (listData.empty()) {\r
+        return nullptr;\r
+    }\r
+    if (index < 0) {\r
+        return nullptr;\r
+    }\r
+    size_t uindex = index;\r
+    if (uindex >= listData.size()) {\r
+        return nullptr;\r
+    }\r
+\r
+    std::list<WeatherItem>::iterator it = listData.begin();\r
+    for (int i = 0; i < index; i++) {\r
+        it++;\r
+    }\r
+    WeatherItem itemData = *it;\r
+    WeatherItemView *item = nullptr;\r
+    if (inView == nullptr) {\r
+        item = new WeatherItemView();\r
+    } else {\r
+        item = static_cast<WeatherItemView *>(inView);\r
+    }\r
+\r
+    item->SetItemInfo(itemData);\r
+    item->SetOnClickListener(itemClickListener);\r
+    return item;\r
+}\r
+\r
+void WeatherAdapter::AddListItem(const WeatherItem &item)\r
+{\r
+    listData.push_back(item);\r
+}\r
+}  // namespace OHOS\r
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/weather/src/WeatherItemView.cpp b/code/sdk/application/wearable/nativeapp/nativeui/weather/src/WeatherItemView.cpp
new file mode 100644 (file)
index 0000000..e417f9f
--- /dev/null
@@ -0,0 +1,98 @@
+/*\r
+ * Copyright (c) Huawei 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
+\r
+namespace OHOS {\r
+static constexpr int16_t WEATHER_ICON_X = 155;\r
+static constexpr int16_t WEATHER_LABEL_X = 10;\r
+static constexpr int16_t WEATHER_LABEL2_X = 220;\r
+static constexpr int16_t WEATHER_CHARTLINE_X = 20;\r
+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
+static constexpr int16_t WEATHER_IMAGE_SIZE = 300;\r
+static constexpr int16_t WEATHER_ICON_Y = 15;\r
+static constexpr int16_t NUMS_50 = 50;\r
+\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
+\r
+    Add(&sNextImage);\r
+    Add(&sLabel_1);\r
+    Add(&sIcon);\r
+    Add(&sLabel_2);\r
+    Add(&chartLine);\r
+}\r
+\r
+WeatherItemView::~WeatherItemView()\r
+{\r
+    Remove(&sIcon);\r
+    Remove(&sLabel_1);\r
+    Remove(&sLabel_2);\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
+}\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
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/weather/src/WeatherMainPage.cpp b/code/sdk/application/wearable/nativeapp/nativeui/weather/src/WeatherMainPage.cpp
new file mode 100644 (file)
index 0000000..e1d9630
--- /dev/null
@@ -0,0 +1,336 @@
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: WeatherMainPage\r
+ * Create: 2025-03-23\r
+ */\r
+\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 "wearable_log.h"\r
+#include <sstream>\r
+#include <iomanip>\r
+\r
+static constexpr int16_t WEATHER_LABEL_SIZE_WIDTH_ONE = 250;\r
+static constexpr int16_t WEATHER_LABEL_SIZE_HEIGHT_ONE = 60;\r
+static constexpr int16_t WEATHER_LABEL_SIZE_WIDTH_FOUR = 210;\r
+static constexpr int16_t WEATHER_LABEL_SIZE_HEIGHT_FOUR = 40;\r
+static constexpr int16_t WEATHER_LABEL_SIZE_WIDTH_FIVE = 223;\r
+static constexpr int16_t WEATHER_LABEL_SIZE_HEIGHT_FIVE = 46;\r
+static constexpr int16_t WEATHER_LABEL_SIZE_WIDTH_SIX = 149;\r
+static constexpr int16_t WEATHER_LABEL_SIZE_HEIGHT_SIX = 20;\r
+static constexpr int16_t WEATHER_LABEL_FRONT_ONE = 40;\r
+static constexpr int16_t WEATHER_LABEL_FRONT_TWO = 24;\r
+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_Y = 323;\r
+static constexpr int16_t WEATHER_AROUND_WIDTH = 198;\r
+static constexpr int16_t WEATHER_AROUND_HEIGHT = 40;\r
+static constexpr int16_t WEATHER_CODE_POSITION_X = 267;\r
+static constexpr int16_t WEATHER_CODE_POSITION_Y = 268;\r
+static constexpr int16_t WEATHER_CODE_POSITION_WIDTH = 72;\r
+static constexpr int16_t WEATHER_CODE_POSITION_HEIGHT = 46;\r
+static constexpr int16_t WEATHER_TEMP_POSITION_X = 210;\r
+static constexpr int16_t WEATHER_TEMP_POSITION_Y = 130;\r
+static constexpr int16_t WEATHER_TEMP_WIDTH = 190;\r
+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_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_LABLEAIR_DATA = 79;\r
+static constexpr int16_t WEATHER_LABLEAIR_HEIGHT = 30;\r
+static constexpr int16_t WEATHER_IMAGEHUMIDITY_DATA = 120;\r
+static constexpr int16_t WEATHER_IMG_X = 71;\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_LABELTITLE_POSITION_X = 63;\r
+static constexpr int16_t WEATHER_LABELTITLE_POSITION_Y = 100;\r
+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
+\r
+const char *weatherNames[] = {"晴", "多云", "阴", "阵雨", "雷阵雨", "雷阵雨伴有冰雹", "雨夹雪",\r
+                              "小雨", "中雨", "大雨", "暴雨", "大暴雨", "特大暴雨", "阵雪",\r
+                              "小雪", "中雪", "大雪", "暴雪", "雾", "冻雨", "沙尘暴",\r
+                              "小到中雨", "中到大雨", "大到暴雨", "小到中雪", "中到大雪", "大到暴雪", "浮尘",\r
+                              "扬沙", "强沙尘暴", "霾", "无天气数据"};\r
+\r
+namespace OHOS {\r
+REGIST_SLICE_PAGE(VIEW_WEATHER, WEATHER_PAGES::WEATHER_MAIN_PAGE, WeatherMainPage, true);\r
+\r
+WeatherMainPage::WeatherMainPage()\r
+{\r
+    weatherModel = &WeatherModel::GetInstance();\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
+    }\r
+\r
+    if (weatherImg != nullptr) {\r
+        delete weatherImg;\r
+        weatherImg = nullptr;\r
+    }\r
+\r
+    if (mainImg != nullptr) {\r
+        delete mainImg;\r
+        mainImg = nullptr;\r
+    }\r
+\r
+    if (aroundImg != nullptr) {\r
+        delete aroundImg;\r
+        aroundImg = nullptr;\r
+    }\r
+\r
+    if (ImageAir != nullptr) {\r
+        delete ImageAir;\r
+        ImageAir = nullptr;\r
+    }\r
+\r
+    if (ImageHumidity != nullptr) {\r
+        delete ImageHumidity;\r
+        ImageHumidity = nullptr;\r
+    }\r
+\r
+    if (ImagePageKey != nullptr) {\r
+        delete ImagePageKey;\r
+        ImagePageKey = nullptr;\r
+    }\r
+    ImageCacheManager::GetInstance().UnloadAllInMultiRes(WEATHER_IMAGE);\r
+}\r
+\r
+void WeatherMainPage::OnStart(void *data)\r
+{\r
+    group = new UIViewGroup();\r
+    if (group == nullptr) {\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
+        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
+    }\r
+    AddViewToPageContainer(group);\r
+}\r
+\r
+void WeatherMainPage::InitImage()\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
+    } else {\r
+        LOADIMG::LoadImageViewImg(mainImg, WEATHER_IMAGE, IMAGE_CONVERTER_TOOL_WEATHER65);\r
+        LOADIMG::LoadImageViewImg(aroundImg, WEATHER_IMAGE, IMAGE_CONVERTER_TOOL_WEATHER76);\r
+    }\r
+    ImageAir = new UIImageView();\r
+    if (ImageAir == nullptr) {\r
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "WeatherPageFirst::ImageAir new image fail");\r
+        return;\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
+        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
+        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
+}\r
+\r
+void WeatherMainPage::InitWeatherImage()\r
+{\r
+    addressImg = new UIImageView();\r
+    if (addressImg == nullptr) {\r
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "WeatherPageFirst::img 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
+        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
+}\r
+\r
+\r
+void WeatherMainPage::InitLabel()\r
+{\r
+    int posX[LABEL_COUNT] = {140, 113, 120, 222, 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
+            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
+            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
+            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
+            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
+            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
+        }\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
+{\r
+    if (!flag) {\r
+        return "--";\r
+    }\r
+    tm inputTm = {};\r
+    std::istringstream iss(inputStr);\r
+    iss >> std::get_time(&inputTm, "%Y%m%d%H%M");\r
+    time_t inputTime = mktime(&inputTm);\r
+    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
+        strftime(buffer, sizeof(buffer), "%H:%M", &inputTm);\r
+        return std::string(buffer);\r
+    } else {\r
+        char buffer[6];\r
+        strftime(buffer, sizeof(buffer), "%m/%d", &inputTm);\r
+        return std::string(buffer);\r
+    }\r
+}\r
+\r
+bool WeatherMainPage::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().ChangeSlice(VIEW_APPLIST);\r
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "WeatherPresenter::OnDrag ChangeSlice(VIEW_APPLIST)");\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
+    }\r
+    return false;\r
+}\r
+\r
+bool WeatherMainPage::OnClick(UIView &view, const ClickEvent &event)\r
+{\r
+    UNUSED(event);\r
+    return true;\r
+}\r
+}\r
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/weather/src/WeatherModel.cpp b/code/sdk/application/wearable/nativeapp/nativeui/weather/src/WeatherModel.cpp
new file mode 100644 (file)
index 0000000..6b77b95
--- /dev/null
@@ -0,0 +1,411 @@
+/*\r
+ * Copyright (c) Huawei 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
+#ifdef BUILD_IN_LINUX\r
+#include "localtime.h"\r
+#endif\r
+\r
+namespace OHOS {\r
+\r
+WeatherModel::WeatherModel() {}\r
+\r
+WeatherModel::~WeatherModel() {}\r
+\r
+WeatherModel &WeatherModel::GetInstance()\r
+{\r
+    static WeatherModel instance;\r
+    return instance;\r
+}\r
+\r
+uint8_t WeatherModel::GetWeatherListNum()\r
+{\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
+}\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
+}\r
+\r
+std::vector<HourWeather> WeatherModel::GetHourWeather()\r
+{\r
+    if (houWeather.size() < WEATHER_COUNT) {\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
+            {"08:00", "18", "04"}, {"09:00", "20", "04"}, {"10:00", "22", "04"}, {"11:00", "24", "04"},\r
+            {"12:00", "25", "04"}, {"13:00", "26", "04"}, {"14:00", "26", "04"}, {"15:00", "25", "06"},\r
+            {"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
+        }\r
+    }\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
+    if (!file.is_open()) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "no file");\r
+        return false;\r
+    }\r
+    std::stringstream buffer;\r
+    buffer << file.rdbuf();\r
+    std::string content = buffer.str();\r
+    int intsize = sizeof(content);\r
+    cJSON *root = nullptr;\r
+    // 解析JSON字符串\r
+    if (intsize != 0) {\r
+        root = cJSON_Parse(content.c_str());\r
+    }\r
+    if (root == NULL) {\r
+        // 如果解析失败,输出错误信息\r
+        const char *error_ptr;\r
+        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
+        return false;\r
+    }\r
+    cJSON_Delete(root);\r
+    return true;\r
+}\r
+\r
+void WeatherModel::InitFirstPageData()\r
+{\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
+    }\r
+    if (map_observe.find("max_degree") != map_observe.end()) {\r
+        curWeather.max_degree = map_observe["max_degree"].c_str();\r
+    }\r
+    if (map_observe.find("degree") != map_observe.end()) {\r
+        curWeather.degree = map_observe["degree"].c_str();\r
+    }\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
+    }\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
+    }\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
+{\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
+\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
+        HourWeather sample = {nullptr};\r
+        if (name == "update_time") {\r
+            dayTime[id] = category;\r
+        } else if (name == "degree") {\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
+        HourWeather sample = {nullptr};\r
+        sample.hour = dayTime[i].c_str();\r
+        sample.degree = dayTemp[i].c_str();\r
+        sample.weather = dayWeather[i].c_str();\r
+        houWeather.push_back(sample);\r
+    }\r
+}\r
+\r
+void WeatherModel::InitThirdPageData()\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
+        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
+        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
+            } else {\r
+                currentWeek[id] = category;\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 == "day_weather_code") {\r
+            weatherValue[id] = std::atoi(category.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
+    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
+        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
+        }\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
+        if (str.length() >= WEATHER_HOUR) {\r
+            // 提取小时部分\r
+            hour = str.substr(SET_EIGHT, SET_TWO) + ":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
+            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
+            "weather_code", cJSON_GetObjectItemCaseSensitive(forecast_1h_num, "weather_code")->valuestring, i));\r
+    }\r
+    return true;\r
+}\r
+\r
+bool WeatherModel::InitVecObserve(cJSON *root)\r
+{\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
+        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
+        std::make_pair("update_time", cJSON_GetObjectItemCaseSensitive(observe, "update_time")->valuestring));\r
+    map_observe.insert(\r
+        std::make_pair("weather_code", cJSON_GetObjectItemCaseSensitive(observe, "weather_code")->valuestring));\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
+        cJSON_Delete(root);\r
+        return false;\r
+    }\r
+    for (int i = 0; i < SET_FOURTEEN; 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
+            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
+    }\r
+    return true;\r
+}\r
+\r
+bool WeatherModel::InitVecWeek(cJSON *root)\r
+{\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
+        cJSON_Delete(root);\r
+        return false;\r
+    }\r
+    for (int i = 0; i < SET_TEN; 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
+            continue;\r
+        }\r
+        std::istringstream iss(cJSON_GetObjectItemCaseSensitive(forecast_24h_num, "time")->valuestring);\r
+        char dash1;\r
+        char dash2;\r
+        int year = 0;\r
+        int month = 0;\r
+        int day = 0;\r
+        const int start_year = START_YEAR;\r
+        if ((iss >> year >> dash1 >> month >> dash2 >> day) && (dash1 == '-') && (dash2 == '-')) {\r
+            std::tm timeinfo = {};\r
+            timeinfo.tm_year = year - start_year;\r
+            timeinfo.tm_mon = month - 1;\r
+            timeinfo.tm_mday = day;\r
+            timeinfo.tm_hour = 0;\r
+            timeinfo.tm_min = 0;\r
+            timeinfo.tm_sec = 0;\r
+            timeinfo.tm_isdst = -1;\r
+            std::time_t timestamp = mktime(&timeinfo);\r
+            if (timestamp == -1) {\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
+                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
+                "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
+        } else {\r
+            WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Error Date");\r
+        }\r
+    }\r
+    return true;\r
+}\r
+\r
+bool WeatherModel::InitVecAddress(cJSON *root)\r
+{\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
+        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
+    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
+    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 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
+    int set = hours * MIN_TO_HOUR + minutes;\r
+    isDay = (currentTime >= rise && currentTime < set) ? true : false;\r
+}\r
+\r
+bool WeatherModel::GetDayStatus()\r
+{\r
+    return isDay;\r
+}\r
+}\r
diff --git a/code/sdk/application/wearable/nativeapp/nativeui/weather/src/WeatherPageSecond.cpp b/code/sdk/application/wearable/nativeapp/nativeui/weather/src/WeatherPageSecond.cpp
new file mode 100644 (file)
index 0000000..f9e9e76
--- /dev/null
@@ -0,0 +1,264 @@
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: WeatherPageSecond\r
+ * Create: 2025-03-15\r
+ */\r
+\r
+#include "weather/WeatherPageSecond.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/WeatherView.h"\r
+#include "weather/WeatherModel.h"\r
+#include "ui_resource_weather.h"\r
+#include "common/image_cache_manager.h"\r
+#include "wearable_log.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
+static constexpr uint16_t ANIMATOR_TIME = 50;\r
+\r
+REGIST_SLICE_PAGE(VIEW_WEATHER, WEATHER_PAGES::WEATHER_SECOND_PAGE, WeatherPageSecond, false);\r
+\r
+WeatherPageSecond::WeatherPageSecond()\r
+{\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "WeatherPageSecond::WeatherPageSecond");\r
+    weatherModel = &WeatherModel::GetInstance();\r
+}\r
+\r
+WeatherPageSecond::~WeatherPageSecond()\r
+{\r
+    if (weatherSwipeGroup != nullptr) {\r
+        weatherSwipeGroup->RemoveAll();\r
+        delete weatherSwipeGroup;\r
+        weatherSwipeGroup = nullptr;\r
+    }\r
+\r
+    for (int i = 0; i < SET_THREE; ++i) {\r
+        if (swipeGroup[i] != nullptr) {\r
+            swipeGroup[i]->RemoveAll();\r
+            delete swipeGroup[i];\r
+            swipeGroup[i] = nullptr;\r
+        }\r
+    }\r
+\r
+    for (int i = 0; i < SET_EIGHT; ++i) {\r
+        if (imgBack[i] != nullptr) {\r
+            delete imgBack[i];\r
+            imgBack[i] = nullptr;\r
+        }\r
+    }\r
+\r
+    for (int i = 0; i < SET_EIGHT; ++i) {\r
+        if (labelTime[i] != nullptr) {\r
+            delete labelTime[i];\r
+            labelTime[i] = nullptr;\r
+        }\r
+    }\r
+\r
+    for (int i = 0; i < SET_EIGHT; ++i) {\r
+        if (labelTemp[i] != nullptr) {\r
+            delete labelTemp[i];\r
+            labelTemp[i] = nullptr;\r
+        }\r
+    }\r
+\r
+    for (int i = 0; i < SET_EIGHT; ++i) {\r
+        if (imgWeather[i] != nullptr) {\r
+            delete imgWeather[i];\r
+            imgWeather[i] = nullptr;\r
+        }\r
+    }\r
+    if (mainImg != nullptr) {\r
+        delete mainImg;\r
+        mainImg = nullptr;\r
+    }\r
+    if (ImagePageKey != nullptr) {\r
+        delete ImagePageKey;\r
+        ImagePageKey = nullptr;\r
+    }\r
+    ImageCacheManager::GetInstance().UnloadAllInMultiRes(WEATHER_IMAGE);\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "WeatherPageSecond::~WeatherPageSecond");\r
+}\r
+\r
+void WeatherPageSecond::OnStart(void *data)\r
+{\r
+    weatherSwipeGroup = new UISwipeView(UISwipeView::VERTICAL);\r
+    if (weatherSwipeGroup == nullptr) {\r
+        WEARABLE_LOGD(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
+    for (int i = 0; i < SET_THREE; i++) {\r
+        swipeGroup[i] = new UIViewGroup();\r
+        if (swipeGroup[i] == nullptr) {\r
+            return;\r
+        }\r
+        WeatherInit(swipeGroup[i]);\r
+        weatherSwipeGroup->Add(swipeGroup[i]);\r
+    }\r
+\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "WeatherPageFirst::InitPageFirst successful");\r
+    AddViewToPageContainer(weatherSwipeGroup);\r
+}\r
+\r
+void WeatherPageSecond::WeatherInit(UIViewGroup *group)\r
+{\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
+    mainImg = new UIImageView();\r
+    mainImg->SetPosition(0, 0);\r
+    mainImg->SetStyle(STYLE_BACKGROUND_OPA, OPA_OPAQUE);\r
+    ImageInfo *imgSrc =\r
+        ImageCacheManager::GetInstance().LoadOneInMultiRes(IMAGE_CONVERTER_TOOL_WEATHER65, WEATHER_IMAGE);\r
+    if (imgSrc == nullptr) {\r
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "WeatherMainPage::LoadOneInMultiRes fail");\r
+    }\r
+    if (weatherModel->GetDayStatus()) {\r
+        LOADIMG::LoadImageViewImg(mainImg, WEATHER_IMAGE, IMAGE_CONVERTER_TOOL_WEATHER64);\r
+    } else {\r
+        LOADIMG::LoadImageViewImg(mainImg, WEATHER_IMAGE, IMAGE_CONVERTER_TOOL_WEATHER65);\r
+    }\r
+    group->Add(mainImg);\r
+    houWeather = weatherModel->GetHourWeather();\r
+    ImagePageKey = new UIImageView();\r
+    if (ImagePageKey == nullptr) {\r
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "WeatherPageFirst::ImagePageKey new image fail");\r
+        return;\r
+    }\r
+    ImagePageKey->SetPosition(WEATHER_IMAGEPAGEKEY_X, WEATHER_IMAGEPAGEKEY_Y, WEATHER_IMAGEPAGEKEY_WIDTH,\r
+                              WEATHER_IMAGEPAGEKEY_HEIGHT);\r
+    ImagePageKey->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+    LOADIMG::LoadImageViewImg(ImagePageKey, WEATHER_IMAGE, IMAGE_CONVERTER_TOOL_WEATHER67);\r
+    group->Add(ImagePageKey);\r
+    int count = index * SET_EIGHT;\r
+    index++;\r
+    InitImage(group, count);\r
+    InitLabel(group, count);\r
+    return;\r
+}\r
+\r
+void WeatherPageSecond::InitImage(UIViewGroup *group, int count)\r
+{\r
+    int weatherPosX[SET_EIGHT] = {67, 161, 257, 351, 67, 161, 257, 351};\r
+    int weatherPosY[SET_EIGHT] = {125, 125, 125, 125, 289, 289, 289, 289};\r
+    int backPosX[SET_EIGHT] = {47, 141, 235, 329, 47, 141, 235, 329};\r
+    int backPosY[SET_EIGHT] = {71, 71, 71, 71, 235, 235, 235, 235};\r
+    for (int i = 0; i < SET_EIGHT; i++) {\r
+        imgBack[i] = new UIImageView();\r
+        if (imgBack[i] == nullptr) {\r
+            WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "WeatherPageSecond::InitPageSecond new UIImageView fail");\r
+            return;\r
+        }\r
+        imgBack[i]->SetPosition(backPosX[i], backPosY[i]);\r
+        if (weatherModel->GetDayStatus()) {\r
+            LOADIMG::LoadImageViewImg(imgBack[i], WEATHER_IMAGE, IMAGE_CONVERTER_TOOL_WEATHER73);\r
+        } else {\r
+            LOADIMG::LoadImageViewImg(imgBack[i], WEATHER_IMAGE, IMAGE_CONVERTER_TOOL_WEATHER74);\r
+        }\r
+\r
+        imgWeather[i] = new UIImageView();\r
+        if (imgWeather[i] == nullptr) {\r
+            WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "WeatherPageSecond::InitPageSecond new labelTime fail");\r
+            return;\r
+        }\r
+        imgWeather[i]->SetPosition(weatherPosX[i], weatherPosY[i]);\r
+        int curWeather_code = std::atoi(houWeather[count + i].weather);\r
+        LOADIMG::LoadImageViewImg(imgWeather[i], WEATHER_IMAGE, smallWeatherImage[curWeather_code]);\r
+        group->Add(imgBack[i]);\r
+        group->Add(imgWeather[i]);\r
+    }\r
+}\r
+\r
+void WeatherPageSecond::InitLabel(UIViewGroup *group, int count)\r
+{\r
+    int timePosX[SET_EIGHT] = {67, 161, 255, 349, 67, 161, 255, 349};\r
+    int timePosY[SET_EIGHT] = {91, 91, 91, 91, 255, 255, 255, 255};\r
+    int tempPosX[SET_EIGHT] = {75, 169, 263, 356, 75, 169, 263, 356};\r
+    int tempPosY[SET_EIGHT] = {175, 175, 175, 175, 339, 339, 339, 339};\r
+    UILabel *topLabel = new UILabel();\r
+    if (topLabel == nullptr) {\r
+        return;\r
+    }\r
+    topLabel->SetText("24小时预报");\r
+    topLabel->SetFont(DEFAULT_VECTOR_FONT_FILENAME, WEATHER_TOPLABEL_FRONT);\r
+    topLabel->SetPosition(WEATHER_TOPLABEL_X, WEATHER_TOPLABEL_Y, WEATHER_TOPLABEL_WIDTH, WEATHER_TOPLABEL_HEIGHT);\r
+    group->Add(topLabel);\r
+    for (int i = 0; i < SET_EIGHT; i++) {\r
+        labelTemp[i] = new UILabel();\r
+        if (labelTemp[i] == nullptr) {\r
+            WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "WeatherPageSecond::InitPageSecond new labelTemp fail");\r
+            return;\r
+        }\r
+        std::ostringstream oss;\r
+        oss << houWeather[count + i].degree << "°";\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
+\r
+        labelTime[i] = new UILabel();\r
+        if (labelTime[i] == nullptr) {\r
+            WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "WeatherPageSecond::InitPageSecond new labelTime fail");\r
+            return;\r
+        }\r
+        std::string strHour = houWeather[count + 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
+        group->Add(labelTemp[i]);\r
+        group->Add(labelTime[i]);\r
+    }\r
+}\r
+\r
+bool WeatherPageSecond::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, nullptr,\r
+                                                       TransitionType::TRANSITION_INVALID, true);\r
+    } else if (event.GetDragDirection() == DragEvent::DIRECTION_RIGHT_TO_LEFT) {\r
+        NativeAbility::GetInstance().SwitchPageInSlice(WEATHER_PAGES::WEATHER_THIRD_PAGE, nullptr,\r
+                                                       TransitionType::TRANSITION_INVALID, true);\r
+    }\r
+    return false;\r
+}\r
+\r
+void WeatherPageSecond::OnSwipe(UISwipeView &view)\r
+{\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "TempPresenter::OnSwipe ");\r
+    UNUSED(view);\r
+    return;\r
+}\r
+\r
+bool WeatherPageSecond::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/nativeapp/nativeui/weather/src/WeatherPageThird.cpp b/code/sdk/application/wearable/nativeapp/nativeui/weather/src/WeatherPageThird.cpp
new file mode 100644 (file)
index 0000000..d6ca8fb
--- /dev/null
@@ -0,0 +1,206 @@
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: WeatherPageThird\r
+ * Create: 2025-03-23\r
+ */\r
+\r
+#include "weather/WeatherPageThird.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/WeatherView.h"\r
+#include "weather/WeatherModel.h"\r
+#include "ui_resource_weather.h"\r
+#include "common/image_cache_manager.h"\r
+#include "wearable_log.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
+\r
+REGIST_SLICE_PAGE(VIEW_WEATHER, WEATHER_PAGES::WEATHER_THIRD_PAGE, WeatherPageThird, false);\r
+\r
+WeatherPageThird::WeatherPageThird()\r
+{\r
+    weatherModel = &WeatherModel::GetInstance();\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "WeatherPageThird::WeatherPageThird");\r
+}\r
+\r
+WeatherPageThird::~WeatherPageThird()\r
+{\r
+    if (group != nullptr) {\r
+        group->RemoveAll();\r
+        delete group;\r
+        group = nullptr;\r
+    }\r
+\r
+    if (contentList != nullptr) {\r
+        delete contentList;\r
+        contentList = nullptr;\r
+    }\r
+\r
+    if (title != nullptr) {\r
+        delete title;\r
+        title = nullptr;\r
+    }\r
+\r
+    if (listAdapter != nullptr) {\r
+        delete listAdapter;\r
+        listAdapter = nullptr;\r
+    }\r
+\r
+    if (mainImg != nullptr) {\r
+        delete mainImg;\r
+        mainImg = nullptr;\r
+    }\r
+\r
+    if (ImagePageKey != nullptr) {\r
+        delete ImagePageKey;\r
+        ImagePageKey = nullptr;\r
+    }\r
+    ImageCacheManager::GetInstance().UnloadAllInMultiRes(WEATHER_IMAGE);\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "WeatherPageThird::~WeatherPageThird");\r
+}\r
+\r
+void WeatherPageThird::OnStart(void *data)\r
+{\r
+    group = new UIViewGroup();\r
+    if (group == nullptr) {\r
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "WeatherView::OnStart::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_LOGD(WEARABLE_LOG_MODULE_APP, "WeatherView::OnStart::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(DEFAULT_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
+\r
+    mainImg = new UIImageView();\r
+    mainImg->SetPosition(0, 0);\r
+    mainImg->SetStyle(STYLE_BACKGROUND_OPA, OPA_OPAQUE);\r
+    if (weatherModel->GetDayStatus()) {\r
+        LOADIMG::LoadImageViewImg(mainImg, WEATHER_IMAGE, IMAGE_CONVERTER_TOOL_WEATHER64);\r
+    } else {\r
+        LOADIMG::LoadImageViewImg(mainImg, WEATHER_IMAGE, IMAGE_CONVERTER_TOOL_WEATHER65);\r
+    }\r
+    InitScrollView();\r
+    InitScrollData();\r
+    AddViewToPageContainer(group);\r
+}\r
+\r
+void WeatherPageThird::InitScrollView()\r
+{\r
+    contentList = new UIList();\r
+    if (contentList == nullptr) {\r
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "WeatherView::OnStart::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
+    ImagePageKey = new UIImageView();\r
+    if (ImagePageKey == nullptr) {\r
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "WeatherPageFirst::ImagePageKey new image fail");\r
+        return;\r
+    }\r
+    ImagePageKey->SetPosition(WEATHER_IMAGEPAGEKEY_X, WEATHER_IMAGEPAGEKEY_Y, WEATHER_IMAGEPAGEKEY_WIDTH,\r
+                              WEATHER_IMAGEPAGEKEY_HEIGHT);\r
+    ImagePageKey->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+    LOADIMG::LoadImageViewImg(ImagePageKey, WEATHER_IMAGE, IMAGE_CONVERTER_TOOL_WEATHER68);\r
+    group->Add(mainImg);\r
+    group->Add(title);\r
+    group->Add(contentList);\r
+    group->Add(ImagePageKey);\r
+}\r
+\r
+bool WeatherPageThird::InitScrollData()\r
+{\r
+    const WeatherItem *itemInfo = weatherModel->GetWeatherlistItems();\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "WeatherView::InitWeatherItem %s", itemInfo);\r
+    RefreshWeathersList(itemInfo, weatherModel->GetWeatherListNum());\r
+    return true;\r
+}\r
+\r
+void WeatherPageThird::RefreshWeathersList(const WeatherItem *item, uint8_t count)\r
+{\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "WeatherView::OnStart::listAdapter");\r
+    listAdapter = new WeatherAdapter();\r
+    if (listAdapter == nullptr) {\r
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "WeatherView::OnStart::listAdapter is nullptr");\r
+        return;\r
+    }\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "WeatherView::RefreshWeathersList");\r
+    if (item == nullptr) {\r
+        return;\r
+    } else {\r
+        for (int i = 0; i < count; i++) {\r
+            listAdapter->AddListItem(item[i]);\r
+            WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "WeatherView::RefreshWeathersList %d", i);\r
+        }\r
+    }\r
+    if (contentList == nullptr) {\r
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "WeatherView::contentList fail");\r
+        return;\r
+    }\r
+    contentList->ScrollTo(0);\r
+    contentList->SetAdapter(listAdapter);\r
+}\r
+\r
+bool WeatherPageThird::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_SECOND_PAGE, nullptr,\r
+                                                       TransitionType::TRANSITION_INVALID, true);\r
+    }\r
+    return false;\r
+}\r
+\r
+void WeatherPageThird::OnSwipe(UISwipeView &view)\r
+{\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "TempPresenter::OnSwipe ");\r
+    UNUSED(view);\r
+    return;\r
+}\r
+\r
+bool WeatherPageThird::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/nativeapp/nativeui/weather/src/WeatherPresenter.cpp b/code/sdk/application/wearable/nativeapp/nativeui/weather/src/WeatherPresenter.cpp
new file mode 100644 (file)
index 0000000..c943842
--- /dev/null
@@ -0,0 +1,16 @@
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: WeatherPresenter\r
+ * Create: 2025-03-23\r
+ */\r
+\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
+}\r
index 09de4d2..3f7de56 100644 (file)
@@ -5,11 +5,13 @@ set(PUBLIC_HEADER
 )
 
 set(PRIVATE_HEADER
+    ${ROOT_DIR}/application/wearable/service/device_msg
 )
 
 set(SOURCES
     ${CMAKE_CURRENT_SOURCE_DIR}/phony_timer.c
     ${CMAKE_CURRENT_SOURCE_DIR}/ohos_timer.c
+    ${CMAKE_CURRENT_SOURCE_DIR}/wearable_onlinelog.c
 )
 
 set(COMPONENT_PUBLIC_CCFLAGS
index d641846..9e67cac 100644 (file)
@@ -7,11 +7,6 @@
 \r
 #ifndef WEARABLE_LOG_H\r
 #define WEARABLE_LOG_H\r
-#ifdef __cplusplus\r
-#if __cplusplus\r
-extern "C" {\r
-#endif\r
-#endif\r
 \r
 #if !defined(SW_UART_DEBUG) && !defined(SW_RTT_DEBUG)\r
 #include "soc_diag_util.h"\r
@@ -20,6 +15,13 @@ extern "C" {
 #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
@@ -44,11 +46,13 @@ typedef enum {
     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)\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
@@ -57,6 +61,15 @@ typedef enum {
 #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_INFO, 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
@@ -68,36 +81,36 @@ typedef enum {
 #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
+#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
+#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
+    do {                                                    \\r
+        if ((pointer) == nullptr) {                         \\r
+            WEARABLE_LOGE((mod), (fmt));                    \\r
             return (code);                                  \\r
-        }                                                 \\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
+#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
diff --git a/code/sdk/application/wearable/ohos_deps/wearable_onlinelog.c b/code/sdk/application/wearable/ohos_deps/wearable_onlinelog.c
new file mode 100644 (file)
index 0000000..8cb72c4
--- /dev/null
@@ -0,0 +1,155 @@
+/*\r
+ * Copyright (c) CompanyNameMagicTag 2023-2023. All rights reserved.\r
+ * Description: wearable_onlinelog src fie.\r
+ * Author: CompanyName\r
+ * Create:\r
+ */\r
+#include "wearable_log.h"\r
+#include "securec.h"\r
+#include "diag_ind_src.h"\r
+#include "diag_service.h"\r
+#include "diag_common.h"\r
+#include "msg_center_protocol.h"\r
+#include "msg_center_device.h"\r
+#if defined(SW_UART_DEBUG)\r
+#include "uart.h"\r
+#endif\r
+\r
+#if (CONFIG_ONLINE_LOG == 1) && !defined(_WIN32)\r
+#define TL_BYTE1 1\r
+#define TL_BYTE2 2\r
+#define SHIFT_8_BIT 8\r
+\r
+#define SET_UART_CHANNEL_CMD 1\r
+#define SET_BR_CHANNEL_CMD 2\r
+#define SET_BLE_CHANNEL_CMD 3\r
+\r
+static uint8_t g_log_diag_channel = DIAG_FRAME_FID_PC;\r
+\r
+// 在线日志级别对应的字符串\r
+static const char *gLevelStrings[] = {"[WEARABLE D/] ", "[WEARABLE I/] ", "[WEARABLE W/] ", "[WEARABLE E/] "};\r
+// 在线日志过滤器;\r
+static uint8_t gOnlineLevelFilter = 0xf;\r
+\r
+errcode_t uapi_diag_service_send_log(uint8_t channel, uint8_t type, uint8_t *payload, uint32_t pay_len);\r
+\r
+static uint8_t calculate_tl_byte(uint32_t payloadLen)\r
+{\r
+    uint8_t tl_byte = 0;\r
+    if (payloadLen <= 0x7f) {\r
+        tl_byte = 0;\r
+    } else if (payloadLen > 0xff) {\r
+        tl_byte = TL_BYTE2;\r
+    } else {\r
+        tl_byte = TL_BYTE1;\r
+    }\r
+    return tl_byte;\r
+}\r
+\r
+void set_online_log_level(uint8_t filter)\r
+{\r
+    gOnlineLevelFilter = filter;\r
+}\r
+\r
+static void send_uart_str(const char *s, uint32_t str_len)\r
+{\r
+#if defined(SW_UART_DEBUG)\r
+    if (hal_uart_get_funcs(SW_DEBUG_UART_BUS) == NULL) {\r
+        return;\r
+    }\r
+    uapi_uart_write(SW_DEBUG_UART_BUS, (const void *)s, str_len, 0);\r
+#endif\r
+}\r
+\r
+void change_log_diag_channel(uint8_t channel)\r
+{\r
+    if (channel == SET_UART_CHANNEL_CMD) {\r
+        g_log_diag_channel = DIAG_FRAME_FID_PC;\r
+    } else if (channel == SET_BR_CHANNEL_CMD) {\r
+        g_log_diag_channel = DIAG_FRAME_FID_PHONE;\r
+    } else if (channel == SET_BLE_CHANNEL_CMD) {\r
+        g_log_diag_channel = DIAG_FRAME_FID_BT;\r
+    } else {\r
+        g_log_diag_channel = DIAG_FRAME_FID_PC;\r
+    }\r
+}\r
+\r
+uint8_t get_log_diag_channel()\r
+{\r
+    return g_log_diag_channel;\r
+}\r
+\r
+void online_print_str(uint16_t level, const char *str, ...)\r
+{\r
+    static uint8_t buffer[1024];\r
+    uint8_t filter = (1 << level) & gOnlineLevelFilter;\r
+    if (!filter) {\r
+        return;\r
+    }\r
+    int offset = sprintf_s((char *)buffer, sizeof(buffer), "%s", gLevelStrings[level]);\r
+    if (offset < 0 || (size_t)offset >= sizeof(buffer)) {\r
+        return;\r
+    }\r
+    va_list args;\r
+    va_start(args, str);\r
+    offset += vsprintf_s((char *)(buffer + offset), sizeof(buffer) - offset, str, args);\r
+    if (offset < 0 || (size_t)offset >= sizeof(buffer)) {\r
+        va_end(args);\r
+        return;\r
+    }\r
+    va_end(args);\r
+    uint8_t channel = get_log_diag_channel();\r
+    if (channel == DIAG_FRAME_FID_PC) {\r
+        send_uart_str((const char *)buffer, offset);\r
+    } else {\r
+        uapi_diag_service_send_log(channel, MSGCENTER_TYPE_ID_ONLINELOG_REPORT, buffer, offset);\r
+    }\r
+}\r
+\r
+errcode_t uapi_diag_service_send_log(uint8_t channel, uint8_t type, uint8_t *payload, uint32_t pay_len)\r
+{\r
+    uint8_t size;\r
+    diag_ser_data_t *diag_data;\r
+    diag_ser_frame_t *frame;\r
+    uint32_t result = ERRCODE_FAIL;\r
+    // 计算tl的长度及填充tl数据;\r
+    uint8_t tl_byte = calculate_tl_byte(pay_len);\r
+    uint32_t tl_len = sizeof(msg_center_pkt_tlv_t) + tl_byte;\r
+    uint8_t tl_data[4];\r
+    msg_center_pkt_tlv_t *tl = (msg_center_pkt_tlv_t *)tl_data;\r
+    tl->type = 0x80 | type;\r
+    if (tl_byte == TL_BYTE1) {\r
+        tl->len = tl_byte;\r
+        tl->data[0] = (uint8_t)pay_len;\r
+    } else if (tl_byte == TL_BYTE2) {\r
+        tl->len = tl_byte;\r
+        tl->data[0] = (uint16_t)pay_len & 0xff;\r
+        tl->data[1] = (uint16_t)pay_len >> SHIFT_8_BIT;\r
+    } else {\r
+        tl->len = 0x80 | (uint8_t)pay_len;\r
+    }\r
+\r
+    size = sizeof(diag_ser_data_t) + sizeof(diag_ser_frame_t) + pay_len + tl_len;\r
+    diag_data = (diag_ser_data_t *)malloc(size);\r
+    if (diag_data == NULL) {\r
+        return ERRCODE_FAIL;\r
+    }\r
+\r
+    diag_data->header.ser_id = DIAG_SER_MSG_CENTER;\r
+    diag_data->header.cmd_id = MSGCENTER_CMD_DEVICE;\r
+    diag_data->header.ack_en = false;\r
+    diag_data->header.src = DIAG_FRAME_FID_MCU;\r
+    diag_data->header.dst = channel;\r
+    diag_data->header.crc_en = 1;\r
+    diag_data->header.length = size - sizeof(diag_ser_data_t);  // size = modeleId + cmdId + tlv\r
+\r
+    frame = (diag_ser_frame_t *)&(diag_data->payload);\r
+    frame->module_id = DIAG_SER_MSG_CENTER;\r
+    frame->cmd_id = MSGCENTER_CMD_DEVICE;\r
+    (void)memcpy_s(&(frame->tlv), tl_len, tl, tl_len);\r
+    (void)memcpy_s(&(frame->tlv[tl_len]), pay_len, payload, pay_len);\r
+    result = uapi_diag_service_send_data(diag_data);\r
+    free(diag_data);\r
+    return result;\r
+}\r
+#endif\r
diff --git a/code/sdk/application/wearable/ohos_deps/wearable_onlinelog.h b/code/sdk/application/wearable/ohos_deps/wearable_onlinelog.h
new file mode 100644 (file)
index 0000000..9ed85ed
--- /dev/null
@@ -0,0 +1,48 @@
+/*
+ * Copyright (c) CompanyNameMagicTag 2025-2025. All rights reserved.
+ * Description: Wearable onlinelog header file.
+ * Author:
+ * Create:
+ */
+
+#ifndef WEARABLE_ONLINELOG_H
+#define WEARABLE_ONLINELOG_H
+
+#include "stdint.h"
+#include "errcode.h"
+
+#ifdef __cplusplus
+#if __cplusplus
+extern "C" {
+#endif
+#endif
+
+/* 特性: 在线日志 */
+#ifndef CONFIG_ONLINE_LOG
+#define CONFIG_ONLINE_LOG 1
+#endif
+
+enum OnLineLogLevel {
+    ONLINE_DEBUG = 0,
+    ONLINE_INFO,
+    ONLINE_WARN,
+    ONLINE_ERROR
+};
+
+void online_print_str(uint16_t level, const char *str, ...);
+void change_log_diag_channel(uint8_t channel);
+uint8_t get_log_diag_channel(void);
+void set_online_log_level(uint8_t filter);
+errcode_t uapi_diag_service_send_log(uint8_t channel, uint8_t type, uint8_t *payload, uint32_t pay_len);
+
+#ifndef ONLINE_PRINT
+#define ONLINE_PRINT(level, fmt, arg...) online_print_str(level, fmt, ##arg)
+#endif
+
+#ifdef __cplusplus
+#if __cplusplus
+}
+#endif
+#endif
+
+#endif // WEARABLE_ONLINELOG_H
\ No newline at end of file
index 41c2006..e68cca9 100644 (file)
@@ -14,6 +14,7 @@ set(PUBLIC_HEADER
 
 set(PRIVATE_HEADER
     ${ROOT_DIR}/open_source/mbedtls/mbedtls_v3.6.0/
+    ${ROOT_DIR}/application/wearable/service/device_msg/
 )
 
 set(PRIVATE_DEFINES
index 6b2fb68..d1f181e 100644 (file)
@@ -97,6 +97,10 @@ boot_animation_init_deinit();
  if  (upg_check_upgrade_need_upgrade()) return ;\r
 #endif\r
     OHOS_SystemInit();\r
+\r
+#ifdef PUBLISH_TEST_DATA\r
+    PublishTestData();\r
+#endif\r
     \r
 #ifdef SUPPORT_POWER_MANAGER\r
     const power_display_svr_api_t *display_api = power_display_svr_get_api();\r
index 7b1691b..1137e9b 100644 (file)
@@ -8,6 +8,8 @@ add_subdirectory_if_exist(xiaodu_navi)
 add_subdirectory_if_exist(xiaodu_voice)
 add_subdirectory_if_exist(xiaodu_navi_vector)
 add_subdirectory_if_exist(hc_demo_msg)
+add_subdirectory_if_exist(device_msg)
+add_subdirectory_if_exist(remote_msg)
 add_subdirectory_if_exist(auto_ota_msg)
 add_subdirectory_if_exist(alipay_msg)
 add_subdirectory_if_exist(app_store)
index e679c53..5cfeb9a 100644 (file)
@@ -8,7 +8,6 @@ set(PRIVATE_HEADER
     ${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
-    ${ROOT_DIR}/application/wearable/nativeapp/nativeui/uiservice/include
 )
 
 set(SOURCES
index 8c6efbe..f7cc6c6 100644 (file)
@@ -8,7 +8,7 @@
 #include "bundle_install_msg.h"
 #include "bundlems_slite_client.h"
 #include "appexecfwk_errors.h"
-#include "ui_service.h"
+#include "uiservice/ui_service.h"
 
 void AppStoreReplyAck(uint8_t cmd_id, uint8_t type, uint32_t ack)
 {
@@ -112,7 +112,13 @@ errcode_t AppStoreGetPkgList(uint8_t cmd_id, uint8_t type, void *usr_data, uint1
         for (int32_t i = 0; i < count; i++) {
             (void)strncpy_s((char*)unitInfo[i].pkgName, PKG_NAME_MAX_LENGTH,
                             bundleInfos[i].bundleName, strlen(bundleInfos[i].bundleName));
-            WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "AppStoreGetPkgList pkgName[%d] = %s", i, unitInfo[i].pkgName);
+            (void)strncpy_s((char*)unitInfo[i].versionName, VERSION_NAME_MAX_LENGTH,
+                            bundleInfos[i].versionName, strlen(bundleInfos[i].versionName));
+            (void)strncpy_s((char*)unitInfo[i].labelName, LABEL_NAME_MAX_LENGTH,
+                            bundleInfos[i].label, strlen(bundleInfos[i].label));
+            WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "AppStoreGetPkgList pkgName[%d] = %s, versionName[%d] = %s,\
+                            labeName[%d] = %s", i, unitInfo[i].pkgName, i, unitInfo[i].versionName, i,
+                            unitInfo[i].labelName);
             unitInfo[i].versionCode = bundleInfos[i].versionCode;
         }
         ret = msg_center_send_data(MSGCENTER_CMD_APP_STORE, type, infoList, len);
@@ -127,3 +133,40 @@ errcode_t AppStoreGetPkgList(uint8_t cmd_id, uint8_t type, void *usr_data, uint1
     }
     return ret;
 }
+
+errcode_t AppStoreGetBundleInfo(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len)
+{
+    BundleInfo bundleInfo;
+    int32_t ret = ERRCODE_FAIL;
+
+    uint8_t tl_len = msg_center_get_tlv_tl_len(usr_data);
+    uint16_t payload_len = usr_len - tl_len;
+    uint8_t *tlv_payload = (uint8_t *)msg_center_get_tlv_payload(usr_data);
+    char *bundleName = (char *)malloc(payload_len + 1);
+    (void)memcpy_s(bundleName, payload_len, tlv_payload, payload_len);
+    bundleName[payload_len] = '\0';
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "bundleName = %s", bundleName);
+
+    uint8_t bundleRet = OHOS::BundleMsClient::GetInstance().GetBundleInfo(bundleName, 0, &bundleInfo);
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "get bundleInfo, ret = %d", bundleRet);
+
+    int32_t len = sizeof(PkgUnitInfo);
+    PkgUnitInfo *info = (PkgUnitInfo *)malloc(len);
+    if (info != nullptr) {
+        memset_s(info, len, 0, len);
+        (void)strncpy_s((char*)info->pkgName, PKG_NAME_MAX_LENGTH, bundleInfo.bundleName,
+                        strlen(bundleInfo.bundleName));
+        (void)strncpy_s((char*)info->versionName, VERSION_NAME_MAX_LENGTH, bundleInfo.versionName,
+                        strlen(bundleInfo.versionName));
+        (void)strncpy_s((char*)info->labelName, LABEL_NAME_MAX_LENGTH, bundleInfo.label, strlen(bundleInfo.label));
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "AppStoreGetBundleInfo pkgName = %s, versionName = %s, labeName = %s",
+                      info->pkgName, info->versionName, info->labelName);
+        info->versionCode = bundleInfo.versionCode;
+        ret = msg_center_send_data(cmd_id, type, info, len);
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_MSG_CENTER, "AppStoreGetBundleInfo send data ret = 0x%x", ret);
+        free(info);
+        free(bundleName);
+    }
+
+    return ret;
+}
\ No newline at end of file
index 7bbc93b..3757401 100644 (file)
@@ -18,6 +18,8 @@ extern "C" {
 #endif
 
 #define PKG_NAME_MAX_LENGTH 128
+#define VERSION_NAME_MAX_LENGTH 128
+#define LABEL_NAME_MAX_LENGTH 256
 #define FS_DIR_APP_STORE    "/user/app_store/"
 
 typedef enum {
@@ -29,6 +31,7 @@ typedef enum {
     APP_STORE_OPERATION  = 0x01,
     APP_STORE_NOTIFY_PROGRESS = 0x02,
     APP_STORE_GET_PKG_LIST = 0x03,
+    APP_STORE_GET_BUNDLEINFO = 0x04,
 } AppStoreType;
 
 typedef enum {
@@ -60,10 +63,13 @@ typedef struct {
 typedef struct {
     uint8_t pkgName[PKG_NAME_MAX_LENGTH];
     int32_t versionCode;
+    uint8_t versionName[VERSION_NAME_MAX_LENGTH];
+    uint8_t labelName[LABEL_NAME_MAX_LENGTH];
 } PkgUnitInfo;
 
 errcode_t AppStorePkgOperation(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len);
 errcode_t AppStoreGetPkgList(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len);
+errcode_t AppStoreGetBundleInfo(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len);
 
 #ifdef __cplusplus
 #if __cplusplus
index f34d838..d2f1f1a 100644 (file)
@@ -10,6 +10,7 @@ extern "C" {
 static const msg_center_cmd_map_t g_appStoreTbl[] = {
     { MSGCENTER_CMD_APP_STORE,  APP_STORE_OPERATION,                 AppStorePkgOperation },
     { MSGCENTER_CMD_APP_STORE,  APP_STORE_GET_PKG_LIST,              AppStoreGetPkgList },
+    { MSGCENTER_CMD_APP_STORE,  APP_STORE_GET_BUNDLEINFO,            AppStoreGetBundleInfo },
 };
 
 errcode_t AppStoreTypeDispatch(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len)
index 5485438..8359e67 100644 (file)
@@ -43,7 +43,9 @@ typedef enum {
     TOPIC_EVENT_HFP_FINISHED,\r
     TOPIC_EVENT_HFP_PHONE_TO_WATCH,\r
     TOPIC_EVENT_HFP_WATCH_TO_PHONE,\r
-    \r
+    TOPIC_EVENT_BLOODOXYGEN_UPDATA,\r
+    TOPIC_EVENT_SPORT_DISTANCE,\r
+    TOPIC_EVENT_LOCATION,\r
     TOPIC_END_NUM = 20000,\r
 } TopicNum;\r
 \r
index 2560ff4..5fe38ef 100644 (file)
@@ -32,6 +32,9 @@ static const TopicToCore topicToCoreArray[] = {
     {TOPIC_EVENT_HFP_FINISHED, A_CORE_MASK, 1},
     {TOPIC_EVENT_HFP_PHONE_TO_WATCH, A_CORE_MASK, 1},
     {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,其对应的位图 */
diff --git a/code/sdk/application/wearable/service/device_msg/CMakeLists.txt b/code/sdk/application/wearable/service/device_msg/CMakeLists.txt
new file mode 100644 (file)
index 0000000..9ea557d
--- /dev/null
@@ -0,0 +1,51 @@
+set(COMPONENT_NAME "device_msg")\r
+\r
+set(PUBLIC_HEADER\r
+)\r
+\r
+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}/middleware/services/gui/uikit/proprietary/include\r
+    ${ROOT_DIR}/middleware/services/gui/uikit/proprietary/src/ui/innerkits\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}/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
+)\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
+)\r
+\r
+set(COMPONENT_CCFLAGS\r
+    -std=c++11\r
+    -Wno-missing-field-initializers\r
+)\r
+\r
+set(WHOLE_LINK\r
+    true\r
+)\r
+\r
+set(PUBLIC_DEFINES\r
+)\r
+\r
+set(PRIVATE_DEFINES\r
+    APP_PLATFORM_WATCHGT\r
+    CONFIG_ACELITE_ENABLE\r
+)\r
+\r
+build_component()\r
+\r
+\r
diff --git a/code/sdk/application/wearable/service/device_msg/device_location.cpp b/code/sdk/application/wearable/service/device_msg/device_location.cpp
new file mode 100644 (file)
index 0000000..d24a14f
--- /dev/null
@@ -0,0 +1,174 @@
+/*\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/service/device_msg/device_location.h b/code/sdk/application/wearable/service/device_msg/device_location.h
new file mode 100644 (file)
index 0000000..3305d69
--- /dev/null
@@ -0,0 +1,20 @@
+/*\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
diff --git a/code/sdk/application/wearable/service/device_msg/device_msg.cpp b/code/sdk/application/wearable/service/device_msg/device_msg.cpp
new file mode 100644 (file)
index 0000000..3f54b45
--- /dev/null
@@ -0,0 +1,191 @@
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025. All rights reserved.\r
+ * Description: Breath Ease\r
+ * Author: wangle\r
+ * Create: 2025-4-23\r
+ */\r
+#include "msg_center_protocol.h"\r
+#include "msg_center_cmd.h"\r
+#include "ohos_init.h"\r
+#include "msg_center_device.h"\r
+#ifdef PUBLISH_TEST_DATA\r
+#include <cstdlib>\r
+#include <ctime>\r
+#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
+#ifdef __cplusplus\r
+extern "C" {\r
+#endif\r
+#ifdef PUBLISH_TEST_DATA\r
+#define BLOODOXYGEN_LOWER 90\r
+#define BLOODOXYGEN_RANGE 10\r
+#define STEP_RANGE 5\r
+#define DISTANCE_RANGE 10\r
+#define HEARTRATE_LOWER 60\r
+#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
+static void PublishTopicTestDataEvent(uint16_t topic, const void *data, size_t len)\r
+{\r
+    int32_t ret;\r
+    uint16_t size = len;\r
+    BroadcastApi *broadcastApi = nullptr;\r
+    IUnknown *api = nullptr;\r
+\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "PublishTopicTestDataEvent topic=%u!!", topic);\r
+\r
+    void *publishData = malloc(size);\r
+    if (publishData == nullptr) {\r
+        return;\r
+    }\r
+    ret = memcpy_s(publishData, size, data, size);\r
+    if (ret != EOK) {\r
+        free(publishData);\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "PublishTopicTestDataEvent memcpy_s fail! ret = %d", ret);\r
+        return;\r
+    }\r
+\r
+    Request request = {\r
+        .msgId = topic,\r
+        .len = size,\r
+        .msgValue = 0,\r
+        .data = publishData,\r
+    };\r
+\r
+    /* public request */\r
+    api = SAMGR_GetInstance()->GetFeatureApi(BROADCAST_SERVICE_NAME, BROADCAST_FEATURE_NAME);\r
+    if (api == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "GetFeatureApi failed");\r
+        free(publishData);\r
+        return;\r
+    }\r
+    ret = api->QueryInterface(api, DEFAULT_VERSION, (void **)&broadcastApi);\r
+    if (ret != 0 || broadcastApi == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "QueryInterface failed");\r
+        free(publishData);\r
+        return;\r
+    }\r
+    broadcastApi->PublishTopic((IUnknown *)broadcastApi, &request);\r
+    broadcastApi->Release((IUnknown *)broadcastApi);\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "PublishTopicTestDataEvent end!!");\r
+\r
+    return;\r
+}\r
+\r
+static void PublishTestDataCallback(void *)\r
+{\r
+    switch (g_rotation_publish++ % PUBLISH_TYPE_MAX) {\r
+        case PUBLISH_BLOODOXYGEN: {\r
+            uint8_t blood_oxygen = BLOODOXYGEN_LOWER + rand() % BLOODOXYGEN_RANGE;\r
+            PublishTopicTestDataEvent(TOPIC_EVENT_BLOODOXYGEN_UPDATA, &blood_oxygen, sizeof(uint8_t));\r
+            break;\r
+        }\r
+        case PUBLISH_SETP: {\r
+            uint32_t step = rand() % STEP_RANGE;\r
+            PublishTopicTestDataEvent(TOPIC_EVENT_STEPDATA_UPDATE, &step, sizeof(uint32_t));\r
+            break;\r
+        }\r
+        case PUBLISH_HEARTRATE: {\r
+            HeartDatas heart_data = {0};\r
+            heart_data.perSec = HEARTRATE_LOWER + rand() % HEARTRATE_RANGE;\r
+            PublishTopicTestDataEvent(TOPIC_EVENT_HEARTRATE_UPDATA, &heart_data, sizeof(HeartDatas));\r
+            break;\r
+        }\r
+        case PUBLISH_DISTANCE: {\r
+            uint32_t distance = rand() % DISTANCE_RANGE;\r
+            PublishTopicTestDataEvent(TOPIC_EVENT_SPORT_DISTANCE, &distance, sizeof(uint32_t));\r
+            break;\r
+        }\r
+        default:\r
+            break;\r
+    }\r
+}\r
+\r
+void PublishTestData()\r
+{\r
+    uint32 tick = GetOSTick(5000);  // 5秒发布一次测试数据\r
+    if (g_publishTestDataHandle == nullptr) {\r
+        g_publishTestDataHandle = new GraphicTimer(tick, PublishTestDataCallback, nullptr, true);\r
+    }\r
+    if (g_publishTestDataHandle == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "PublishTestData new GraphicTimer failed!!");\r
+        return;\r
+    }\r
+    bool retTimer = g_publishTestDataHandle->Start();\r
+    if (!retTimer) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "PublishTestData Start failed!!");\r
+        if (g_publishTestDataHandle != nullptr) {\r
+            delete g_publishTestDataHandle;\r
+            g_publishTestDataHandle = nullptr;\r
+        }\r
+        return;\r
+    }\r
+}\r
+#endif\r
+static const msg_center_cmd_map_t g_msg_center_device_tbl[] = {\r
+    {MSGCENTER_CMD_DEVICE, MSGCENTER_TYPE_ID_GET_BATTERY_LEVEL, msg_center_get_battery_level},\r
+    {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
+#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
+};\r
+\r
+errcode_t msg_center_device_type_dispatch(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len)\r
+{\r
+    uint8_t tbl_size = sizeof(g_msg_center_device_tbl) / sizeof(g_msg_center_device_tbl[0]);\r
+    uint8_t i;\r
+    for (i = 0; i < tbl_size; i++) {\r
+        msg_center_cmd_map_t *item = (msg_center_cmd_map_t *)&g_msg_center_device_tbl[i];\r
+        if ((item->type == type) && (item->handler != NULL)) {\r
+            item->handler(cmd_id, type, usr_data, usr_len);\r
+            return ERRCODE_SUCC;\r
+        }\r
+    }\r
+    return ERRCODE_NOT_SUPPORT;\r
+}\r
+\r
+void device_init(void)\r
+{\r
+    msg_center_register_cmd(MSGCENTER_CMD_DEVICE, msg_center_device_type_dispatch);\r
+}\r
+\r
+APP_FEATURE_INIT_PRI(device_init, LAYER_INIT_LEVEL_4);\r
+#ifdef __cplusplus\r
+}\r
+#endif\r
+}  // namespace OHOS
\ No newline at end of file
diff --git a/code/sdk/application/wearable/service/device_msg/device_proxy.cpp b/code/sdk/application/wearable/service/device_msg/device_proxy.cpp
new file mode 100644 (file)
index 0000000..336cfd7
--- /dev/null
@@ -0,0 +1,476 @@
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025. All rights reserved.\r
+ * Description: Breath Ease\r
+ * Author: wangle\r
+ * Create: 2025-4-23\r
+ */\r
+#include <cstdio>\r
+#include "device_proxy.h"\r
+#include "wearable_log.h"\r
+#include "common_def.h"\r
+#include "cpp/audio_manager.h"\r
+#include "uiservice/ui_service.h"\r
+#include "ui_resource_string.h"\r
+#include <sys/statfs.h>\r
+#include <algorithm>\r
+#include "key_id.h"\r
+#include "common.h"\r
+#include "nv.h"\r
+#include "upg.h"\r
+#include "upg_porting.h"\r
+\r
+namespace OHOS {\r
+static constexpr const char *MOUNT_POINT[] = {"/system", "/user", "/update", "/music"};\r
+static constexpr const uint16_t language_protocol[] = {(uint8_t)(0x0u << 8) | LANGUAGE_ID_ZH,\r
+                                                       (uint8_t)(0x1u << 8) | LANGUAGE_ID_ZH,\r
+                                                       (uint8_t)(0x2u << 8) | LANGUAGE_ID_EN};\r
+static constexpr const uint8_t language_mask_bits = 8;\r
+static constexpr const uint16_t language_key_mask = 0xFF00;\r
+static constexpr const uint16_t language_val_mask = 0x00FF;\r
+\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;          // 18 * 1000\r
+static constexpr const uint32_t adc_reference_ratio_denominator = 1024U / 2U;  // 40960 / (1000/18)/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
+template <typename T>\r
+T clamp(const T &value, const T &min_val, const T &max_val)\r
+{\r
+    return (value < min_val) ? (min_val) : (value > max_val ? max_val : value);\r
+}\r
+\r
+void device_proxy::get_storage_info(storage_info &info)\r
+{\r
+    memset_s(&info, sizeof(storage_info), 0, sizeof(storage_info));\r
+    for (size_t i = 0; i < sizeof(MOUNT_POINT) / sizeof(MOUNT_POINT[0]); i++) {\r
+        struct statfs tmpStat = {0};\r
+        if (statfs(MOUNT_POINT[i], &tmpStat) != 0) {\r
+            WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "无法获取%s的挂载点信息,%s", MOUNT_POINT[i], strerror(errno));\r
+            continue;\r
+        }\r
+\r
+        uint32_t total = static_cast<uint32_t>(tmpStat.f_blocks * tmpStat.f_bsize);\r
+        uint32_t used = static_cast<uint32_t>((tmpStat.f_blocks - tmpStat.f_bfree) * tmpStat.f_bsize);\r
+        uint32_t free = static_cast<uint32_t>(tmpStat.f_bfree * tmpStat.f_bsize);\r
+\r
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "挂载点%s信息, 总:%d(byte), 用:%d(byte), 剩:%d(byte)",\r
+                      MOUNT_POINT[i], total, used, free);\r
+        info.total_size += total;\r
+        info.used_size += used;\r
+        info.free_size += free;\r
+    }\r
+}\r
+void device_proxy::get_language_id(uint8_t &id)\r
+{\r
+    sys_language_id_t lang_id = {0};\r
+    uint16_t nvsize = 0;\r
+\r
+    errcode_t ret = uapi_nv_read(NV_ID_SYS_LANGUAGE_ID, sizeof(sys_language_id_t), &nvsize, (uint8_t *)&lang_id);\r
+    if (ret != ERRCODE_SUCC) {\r
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "nv get language id error, ret=%u", ret);\r
+        return;\r
+    }\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "language nvsize=%u id = %u", nvsize, lang_id.language_id);\r
+\r
+    for (auto key : language_protocol) {\r
+        if (lang_id.language_id == (uint8_t)(key & language_val_mask)) {\r
+            id = (uint8_t)((key & language_key_mask) >> language_mask_bits);\r
+            return;\r
+        }\r
+    }\r
+    id = LANGUAGE_ID_ZH;\r
+}\r
+void device_proxy::set_language_id(uint8_t id)\r
+{\r
+    sys_language_id_t lang_id = {.language_id = LANGUAGE_ID_ZH};\r
+\r
+    for (auto key : language_protocol) {\r
+        if (id == (uint8_t)((key & language_key_mask) >> language_mask_bits)) {\r
+            lang_id.language_id = (uint8_t)(key & 0xFF);\r
+        }\r
+    }\r
+\r
+    errcode_t ret = uapi_nv_write(NV_ID_SYS_LANGUAGE_ID, (uint8_t *)&lang_id, sizeof(sys_language_id_t));\r
+    if (ret != ERRCODE_SUCC) {\r
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "nv set language id error, ret=%u", ret);\r
+        return;\r
+    }\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "set language id = %u", lang_id.language_id);\r
+    // 发送更新消息到uiservice\r
+    SendMsgToUIService(UI_UPDATE_LANGUAGE, 0, nullptr, 0);\r
+}\r
+void device_proxy::get_product_info(std::string &info_string)\r
+{\r
+    sys_product_info_t info = {0};\r
+    uint16_t nvsize = 0;\r
+    info_string.clear();\r
+\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_LOGD(WEARABLE_LOG_MODULE_APP, "nv get product info error, ret=%u", ret);\r
+        return;\r
+    }\r
+\r
+    if (nvsize < sizeof(sys_product_info_t) || info.size == 0) {\r
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "invalid product info size: nvsize=%u, info.size=%u", nvsize, info.size);\r
+        return;\r
+    }\r
+\r
+    info_string.assign((const char *)info.name, info.size);\r
+\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "product info: nvsize=%u, strlen=%zu, data=%.*s", nvsize, info_string.size(),\r
+                  static_cast<int>(info_string.size()), info_string.c_str());\r
+}\r
+void device_proxy::get_volume_info(uint8_t vol_type, std::vector<volume_info> &vol_info)\r
+{\r
+    std::vector<AudioStreamType> audio_types;\r
+\r
+    if (vol_type == vol_type_all_idx || vol_type > vol_type_max_idx) {\r
+        for (uint8_t i = 0; i < vol_type_max_idx; i++) {\r
+            uint8_t max_perc = 0;\r
+            trans_type_to_audio_stream_type(i, audio_types);\r
+            for (auto types : audio_types) {  // 每个类型也由多个音频类型组成, 取声音最大的\r
+                int32_t vol = Audio::AudioManager::GetInstance().GetVolume(types);\r
+                int32_t max_vol = Audio::AudioManager::GetInstance().GetMaxVolume(types);\r
+                int32_t min_vol = Audio::AudioManager::GetInstance().GetMinVolume(types);\r
+                uint8_t perc = calc_vol_percentage(min_vol, max_vol, vol);\r
+                max_perc = max_perc > perc ? max_perc : perc;\r
+            }\r
+            volume_info info;\r
+            info.type = i;\r
+            info.perc = max_perc;\r
+\r
+            vol_info.push_back(info);\r
+        }\r
+    } else {\r
+        uint8_t max_perc = 0;\r
+        trans_type_to_audio_stream_type(vol_type, audio_types);\r
+        for (auto types : audio_types) {  // 每个类型也由多个音频类型组成, 取声音最大的\r
+            int32_t vol = Audio::AudioManager::GetInstance().GetVolume(types);\r
+            int32_t max_vol = Audio::AudioManager::GetInstance().GetMaxVolume(types);\r
+            int32_t min_vol = Audio::AudioManager::GetInstance().GetMinVolume(types);\r
+            uint8_t perc = calc_vol_percentage(min_vol, max_vol, vol);\r
+            max_perc = max_perc > perc ? max_perc : perc;\r
+        }\r
+        volume_info info;\r
+        info.type = vol_type;\r
+        info.perc = max_perc;\r
+\r
+        vol_info.push_back(info);\r
+    }\r
+}\r
+void device_proxy::set_volume_info(volume_info &vol_info)\r
+{\r
+    std::vector<AudioStreamType> audio_types;\r
+    trans_type_to_audio_stream_type(vol_info.type, audio_types);\r
+    for (auto types : audio_types) {\r
+        int32_t max_vol = Audio::AudioManager::GetInstance().GetMaxVolume(types);\r
+        int32_t min_vol = Audio::AudioManager::GetInstance().GetMinVolume(types);\r
+\r
+        int32_t vol = calc_vol_volume(min_vol, max_vol, vol_info.perc);\r
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SetVolume %08X, %d", types, vol);\r
+        Audio::AudioManager::GetInstance().SetVolume(types, vol);\r
+    }\r
+}\r
+OTA_ERR device_proxy::ota_init(ota_info &info)\r
+{\r
+    // 检查OTA的当前状态\r
+    upg_status status = uapi_upg_get_status();\r
+    if (status == UPG_STATUS_UPDATING) {\r
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "OTAInit:The update module is being upgraded.");\r
+        return OTA_ERR::OTA_ERR_STATUS_UPDATING;\r
+    }\r
+    // 清理并检查升级区空间大小\r
+    delete_file_with_cleanup(upg_get_pkg_file_dir(), upg_get_pkg_file_path());\r
+    uint32_t total_size = uapi_upg_get_storage_size();\r
+    if (total_size == 0) {\r
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "OTAInit:OTA check storage size error, total_size is 0");\r
+        return OTA_ERR::OTA_ERR_INVAILD_STORAGE;\r
+    }\r
+    if (info.package_size >= total_size) {\r
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "OTAInit:check size error, total size:%u, need size:%u", total_size,\r
+                      info.package_size);\r
+        return OTA_ERR::OTA_ERR_INSUFFICIENT_STORAGE_SPACE;\r
+    }\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "OTAInit:check succ");\r
+    return OTA_ERR::OTA_SUCC;\r
+}\r
+OTA_ERR device_proxy::ota_update(ota_info &info)\r
+{\r
+    uint32_t total_size = 0;\r
+    do {\r
+        FILE *fp = fopen(upg_get_pkg_file_path(), "rb");\r
+        if (fp == nullptr) {\r
+            break;\r
+        }\r
+        fseek(fp, 0L, SEEK_END);\r
+        total_size = ftell(fp);\r
+        fclose(fp);\r
+    } while (false);\r
+    if (total_size == 0) {\r
+        return OTA_ERR::OTA_ERR_INVAILD_STORAGE;\r
+    }\r
+    if (total_size != info.package_size) {\r
+        return OTA_ERR::OTA_ERR_PACKAGE_SIZE_ERROR;\r
+    }    \r
+    return OTA_ERR::OTA_SUCC;\r
+}\r
+\r
+void device_proxy::call_ui_ota_update()\r
+{\r
+    // 发送升级请求到uiservice\r
+    SendMsgToUIService(UI_OTA_UPDATE, 0, nullptr, 0);\r
+}\r
+\r
+int device_proxy::delete_file_with_cleanup(const char *ppath, const char *path)\r
+{\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "path:%s, ppath:%s", path, ppath);\r
+    // 1. 删除文件\r
+    if (unlink(path) == -1) {\r
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "unlink failed:%d", errno);\r
+        return 1;\r
+    }\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "unlink succ");\r
+    // 2. 打开父目录文件描述符\r
+    int dir_fd = open(ppath, O_RDONLY);\r
+    if (dir_fd == -1) {\r
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "open parent dir failed:%d", errno);\r
+        return 1;\r
+    }\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "open parent dir succ");\r
+    // 3. 同步父目录元数据到磁盘\r
+    if (fsync(dir_fd) == -1) {\r
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "fsync dir failed:%d", errno);\r
+        close(dir_fd);\r
+        return 1;\r
+    }\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "fsync dir succ");\r
+    close(dir_fd);\r
+    return 0;\r
+}\r
+\r
+uint8_t device_proxy::calc_vol_percentage(int32_t min, int32_t max, int32_t curr)\r
+{\r
+    if (min >= max) {\r
+        return 0;\r
+    }\r
+    const int32_t clamped_curr = clamp(curr, min, max);\r
+    const int64_t range = static_cast<int64_t>(max) - min;\r
+\r
+    const int64_t scaled_value = (static_cast<int64_t>(clamped_curr - min) * percentage_scale);\r
+    return static_cast<uint8_t>(scaled_value / range);\r
+}\r
+int32_t device_proxy::calc_vol_volume(int32_t min, int32_t max, uint8_t percentage)\r
+{\r
+    if (min >= max) {\r
+        return min;\r
+    }\r
+    uint8_t clamped_percentage = clamp(percentage, percentage_min, percentage_max);\r
+\r
+    double range = static_cast<double>(max - min);\r
+    double percentage_ratio = static_cast<double>(clamped_percentage) / 100.0;\r
+    int32_t curr = static_cast<int32_t>(min + range * percentage_ratio);\r
+\r
+    return static_cast<int32_t>(clamp(curr, min, max));\r
+}\r
+void device_proxy::trans_type_to_audio_stream_type(uint8_t type, std::vector<AudioStreamType> &audio_types)\r
+{\r
+    audio_types.clear();\r
+    switch (type) {\r
+        case vol_type_alarm:\r
+            audio_types.push_back(AUDIO_STREAM_ALARM);         // 通用报警音\r
+            audio_types.push_back(AUDIO_STREAM_ALARM_SYSTEM);  // 设备报警\r
+            audio_types.push_back(AUDIO_STREAM_ALARM_CLOCK);   // 闹钟报警\r
+            break;\r
+        case vol_type_ring:\r
+            audio_types.push_back(AUDIO_STREAM_RING);  // 来电铃声\r
+            break;\r
+        case vol_type_call:\r
+            audio_types.push_back(AUDIO_STREAM_VOICE_CALL);         // 普通语音通话\r
+            audio_types.push_back(AUDIO_STREAM_VOICE_CALL_VOIP);    // 网络语音通话(如微信通话)\r
+            audio_types.push_back(AUDIO_STREAM_VOICE_CALL_BT_SCO);  // 蓝牙语音通话\r
+            audio_types.push_back(AUDIO_STREAM_VOICE_CALL_VOLTE);   // 4G VOLTE 高清语音通话\r
+            break;\r
+        case vol_type_assistant:\r
+            audio_types.push_back(AUDIO_STREAM_VOICE_ASSISTANT);  // 语音助手(如 Siri、Google Assistant)\r
+            audio_types.push_back(AUDIO_STREAM_TTS);              // 语音合成(如文本转语音)\r
+            break;\r
+        case vol_type_notification:\r
+            audio_types.push_back(AUDIO_STREAM_NOTIFICATION);  // 通用提示音\r
+            audio_types.push_back(AUDIO_STREAM_NOTIFICATION_SYSTEM);  // 设备提示音(如蓝牙连接/断开、低电量提示)\r
+            audio_types.push_back(AUDIO_STREAM_NOTIFICATION_PROMPT);  // 运动健康提示音(如运动完成提醒)\r
+            break;\r
+        case vol_type_music:\r
+            audio_types.push_back(AUDIO_STREAM_MUSIC);  // 本地音乐播放。\r
+            audio_types.push_back(AUDIO_STREAM_A2DP_MUSIC);  // 蓝牙传输的媒体音(如从手机传输到蓝牙耳机的音乐)。\r
+            break;\r
+        case vol_type_video:\r
+            audio_types.push_back(AUDIO_STREAM_FITNESS_VIDEO);  // 健身视频的指导音频。\r
+            break;\r
+    }\r
+}\r
+\r
+uint8_t battery_power::get_battery_percentage()\r
+{\r
+    battery_power *inst = get_instance();\r
+    if (inst == nullptr) {\r
+        return 0;\r
+    }\r
+    uint32_t voltage = 0;\r
+    // 从adc获取电压值\r
+    if (inst->adc_context_startup()) {\r
+        voltage = inst->calc_voltage();\r
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "calc_voltage:%u", voltage);\r
+    }\r
+    inst->adc_context_shutdown();\r
+    // 根据电压值计算电量百分比\r
+    return inst->calc_percentage(voltage);\r
+}\r
+\r
+battery_power *battery_power::get_instance()\r
+{\r
+    static battery_power *instance = nullptr;\r
+    if (instance == nullptr) {\r
+        battery_power *temp = new battery_power();\r
+        if (!temp->adc_context_init()) {\r
+            delete temp;\r
+            return nullptr;\r
+        }\r
+        instance = temp;\r
+    }\r
+    return instance;\r
+}\r
+\r
+battery_power::battery_power()\r
+{\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
+    // 由测试检测而来, 测试中得到的数据应该是0.3744V(没有标注单位,猜测得到,未必准确)\r
+    // 因为要算百分比, 换算成毫伏更容易计算\r
+    adc_max_range_mv = def_adc_max_range_mv;\r
+    adc_min_range_mv = def_adc_min_range_mv;\r
+}\r
+\r
+battery_power::~battery_power()\r
+{\r
+    adc_context_shutdown();\r
+}\r
+\r
+bool battery_power::adc_context_init()\r
+{\r
+    // 初始化pin模块\r
+    uapi_pin_init();\r
+    // 初始化高精度计数器\r
+    errcode_t err = uapi_tcxo_init();\r
+    if (err != ERRCODE_SUCC) {\r
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "uapi_tcxo_init error %u", err);\r
+        return false;\r
+    }\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "uapi_tcxo_init succ");\r
+    // 设置pin脚模式\r
+    err = uapi_pin_set_mode(analog_pin, mode);\r
+    if (err != ERRCODE_SUCC) {\r
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "uapi_pin_set_mode error %u", err);\r
+        return false;\r
+    }\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "uapi_pin_set_mode succ");\r
+    return true;\r
+}\r
+\r
+bool battery_power::adc_context_startup()\r
+{\r
+    errcode_t err = uapi_adc_init(ADC_CLOCK_500KHZ);  // 初始化adc\r
+    if (err != ERRCODE_SUCC) {\r
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "uapi_adc_init error %u", err);\r
+        return false;\r
+    }\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "uapi_adc_init succ");\r
+    uapi_adc_power_en(AFE_SCAN_MODE_MAX_NUM, true);\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "uapi_adc_power_en true");\r
+    err = uapi_adc_open_channel(channel);\r
+    if (err != ERRCODE_SUCC) {\r
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "uapi_adc_open_channel error %u", err);\r
+        return false;\r
+    }\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "uapi_adc_open_channel succ");\r
+    return true;\r
+}\r
+void battery_power::adc_context_shutdown()\r
+{\r
+    errcode_t err = uapi_adc_close_channel(channel);\r
+    if (err != ERRCODE_SUCC) {\r
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "uapi_adc_close_channel error %u", err);\r
+    }\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "uapi_adc_close_channel succ");\r
+    uapi_adc_power_en(AFE_SCAN_MODE_MAX_NUM, false);\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "uapi_adc_power_en false");\r
+    uapi_adc_deinit();\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "uapi_adc_deinit");\r
+}\r
+\r
+uint8_t battery_power::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 battery_power::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
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "sample result = %u", sample_result);\r
+        if (sample_result != 0) {\r
+            stick += sample_result;\r
+            stick_count++;\r
+        }\r
+        osal_irq_restore(irq_sts);\r
+    }\r
+\r
+    if (stick_count == 0) {\r
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "error, no result");\r
+        return 0;\r
+    }\r
+\r
+    uint32_t voltage = adc_trans_sytick_to_voltages(stick / stick_count);\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "adc trans voltages:%u", voltage);\r
+    return voltage;\r
+}\r
+\r
+uint32_t battery_power::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
+}  // namespace OHOS
\ No newline at end of file
diff --git a/code/sdk/application/wearable/service/device_msg/device_proxy.h b/code/sdk/application/wearable/service/device_msg/device_proxy.h
new file mode 100644 (file)
index 0000000..7cedf80
--- /dev/null
@@ -0,0 +1,104 @@
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025. All rights reserved.\r
+ * Description: Breath Ease\r
+ * Author: wangle\r
+ * Create: 2025-4-23\r
+ */\r
+#ifndef WATCH_SETTING_PROXY_H\r
+#define WATCH_SETTING_PROXY_H\r
+\r
+#include <vector>\r
+#include <string>\r
+#include "msg_center_protocol.h"\r
+#include "cpp/audio_manager.h"\r
+#include "adc.h"\r
+#include "tcxo.h"\r
+#include "pinctrl.h"\r
+#include "hal_adc.h"\r
+\r
+namespace OHOS {\r
+\r
+typedef struct storage_info {\r
+    uint32_t total_size;  // 总大小\r
+    uint32_t used_size;   // 已使用\r
+    uint32_t free_size;   // 未使用\r
+} storage_info_t;\r
+\r
+typedef struct volume_info {\r
+    uint8_t type;  // 类型\r
+    uint8_t perc;  // 百分比\r
+} volume_info_t;\r
+\r
+typedef struct ota_info {\r
+    uint32_t package_size;\r
+} ota_info_t;\r
+\r
+enum class OTA_ERR : uint32_t {\r
+    OTA_SUCC = 0x00000000u,                            //"成功"\r
+    OTA_ERR_INVALID_PARAM = 0x00000001u,               //"参数错误"\r
+    OTA_ERR_INITIALIZE_ERR = 0x00000002u,              //"OTA初始化错误"\r
+    OTA_ERR_STATUS_UPDATING = 0x00000003u,             //"OTA正在升级中"\r
+    OTA_ERR_INVAILD_STORAGE = 0x00000004u,             //"获取升级区信息错误"\r
+    OTA_ERR_INSUFFICIENT_STORAGE_SPACE = 0x00000005u,  //"升级区没有足够的空间"\r
+    OTA_ERR_PACKAGE_SIZE_ERROR = 0x00000006u,          //"升级包大小不匹配"\r
+};\r
+\r
+static constexpr const uint8_t vol_type_all_idx = 0;\r
+static constexpr const uint8_t vol_type_max_idx = 7;\r
+static constexpr const uint8_t vol_type_alarm = 1;      // 报警类\r
+static constexpr const uint8_t vol_type_ring = 2;       // 来电铃声\r
+static constexpr const uint8_t vol_type_call = 3;       // 语音通话\r
+static constexpr const uint8_t vol_type_assistant = 4;  // 语音助手\r
+static constexpr const uint8_t vol_type_notification = 5; // 通用提示音\r
+static constexpr const uint8_t vol_type_music = 6;      // 音乐\r
+static constexpr const uint8_t vol_type_video = 7;      // 视频\r
+\r
+\r
+class device_proxy {\r
+public:\r
+    static void get_storage_info(storage_info &info);\r
+    static void get_language_id(uint8_t &lang_id);\r
+    static void set_language_id(uint8_t lang_id);\r
+    static void get_product_info(std::string &info_string);\r
+    static void get_volume_info(uint8_t vol_type, std::vector<volume_info> &vol_info);\r
+    static void set_volume_info(volume_info &vol_info);\r
+    static OTA_ERR ota_init(ota_info &info);\r
+    static OTA_ERR ota_update(ota_info &info);\r
+    static void call_ui_ota_update();\r
+public:\r
+    static uint32_t calc_stat_size(uint64_t size);\r
+    static uint8_t calc_vol_percentage(int32_t min, int32_t max, int32_t curr);\r
+    static int32_t calc_vol_volume(int32_t min, int32_t max, uint8_t percentage);\r
+    static void trans_type_to_audio_stream_type(uint8_t type, std::vector<AudioStreamType> &audio_types);\r
+    static int delete_file_with_cleanup(const char *ppath, const char *path);\r
+};\r
+\r
+class battery_power {\r
+public:\r
+    static uint8_t get_battery_percentage();\r
+\r
+protected:\r
+    static battery_power *get_instance();\r
+\r
+private:\r
+    battery_power();\r
+    ~battery_power();\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
+\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
+\r
+}  // namespace OHOS\r
+#endif
\ No newline at end of file
diff --git a/code/sdk/application/wearable/service/device_msg/msg_center_device.cpp b/code/sdk/application/wearable/service/device_msg/msg_center_device.cpp
new file mode 100644 (file)
index 0000000..56f89c1
--- /dev/null
@@ -0,0 +1,520 @@
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025. All rights reserved.\r
+ * Description: Breath Ease\r
+ * Author: wangle\r
+ * Create: 2025-4-23\r
+ */\r
+#include "msg_center_protocol.h"\r
+#include "msg_center_device.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 "findphone/FindPhoneMainPage.h"\r
+#include "camera/CameraMainPage.h"\r
+\r
+#ifdef __cplusplus\r
+extern "C" {\r
+#endif\r
+#include "diag_msg.h"\r
+#include "diag_ind_src.h"\r
+\r
+uint8_t g_bloodoxygen = 0;\r
+uint16_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
+    WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "get_battery_level");\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 battery_level = OHOS::battery_power::get_battery_percentage();\r
+\r
+    errcode_t ret = msg_center_send_data(cmd_id, type, &battery_level, sizeof(battery_level));\r
+    if (ret != ERRCODE_SUCC) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "send get_battery_level_ack fail, ret = %d", ret);\r
+        return ERRCODE_FAIL;\r
+    }\r
+    return ERRCODE_SUCC;\r
+}\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
+    WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "get_storage_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
+    uint8_t battery_level = 0;\r
+\r
+    OHOS::storage_info info;\r
+    OHOS::device_proxy::get_storage_info(info);\r
+\r
+    errcode_t ret = msg_center_send_data(cmd_id, type, &info, sizeof(OHOS::storage_info));\r
+    if (ret != ERRCODE_SUCC) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "send get_storage_info_ack fail, ret = %d", ret);\r
+        return ERRCODE_FAIL;\r
+    }\r
+    return ERRCODE_SUCC;\r
+}\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
+    WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "get_product_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
+    uint8_t battery_level = 0;\r
+\r
+    std::string product_info;\r
+    OHOS::device_proxy::get_product_info(product_info);\r
+\r
+    errcode_t ret = msg_center_send_data(cmd_id, type, (void *)product_info.c_str(), product_info.length());\r
+    if (ret != ERRCODE_SUCC) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "send get_product_info_ack fail, ret = %d", ret);\r
+        return ERRCODE_FAIL;\r
+    }\r
+    return ERRCODE_SUCC;\r
+}\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
+    WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "get_language_id");\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
+    uint8_t battery_level = 0;\r
+\r
+    uint8_t language_id = 0;\r
+    OHOS::device_proxy::get_language_id(language_id);\r
+\r
+    errcode_t ret = msg_center_send_data(cmd_id, type, &language_id, sizeof(uint8_t));\r
+    if (ret != ERRCODE_SUCC) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "send get_language_id_ack fail, ret = %d", ret);\r
+        return ERRCODE_FAIL;\r
+    }\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
+    WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "set_language_id");\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 language_id = 0;\r
+    if (v_len != sizeof(uint8_t)) {\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
+    language_id = *(uint8_t *)v_data;\r
+    OHOS::device_proxy::set_language_id(language_id);\r
+\r
+    errcode_t ret = msg_center_send_data(cmd_id, type, &language_id, sizeof(uint8_t));\r
+    if (ret != ERRCODE_SUCC) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "send set_language_id_ack fail, ret = %d", ret);\r
+        return ERRCODE_FAIL;\r
+    }\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
+    WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "ota_init");\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::ota_info info;\r
+    if (v_len != sizeof(OHOS::ota_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::ota_info), v_data, v_len);\r
+    OHOS::OTA_ERR err = OHOS::device_proxy::ota_init(info);\r
+\r
+    errcode_t ret = msg_center_send_data(cmd_id, type, &err, sizeof(OHOS::OTA_ERR));\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_update(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len)\r
+{\r
+    WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "ota_update");\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::ota_info info;\r
+    if (v_len != sizeof(OHOS::ota_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::ota_info), v_data, v_len);\r
+    OHOS::OTA_ERR err = OHOS::device_proxy::ota_update(info);\r
+\r
+    errcode_t ret = msg_center_send_data(cmd_id, type, &err, sizeof(OHOS::OTA_ERR));\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
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "send ret = %d", ret);\r
+    OHOS::device_proxy::call_ui_ota_update();    \r
+\r
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "send ui over");\r
+    return ERRCODE_SUCC;\r
+}\r
+\r
+errcode_t msg_center_device_heartrate(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_heartrate, sizeof(g_heartrate));\r
+    if (ret != ERRCODE_SUCC) {\r
+        return ERRCODE_FAIL;\r
+    }\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_MSG_CENTER, "msg_center_device_heartrate:%d\r\n", g_heartrate);\r
+    /* notify UI or call UI load */\r
+\r
+    return ERRCODE_SUCC;\r
+}\r
+\r
+errcode_t msg_center_device_stepdata(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_stepdata, sizeof(g_stepdata));\r
+    if (ret != ERRCODE_SUCC) {\r
+        return ERRCODE_FAIL;\r
+    }\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_MSG_CENTER, "msg_center_device_stepdata:%d\r\n", g_stepdata);\r
+    /* notify UI or call UI load */\r
+\r
+    return ERRCODE_SUCC;\r
+}\r
+\r
+errcode_t msg_center_device_bloodoxygen(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_bloodoxygen, sizeof(g_bloodoxygen));\r
+    if (ret != ERRCODE_SUCC) {\r
+        return ERRCODE_FAIL;\r
+    }\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_MSG_CENTER, "msg_center_device_bloodoxygen:%d\r\n", g_bloodoxygen);\r
+    /* notify UI or call UI load */\r
+\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
+    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
+    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
+            break;\r
+        case SPORT_ACTION_PAUSE:\r
+            OHOS::SportsModel::GetInstance()->StopSportsTimer(false);\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
+            break;\r
+        case SPORT_ACTION_STOP:\r
+            OHOS::SportsModel::GetInstance()->StopSportsTimer(false);\r
+            OHOS::NativeAbility::GetInstance().ChangeSlice(VIEW_MAIN_SAMPLE);\r
+            break;\r
+        default:\r
+            ret = ERRCODE_FAIL;\r
+            break;\r
+    }\r
+\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
+        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
+{\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
+        return ERRCODE_FAIL;\r
+    }\r
+    return ERRCODE_SUCC;\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
+    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
+    return ERRCODE_SUCC;\r
+}\r
+\r
+errcode_t msg_center_camera_online(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len)\r
+{\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_MSG_CENTER, "recv connect success from phone");\r
+    if (OHOS::CameraMainPage::GetInstance() != nullptr) {\r
+        OHOS::CameraMainPage::GetInstance()->Refresh_page();\r
+        return ERRCODE_SUCC;\r
+    } else {\r
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_MSG_CENTER, "CameraMainPage not exist\r\n");\r
+        return ERRCODE_FAIL;\r
+    }\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
+{\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
+    uint8_t data = *tlv_payload;\r
+    errcode_t ret = ERRCODE_SUCC;\r
+    WEARABLE_LOGI(WEARABLE_LOG_MODULE_MSG_CENTER, "msg_center_offline_log_switch, data = %d\r\n", data);\r
+    if (data) {\r
+        uapi_zdiag_set_offline_log_enable(true); /*open offline log*/\r
+    } else {\r
+        uapi_zdiag_set_offline_log_enable(false); /*close offline log*/\r
+    }\r
+    ret = msg_center_send_data(cmd_id, type, &data, sizeof(data));\r
+    if (ret != ERRCODE_SUCC) {\r
+        return ERRCODE_FAIL;\r
+    }\r
+    return ERRCODE_SUCC;\r
+}\r
+\r
+#if (CONFIG_ONLINE_LOG == 1)\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
+    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
+    uint8_t data = *tlv_payload;\r
+    errcode_t ret = ERRCODE_SUCC;\r
+    WEARABLE_LOGI(WEARABLE_LOG_MODULE_MSG_CENTER, "msg_center_set_online_log_channel, data = %d\r\n", data);\r
+    change_log_diag_channel(data);\r
+    ret = msg_center_send_data(cmd_id, type, &data, sizeof(data));\r
+    if (ret != ERRCODE_SUCC) {\r
+        return ERRCODE_FAIL;\r
+    }\r
+    return ERRCODE_SUCC;\r
+}\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
+    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
+    uint8_t data = *tlv_payload;\r
+    errcode_t ret = ERRCODE_SUCC;\r
+    WEARABLE_LOGI(WEARABLE_LOG_MODULE_MSG_CENTER, "msg_center_set_online_log_level, data = %d\r\n", data);\r
+    set_online_log_level(data);\r
+    ret = msg_center_send_data(cmd_id, type, &data, sizeof(data));\r
+    if (ret != ERRCODE_SUCC) {\r
+        return ERRCODE_FAIL;\r
+    }\r
+    return ERRCODE_SUCC;\r
+}\r
+#endif\r
+\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
+        ret = OHOS::FindPhoneMainPage::GetInstance()->StopFindPhone();\r
+    } else {\r
+        WEARABLE_LOGD(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
+#ifdef __cplusplus\r
+}\r
+#endif
\ No newline at end of file
diff --git a/code/sdk/application/wearable/service/device_msg/msg_center_device.h b/code/sdk/application/wearable/service/device_msg/msg_center_device.h
new file mode 100644 (file)
index 0000000..02f3c25
--- /dev/null
@@ -0,0 +1,114 @@
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025. All rights reserved.\r
+ * Description: Breath Ease\r
+ * Author: wangle\r
+ * Create: 2025-4-23\r
+ */\r
+#ifndef MSG_CENTER_DEVICE_H\r
+#define MSG_CENTER_DEVICE_H\r
+\r
+#include "msg_center_protocol.h"\r
+#include "wearable_log.h"\r
+\r
+#ifdef __cplusplus\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
+} msg_center_device_type_id_t;\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
+errcode_t msg_center_get_storage_info(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len);\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
+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
+errcode_t msg_center_ota_update(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len);\r
+\r
+errcode_t msg_center_device_heartrate(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len);\r
+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
+\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
+/* 查找手机 */\r
+errcode_t msg_center_device_findphone(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
+\r
+#if (CONFIG_ONLINE_LOG == 1)\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
+errcode_t msg_center_set_online_log_level(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len);\r
+#endif\r
+\r
+#ifdef PUBLISH_TEST_DATA\r
+void PublishTestData();\r
+#endif\r
+#ifdef __cplusplus\r
+}\r
+#endif\r
+#endif /* MSG_CENTER_DEVICE_H */\r
index 058f8dc..8c61862 100644 (file)
@@ -11,7 +11,6 @@ set(PRIVATE_HEADER
     ${ROOT_DIR}/middleware/services/gui/uikit/utils/interfaces/kits/gfx_utils
     ${ROOT_DIR}/open_source/openharmony/base/startup/syspara_lite/include
     ${ROOT_DIR}/open_source/openharmony/drivers/peripheral/format/interfaces/include
-    ${ROOT_DIR}/application/wearable/nativeapp/nativeui/main/include/dial
 )
 
 set(SOURCES
diff --git a/code/sdk/application/wearable/service/dial_market/dial_market.cpp b/code/sdk/application/wearable/service/dial_market/dial_market.cpp
new file mode 100644 (file)
index 0000000..5d6de84
--- /dev/null
@@ -0,0 +1,244 @@
+/*
+ * Copyright (c) CompanyNameMagicTag 2023-2023. All rights reserved.
+ * Description: ota upgrade handle.
+ * This file should be changed only infrequently and with great care.
+ */
+#include <stdio.h>
+#include "securec.h"
+#include "msg_center.h"
+#include "msg_center_protocol.h"
+#include "msg_center_cmd.h"
+#include "wearable_log.h"
+#include "common_def.h"
+#include "dial_market.h"
+#include "parameter.h"
+#include "main/dial/WatchInterface.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+errcode_t msg_center_dial_market_get_sys_info(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len)
+{
+    errcode_t ret = ERRCODE_SUCC;
+    watch_sys_info sys;
+    bool op_ret = false;
+
+    /* 组装信息 */
+    strcpy_s(sys.chip_platform, MAX_CHIP_PLAT_LEN, "hisi");
+    strcpy_s(sys.chip_model, MAX_CHIP_MODEL_LEN, "3321");
+    char *os_version = GetOsName();
+    if (os_version == NULL) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_MSG_CENTER, "os_version is NULL\r\n");
+        return ERRCODE_FAIL;
+    }
+    strcpy_s(sys.os_version, MAX_OS_LEN, os_version); // "OpenHarmony-5.0.1.115"
+
+    char *api_level = GetSdkApiLevel();
+    if (api_level == NULL) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_MSG_CENTER, "api_level is NULL\r\n");
+        free(os_version);
+        return ERRCODE_FAIL;
+    }
+    strcpy_s(sys.api_level, MAX_API_LEVEL_LEN, api_level); // "13"
+
+    op_ret = GetWatchSystemInfo(&sys);
+    if (op_ret == false) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_MSG_CENTER, "GetWatchSystemInfo fail\r\n");
+        free(os_version);
+        free(api_level);
+        return ERRCODE_FAIL;
+    }
+
+    ret = msg_center_send_data(cmd_id, type, &sys, sizeof(watch_sys_info));
+    if (ret != ERRCODE_SUCC) {
+        free(os_version);
+        free(api_level);
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_MSG_CENTER, "send data fail, ret = %d\r\n", ret);
+        return ERRCODE_FAIL;
+    }
+
+    free(os_version);
+    free(api_level);
+    return ERRCODE_SUCC;
+}
+
+errcode_t msg_center_dial_market_get_dev_cap(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len)
+{
+    errcode_t ret = ERRCODE_SUCC;
+    watch_dev_cap_info cap;
+    bool op_ret = false;
+
+    op_ret = GetWatchCapability(&cap);
+    if (op_ret == false) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_MSG_CENTER, "GetWatchCapability fail\r\n");
+        return ERRCODE_FAIL;
+    }
+
+    ret = msg_center_send_data(cmd_id, type, &cap, sizeof(watch_dev_cap_info));
+    if (ret != ERRCODE_SUCC) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_MSG_CENTER, "send data fail, ret = %d\r\n", ret);
+        return ERRCODE_FAIL;
+    }
+
+    return ERRCODE_SUCC;
+}
+
+errcode_t msg_center_dial_market_get_one_watch_info(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len)
+{
+    errcode_t ret = ERRCODE_SUCC;
+    uint8_t *tlv_payload = (uint8_t *)msg_center_get_tlv_payload(usr_data);
+    uint32_t uuid = *(uint32_t *)tlv_payload;
+    bool op_ret = false;
+    watch_dial_info info;
+
+    WEARABLE_LOGI(WEARABLE_LOG_MODULE_MSG_CENTER, "uuid = %d\r\n", uuid);
+    op_ret = GetWatchFaceInfo(uuid, &info);
+    if (op_ret == false) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_MSG_CENTER, "GetWatchFaceInfo fail\r\n");
+        (void)memset_s(&info, sizeof(watch_dial_info), 0, sizeof(watch_dial_info));
+        info.uuid = uuid;
+        (void)msg_center_send_data(cmd_id, type, &info, sizeof(watch_dial_info));
+        return ERRCODE_FAIL;
+    }
+
+    ret = msg_center_send_data(cmd_id, type, &info, sizeof(watch_dial_info));
+    if (ret != ERRCODE_SUCC) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_MSG_CENTER, "send data fail, ret = %d\r\n", ret);
+        return ERRCODE_FAIL;
+    }
+
+    return ERRCODE_SUCC;
+}
+
+errcode_t msg_center_dial_market_install_watch(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len)
+{
+    errcode_t ret = ERRCODE_SUCC;
+    uint32_t uuid = 0;
+    bool op_ret = false;
+    uint8_t tl_len = msg_center_get_tlv_tl_len(usr_data);
+    uint16_t payload_len = usr_len - tl_len;
+    uint8_t *tlv_payload = (uint8_t *)msg_center_get_tlv_payload(usr_data);
+
+    char *path = (char *)malloc(payload_len + 1);
+    if (path == nullptr) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_MSG_CENTER, "malloc failed.\r\n");
+        return ERRCODE_FAIL;
+    }
+
+    (void)memcpy_s(path, payload_len, tlv_payload, payload_len);
+    path[payload_len] = '\0';
+    WEARABLE_LOGI(WEARABLE_LOG_MODULE_MSG_CENTER, "path = %s\r\n", path);
+
+    op_ret = GetUuidByPath(path, &uuid);
+    if (op_ret == false) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_MSG_CENTER, "install fail.\r\n");
+        free(path);
+        return ERRCODE_FAIL;
+    }
+
+    ret = msg_center_send_data(cmd_id, type, &uuid, sizeof(uint32_t));
+    if (ret != ERRCODE_SUCC) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_MSG_CENTER, "send data fail, ret = %d\r\n", ret);
+        free(path);
+        return ERRCODE_FAIL;
+    }
+
+    free(path);
+    return ERRCODE_SUCC;
+}
+
+errcode_t msg_center_dial_market_uninstall_watch(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len)
+{
+    errcode_t ret = ERRCODE_SUCC;
+    bool op_ret = false;
+    uint8_t *tlv_payload = (uint8_t *)msg_center_get_tlv_payload(usr_data);
+    uint32_t uuid = *(uint32_t *)tlv_payload;
+
+    WEARABLE_LOGI(WEARABLE_LOG_MODULE_MSG_CENTER, "uuid = %d\r\n", uuid);
+    op_ret = UninstallWatch(uuid);
+    WEARABLE_LOGI(WEARABLE_LOG_MODULE_MSG_CENTER, "uninstall ret : %d\r\n", op_ret);
+
+    ret = msg_center_send_data(cmd_id, type, &op_ret, sizeof(uint8_t));
+    if (ret != ERRCODE_SUCC) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_MSG_CENTER, "send data fail, ret = %d\r\n", ret);
+        return ERRCODE_FAIL;
+    }
+
+    return ERRCODE_SUCC;
+}
+
+errcode_t msg_center_dial_market_set_watch(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len)
+{
+    errcode_t ret = ERRCODE_SUCC;
+    bool op_ret = false;
+    uint8_t *tlv_payload = (uint8_t *)msg_center_get_tlv_payload(usr_data);
+    uint32_t uuid = *(uint32_t *)tlv_payload;
+
+    WEARABLE_LOGI(WEARABLE_LOG_MODULE_MSG_CENTER, "uuid = %d\r\n", uuid);
+    op_ret = SetCurrentWatchFace(uuid);
+    WEARABLE_LOGI(WEARABLE_LOG_MODULE_MSG_CENTER, "set_current_watch_face ret : %d\r\n", op_ret);
+
+    ret = msg_center_send_data(cmd_id, type, &op_ret, sizeof(uint8_t));
+    if (ret != ERRCODE_SUCC) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_MSG_CENTER, "send data fail, ret = %d\r\n", ret);
+        return ERRCODE_FAIL;
+    }
+
+    return ERRCODE_SUCC;
+}
+
+errcode_t msg_center_dial_market_get_all_watch_info(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len)
+{
+    errcode_t ret = ERRCODE_SUCC;
+    watch_dial_info *info = nullptr;
+    uint8_t watch_num = 0;
+    bool op_ret = false;
+
+    WEARABLE_LOGI(WEARABLE_LOG_MODULE_MSG_CENTER, "get_all_watch_info\r\n");
+    op_ret = GetAllWatchFaceInfo(&info, &watch_num);
+    if (op_ret == false) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_MSG_CENTER, "GetAllWatchFaceInfo fail\r\n");
+        watch_num = 0;
+        (void)msg_center_send_data(cmd_id, type, info, sizeof(watch_dial_info) * watch_num);
+        return ERRCODE_FAIL;
+    }
+
+    ret = msg_center_send_data(cmd_id, type, info, sizeof(watch_dial_info) * watch_num);
+    if (ret != ERRCODE_SUCC) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_MSG_CENTER, "send data fail, ret = %d\r\n", ret);
+        free(info);
+        return ERRCODE_FAIL;
+    }
+
+    free(info);
+    return ERRCODE_SUCC;
+}
+
+errcode_t msg_center_dial_market_get_cur_watch_info(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len)
+{
+    errcode_t ret = ERRCODE_SUCC;
+    bool op_ret = false;
+    watch_dial_info info;
+
+    WEARABLE_LOGI(WEARABLE_LOG_MODULE_MSG_CENTER, "get_cur_watch_info\r\n");
+    op_ret = GetCurrentWatchFaceInfo(&info);
+    if (op_ret == false) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_MSG_CENTER, "GetCurrentWatchFaceInfo fail\r\n");
+        (void)memset_s(&info, sizeof(watch_dial_info), 0, sizeof(watch_dial_info));
+        info.uuid = 0xFFFFFFFF; // 异常时用全F的uuid表示
+        (void)msg_center_send_data(cmd_id, type, &info, sizeof(watch_dial_info));
+        return ERRCODE_FAIL;
+    }
+
+    ret = msg_center_send_data(cmd_id, type, &info, sizeof(watch_dial_info));
+    if (ret != ERRCODE_SUCC) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_MSG_CENTER, "send data fail, ret = %d\r\n", ret);
+        return ERRCODE_FAIL;
+    }
+
+    return ERRCODE_SUCC;
+}
+#ifdef __cplusplus
+}
+#endif
\ No newline at end of file
diff --git a/code/sdk/application/wearable/service/dial_market/dial_market_msg.cpp b/code/sdk/application/wearable/service/dial_market/dial_market_msg.cpp
new file mode 100644 (file)
index 0000000..b30812e
--- /dev/null
@@ -0,0 +1,47 @@
+
+#include "msg_center_protocol.h"
+#include "msg_center_cmd.h"
+#include "ohos_init.h"
+#include "dial_market.h"
+
+namespace OHOS {
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+static const msg_center_cmd_map_t g_msg_center_dial_market_tbl[] = {
+    { MSGCENTER_CMD_DIAL_MARKET, MSGCENTER_TYPE_ID_DM_GET_SYS_INFO, msg_center_dial_market_get_sys_info},
+    { MSGCENTER_CMD_DIAL_MARKET, MSGCENTER_TYPE_ID_DM_GET_DEV_CAP, msg_center_dial_market_get_dev_cap},
+    { MSGCENTER_CMD_DIAL_MARKET, MSGCENTER_TYPE_ID_DM_GET_ONE_WATCH_INFO, msg_center_dial_market_get_one_watch_info},
+    { MSGCENTER_CMD_DIAL_MARKET, MSGCENTER_TYPE_ID_DM_INSTALL_WATCH, msg_center_dial_market_install_watch},
+    { MSGCENTER_CMD_DIAL_MARKET, MSGCENTER_TYPE_ID_DM_UNINSTALL_WATCH, msg_center_dial_market_uninstall_watch},
+    { MSGCENTER_CMD_DIAL_MARKET, MSGCENTER_TYPE_ID_DM_SET_WATCH, msg_center_dial_market_set_watch},
+    { MSGCENTER_CMD_DIAL_MARKET, MSGCENTER_TYPE_ID_DM_GET_ALL_WATCH_INFO, msg_center_dial_market_get_all_watch_info},
+    { MSGCENTER_CMD_DIAL_MARKET, MSGCENTER_TYPE_ID_DM_GET_CUR_WATCH_INFO, msg_center_dial_market_get_cur_watch_info},
+};
+
+errcode_t msg_center_dial_market_dispatch(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len)
+{
+    uint8_t tbl_size = sizeof(g_msg_center_dial_market_tbl) / sizeof(g_msg_center_dial_market_tbl[0]);
+    uint8_t i;
+    for (i = 0; i < tbl_size; i++) {
+        msg_center_cmd_map_t *item = (msg_center_cmd_map_t *)&g_msg_center_dial_market_tbl[i];
+        if ((item->type == type) && (item->handler != NULL)) {
+            item->handler(cmd_id, type, usr_data, usr_len);
+            return ERRCODE_SUCC;
+        }
+    }
+    return ERRCODE_NOT_SUPPORT;
+}
+
+void dial_market_init(void)
+{
+    msg_center_register_cmd(MSGCENTER_CMD_DIAL_MARKET, msg_center_dial_market_dispatch);
+}
+
+APP_FEATURE_INIT_PRI(dial_market_init, LAYER_INIT_LEVEL_4);
+#ifdef __cplusplus
+}
+#endif
+}  // namespace OHOS
\ No newline at end of file
index a1ac91c..a26eab4 100644 (file)
@@ -18,9 +18,13 @@ set(PRIVATE_HEADER
     ${ROOT_DIR}/middleware/services/gui/uikit/proprietary/src/ui/frameworks/components_ext
     ${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
     ${ROOT_DIR}/application/wearable/service/xiaodu_navi_vector
     ${ROOT_DIR}/application/wearable/service/xiaodu_navi_vector/libs
     ${ROOT_DIR}/application/wearable/service/msg_center/src/notify/ketinput/include
+    ${ROOT_DIR}/application/wearable/nativeapp/nativelauncher/include
+    ${ROOT_DIR}/application/wearable/nativeabilityfwk/include
+    ${ROOT_DIR}/open_source/openharmony/foundation/multimedia/player/interfaces/kits
 )
 
 set(SOURCES
@@ -88,15 +92,6 @@ set(PUBLIC_HEADER
 )
 
 set(PRIVATE_HEADER
-    ${CMAKE_CURRENT_SOURCE_DIR}/../../nativeapp/nativeui/alarmclockmanage/include
-    ${CMAKE_CURRENT_SOURCE_DIR}/../../nativeapp/nativeui/alarmclocktimerconfig/include
-    ${CMAKE_CURRENT_SOURCE_DIR}/../../nativeapp/nativeui/alarm/include
-    ${CMAKE_CURRENT_SOURCE_DIR}/../../nativeapp/nativeui/callerlog/include
-    ${CMAKE_CURRENT_SOURCE_DIR}/../../nativeapp/nativeui/phoneservice/include
-    ${CMAKE_CURRENT_SOURCE_DIR}/../../nativeapp/nativeui/main/include
-    ${CMAKE_CURRENT_SOURCE_DIR}/../../nativeapp/nativeui/player/include
-    ${CMAKE_CURRENT_SOURCE_DIR}/../../nativeapp/nativeui/bluetooth/include
-    ${CMAKE_CURRENT_SOURCE_DIR}/../../nativeapp/nativeui/key/include
     ${CMAKE_CURRENT_SOURCE_DIR}/../../nativeapp/nativelauncher/include
     ${CMAKE_CURRENT_SOURCE_DIR}/../../ohos_deps
     ${ROOT_DIR}/middleware/services/gui/uikit/proprietary/include
@@ -120,20 +115,13 @@ set(PRIVATE_HEADER
     ${ROOT_DIR}/include/middleware/services/bts/common
     ${ROOT_DIR}/application/auto_ota
     ${ROOT_DIR}/application/wearable/service/xiaodu_navi_vector
+    ${ROOT_DIR}/open_source/openharmony/third_party/cJSON
+    ${ROOT_DIR}/application/wearable/service/device_msg
     ${ROOT_DIR}/application/wearable/service/msg_center/src/notify/ketinput/include
     ${ROOT_DIR}/application/wearable/nativeapp/nativelauncher/include
     ${ROOT_DIR}/application/wearable/nativeabilityfwk/include
-    ${ROOT_DIR}/application/wearable/nativeapp/nativeui/alarm/include
-    ${ROOT_DIR}/application/wearable/nativeapp/nativeui/key/include
-    ${ROOT_DIR}/application/wearable/nativeapp/nativeui/alarmclockmanage/include
-    ${ROOT_DIR}/application/wearable/nativeapp/nativeui/alarmclocktimerconfig/include
-    ${ROOT_DIR}/application/wearable/nativeapp/nativeui/main/include
-    ${ROOT_DIR}/application/wearable/nativeapp/nativeui/callerlog/include
-    ${ROOT_DIR}/application/wearable/nativeapp/nativeui/phoneservice/include
-    ${ROOT_DIR}/application/wearable/nativeapp/nativeui/makephone/include
-    ${ROOT_DIR}/application/wearable/nativeapp/nativeui/player/include
-    ${ROOT_DIR}/application/wearable/nativeapp/nativeui/applist/include
     ${ROOT_DIR}/open_source/openharmony/foundation/multimedia/player/interfaces/kits
+
 )
 
 if("JS_ENABLE" IN_LIST DEFINES)
@@ -144,18 +132,18 @@ set(SOURCES
     ${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/pairing_notification.cpp
+    ${CMAKE_CURRENT_SOURCE_DIR}/src/notify/phone_msg_notification.cpp
 )
 else()
 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/msg_center_self_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/pairing_notification.cpp
+    ${CMAKE_CURRENT_SOURCE_DIR}/src/notify/phone_msg_notification.cpp
 )
 endif()
 
index 6a29e7c..c6b588a 100644 (file)
Binary files a/code/sdk/application/wearable/service/msg_center/brandy-auto-ota-cli/libmsg_center.a and b/code/sdk/application/wearable/service/msg_center/brandy-auto-ota-cli/libmsg_center.a differ
index 1a1666e..19e2cb5 100644 (file)
Binary files a/code/sdk/application/wearable/service/msg_center/brandy-auto-ota-ser/libmsg_center.a and b/code/sdk/application/wearable/service/msg_center/brandy-auto-ota-ser/libmsg_center.a differ
index c3aaaca..b1e105a 100644 (file)
Binary files a/code/sdk/application/wearable/service/msg_center/brandy-native-js/libmsg_center.a and b/code/sdk/application/wearable/service/msg_center/brandy-native-js/libmsg_center.a differ
index 426bb7c..7f842a9 100644 (file)
Binary files a/code/sdk/application/wearable/service/msg_center/brandy-xts/libmsg_center.a and b/code/sdk/application/wearable/service/msg_center/brandy-xts/libmsg_center.a differ
index 02cf29c..ed6ece0 100644 (file)
@@ -62,6 +62,8 @@ typedef enum msg_center_cmd_id {
     MSGCENTER_CMD_WATCH_CONNECT      = 0x8,\r
     MSGCENTER_CMD_APP_STORE          = 0x9,\r
     MSGCENTER_CMD_DIAL_MARKET        = 0xa,\r
+    MSGCENTER_CMD_PHONE_MSG          = 0xb, // 增加消息通知;\r
+    MSGCENTER_CMD_DEVICE             = 0xc,\r
     MSGCENTER_CMD_MAX\r
 } msg_center_cmd_id_t;\r
 \r
index 532f1c1..345828d 100644 (file)
@@ -24,6 +24,7 @@
 #include "components/ui_view_group.h"
 #include "alarm_notification.h"
 #include "makephone_notification.h"
+#include "phone_msg_notification.h"
 
 constexpr uint16_t HALF_SCREEN = 2;
 constexpr int16_t NOTIFY_PRIORITY_DEFAULT = 4;
diff --git a/code/sdk/application/wearable/service/msg_center/include/notify/phone_msg_notification.h b/code/sdk/application/wearable/service/msg_center/include/notify/phone_msg_notification.h
new file mode 100644 (file)
index 0000000..735c01e
--- /dev/null
@@ -0,0 +1,75 @@
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\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 "components/ui_view_group.h"\r
+#include "components/ui_view_group.h"\r
+#include "components/ui_label.h"\r
+#include "components/ui_label_button_ext.h"\r
+#include "graphic_timer.h"\r
+#include <unordered_map>\r
+\r
+struct PhoneMsg {\r
+    std::string appName;\r
+    std::string msgTitle;\r
+    std::string msgContent;\r
+};\r
+\r
+namespace OHOS {\r
+class PhoneMsgView {\r
+public:\r
+    static UIViewGroup *CreatePhoneMsgView();\r
+    static void FreePhoneMsgView(void);\r
+    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 const uint32_t notifyTime = 5000;\r
+\r
+private:\r
+    static UIViewGroup *phoneMsgView_;\r
+    static UILabel *appNameLabel_;\r
+    static UILabel *titleLabel_;\r
+    static UILabel *contentLabel_;\r
+    static GraphicTimer *phoneMsgNotifyStop_;\r
+    static PhoneMsg phoneMsg_;\r
+    static UILabelButtonExt *cancelButton_;\r
+};\r
+\r
+class PhoneMsgViewEventListener : public OHOS::UIView::OnClickListener,\r
+                               public OHOS::UIView::OnLongPressListener,\r
+                               public OHOS::UIView::OnTouchListener,\r
+                               public OHOS::UIView::OnDragListener {\r
+public:\r
+    PhoneMsgViewEventListener();\r
+    virtual ~PhoneMsgViewEventListener();\r
+    static PhoneMsgViewEventListener *GetInstance(void);\r
+    bool OnDrag(UIView& view, const DragEvent& event) override;\r
+    bool OnDragEnd(OHOS::UIView& view, const OHOS::DragEvent& event) override;\r
+    bool OnClick(OHOS::UIView& view, const OHOS::ClickEvent& event) override;\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 /* PHONE_MSG_NOTIFICATION_H */\r
diff --git a/code/sdk/application/wearable/service/msg_center/src/common/msg_center_self_cmd.cpp b/code/sdk/application/wearable/service/msg_center/src/common/msg_center_self_cmd.cpp
new file mode 100644 (file)
index 0000000..ee822be
--- /dev/null
@@ -0,0 +1,43 @@
+#include "msg_center_protocol.h"
+#include "msg_center_cmd.h"
+#include "ohos_init.h"
+#include "msg_center_common.h"
+namespace OHOS {
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+static const msg_center_cmd_map_t g_msg_center_self_cmd_tbl[] = {
+#ifdef JS_ENABLE
+    { MSGCENTER_CMD_PING,       MSGCENTER_TYPE_ID_PING_REC,           msg_center_ping_rec},
+    { MSGCENTER_CMD_PING,       MSGCENTER_TYPE_ID_PING_RSP,           NULL},
+#endif
+};
+
+errcode_t msg_center_self_cmd_type(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len)
+{
+    uint8_t tbl_size = sizeof(g_msg_center_self_cmd_tbl) / sizeof(g_msg_center_self_cmd_tbl[0]);
+    uint8_t i;
+    for (i = 0; i < tbl_size; i++) {
+        msg_center_cmd_map_t *item = (msg_center_cmd_map_t *)&g_msg_center_self_cmd_tbl[i];
+        if ((item->type == type) && (item->handler != NULL)) {
+            item->handler(cmd_id, type, usr_data, usr_len);
+            return ERRCODE_SUCC;
+        }
+    }
+    return ERRCODE_NOT_SUPPORT;
+}
+
+void xiaodu_self_cmd_init(void)
+{
+    msg_center_register_cmd(MSGCENTER_CMD_PING, msg_center_self_cmd_type);
+}
+
+#ifdef JS_ENABLE
+APP_FEATURE_INIT_PRI(xiaodu_self_cmd_init, LAYER_INIT_LEVEL_4);
+#endif
+#ifdef __cplusplus
+}
+#endif
+}  // namespace OHOS
\ No newline at end of file
index 04e3aa0..557dec3 100644 (file)
@@ -14,9 +14,9 @@
 #include "wearable_log.h"
 #include "service_id_define.h"
 #include "broadcast_service.h"
-#include "AlarmClockModel.h"
-#include "AlarmPopUpPresenter.h"
-#include "CallerLogModel.h"
+#include "alarm/AlarmClockModel.h"
+#include "alarm/AlarmPopUpPresenter.h"
+#include "callerlog/CallerLogModel.h"
 #include "notification_manager.h"
 #include "NativeAbility.h"
 #include "abilityms_slite_client.h"
 #include "baidumap.h"
 #include "common_def.h"
 #include "keyinput.h"
-#include "KeyInputListener.h"
-#include "VolumeSettingView.h"
-#include "VolumeSettingPresenter.h"
-#include "VolumeSettingView.h"
+#include "key/KeyInputListener.h"
+#include "main/VolumeSettingView.h"
+#include "main/VolumeSettingPresenter.h"
+#include "main/VolumeSettingView.h"
+#include "cJSON.h"
+#include "heartrate/HeartModel.h"
+#include "device_location.h"
 namespace OHOS {
 
 #ifdef __cplusplus
 extern "C" {
 #endif
 
+extern uint8_t g_bloodoxygen;
+extern uint16_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_NEXTDAY_UPDATE, PRIORITY_TWO},
-         {TOPIC_EVENT_BLE_TRANSMIT,PRIORITY_ONE},
     {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},
-    {TOPIC_EVENT_DEVICE_BIND, PRIORITY_ONE},
-    // {TOPIC_EVENT_DEVICE_UNBIND, PRIORITY_TWO},
-    // {TOPIC_EVENT_DEVICE_UNBINDING_REQUEST, PRIORITY_TWO},
-
-    };
+    {TOPIC_DEMO_ALL_MSG, PRIORITY_TWO},
+    {TOPIC_EVENT_STEPDATA_UPDATE, PRIORITY_TWO},
+    {TOPIC_EVENT_HEARTRATE_UPDATA, PRIORITY_TWO},
+    {TOPIC_EVENT_BLOODOXYGEN_UPDATA, PRIORITY_TWO},
+    {TOPIC_EVENT_SPORT_DISTANCE, PRIORITY_TWO},
+    {TOPIC_EVENT_LOCATION, PRIORITY_TWO},
+};
 
 bool g_pressFlag = false;
 bool g_longPressFlag = false;
@@ -86,7 +96,11 @@ void MsgCenterSubscribe()
     MsgCenterSubscribeTopic(TOPIC_EVENT_HFP_FINISHED);
     MsgCenterSubscribeTopic(TOPIC_EVENT_HFP_PHONE_TO_WATCH);
     MsgCenterSubscribeTopic(TOPIC_EVENT_HFP_WATCH_TO_PHONE);
-    MsgCenterSubscribeTopic(TOPIC_EVENT_DEVICE_BIND);
+    MsgCenterSubscribeTopic(TOPIC_EVENT_STEPDATA_UPDATE);
+    MsgCenterSubscribeTopic(TOPIC_EVENT_HEARTRATE_UPDATA);
+    MsgCenterSubscribeTopic(TOPIC_EVENT_BLOODOXYGEN_UPDATA);
+    MsgCenterSubscribeTopic(TOPIC_EVENT_SPORT_DISTANCE);
+    MsgCenterSubscribeTopic(TOPIC_EVENT_LOCATION);
 }
 
 static OHOS::UIViewGroup* ShowAlarmNotify(void)
@@ -109,28 +123,12 @@ static OHOS::UIViewGroup* ShowMultiPhoneCallNotify(void)
     return OHOS::CreateMultiplePhoneView();
 }
 
-
-/*显示绑定通知*/
-static OHOS::UIViewGroup* showDeviceBindingNotify(void)
+static OHOS::UIViewGroup* ShowMsgNotify(void)
 {
-    return OHOS::CreateDeviceBindingView();
+    WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "ShowMsgNotify");
+    return OHOS::PhoneMsgView::CreatePhoneMsgView();
 }
 
-/*显示解绑通知*/
-static OHOS::UIViewGroup* showDeviceUnBindingNotify(void)
-{
-    return OHOS::CreateDeviceUnBindingView();
-}
-
-/*显示解除绑定请求(与新设备连接)通知*/
-static OHOS::UIViewGroup* showDeviceUnbindingRequestNotify(void)
-{
-    return OHOS::CreateDeviceUnbindingRequestGroupView();
-}
-static OHOS::UIViewGroup* showtransmitNotify(void)
-{
-    return OHOS::transmittingShow();
-}
 void MsgCenterNotifyAlarmProc(const Topic topic, Request* req)
 {
     unused(req);
@@ -206,115 +204,84 @@ void MsgCenterNotifyHfpWatchProc(const Topic topic, Request* req)
     }
 }
 
-void MsgCenterNotifyDeviceBindProc(const Topic topic, Request* req)
+void MsgCenterNotifyMsgWatchProc(const Topic topic, Request* req)
 {
-    //unused(req);
-    WEARABLE_LOGI(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();
+    std::string msgContent((char *)(req->data),  req->len);
+    WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "MsgCenterNotifyMsgWatchProc msgContent %s\r\n", msgContent.c_str());
+    cJSON *msgJson = cJSON_Parse(msgContent.c_str());
+    if (msgJson == NULL) {
+         WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "phone msg_result cJSON_Parse, fail = %p\r\n", msgJson);
     }
-    uint8_t* data=(uint8_t*)req->data;
-    uint8_t len_name = req->len;
-    char devname[len_name];
-    if(data!=NULL && req->len>=2)
-    {
-        switch(data[0])
-        {
-            case DEVICEBIND:
-                NotificationManager::GetInstance()->SetNotifyPriority(PRIORITY_ONE);
-                len_name = req->len-2;
-                memset(devname,0,len_name);
-                if(len_name > 0)
-                {
-                    memcpy(devname,(char *)req->data+2,len_name);
-                    PairingViewEventListener::GetInstance().SetDeviceName(devname);
-                }else{
-                    PairingViewEventListener::GetInstance().SetDeviceName(NULL);
-                }
-                NotificationManager::GetInstance()->ShowNotify(showDeviceBindingNotify, (uint16_t)topic, true);
-                break;
-            case DEVICEUNBIND:
-                
-                NotificationManager::GetInstance()->SetNotifyPriority(PRIORITY_ONE);
-                len_name = req->len-2;
-                memset(devname,0,len_name);
-                if(len_name > 0)
-                {
-                    memcpy(devname,(char *)req->data+2,len_name);
-                    // printf("devname:%s\r\n",devname);
-                    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;
-        }
-       
+    cJSON *appNameJson = cJSON_GetObjectItem(msgJson, "appName");
+    cJSON *packageNameJson =  cJSON_GetObjectItem(msgJson, "packageName");
+    cJSON *titleJson = cJSON_GetObjectItem(msgJson, "title");
+    cJSON *contentJson = cJSON_GetObjectItem(msgJson, "content");
+    char *appName = appNameJson->valuestring;
+    char *packageName = packageNameJson->valuestring;
+    char *title = titleJson->valuestring;
+    char *content = contentJson->valuestring;
+    if (msgJson) {
+        cJSON_Delete(msgJson);
+    }
+    PhoneMsgView::UpDatePhoneMsg(appName, title, content);
+    if (CheckPriority(topic)) {
+        NotificationManager::GetInstance()->SetNotifyPriority(PRIORITY_TWO);
+        NotificationManager::GetInstance()->ShowNotify(ShowMsgNotify, static_cast<uint16_t>(topic), true);
     }
-   
 }
-void MsgCenterNotifybleTransmit(const Topic topic, Request* req)
+
+void MsgCenterNotifyHeartRateProc(const Topic topic, Request* req)
 {
     unused(topic);
-    uint8_t* data=(uint8_t*)req->data;
-   
-    
-    if(data[0]==TRANS_FREE)
-    {
-        if(transmittingISShow())
-        NotificationManager::GetInstance()->StopNotify();
+    if(req && req->data){
+        HeartDatas* heart_data = (HeartDatas*)req->data;
+        g_heartrate = heart_data->perSec;
+        WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "MsgCenterNotifyHeartRateProc per heartrate: %d\n", g_heartrate);
     }
-    else if (data[0]==IS_NEED_CAT1_OTA)
-    {
-      
-        NotificationManager::GetInstance()->SetNotifyPriority(PRIORITY_ONE);
+}
 
-        NotificationManager::GetInstance()->ShowNotify(showCat1UpdataNotify, (uint16_t)topic, true);
+void MsgCenterNotifyStepDataProc(const Topic topic, Request* req)
+{
+    unused(topic);
+    uint32_t step = 0;
+    if(req && req->data){
+        step = *(uint32_t*)req->data;
+        g_stepdata += step;
+        WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "MsgCenterNotifyStepDataProc step:%d, totalStep:%d\n", step, g_stepdata);
     }
-    else if (data[0]==FILE_IS_DONE)
-    {
-        set_transmittingShow_falg(data[0]);
+}
+
+void MsgCenterNotifyBloodOxygenProc(const Topic topic, Request* req)
+{
+    unused(topic);
+    if(req && req->data){
+        g_bloodoxygen = *(uint8_t*)req->data;
+        WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "MsgCenterNotifyBloodOxygenProc bloodoxygen:%d\n", g_bloodoxygen);
     }
-    else
-    {
-        set_transmittingShow_falg(data[0]);
-        
-        NotificationManager::GetInstance()->SetNotifyPriority(PRIORITY_ONE);
+}
 
-        NotificationManager::GetInstance()->ShowNotify(showtransmitNotify, (uint16_t)topic, true);
+void MsgCenterNotifyDistanceProc(const Topic topic, Request* req)
+{
+    unused(topic);
+    uint32_t distance = 0;
+    if(req && req->data){
+        distance = *(uint32_t*)req->data;
+        g_distance += distance;
+        WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "MsgCenterNotifyDistanceProc distance:%d\n", g_distance);
     }
-    // unused(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_);
+    }
 }
+
 /* 订阅事件通知逻辑可定制 */
 static MsgCenterNotifyTable g_msgCenterNotifyTable[] = {
     {TOPIC_EVENT_ALARM_RING,         MsgCenterNotifyAlarmProc},
@@ -325,13 +292,13 @@ static MsgCenterNotifyTable g_msgCenterNotifyTable[] = {
     {TOPIC_EVENT_HFP_WATCH_TO_PHONE, MsgCenterNotifyHfpPhoneProc},
     {TOPIC_EVENT_HFP_WATCH_ACTIVE,   MsgCenterNotifyHfpWatchProc},
     {TOPIC_EVENT_HFP_PHONE_TO_WATCH, MsgCenterNotifyHfpWatchProc},
-{TOPIC_EVENT_BLE_TRANSMIT,       MsgCenterNotifybleTransmit},
-
-    {TOPIC_EVENT_DEVICE_BIND,     MsgCenterNotifyDeviceBindProc},
-    // {TOPIC_EVENT_DEVICE_UNBIND,   MsgCenterNotifyDeviceUnBindProc},   
-    // {TOPIC_EVENT_DEVICE_UNBINDING_REQUEST,   MsgCenterNotifyDeviceUnBindingRequestProc},   
-
-       };
+    {TOPIC_DEMO_ALL_MSG,             MsgCenterNotifyMsgWatchProc},
+    {TOPIC_EVENT_HEARTRATE_UPDATA,   MsgCenterNotifyHeartRateProc},
+    {TOPIC_EVENT_STEPDATA_UPDATE,    MsgCenterNotifyStepDataProc},
+    {TOPIC_EVENT_BLOODOXYGEN_UPDATA, MsgCenterNotifyBloodOxygenProc},
+    {TOPIC_EVENT_SPORT_DISTANCE,     MsgCenterNotifyDistanceProc},
+    {TOPIC_EVENT_LOCATION,           MsgCenterNotifyLocationProc},
+};
 
 static MsgCenterNotifyTable *MsgCenterGetNotifyTblCb(uint8_t idx)
 {
@@ -506,12 +473,12 @@ void StopJsApp(char *bundleName)
 {
     ElementName* topAbility = OHOS::AbilityMsClient::GetInstance().GetTopAbility();
     if (topAbility == nullptr) {
-        WEARABLE_LOGE(HILOG_MODULE_AAFWK, "topAbility is null");
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_MSG_CENTER, "topAbility is null");
         return;
     }
 
     if (strcmp(topAbility->bundleName, bundleName) != 0) {
-        WEARABLE_LOGE(HILOG_MODULE_AAFWK, "%s is not top active", bundleName);
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_MSG_CENTER, "%s is not top active", bundleName);
         FreeElement(topAbility);
         return;
     }
index dc289cf..9b98aff 100644 (file)
@@ -8,7 +8,7 @@
 #include "notification_manager.h"\r
 #include "wearable_log.h"\r
 #include "UiConfig.h"\r
-#include "AlarmPopUpPresenter.h"\r
+#include "alarm/AlarmPopUpPresenter.h"\r
 #include "components/ui_image_view.h"\r
 #include "components/ui_label.h"\r
 \r
@@ -84,6 +84,7 @@ void NoOperateCallback(void* data)
 {\r
     (void)data;\r
     NotificationManager::GetInstance()->StopNotify();\r
+    AlarmPopUpPresenter::GetInstance()->DelayAlarmRing();\r
 }\r
 \r
 void StartAlarmTimer(AlarmTimerType type, int32_t interval)\r
index bfcc29b..cfff9a7 100644 (file)
@@ -9,18 +9,18 @@
 #include "common/key_code.h"
 #include "AppViewIDs.h"
 #include "View.h"
-#include "KeyInputListener.h"
-#include "VolumeSettingView.h"
-#include "VolumeSettingPresenter.h"
-#include "VolumeSettingView.h"
+#include "key/KeyInputListener.h"
+#include "main/VolumeSettingView.h"
+#include "main/VolumeSettingPresenter.h"
+#include "main/VolumeSettingView.h"
 #include "wearable_log.h"
 #include "UiConfig.h"
 #include "dock/input_device.h"
 #include "notification_manager.h"
-#include "AlarmPopUpPresenter.h"
-#include "CallerLogModel.h"
-#include "MainCallingPresenter.h"
-#include "ApplistModel.h"
+#include "alarm/AlarmPopUpPresenter.h"
+#include "callerlog/CallerLogModel.h"
+#include "makephone/MainCallingPresenter.h"
+#include "applist/ApplistModel.h"
 namespace OHOS {
 static bool IsNotifyCallStatus()
 {
index 29c369a..c0929b0 100644 (file)
@@ -7,15 +7,15 @@
 \r
 #include "notification_manager.h"\r
 #include "wearable_log.h"\r
-#include "CallerLogModel.h"\r
-#include "PhoneService.h"\r
+#include "callerlog/CallerLogModel.h"\r
+#include "phoneservice/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 "main/VolumeSettingView.h"\r
+#include "main/VolumeSettingPresenter.h"\r
 #include "ui_resource_image.h"\r
 \r
 namespace OHOS {\r
diff --git a/code/sdk/application/wearable/service/msg_center/src/notify/phone_msg_notification.cpp b/code/sdk/application/wearable/service/msg_center/src/notify/phone_msg_notification.cpp
new file mode 100644 (file)
index 0000000..eb6a408
--- /dev/null
@@ -0,0 +1,206 @@
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: phone message notification\r
+ * Create: 2025-04-25\r
+ */\r
+\r
+#include "notification_manager.h"\r
+#include "ohos_timer.h"\r
+#include "wearable_log.h"\r
+#include <string>\r
+#include "main/MessageModel.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
+// 三方消息主题\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
+// 三方消息内容\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
+\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
+\r
+UIViewGroup *PhoneMsgView::phoneMsgView_ = nullptr;\r
+UILabel *PhoneMsgView::appNameLabel_ = 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
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "PhoneMsgStopNotifyCallback");\r
+    (void)data;\r
+    NotificationManager::GetInstance()->StopNotify();\r
+}\r
+\r
+void PhoneMsgView::StartPhoneMsgTimer(int32_t interval)\r
+{\r
+    uint32_t tick = GetOSTick(interval);\r
+    phoneMsgNotifyStop_ = new GraphicTimer(tick, PhoneMsgStopNotifyCallback, nullptr, true);\r
+    phoneMsgNotifyStop_->Start();\r
+}\r
+\r
+void PhoneMsgView::DisablePhoneMsgTimer()\r
+{\r
+    if (phoneMsgNotifyStop_ != nullptr) {\r
+        phoneMsgNotifyStop_->Stop();\r
+        delete phoneMsgNotifyStop_;\r
+        phoneMsgNotifyStop_ = nullptr;\r
+    }\r
+}\r
+\r
+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_->SetViewId("phoneMsgView");\r
+    }\r
+\r
+    if (appNameLabel_ == nullptr) {\r
+        appNameLabel_ = new UILabel();\r
+    }\r
+    appNameLabel_->SetPosition(APP_NAME_POS_X, APP_NAME_POS_Y, APP_NAME_WIDTH, APP_NAME_HEIGHT);\r
+    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 (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
+    }\r
+    contentLabel_->SetPosition(MSG_CONTENT_POS_X, MSG_CONTENT_POS_Y, MSG_CONTENT_WIDTH, MSG_CONTENT_HEIGHT);\r
+    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
+    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
+    phoneMsgView_->SetDraggable(true);\r
+    phoneMsgView_->SetTouchable(true);\r
+    UIView::OnDragListener *dragListener =\r
+        static_cast<UIView::OnDragListener *>(PhoneMsgViewEventListener::GetInstance());\r
+    UIView::OnClickListener *clickListener =\r
+        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::FreePhoneMsgView(void)\r
+{\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "FreePhoneMsgView");\r
+    if (phoneMsgView_ != nullptr) {\r
+        DisablePhoneMsgTimer();\r
+        phoneMsgView_->RemoveAll();\r
+        delete appNameLabel_;\r
+        appNameLabel_ = nullptr;\r
+        delete titleLabel_;\r
+        titleLabel_ = 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
+void PhoneMsgView::UpDatePhoneMsg(std::string appName, std::string titile, std::string content)\r
+{\r
+    phoneMsg_.appName = appName;\r
+    phoneMsg_.msgTitle = titile;\r
+    phoneMsg_.msgContent = content;\r
+    MessageModel::GetInstance().GetMessageInfo(appName, titile, content);\r
+}\r
+\r
+PhoneMsgViewEventListener::PhoneMsgViewEventListener()\r
+{\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "PhoneMsgViewEventListener :%p", this);\r
+}\r
+\r
+PhoneMsgViewEventListener::~PhoneMsgViewEventListener()\r
+{\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "~PhoneMsgViewEventListener");\r
+}\r
+\r
+PhoneMsgViewEventListener *PhoneMsgViewEventListener::GetInstance(void)\r
+{\r
+    static PhoneMsgViewEventListener phoneMsgViewEventListener;\r
+    return &phoneMsgViewEventListener;\r
+}\r
+\r
+bool PhoneMsgViewEventListener::OnDrag(UIView &view, const DragEvent &event)\r
+{\r
+    return true;\r
+}\r
+\r
+bool PhoneMsgViewEventListener::OnDragEnd(UIView &view, const DragEvent &event)\r
+{\r
+    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
+    }\r
+    return true;\r
+}\r
+\r
+bool PhoneMsgViewEventListener::OnClick(UIView &view, const ClickEvent &event)\r
+{\r
+    UNUSED(event);\r
+    std::string viewId = view.GetViewId();\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "PhoneMsgViewEventListener ClickListener %s", viewId.c_str());\r
+    if (viewId == "phoneMsgView") {\r
+        NotificationManager::GetInstance()->StopNotify();\r
+    }\r
+    return true;\r
+}\r
+}  // namespace OHOS
\ No newline at end of file
index 6f45b72..3e2c29d 100644 (file)
@@ -23,7 +23,7 @@
 #include "nandflash_to_os.h"\r
 #endif\r
 #ifdef SUPPORT_OHOSFWK\r
-#include "ui_screennotify.h"\r
+#include "screennotify/ui_screennotify.h"\r
 #endif\r
 #include "sys/time.h"\r
 #include "touch_screen_def.h"\r
diff --git a/code/sdk/application/wearable/service/remote_msg/CMakeLists.txt b/code/sdk/application/wearable/service/remote_msg/CMakeLists.txt
new file mode 100644 (file)
index 0000000..f8e5abb
--- /dev/null
@@ -0,0 +1,37 @@
+set(COMPONENT_NAME "remote_msg")\r
+\r
+set(PUBLIC_HEADER\r
+)\r
+\r
+set(PRIVATE_HEADER\r
+    ${ROOT_DIR}/middleware/services/gui/uikit/utils/interfaces/innerkits\r
+    ${ROOT_DIR}/middleware/services/gui/uikit/utils/interfaces/kits\r
+)\r
+\r
+set(SOURCES\r
+    ${CMAKE_CURRENT_SOURCE_DIR}/remote_msg.cpp\r
+)\r
+\r
+set(COMPONENT_PUBLIC_CCFLAGS\r
+)\r
+\r
+set(COMPONENT_CCFLAGS\r
+    -std=c++11\r
+    -Wno-missing-field-initializers\r
+)\r
+\r
+set(WHOLE_LINK\r
+    true\r
+)\r
+\r
+set(PUBLIC_DEFINES\r
+)\r
+\r
+set(PRIVATE_DEFINES\r
+    APP_PLATFORM_WATCHGT\r
+    CONFIG_ACELITE_ENABLE\r
+)\r
+\r
+build_component()\r
+\r
+\r
diff --git a/code/sdk/application/wearable/service/remote_msg/remote_msg.cpp b/code/sdk/application/wearable/service/remote_msg/remote_msg.cpp
new file mode 100644 (file)
index 0000000..a339654
--- /dev/null
@@ -0,0 +1,73 @@
+/*\r
+ * Copyright (c) CompanyNameMagicTag 2023-2023. All rights reserved.\r
+ * Description: ota upgrade handle.\r
+ * This file should be changed only infrequently and with great care.\r
+ */\r
+#include <stdio.h>\r
+#include "securec.h"\r
+#include "msg_center.h"\r
+#include "msg_center_protocol.h"\r
+#include "msg_center_cmd.h"\r
+#include "wearable_log.h"\r
+#include "securec.h"\r
+#include "msg_center.h"\r
+#include "msg_center_common.h"\r
+#include "ohos_init.h"\r
+#include "remote_msg.h"\r
+#ifdef __cplusplus\r
+extern "C" {\r
+#endif\r
+\r
+static const msg_center_cmd_map_t g_msg_center_phone_msg_tbl[] = {\r
+    {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
+};\r
+\r
+errcode_t msg_center_phone_msg_rec(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, "msg_center_phone_msg_rec, 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
+    MsgCenterNotifyProc(TOPIC_DEMO_ALL_MSG, &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, "phone msg_result fail, ret = %d\r\n", ret);\r
+        return ERRCODE_FAIL;\r
+    }\r
+    return ERRCODE_SUCC;\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
+                  cmd_id, type);\r
+    uint8_t tbl_size = sizeof(g_msg_center_phone_msg_tbl) / sizeof(g_msg_center_phone_msg_tbl[0]);\r
+    uint8_t i;\r
+    for (i = 0; i < tbl_size; i++) {\r
+        msg_center_cmd_map_t *item = (msg_center_cmd_map_t *)&g_msg_center_phone_msg_tbl[i];\r
+        if ((item->type == type) && (item->handler != NULL)) {\r
+            item->handler(cmd_id, type, usr_data, usr_len);\r
+            return ERRCODE_SUCC;\r
+        }\r
+    }\r
+    return ERRCODE_NOT_SUPPORT;\r
+}\r
+\r
+void phone_msg_init(void)\r
+{\r
+    msg_center_register_cmd(MSGCENTER_CMD_PHONE_MSG, msg_center_phone_msg_type_dispatch);\r
+}\r
+\r
+APP_FEATURE_INIT_PRI(phone_msg_init, LAYER_INIT_LEVEL_4);\r
+\r
+#ifdef __cplusplus\r
+}\r
+#endif
\ No newline at end of file
diff --git a/code/sdk/application/wearable/service/remote_msg/remote_msg.h b/code/sdk/application/wearable/service/remote_msg/remote_msg.h
new file mode 100644 (file)
index 0000000..2787377
--- /dev/null
@@ -0,0 +1,33 @@
+/*\r
+ * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved.\r
+ * Description: third application message\r
+ * Author: CompanyName\r
+ * Create: 2021-11-11\r
+ */\r
+\r
+#ifndef REMOTE_MSG_H\r
+#define REMOTE_MSG_H\r
+\r
+#include "msg_center_protocol.h"\r
+\r
+#ifdef __cplusplus\r
+#if __cplusplus\r
+extern "C" {\r
+#endif\r
+#endif\r
+\r
+typedef enum msg_center_phone_msg_type_id {\r
+    MSGCENTER_TYPE_ID_MSG_THIRD_APP = 0x1, // 三方应用消息\r
+    MSGCENTER_TYPE_ID_MSG_SMS,             // 短信\r
+    MSGCENTER_TYPE_ID_MSG_PHONE,           // 电话\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
+\r
+#ifdef __cplusplus\r
+#if __cplusplus\r
+}\r
+#endif\r
+#endif\r
+#endif /* REMOTE_MSG_H */
\ No newline at end of file
index 6ca6ae7..9e88a43 100644 (file)
@@ -20,6 +20,9 @@
 #include "watchdog.h"\r
 #include "js_ability.h"\r
 #include "recording_module.h"\r
+#ifdef CONFIG_BRANDY_BLE_TRANS_OPTIMIZE\r
+#include "bluetooth/BluetoothChangeBle.h"\r
+#endif\r
 \r
 #ifdef __cplusplus\r
 extern "C" {\r
@@ -62,6 +65,43 @@ static void pcm_stream_del_queue(void)
     return;\r
 }\r
 \r
+static errcode_t send_pcm_stream_data(pcm_stream_queue_msg msg)\r
+{\r
+    uint8_t retry_cnt = 100;\r
+    uint8_t msg_send_delay = 10;\r
+    errcode_t res;\r
+\r
+    while (retry_cnt--) {\r
+        if (msg.msg_id == MSGCENTER_TYPE_ID_XIAODU_SEND_PCM_STREAM) {\r
+            res = msg_center_xiaodu_send_pcm_stream(MSGCENTER_CMD_XIAODU, MSGCENTER_TYPE_ID_XIAODU_SEND_PCM_STREAM,\r
+                msg.data, msg.len);\r
+        } else if (msg.msg_id == MSGCENTER_TYPE_ID_XIAODU_END_RECORD) {\r
+            res = msg_center_xiaodu_send_end_record(MSGCENTER_CMD_XIAODU, MSGCENTER_TYPE_ID_XIAODU_END_RECORD, msg.data,\r
+                msg.len);\r
+#ifdef CONFIG_BRANDY_BLE_TRANS_OPTIMIZE\r
+            ChangeBleConnectToDefault();\r
+#endif\r
+        }\r
+\r
+        if (res != ERRCODE_SUCC) {\r
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_MSG_CENTER, "send stream fail, retry_cnt: %d, type = %d\n", retry_cnt,\r
+                          msg.msg_id);\r
+            osDelay(msg_send_delay);\r
+        } else {\r
+            break;\r
+        }\r
+    }\r
+    free(msg.data);\r
+    msg.data = nullptr;\r
+    if (res != ERRCODE_SUCC) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_MSG_CENTER, "after retry, send stream still fail, retry_cnt: %d, type = %d\n",\r
+                      retry_cnt, msg.msg_id);\r
+        pcm_stream_del_queue();\r
+        return ERRCODE_FAIL;\r
+    }\r
+    return ERRCODE_SUCC;\r
+}\r
+\r
 static errcode_t pcm_stream_task_body(void *data)\r
 {\r
     UNUSED(data);\r
@@ -75,39 +115,22 @@ static errcode_t pcm_stream_task_body(void *data)
     }\r
 \r
     g_pcm_stream_end_record_sended_flag = false;\r
+#ifdef CONFIG_BRANDY_BLE_TRANS_OPTIMIZE\r
+    ChangeBleConnectToMax();\r
+#endif\r
 \r
     for (;;) {\r
         osStatus_t ret = osMessageQueueGet(g_pcm_stream_msg_queue_id, &msg, nullptr, osWaitForever);\r
         if (ret != osOK) {\r
-            msg.msg_id = MSGCENTER_TYPE_ID_XIAODU_END_RECORD;\r
-            msg.data = nullptr;\r
+            continue;\r
         }\r
-        if (msg.msg_id == MSGCENTER_TYPE_ID_XIAODU_SEND_PCM_STREAM) {\r
-            res = msg_center_xiaodu_send_pcm_stream(MSGCENTER_CMD_XIAODU, MSGCENTER_TYPE_ID_XIAODU_SEND_PCM_STREAM,\r
-                msg.data, msg.len);\r
-            free(msg.data);\r
-            msg.data = nullptr;\r
-            if (res != ERRCODE_SUCC) {\r
-                WEARABLE_LOGE(WEARABLE_LOG_MODULE_MSG_CENTER, "send pcm stream failed");\r
-                pcm_stream_del_queue();\r
-                return ERRCODE_FAIL;\r
-            }\r
-        } else if (msg.msg_id == MSGCENTER_TYPE_ID_XIAODU_END_RECORD) {\r
-            res = msg_center_xiaodu_send_end_record(MSGCENTER_CMD_XIAODU, MSGCENTER_TYPE_ID_XIAODU_END_RECORD, msg.data,\r
-                msg.len);\r
-            free(msg.data);\r
-            msg.data = nullptr;\r
-            if (res != ERRCODE_SUCC) {\r
-                WEARABLE_LOGE(WEARABLE_LOG_MODULE_MSG_CENTER, "send pcm end failed");\r
-                pcm_stream_del_queue();\r
-                return ERRCODE_FAIL;\r
-            }\r
-            g_pcm_stream_end_record_sended_flag = true;\r
-            return ERRCODE_SUCC;\r
+\r
+        /* pcm帧、end帧合并处理 */\r
+        res = send_pcm_stream_data(msg);\r
+        if (res == ERRCODE_FAIL || (res == ERRCODE_SUCC && msg.msg_id == MSGCENTER_TYPE_ID_XIAODU_END_RECORD)) {\r
+            return res;\r
         }\r
     }\r
-\r
-    return ERRCODE_SUCC;\r
 }\r
 \r
 /*\r
@@ -163,7 +186,6 @@ errcode_t pcm_stream_create_task(void)
 \r
 errcode_t msg_center_xiaodu_start(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len)\r
 {\r
-    unused(usr_data);\r
     uint8_t ack = 1;\r
     errcode_t ret = ERRCODE_SUCC;\r
 \r
@@ -174,16 +196,21 @@ errcode_t msg_center_xiaodu_start(uint8_t cmd_id, uint8_t type, void *usr_data,
     }\r
     display_api->set_screen_set_keepon_timeout(30000); // 30000ms\r
 #endif\r
-#ifdef JS_ENABLE\r
-    StartJsApp("com.vendor.voiceassistant");\r
-#endif\r
 \r
     /* ack */\r
     ret = msg_center_send_data(cmd_id, type, &ack, sizeof(ack));\r
     if (ret != ERRCODE_SUCC) {\r
         return ERRCODE_FAIL;\r
     }\r
+    uint8_t *tlv_payload = (uint8_t *)msg_center_get_tlv_payload(usr_data);\r
+#ifdef JS_ENABLE\r
+    if(tlv_payload[0] == 1) {\r
+        StartJsApp("com.vendor.Aidialogue");\r
+    } else {\r
+        StartJsApp("com.vendor.Aidial");\r
+    }\r
 \r
+#endif\r
     return ERRCODE_SUCC;\r
 }\r
 \r
@@ -407,6 +434,7 @@ errcode_t msg_center_xiaodu_send_end_record(uint8_t cmd_id, uint8_t type, void *
     WEARABLE_LOGI(WEARABLE_LOG_MODULE_MSG_CENTER, "send pcm stream end, usr_data = %d, usr_len = %d\r\n",\r
                   *(uint8_t *)usr_data, usr_len); /* usr_data参考协议msg_center_pcm_end_flag_t */\r
     pcm_stream_del_queue();\r
+    g_pcm_stream_end_record_sended_flag = true;\r
     return ERRCODE_SUCC;\r
 }\r
 \r
index ebe9e40..1d3047a 100644 (file)
@@ -3,6 +3,9 @@
 #include "msg_center_protocol.h"
 #include "msg_center_cmd.h"
 #include "ohos_init.h"
+#include "msg_center_common.h"
+#include "wearable_log.h"
+
 namespace OHOS {
 
 #ifdef __cplusplus