From 4ffd7894e69d766bc5a42d13239cc861b9ab277f Mon Sep 17 00:00:00 2001 From: Caisking <3449750381@qq.com> Date: Mon, 8 Apr 2024 11:33:42 +0800 Subject: [PATCH] =?utf8?q?=E5=90=88=E5=B9=B6602Patch?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- .../wearable/fd230app/CMakeLists.txt | 34 + .../nativelauncher/include/AppViewIDs.h | 9 +- .../nativelauncher/include/NativeLauncher.h | 6 + .../nativelauncher/include/UiConfig.h | 47 +- .../include/slices/main/MainPresenter.h | 35 + .../include/slices/main/MainView.h | 53 + .../nativelauncher/src/NativeLauncher.cpp | 86 +- .../src/slices/main/MainPresenter.cpp | 41 + .../src/slices/main/MainView.cpp | 102 + .../add_card/include/AddCardAdapter.h | 46 + .../nativeui/add_card/include/AddCardItem.h | 42 + .../nativeui/add_card/include/AddCardModel.h | 35 + .../add_card/include/AddCardPresenter.h | 43 + .../nativeui/add_card/include/AddCardView.h | 49 + .../nativeui/add_card/src/AddCardAdapter.cpp | 59 + .../nativeui/add_card/src/AddCardItem.cpp | 58 + .../nativeui/add_card/src/AddCardModel.cpp | 37 + .../add_card/src/AddCardPresenter.cpp | 78 + .../nativeui/add_card/src/AddCardView.cpp | 113 + .../nativeui/applist/include/AppItemView.h | 14 + .../nativeui/applist/include/ApplistModel.h | 5 +- .../applist/include/ApplistPresenter.h | 12 +- .../nativeui/applist/include/ApplistView.h | 59 +- .../nativeui/applist/src/AppItemView.cpp | 28 +- .../nativeui/applist/src/ApplistAdapter.cpp | 9 +- .../nativeui/applist/src/ApplistCardView.cpp | 7 +- .../nativeui/applist/src/ApplistModel.cpp | 28 +- .../nativeui/applist/src/ApplistPresenter.cpp | 54 +- .../nativeui/applist/src/ApplistView.cpp | 375 +- .../nativeui/clock/include/MainClockView.h | 125 +- .../nativeui/clock/src/MainClockView.cpp | 936 ++--- .../compass/include/CompassControlView.h | 2 + .../compass/src/CompassControlView.cpp | 18 +- .../dialupdate/src/DialUpdateModel.cpp | 2 + .../nativeui/heartrate/src/HeartModel.cpp | 2 +- .../indoorwalk/include/CustomizationView.h | 1 - .../indoorwalk/include/IndoorWalkEndView.h | 1 - .../indoorwalk/include/IndoorWalkModel.h | 1 - .../indoorwalk/include/IndoorWalkMotionView.h | 1 - .../include/IndoorWalkPreparedView.h | 1 - .../indoorwalk/include/IndoorWalkPresenter.h | 6 +- .../indoorwalk/include/MotionPageFifth.h | 1 - .../indoorwalk/include/MotionPageFirst.h | 1 - .../indoorwalk/include/MotionPageFourth.h | 1 - .../indoorwalk/include/MotionPageSecond.h | 1 - .../indoorwalk/include/MotionPageThird.h | 1 - .../indoorwalk/src/IndoorWalkMotionView.cpp | 18 +- .../indoorwalk/src/IndoorWalkPreparedView.cpp | 2 +- .../indoorwalk/src/IndoorWalkPresenter.cpp | 13 - .../indoorwalk/src/IndoorWalkView.cpp | 4 +- .../nativeui/key/include/KeyInputListener.h | 23 +- .../nativeui/key/src/KeyInputListener.cpp | 58 +- .../dial/parser => include}/DialBinParser.h | 16 +- .../dial/parser => include}/DialBinTypes.h | 27 +- .../nativeui/main/include/MainModel.h | 59 + .../main/include/MainPresenterSample.h | 60 +- .../nativeui/main/include/MainViewSample.h | 30 +- .../main/include/VolumeSettingPresenter.h | 8 +- .../nativeui/main/include/VolumeSettingView.h | 5 +- .../main/include/dial/DialKaleidoscopeView.h | 11 + .../fd230app/nativeui/main/src/MainModel.cpp | 203 ++ .../nativeui/main/src/MainPresenterSample.cpp | 236 +- .../nativeui/main/src/MainViewSample.cpp | 215 +- .../main/src/VolumeSettingPresenter.cpp | 105 +- .../nativeui/main/src/VolumeSettingView.cpp | 28 +- .../main/src/dial/parser/DialBinParser.cpp | 98 +- .../screensetting/include/ScreenModels.h | 59 +- .../screensetting/src/ScreenModels.cpp | 209 +- .../set_card/include/SetCardAdapter.h | 40 + .../set_card/include/SetCardDeleteView.h | 26 + .../nativeui/set_card/include/SetCardItem.h | 34 + .../nativeui/set_card/include/SetCardModel.h | 43 + .../set_card/include/SetCardNoCardView.h | 27 + .../set_card/include/SetCardPresenter.h | 51 + .../nativeui/set_card/include/SetCardView.h | 62 + .../nativeui/set_card/src/SetCardAdapter.cpp | 58 + .../set_card/src/SetCardDeleteView.cpp | 53 + .../nativeui/set_card/src/SetCardItem.cpp | 32 + .../nativeui/set_card/src/SetCardModel.cpp | 72 + .../set_card/src/SetCardNoCardView.cpp | 43 + .../set_card/src/SetCardPresenter.cpp | 116 + .../nativeui/set_card/src/SetCardView.cpp | 208 ++ .../set_desktop/include/SetDesktopModel.h | 37 + .../set_desktop/include/SetDesktopPresenter.h | 39 + .../set_desktop/include/SetDesktopView.h | 50 + .../set_desktop/src/SetDesktopModel.cpp | 46 + .../set_desktop/src/SetDesktopPresenter.cpp | 62 + .../set_desktop/src/SetDesktopView.cpp | 107 + .../nativeui/set_dial/include/SetDialInfo.h | 26 + .../nativeui/set_dial/include/SetDialModel.h | 36 + .../set_dial/include/SetDialPresenter.h | 40 + .../nativeui/set_dial/include/SetDialView.h | 47 + .../nativeui/set_dial/src/SetDialModel.cpp | 161 + .../set_dial/src/SetDialPresenter.cpp | 79 + .../nativeui/set_dial/src/SetDialView.cpp | 118 + .../wearable/nativeapp/CMakeLists.txt | 5 +- .../nativeui/main/src/MainViewSample.cpp | 10 - .../main/src/dial/parser/DialBinParser.h | 63 - .../main/src/dial/parser/DialBinTypes.h | 158 - .../phoneservice/include/PhoneService.h | 473 +-- .../phoneservice/src/PhoneService.cpp | 3151 +++++++++-------- .../msg_center/src/msg_center_customer.cpp | 4 + .../src/notify/makephone_notification.cpp | 2 + .../config/target_config/brandy/config.py | 3 +- .../fd230/fs/user/res/APPLIST_ALARM.bin | Bin 4504 -> 12824 bytes .../fs/user/res/APPLIST_CALLER_IMAGE.bin | Bin 4504 -> 12824 bytes .../fs/user/res/APPLIST_COMPASS_IMAGE.bin | Bin 4504 -> 12824 bytes .../fd230/fs/user/res/APPLIST_SETTING.bin | Bin 4504 -> 12824 bytes .../fd230/fs/user/res/APPLIST_SPO2.bin | Bin 4504 -> 12824 bytes .../fd230/fs/user/res/CARD_ACTIVITY.bin | Bin 0 -> 52664 bytes .../fd230/fs/user/res/CARD_ADD.bin | Bin 0 -> 4504 bytes .../fd230/fs/user/res/CARD_COMPASS.bin | Bin 0 -> 52664 bytes .../fd230/fs/user/res/CARD_DEL.bin | Bin 0 -> 4504 bytes .../fd230/fs/user/res/CARD_HEART.bin | Bin 0 -> 52664 bytes .../fd230/fs/user/res/CARD_PLAYER.bin | Bin 0 -> 53416 bytes .../fd230/fs/user/res/DIAL_CLOCK.bin | Bin 0 -> 27224 bytes .../fd230/fs/user/res/NEW_DEVICE.bin | Bin 31224 -> 22488 bytes .../fd230/fs/user/res/SETTING_NEXT.bin | Bin 360 -> 1464 bytes .../fd230/fs/user/res/SETTTING_DESKTOP.bin | Bin 0 -> 3976 bytes .../fd230/fs/user/res/SET_DESKTOP_BG.bin | Bin 0 -> 24600 bytes .../fs/user/res/SET_DESKTOP_HEXAGONS.bin | Bin 0 -> 14824 bytes .../fd230/fs/user/res/SET_DESKTOP_LIST.bin | Bin 0 -> 14824 bytes .../fd230/fs/user/res/backGround.bin | Bin 0 -> 1794008 bytes .../fd230/fs/user/res/hexagons.bin | Bin 0 -> 6168 bytes .../fd230/fs/user/res/kaleidoscope.bin | Bin 0 -> 27224 bytes .../mk_fs_image/fd230/fs/user/res/planet.bin | Bin 0 -> 27224 bytes .../fd230/fs/user/res/rabbit454.bin | Bin 0 -> 138648 bytes .../mk_fs_image/fd230/fs/user/res/rainbow.bin | Bin 0 -> 27224 bytes 128 files changed, 6158 insertions(+), 3576 deletions(-) create mode 100644 code/sdk/application/wearable/fd230app/nativelauncher/include/slices/main/MainPresenter.h create mode 100644 code/sdk/application/wearable/fd230app/nativelauncher/include/slices/main/MainView.h create mode 100644 code/sdk/application/wearable/fd230app/nativelauncher/src/slices/main/MainPresenter.cpp create mode 100644 code/sdk/application/wearable/fd230app/nativelauncher/src/slices/main/MainView.cpp create mode 100644 code/sdk/application/wearable/fd230app/nativeui/add_card/include/AddCardAdapter.h create mode 100644 code/sdk/application/wearable/fd230app/nativeui/add_card/include/AddCardItem.h create mode 100644 code/sdk/application/wearable/fd230app/nativeui/add_card/include/AddCardModel.h create mode 100644 code/sdk/application/wearable/fd230app/nativeui/add_card/include/AddCardPresenter.h create mode 100644 code/sdk/application/wearable/fd230app/nativeui/add_card/include/AddCardView.h create mode 100644 code/sdk/application/wearable/fd230app/nativeui/add_card/src/AddCardAdapter.cpp create mode 100644 code/sdk/application/wearable/fd230app/nativeui/add_card/src/AddCardItem.cpp create mode 100644 code/sdk/application/wearable/fd230app/nativeui/add_card/src/AddCardModel.cpp create mode 100644 code/sdk/application/wearable/fd230app/nativeui/add_card/src/AddCardPresenter.cpp create mode 100644 code/sdk/application/wearable/fd230app/nativeui/add_card/src/AddCardView.cpp rename code/sdk/application/wearable/fd230app/nativeui/main/{src/dial/parser => include}/DialBinParser.h (86%) rename code/sdk/application/wearable/fd230app/nativeui/main/{src/dial/parser => include}/DialBinTypes.h (77%) create mode 100644 code/sdk/application/wearable/fd230app/nativeui/main/include/MainModel.h create mode 100644 code/sdk/application/wearable/fd230app/nativeui/main/include/dial/DialKaleidoscopeView.h create mode 100644 code/sdk/application/wearable/fd230app/nativeui/main/src/MainModel.cpp create mode 100644 code/sdk/application/wearable/fd230app/nativeui/set_card/include/SetCardAdapter.h create mode 100644 code/sdk/application/wearable/fd230app/nativeui/set_card/include/SetCardDeleteView.h create mode 100644 code/sdk/application/wearable/fd230app/nativeui/set_card/include/SetCardItem.h create mode 100644 code/sdk/application/wearable/fd230app/nativeui/set_card/include/SetCardModel.h create mode 100644 code/sdk/application/wearable/fd230app/nativeui/set_card/include/SetCardNoCardView.h create mode 100644 code/sdk/application/wearable/fd230app/nativeui/set_card/include/SetCardPresenter.h create mode 100644 code/sdk/application/wearable/fd230app/nativeui/set_card/include/SetCardView.h create mode 100644 code/sdk/application/wearable/fd230app/nativeui/set_card/src/SetCardAdapter.cpp create mode 100644 code/sdk/application/wearable/fd230app/nativeui/set_card/src/SetCardDeleteView.cpp create mode 100644 code/sdk/application/wearable/fd230app/nativeui/set_card/src/SetCardItem.cpp create mode 100644 code/sdk/application/wearable/fd230app/nativeui/set_card/src/SetCardModel.cpp create mode 100644 code/sdk/application/wearable/fd230app/nativeui/set_card/src/SetCardNoCardView.cpp create mode 100644 code/sdk/application/wearable/fd230app/nativeui/set_card/src/SetCardPresenter.cpp create mode 100644 code/sdk/application/wearable/fd230app/nativeui/set_card/src/SetCardView.cpp create mode 100644 code/sdk/application/wearable/fd230app/nativeui/set_desktop/include/SetDesktopModel.h create mode 100644 code/sdk/application/wearable/fd230app/nativeui/set_desktop/include/SetDesktopPresenter.h create mode 100644 code/sdk/application/wearable/fd230app/nativeui/set_desktop/include/SetDesktopView.h create mode 100644 code/sdk/application/wearable/fd230app/nativeui/set_desktop/src/SetDesktopModel.cpp create mode 100644 code/sdk/application/wearable/fd230app/nativeui/set_desktop/src/SetDesktopPresenter.cpp create mode 100644 code/sdk/application/wearable/fd230app/nativeui/set_desktop/src/SetDesktopView.cpp create mode 100644 code/sdk/application/wearable/fd230app/nativeui/set_dial/include/SetDialInfo.h create mode 100644 code/sdk/application/wearable/fd230app/nativeui/set_dial/include/SetDialModel.h create mode 100644 code/sdk/application/wearable/fd230app/nativeui/set_dial/include/SetDialPresenter.h create mode 100644 code/sdk/application/wearable/fd230app/nativeui/set_dial/include/SetDialView.h create mode 100644 code/sdk/application/wearable/fd230app/nativeui/set_dial/src/SetDialModel.cpp create mode 100644 code/sdk/application/wearable/fd230app/nativeui/set_dial/src/SetDialPresenter.cpp create mode 100644 code/sdk/application/wearable/fd230app/nativeui/set_dial/src/SetDialView.cpp delete mode 100644 code/sdk/application/wearable/nativeapp/nativeui/main/src/dial/parser/DialBinParser.h delete mode 100644 code/sdk/application/wearable/nativeapp/nativeui/main/src/dial/parser/DialBinTypes.h create mode 100644 code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/CARD_ACTIVITY.bin create mode 100644 code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/CARD_ADD.bin create mode 100644 code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/CARD_COMPASS.bin create mode 100644 code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/CARD_DEL.bin create mode 100644 code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/CARD_HEART.bin create mode 100644 code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/CARD_PLAYER.bin create mode 100644 code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/DIAL_CLOCK.bin create mode 100644 code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/SETTTING_DESKTOP.bin create mode 100644 code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/SET_DESKTOP_BG.bin create mode 100644 code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/SET_DESKTOP_HEXAGONS.bin create mode 100644 code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/SET_DESKTOP_LIST.bin create mode 100644 code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/backGround.bin create mode 100644 code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/hexagons.bin create mode 100644 code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/kaleidoscope.bin create mode 100644 code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/planet.bin create mode 100644 code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/rabbit454.bin create mode 100644 code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/rainbow.bin diff --git a/code/sdk/application/wearable/fd230app/CMakeLists.txt b/code/sdk/application/wearable/fd230app/CMakeLists.txt index 6a1bb4232..08e498629 100644 --- a/code/sdk/application/wearable/fd230app/CMakeLists.txt +++ b/code/sdk/application/wearable/fd230app/CMakeLists.txt @@ -5,6 +5,7 @@ set(UI_SAMPLE_ROOT ${ROOT_DIR}/middleware/services/gui/uikit/sample/uitest) set(PUBLIC_HEADER ${CMAKE_CURRENT_SOURCE_DIR}/nativelauncher/include + ${CMAKE_CURRENT_SOURCE_DIR}/nativelauncher/include/slices/main ${CMAKE_CURRENT_SOURCE_DIR}/nativeui/screennotify/include ) @@ -31,6 +32,10 @@ set(PRIVATE_HEADER ${CMAKE_CURRENT_SOURCE_DIR}/nativeui/temperature/include ${CMAKE_CURRENT_SOURCE_DIR}/nativeui/offlinevoice/include ${CMAKE_CURRENT_SOURCE_DIR}/nativeui/settings/include + ${CMAKE_CURRENT_SOURCE_DIR}/nativeui/set_desktop/include + ${CMAKE_CURRENT_SOURCE_DIR}/nativeui/set_card/include + ${CMAKE_CURRENT_SOURCE_DIR}/nativeui/add_card/include + ${CMAKE_CURRENT_SOURCE_DIR}/nativeui/set_dial/include ${CMAKE_CURRENT_SOURCE_DIR}/nativeui/key/include ${CMAKE_CURRENT_SOURCE_DIR}/nativeui/phone/include ${CMAKE_CURRENT_SOURCE_DIR}/nativeui/player/include @@ -68,6 +73,8 @@ set(PRIVATE_HEADER ${ROOT_DIR}/middleware/services/gui/uikit/ui/interfaces/innerkits ${ROOT_DIR}/middleware/services/gui/lvgl/src/hal + ${ROOT_DIR}/middleware/services/gui/uikit/ui/interfaces/kits/events + ${ROOT_DIR}/middleware/services/gui/uikit/ui/interfaces/kits ${ROOT_DIR}/middleware/services/gui/uikit/utils/interfaces/kits ${ROOT_DIR}/middleware/services/gui/uikit/utils/interfaces/kits/gfx_utils @@ -113,11 +120,16 @@ set(PRIVATE_HEADER ${ROOT_DIR}/open_source/openharmony/foundation/multimedia/audiomanager/interfaces/kits/audiocommon ${ROOT_DIR}/open_source/openharmony/foundation/multimedia/player/interfaces/kits/ ${ROOT_DIR}/open_source/openharmony/foundation/multimedia/utils/include + ${ROOT_DIR}/open_source/openharmony/utils/native/lite/include + ${ROOT_DIR}/open_source/openharmony/utils/native/lite/kv_store/innerkits ) set(SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/nativelauncher/src/NativeLauncher.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/nativelauncher/src/slices/main/MainPresenter.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/nativelauncher/src/slices/main/MainView.cpp ${CMAKE_CURRENT_SOURCE_DIR}/nativeui/main/src/MainViewSample.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/nativeui/main/src/MainModel.cpp ${CMAKE_CURRENT_SOURCE_DIR}/nativeui/main/src/MainPresenterSample.cpp ${CMAKE_CURRENT_SOURCE_DIR}/nativeui/main/src/ModelListenerSample.cpp @@ -246,7 +258,26 @@ set(SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/nativeui/settings/src/SettingView.cpp ${CMAKE_CURRENT_SOURCE_DIR}/nativeui/settings/src/SettingModel.cpp ${CMAKE_CURRENT_SOURCE_DIR}/nativeui/settings/src/SettingItemView.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/nativeui/set_desktop/src/SetDesktopModel.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/nativeui/set_desktop/src/SetDesktopPresenter.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/nativeui/set_desktop/src/SetDesktopView.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/nativeui/set_card/src/SetCardAdapter.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/nativeui/set_card/src/SetCardItem.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/nativeui/set_card/src/SetCardModel.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/nativeui/set_card/src/SetCardPresenter.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/nativeui/set_card/src/SetCardView.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/nativeui/set_card/src/SetCardNoCardView.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/nativeui/set_card/src/SetCardDeleteView.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/nativeui/add_card/src/AddCardAdapter.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/nativeui/add_card/src/AddCardItem.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/nativeui/add_card/src/AddCardModel.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/nativeui/add_card/src/AddCardPresenter.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/nativeui/add_card/src/AddCardView.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/nativeui/set_dial/src/SetDialModel.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/nativeui/set_dial/src/SetDialPresenter.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/nativeui/set_dial/src/SetDialView.cpp ${CMAKE_CURRENT_SOURCE_DIR}/nativeui/key/src/KeyInputListener.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/nativeui/screennotify/src/ui_screennotify.cpp ${CMAKE_CURRENT_SOURCE_DIR}/nativeui/heart_blood/src/BloodCardView.cpp ${CMAKE_CURRENT_SOURCE_DIR}/nativeui/heart_blood/src/HeartCardView.cpp @@ -394,6 +425,9 @@ set(SOURCES ${UI_SAMPLE_ROOT}/components/ui_test_cube_rotate/cube_rotate_view.cpp ${UI_SAMPLE_ROOT}/components/ui_test_cube_rotate/ui_test_cube_rotate.cpp ${UI_SAMPLE_ROOT}/components/ui_test_video_play/ui_test_video_play.cpp + ${UI_SAMPLE_ROOT}/components/ui_test_hexagons_list/ui_test_hexagons_list.cpp + ${UI_SAMPLE_ROOT}/components/ui_test_coverflow/ui_test_coverflow.cpp + ${UI_SAMPLE_ROOT}/components/ui_test_kaleidoscope/ui_test_kaleidoscope.cpp ${CMAKE_CURRENT_SOURCE_DIR}/nativeui/main/src/dial/DialRotateImgView.cpp ${CMAKE_CURRENT_SOURCE_DIR}/nativeui/main/src/dial/DialOptionImgView.cpp diff --git a/code/sdk/application/wearable/fd230app/nativelauncher/include/AppViewIDs.h b/code/sdk/application/wearable/fd230app/nativelauncher/include/AppViewIDs.h index 4e8818d6e..f2982be75 100644 --- a/code/sdk/application/wearable/fd230app/nativelauncher/include/AppViewIDs.h +++ b/code/sdk/application/wearable/fd230app/nativelauncher/include/AppViewIDs.h @@ -122,7 +122,11 @@ typedef enum : uint16_t #ifdef SUPPORT_ALIPAY_SEC VIEW_MAIN_ALIPAY, #endif - VIEW_MAX_INTER_APP, // 在此之前添加native应用ID. + VIEW_SET_DESKTOP, + VIEW_SET_CARD, + VIEW_ADD_CARD, + VIEW_SET_DIAL, + VIEW_MAX_INTER_APP, // 在此之前添加native应用ID. VIEW_EXTERN_APP = 0xFFFE, // 三方应用 VIEW_INVALIDE_APP = 0xFFFF, } AppViewId; @@ -130,8 +134,7 @@ typedef enum : uint16_t /* * Slice页面优先级,越小优先级越高 */ -typedef enum : uint16_t -{ +typedef enum : uint16_t { PRIO_0 = 0, PRIO_1, PRIO_2, diff --git a/code/sdk/application/wearable/fd230app/nativelauncher/include/NativeLauncher.h b/code/sdk/application/wearable/fd230app/nativelauncher/include/NativeLauncher.h index 830bad2a0..7d9210b47 100644 --- a/code/sdk/application/wearable/fd230app/nativelauncher/include/NativeLauncher.h +++ b/code/sdk/application/wearable/fd230app/nativelauncher/include/NativeLauncher.h @@ -11,6 +11,12 @@ namespace OHOS public: static NativeLauncher &GetInstance(void); void InitNativeLauncher(void); + void InitMainSlice(void); + void InitSetDesktopSlice(void); + void InitSetCardSlice(void); + void InitAddCardSlice(void); + void InitSetDialSlice(void); + void InitMainSampleSlice(void); void InitSettingSlice(void); void InitApplistSlice(void); diff --git a/code/sdk/application/wearable/fd230app/nativelauncher/include/UiConfig.h b/code/sdk/application/wearable/fd230app/nativelauncher/include/UiConfig.h index 757e573d4..85fd3e91a 100644 --- a/code/sdk/application/wearable/fd230app/nativelauncher/include/UiConfig.h +++ b/code/sdk/application/wearable/fd230app/nativelauncher/include/UiConfig.h @@ -12,11 +12,28 @@ #include "ohos_types.h" #include "graphic_config.h" -namespace OHOS -{ -#ifndef UNUSED -#define UNUSED(x) ((void)(x)) -#endif +namespace OHOS { + static const int CARD_SETTING_COUNT_MAX = 5; + typedef enum { + WATCH_FACE = 0, /* 主表盘枚举值不能修改 */ + HEART_RATE, + COMPASS, + ACTIVITY, + MUSIC_PLAYER, + WEATHER, + BLOODOXGEN, + TRAINING, + MAX_CARD, + } CardId; + + typedef enum { + DIAL_CLOCK = 0, + DIAL_MAX, + } DialId; + + #ifndef UNUSED + #define UNUSED(x) ((void)(x)) + #endif #define LA_HORIZONTAL_RESOLUTION 400 // watch width #define LA_VERTICAL_RESOLUTION 400 // watch height @@ -36,9 +53,10 @@ namespace OHOS #define X_DRAG_OFFSET 20 #define DOUBLES 2 -#define APP_RES_PATH "/user/res" -#define APP_MUSIC_PATH "/user/music" -#define APP_VIDEO_PATH "/user/video" + #define APP_RES_PATH "/user/res" + #define APP_MUSIC_PATH "/user/music" + #define APP_VIDEO_PATH "/user/video" + #define APP_DIAL_PATH "/user/dial" static constexpr const char *CARD_CONFIG_PATH = "/user/cardconfig.bin"; static constexpr const char *CLOCK_IAMGES = APP_RES_PATH "/clock/clock.bin"; @@ -311,6 +329,19 @@ namespace OHOS static constexpr const char *PNG_SELECTION_BOX = APP_RES_PATH "/SELECTION_BOX.bin"; static constexpr const char *PNG_GANTAN = APP_RES_PATH "/GANTAN.bin"; static constexpr const char *PNG_RIGHT = APP_RES_PATH "/RIGHT.bin"; + /* -------------------------------------------------------------------------- */ + static constexpr const char *PNG_SETTTING_DESKTOP_IMAGE = APP_RES_PATH"/SETTTING_DESKTOP.bin"; + static constexpr const char *PNG_SET_DESKTOP_LIST_IMAGE = APP_RES_PATH"/SET_DESKTOP_LIST.bin"; + static constexpr const char *PNG_SET_DESKTOP_HEXAGONS_IMAGE = APP_RES_PATH"/SET_DESKTOP_HEXAGONS.bin"; + static constexpr const char *PNG_SET_DESKTOP_BG_IMAGE = APP_RES_PATH"/SET_DESKTOP_BG.bin"; + static constexpr const char *PNG_SET_CARD_ADD = APP_RES_PATH"/CARD_ADD.bin"; + static constexpr const char *PNG_SET_CARD_DEL = APP_RES_PATH"/CARD_DEL.bin"; + static constexpr const char *PNG_SET_CARD_HEART = APP_RES_PATH"/CARD_HEART.bin"; + static constexpr const char *PNG_SET_CARD_COMPASS = APP_RES_PATH"/CARD_COMPASS.bin"; + static constexpr const char *PNG_SET_CARD_ACTIVITY = APP_RES_PATH"/CARD_ACTIVITY.bin"; + static constexpr const char *PNG_SET_CARD_PLAYER = APP_RES_PATH"/CARD_PLAYER.bin"; + static constexpr const char *PNG_SET_DIAL_CLOCK = APP_RES_PATH"/DIAL_CLOCK.bin"; + } #endif // UI_CONFIG_H diff --git a/code/sdk/application/wearable/fd230app/nativelauncher/include/slices/main/MainPresenter.h b/code/sdk/application/wearable/fd230app/nativelauncher/include/slices/main/MainPresenter.h new file mode 100644 index 000000000..7e25bbdbe --- /dev/null +++ b/code/sdk/application/wearable/fd230app/nativelauncher/include/slices/main/MainPresenter.h @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2020-2021 CompanyNameMagicTag. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef MAIN_PRESENTER_H +#define MAIN_PRESENTER_H + +#include "Presenter.h" + +namespace OHOS { +class MainView; +class MainPresenter : public Presenter { +public: + MainPresenter(); + virtual ~MainPresenter(); + + void OnStart() override; + void OnPause() override; + void OnResume() override; + void OnStop() override; +}; +} + +#endif // MAIN_PRESENTER_H diff --git a/code/sdk/application/wearable/fd230app/nativelauncher/include/slices/main/MainView.h b/code/sdk/application/wearable/fd230app/nativelauncher/include/slices/main/MainView.h new file mode 100644 index 000000000..6a13caea8 --- /dev/null +++ b/code/sdk/application/wearable/fd230app/nativelauncher/include/slices/main/MainView.h @@ -0,0 +1,53 @@ +/* + * Copyright (c) 2020-2021 CompanyNameMagicTag. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef MAIN_VIEW_H +#define MAIN_VIEW_H + +#include + +#include "View.h" +#include "window/window.h" +#include "components/ui_label.h" +#include "components/root_view.h" +#include "components/ui_view_group.h" +#include "components/ui_image_view.h" +#include "components/ui_button.h" +#include "components/ui_label_button.h" + +#include "BaseView.h" +#include "ChangeSliceListener.h" + +namespace OHOS { +#define LA_HORIZONTAL_RESOLUTION 400 // watch width +#define LA_VERTICAL_RESOLUTION 400 // watch height +#define NORMAL_BUTTON_WIDTH 100 // normal button width +#define NORMAL_BUTTON_HEIGHT 50 // normal button height +#define UN_OPACITY 255 // UN_OPACITY +#define FONT_COMMON 20 // 20px + +class MainPresenter; +class MainView : public View { +public: + MainView(); + virtual ~MainView(); + + void OnStart() override; + void OnSetUpView() override; + void OnTearDownView() override; + void OnStop() override; +}; +} // namespace OHOS +#endif // MAIN_VIEW_H \ No newline at end of file diff --git a/code/sdk/application/wearable/fd230app/nativelauncher/src/NativeLauncher.cpp b/code/sdk/application/wearable/fd230app/nativelauncher/src/NativeLauncher.cpp index ae32d0041..a27e9d6d4 100644 --- a/code/sdk/application/wearable/fd230app/nativelauncher/src/NativeLauncher.cpp +++ b/code/sdk/application/wearable/fd230app/nativelauncher/src/NativeLauncher.cpp @@ -16,6 +16,8 @@ #include "DialModelCharge.h" #include "NativeLauncher.h" +#include "MainView.h" +#include "MainPresenter.h" #include "SliceProxy.h" #include "AbilitySliceProxy.h" #include "wearable_log.h" @@ -222,13 +224,24 @@ #include "AlipayMainView.h" #include "AlipayPresenter.h" #endif -namespace OHOS +#include "SetDesktopView.h" +#include "SetDesktopPresenter.h" +#include "SetCardView.h" +#include "SetCardPresenter.h" +#include "AddCardView.h" +#include "AddCardPresenter.h" +#include "SetDialView.h" +#include "SetDialPresenter.h" +#ifdef JS_ENABLE +#include "product_adapter.h" +#endif + +namespace OHOS { +struct AppViewMapper { - struct AppViewMapper - { - AppViewId id; - void (NativeLauncher::*func)(void); - }; + AppViewId id; + void (NativeLauncher::*func)(void); +}; struct ViewIdToString { @@ -325,7 +338,10 @@ namespace OHOS #ifdef SUPPORT_ALIPAY_SEC {VIEW_MAIN_ALIPAY, &NativeLauncher::InitMainAlipaySlice}, #endif - + {VIEW_SET_DESKTOP, &NativeLauncher::InitSetDesktopSlice}, + {VIEW_SET_CARD, &NativeLauncher::InitSetCardSlice}, + {VIEW_ADD_CARD, &NativeLauncher::InitAddCardSlice}, + {VIEW_SET_DIAL, &NativeLauncher::InitSetDialSlice}, #if 0 {VIEW_MAIN_ACTIVITY, &NativeLauncher::InitActivitySlice}, {VIEW_OFFLINEVOICE, &NativeLauncher::InitOfflineVoice}, @@ -362,6 +378,9 @@ namespace OHOS void NativeLauncher::InitNativeLauncher() { + #ifdef JS_ENABLE + ACELite::ProductAdapter::SetScreenSize(HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION); +#endif ConfigModel::GetInstance()->Init(); // 初始化语言 GraphicStartUp::InitFontEngine(MEM_POOL_UI_FONT, MEM_POOL_UI_FONT_SIZE, OHOS::VECTOR_FONT_DIR, DEFAULT_VECTOR_FONT_FILENAME); @@ -379,7 +398,7 @@ namespace OHOS PresenterTask::GetInstance()->Init(); PlayersModel::GetInstance()->AudioInit(); ActivityModel::GetInstance()->Init(); - ScreenModels::GetInstance()->InitCardConfig(); + ScreenModels::GetInstance()->InitKvStorage(); VocassistModel::GetInstance()->Init(); HeartModel::GetInstance()->Init(); BluetoothModel::GetInstance()->Init(); @@ -1115,5 +1134,54 @@ namespace OHOS } NativeAbility::GetInstance().AddSliceProxy(VIEW_MAIN_STOPWATCH, mainstopwatch); } - + + /* -------------------------------------------------------------------------- */ + void NativeLauncher::InitSetDesktopSlice(void) + { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "NativeLauncher::InitSetDesktopSlice"); + SliceProxy *setDesktopView = new AbilitySliceProxy; + if (setDesktopView == nullptr) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "setDesktopView"); + return; + } + NativeAbility::GetInstance().AddSliceProxy(VIEW_SET_DESKTOP, setDesktopView); + } + + void NativeLauncher::InitSetCardSlice(void) + { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "NativeLauncher::InitSetCardSlice"); + SliceProxy *setCardView = new AbilitySliceProxy; + if (setCardView == nullptr) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "setCardView"); + return; + } + NativeAbility::GetInstance().AddSliceProxy(VIEW_SET_CARD, setCardView); + } + + void NativeLauncher::InitAddCardSlice(void) + { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "NativeLauncher::InitAddCardSlice"); + SliceProxy *addCardView = new AbilitySliceProxy; + if (addCardView == nullptr) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "addCardView"); + return; + } + NativeAbility::GetInstance().AddSliceProxy(VIEW_ADD_CARD, addCardView); + } + + void NativeLauncher::InitSetDialSlice(void) + { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "NativeLauncher::InitSetDialSlice"); + SliceProxy *setDialView = new AbilitySliceProxy; + if (setDialView == nullptr) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "setCardView"); + return; + } + NativeAbility::GetInstance().AddSliceProxy(VIEW_SET_DIAL, setDialView); + } + } diff --git a/code/sdk/application/wearable/fd230app/nativelauncher/src/slices/main/MainPresenter.cpp b/code/sdk/application/wearable/fd230app/nativelauncher/src/slices/main/MainPresenter.cpp new file mode 100644 index 000000000..dbfac37c0 --- /dev/null +++ b/code/sdk/application/wearable/fd230app/nativelauncher/src/slices/main/MainPresenter.cpp @@ -0,0 +1,41 @@ +/* + * Copyright (c) 2020-2021 CompanyNameMagicTag. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "MainPresenter.h" +#include "MainView.h" + +namespace OHOS { + +MainPresenter::MainPresenter() {} + +MainPresenter::~MainPresenter() {} + +void MainPresenter::OnStart() +{ + Presenter::OnStart(); +} + +void MainPresenter::OnPause(void) +{ +} + +void MainPresenter::OnResume(void) +{ +} + +void MainPresenter::OnStop(void) +{ +} +} \ No newline at end of file diff --git a/code/sdk/application/wearable/fd230app/nativelauncher/src/slices/main/MainView.cpp b/code/sdk/application/wearable/fd230app/nativelauncher/src/slices/main/MainView.cpp new file mode 100644 index 000000000..3e79969e1 --- /dev/null +++ b/code/sdk/application/wearable/fd230app/nativelauncher/src/slices/main/MainView.cpp @@ -0,0 +1,102 @@ +/* + * Copyright (c) 2020-2021 CompanyNameMagicTag. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "MainView.h" +#include "AppViewIDs.h" +#include "components/ui_label_ext.h" + +#include "wearable_log.h" + +namespace OHOS { +MainView::MainView(){} + +MainView::~MainView(){} + +void MainView::OnStart() +{ + WEARABLE_LOGI(WEARABLE_LOG_MODULE_LAUNCHER_FWK, "MainView::OnStart"); + View::OnStart(); + + BaseView::RootView(Color::Black().full); + + UILabel *goSettings = new UILabel(); + goSettings->SetText("Settings"); + goSettings->SetFont(DEFAULT_VECTOR_FONT_FILENAME, FONT_COMMON); + goSettings->SetPosition(35, LA_VERTICAL_RESOLUTION); + goSettings->Resize(NORMAL_BUTTON_WIDTH, NORMAL_BUTTON_HEIGHT); + goSettings->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER); + goSettings->SetStyle(STYLE_TEXT_OPA, OPA_OPAQUE); + goSettings->SetStyle(STYLE_TEXT_COLOR, Color::Black().full); + goSettings->SetStyle(STYLE_BACKGROUND_COLOR, Color::Green().full); + goSettings->SetStyle(STYLE_BACKGROUND_OPA, UN_OPACITY); + goSettings->SetStyle(STYLE_BORDER_RADIUS, 4); + goSettings->SetTouchable(true); + goSettings->SetOnTouchListener(new ChangeSliceListener(VIEW_MAIN)); + + UILabel *goAppList = new UILabel(); + goAppList->SetText("App List"); + goAppList->SetFont(DEFAULT_VECTOR_FONT_FILENAME, FONT_COMMON); + goAppList->SetPosition(165, LA_VERTICAL_RESOLUTION); + goAppList->Resize(NORMAL_BUTTON_WIDTH, NORMAL_BUTTON_HEIGHT); + goAppList->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER); + goAppList->SetStyle(STYLE_TEXT_OPA, OPA_OPAQUE); + goAppList->SetStyle(STYLE_TEXT_COLOR, Color::Black().full); + goAppList->SetStyle(STYLE_BACKGROUND_COLOR, Color::Green().full); + goAppList->SetStyle(STYLE_BACKGROUND_OPA, UN_OPACITY); + goAppList->SetStyle(STYLE_BORDER_RADIUS, 4); + goAppList->SetTouchable(true); + goAppList->SetOnTouchListener(new ChangeSliceListener(VIEW_MAIN)); + + RootView::GetInstance()->Add(goSettings); + RootView::GetInstance()->Add(goAppList); +} + +void MainView::OnSetUpView() +{ + WEARABLE_LOGI(WEARABLE_LOG_MODULE_LAUNCHER_FWK, "MainView::OnSetUpView"); + View::OnSetUpView(); + + UIViewGroup *group = new UIViewGroup(); + group->SetPosition(0, 0, LA_HORIZONTAL_RESOLUTION, LA_VERTICAL_RESOLUTION); + group->SetStyle(STYLE_BACKGROUND_OPA, UN_OPACITY); + group->SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full); + + RootView::GetInstance()->Add(group); + Draw(); +} + +void MainView::OnTearDownView() +{ + WEARABLE_LOGI(WEARABLE_LOG_MODULE_LAUNCHER_FWK, "MainView::OnTearDownView"); + View::OnTearDownView(); + return; +} + +void MainView::OnStop() +{ + WEARABLE_LOGI(WEARABLE_LOG_MODULE_LAUNCHER_FWK, "MainView::OnStop"); + View::OnStop(); + + if (container_ != nullptr) { + container_->RemoveAll(); + delete container_; + container_ = nullptr; + } + + RootView::GetInstance()->ClearOnKeyActListener(); + RootView::GetInstance()->RemoveAll(); + return; +} +} \ No newline at end of file diff --git a/code/sdk/application/wearable/fd230app/nativeui/add_card/include/AddCardAdapter.h b/code/sdk/application/wearable/fd230app/nativeui/add_card/include/AddCardAdapter.h new file mode 100644 index 000000000..34882c939 --- /dev/null +++ b/code/sdk/application/wearable/fd230app/nativeui/add_card/include/AddCardAdapter.h @@ -0,0 +1,46 @@ +/* + * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved. + * Description: AddCardAdapter.h + * Author: + * Create: 2021-09-18 + */ + +#ifndef ADD_CARD_ADAPTER_H +#define ADD_CARD_ADAPTER_H + +#include +#include +#include "components/ui_list.h" +#include "components/ui_label.h" +#include "components/ui_view_group.h" +#include "components/ui_image_view.h" +#include "components/abstract_adapter.h" +#include "UiConfig.h" +#include "wearable_log.h" +#include "AddCardItem.h" + +namespace OHOS { +class AddCardAdapter : public AbstractAdapter { +public: + explicit AddCardAdapter(); + virtual ~AddCardAdapter(); + + virtual uint16 GetCount(void) override; + + virtual UIView *GetView(UIView *inView, int16 index) override; + + virtual void AddListItem(const AddCardInfo &item); + + void SetItemClickListener(UIView::OnClickListener *itemClickListener) + { + itemClickListener_ = itemClickListener; + } + + void ClearItem(void); + +private: + std::list listData_; + UIView::OnClickListener *itemClickListener_; +}; +} +#endif \ No newline at end of file diff --git a/code/sdk/application/wearable/fd230app/nativeui/add_card/include/AddCardItem.h b/code/sdk/application/wearable/fd230app/nativeui/add_card/include/AddCardItem.h new file mode 100644 index 000000000..5ce44d585 --- /dev/null +++ b/code/sdk/application/wearable/fd230app/nativeui/add_card/include/AddCardItem.h @@ -0,0 +1,42 @@ +/* + * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved. + * Description: AddCardItem.h + * Author: + * Create: 2021-11-23 + */ + +#ifndef ADD_CARD_ITEM_H +#define ADD_CARD_ITEM_H + +#include +#include +#include "components/ui_view.h" +#include "components/ui_view_group.h" +#include "components/ui_image_view.h" +#include "components/ui_label_button.h" +#include "UiConfig.h" + +namespace OHOS { +typedef struct { + CardId id; + bool addFlag; + const char *cardImg; +} AddCardInfo; + +class AddCardItem :public UIViewGroup { +public: + AddCardItem(); + virtual ~AddCardItem(); + void SetItemInfo(const AddCardInfo &cardInfo); + void SetOnClickListener(OnClickListener *onClickListener); + void UpdateItemInfo(bool addFlag); +private: + void SetUpChild(); + UIImageView cardImg_; + UILabelButton cardLabel_; + AddCardInfo cardInfo_; +}; + +} + +#endif // ADD_CARD_ITEM_H \ No newline at end of file diff --git a/code/sdk/application/wearable/fd230app/nativeui/add_card/include/AddCardModel.h b/code/sdk/application/wearable/fd230app/nativeui/add_card/include/AddCardModel.h new file mode 100644 index 000000000..ae17e1a0f --- /dev/null +++ b/code/sdk/application/wearable/fd230app/nativeui/add_card/include/AddCardModel.h @@ -0,0 +1,35 @@ +/* + * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved. + * Description: AddCardModel.h + * Author: + * Create: 2021-11-23 + */ + +#ifndef ADD_CARD_MODEL_H +#define ADD_CARD_MODEL_H + +#include +#include +#include "AppViewIDs.h" +#include "UiConfig.h" +#include "AddCardPresenter.h" +#include "MainModel.h" + +namespace OHOS { + class AddCardModel { + public: + static AddCardModel &GetInstance(void); + void SetSelectedCardIndex(uint8_t cardIndex); + uint8_t GetSelectedCardIndex(void) const; + void AddCardSetting(void); + private: + AddCardModel(); + AddCardModel(const AddCardModel &); + AddCardModel &operator=(const AddCardModel &); + virtual ~AddCardModel(); + uint8_t selectedCardIndex{0}; + + }; +} + +#endif // ADD_CARD_MODEL_H \ No newline at end of file diff --git a/code/sdk/application/wearable/fd230app/nativeui/add_card/include/AddCardPresenter.h b/code/sdk/application/wearable/fd230app/nativeui/add_card/include/AddCardPresenter.h new file mode 100644 index 000000000..f8e6f885b --- /dev/null +++ b/code/sdk/application/wearable/fd230app/nativeui/add_card/include/AddCardPresenter.h @@ -0,0 +1,43 @@ +/* + * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved. + * Description: AddCardPresenter.h + * Author: + * Create: 2021-11-23 + */ + +#ifndef ADD_CARD_PRESENTER_H +#define ADD_CARD_PRESENTER_H + +#include "Presenter.h" +#include "components/ui_list.h" +#include "components/ui_view.h" +#include "KeyInputListener.h" + +namespace OHOS { +static const char *ADD_CARD_ADD = "addcardadd"; +class AddCardView; +class AddCardModel; +class AddCardPresenter : public Presenter, + public UIView::OnClickListener, public UIView::OnDragListener, + public ListScrollListener { +public: + AddCardPresenter(); + virtual ~AddCardPresenter(); + + virtual void OnStart() override; + virtual void OnResume() override; + virtual void OnStop() override; + + bool OnClick(UIView &view, const ClickEvent &event) override; + virtual void OnScrollStart(int16_t index, UIView *view) override; + virtual void OnScrollEnd(int16_t index, UIView *view) override; + virtual void OnItemSelected(int16_t index, UIView* view) override; + virtual bool OnDrag(UIView& view, const DragEvent& event) override; +private: + KeyInputListener *keyActListenr{nullptr}; + AddCardModel *model{nullptr}; + +}; +} + +#endif // ADD_CARD_PRESENTER_H \ No newline at end of file diff --git a/code/sdk/application/wearable/fd230app/nativeui/add_card/include/AddCardView.h b/code/sdk/application/wearable/fd230app/nativeui/add_card/include/AddCardView.h new file mode 100644 index 000000000..63d51bba5 --- /dev/null +++ b/code/sdk/application/wearable/fd230app/nativeui/add_card/include/AddCardView.h @@ -0,0 +1,49 @@ +/* + * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved. + * Description: AddCardView.h + * Author: + * Create: 2021-11-23 + */ + +#ifndef ADD_CARD_VIEW_H +#define ADD_CARD_VIEW_H + +#include "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 "window/window.h" +#include "BaseView.h" +#include "ChangeSliceListener.h" +#include "UiConfig.h" +#include "AddCardAdapter.h" +#include "AddCardModel.h" + +namespace OHOS { +class AddCardPresenter; + +class AddCardView : public View { +public: + AddCardView(); + virtual ~AddCardView(); + + static AddCardView *GetInstance() + { + static AddCardView instance; + return &instance; + } + + virtual void OnStart() override; + virtual void OnSetUpView() override; + virtual void OnTearDownView() override; + virtual void OnStop() override; + void RefreshCardList(void); +private: + void SetUpListInfo(void); + void SetUpListView(void); + UIList contentList_; + AddCardAdapter *addCardAdapter_{nullptr}; +}; +} +#endif // ADD_CARD_VIEW_H diff --git a/code/sdk/application/wearable/fd230app/nativeui/add_card/src/AddCardAdapter.cpp b/code/sdk/application/wearable/fd230app/nativeui/add_card/src/AddCardAdapter.cpp new file mode 100644 index 000000000..d92f38ddb --- /dev/null +++ b/code/sdk/application/wearable/fd230app/nativeui/add_card/src/AddCardAdapter.cpp @@ -0,0 +1,59 @@ +/* + * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved. + * Description: AddCardAdapter.cpp + * Author: + * Create: 2021-09-18 + */ + +#include "AddCardAdapter.h" + +namespace OHOS { +AddCardAdapter::AddCardAdapter() {} + +AddCardAdapter::~AddCardAdapter() +{ + listData_.clear(); +} + +uint16 AddCardAdapter::GetCount(void) +{ + return listData_.size(); +} + +void AddCardAdapter::ClearItem(void) +{ + listData_.clear(); +} + +UIView *AddCardAdapter::GetView(UIView *inView, int16 index) +{ + if (index >= (int16)listData_.size() || index < 0) { + return nullptr; + } + + std::list::iterator it = listData_.begin(); + for (int i = 0; i < index; i++) { + it++; + } + + AddCardItem *item = nullptr; + if (inView == nullptr) { + item = new AddCardItem(); + if (item == nullptr) { + return nullptr; + } + } else { + item = static_cast(inView); + } + + item->SetItemInfo(*it); + item->SetViewIndex(index); + item->SetOnClickListener(itemClickListener_); + return item; +} + +void AddCardAdapter::AddListItem(const AddCardInfo &item) +{ + listData_.push_back(item); +} +} // namespace OHOS diff --git a/code/sdk/application/wearable/fd230app/nativeui/add_card/src/AddCardItem.cpp b/code/sdk/application/wearable/fd230app/nativeui/add_card/src/AddCardItem.cpp new file mode 100644 index 000000000..67e287ec8 --- /dev/null +++ b/code/sdk/application/wearable/fd230app/nativeui/add_card/src/AddCardItem.cpp @@ -0,0 +1,58 @@ +#include "AddCardItem.h" +#include "AddCardPresenter.h" +#include "wearable_log.h" + +namespace OHOS { + AddCardItem::AddCardItem() + { + SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION); + SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT); + SetUpChild(); + Add(&cardImg_); + Add(&cardLabel_); + } + + AddCardItem::~AddCardItem() + { + Remove(&cardImg_); + Remove(&cardLabel_); + } + + void AddCardItem::SetUpChild() + { + cardImg_.SetPosition(87, 60); + cardImg_.Resize(280, 280); + cardImg_.SetResizeMode(UIImageView::FILL); + cardImg_.SetStyle(STYLE_IMAGE_OPA, OPA_OPAQUE); + + cardLabel_.SetPosition(175, 360); + cardLabel_.Resize(100, 50); + cardLabel_.SetFont(DEFAULT_VECTOR_FONT_FILENAME, 20); + } + + void AddCardItem::SetItemInfo(const AddCardInfo &cardInfo) + { + cardInfo_ = cardInfo; + cardImg_.SetSrc(cardInfo.cardImg); + if (cardInfo.addFlag) { + cardLabel_.SetText("已添加"); + } else { + cardLabel_.SetText("添加"); + } + } + + void AddCardItem::UpdateItemInfo(bool addFlag) + { + if (addFlag) { + cardLabel_.SetText("已添加"); + cardInfo_.addFlag = addFlag; + Invalidate(); + } + } + + void AddCardItem::SetOnClickListener(OnClickListener *onClickListener) + { + cardLabel_.SetOnClickListener(onClickListener); + } + +}; diff --git a/code/sdk/application/wearable/fd230app/nativeui/add_card/src/AddCardModel.cpp b/code/sdk/application/wearable/fd230app/nativeui/add_card/src/AddCardModel.cpp new file mode 100644 index 000000000..fa052decb --- /dev/null +++ b/code/sdk/application/wearable/fd230app/nativeui/add_card/src/AddCardModel.cpp @@ -0,0 +1,37 @@ +/* + * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved. + * Description: AddCardModel.cpp + * Author: + * Create: 2021-11-23 + */ + +#include "AddCardModel.h" +#include "kv_store.h" +#include "securec.h" + +namespace OHOS { + AddCardModel::AddCardModel() {} + + AddCardModel::~AddCardModel() {} + + AddCardModel &AddCardModel::GetInstance() + { + static AddCardModel instance; + return instance; + } + + void AddCardModel::SetSelectedCardIndex(uint8_t cardIndex) + { + selectedCardIndex = cardIndex; + } + + uint8_t AddCardModel::GetSelectedCardIndex(void) const + { + return selectedCardIndex; + } + + void AddCardModel::AddCardSetting(void) + { + MainModel::GetInstance().AddCardSetting(selectedCardIndex); + } +} diff --git a/code/sdk/application/wearable/fd230app/nativeui/add_card/src/AddCardPresenter.cpp b/code/sdk/application/wearable/fd230app/nativeui/add_card/src/AddCardPresenter.cpp new file mode 100644 index 000000000..c815867e6 --- /dev/null +++ b/code/sdk/application/wearable/fd230app/nativeui/add_card/src/AddCardPresenter.cpp @@ -0,0 +1,78 @@ +/* + * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved. + * Description: AddCardPresenter.cpp + * Author: + * Create: 2021-11-23 + */ + +#include "AddCardView.h" +#include "AddCardModel.h" +#include "AddCardPresenter.h" + +namespace OHOS { + AddCardPresenter::AddCardPresenter() + { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "AddCardPresenter::AddCardPresenter"); + model = &AddCardModel::GetInstance(); + } + + AddCardPresenter::~AddCardPresenter() { + } + + void AddCardPresenter::OnStart() + { + Presenter::OnStart(); + } + + void AddCardPresenter::OnResume(void) + { + } + + void AddCardPresenter::OnStop(void) + { + } + + bool AddCardPresenter::OnDrag(UIView& view, const DragEvent& event) + { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "AddCardPresenter::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, "AddCardPresenter::OnDrag ChangeSlice"); + NativeAbility::GetInstance().ChangeSlice(VIEW_MAIN); + } + return false; + } + + bool AddCardPresenter::OnClick(UIView &view, const ClickEvent &event) + { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "AddCardPresenter::OnClick"); + model->AddCardSetting(); + view_->RefreshCardList(); + return true; + } + + void AddCardPresenter::OnScrollStart(int16_t index, UIView *view) + { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "AddCardPresenter::OnScrollStart index = %d", index); + return; + } + + void AddCardPresenter::OnScrollEnd(int16_t index, UIView *view) + { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "AddCardPresenter::OnScrollEnd index = %d", index); + if (view == nullptr) { + return; + } + model->SetSelectedCardIndex(index); + } + + void AddCardPresenter::OnItemSelected(int16_t index, UIView* view) + { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "AddCardPresenter::OnItemSelected index = %d", index); + if (view == nullptr) { + return; + } + } + +} diff --git a/code/sdk/application/wearable/fd230app/nativeui/add_card/src/AddCardView.cpp b/code/sdk/application/wearable/fd230app/nativeui/add_card/src/AddCardView.cpp new file mode 100644 index 000000000..a696032d2 --- /dev/null +++ b/code/sdk/application/wearable/fd230app/nativeui/add_card/src/AddCardView.cpp @@ -0,0 +1,113 @@ +/* + * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved. + * Description: AddCardView.cpp + * Author: + * Create: 2021-11-23 + */ + +#include +#include "AddCardView.h" +#include "AddCardPresenter.h" + +namespace OHOS { +AddCardView::AddCardView() +{ + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "AddCardView::AddCardView"); +} + +AddCardView::~AddCardView() +{ + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "AddCardView::~AddCardView"); + if (addCardAdapter_ != nullptr) { + delete addCardAdapter_; + addCardAdapter_ = nullptr; + } +} + +void AddCardView::OnStart() +{ + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "AddCardView::OnStart"); + View::OnStart(); + SetContainerView(new UIViewGroup()); + container_->SetPosition(0, 0, Screen::GetInstance().GetWidth(), Screen::GetInstance().GetHeight()); + addCardAdapter_ = new AddCardAdapter(); + addCardAdapter_->SetItemClickListener(presenter_); + SetUpListInfo(); + SetUpListView(); +} + +void AddCardView::OnSetUpView() +{ + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "AddCardView::OnSetUpView"); + View::OnSetUpView(); +} + +void AddCardView::OnTearDownView() +{ + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "AddCardView::OnTearDownView"); + View::OnTearDownView(); +} + +void AddCardView::OnStop() +{ + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "AddCardView::OnStop"); + View::OnStop(); + if (container_ != nullptr) { + container_->RemoveAll(); + delete container_; + container_ = nullptr; + } +} + +void AddCardView::SetUpListInfo(void) +{ + MainModel::GetInstance().InitCardSettings(); + uint8_t cardCount = MainModel::GetInstance().GetCardSettingCount(); + CardId *cardSettings = MainModel::GetInstance().GetCardSettings(); + addCardAdapter_->ClearItem(); + for (uint8_t i = WATCH_FACE + 1; i < MAX_CARD; i++) { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "All:cardId = %d", i); + const CardInfo *info = MainModel::GetInstance().GetCardInfo((CardId)i); + if (info != nullptr) { + AddCardInfo addInfo; + addInfo.id = info->id; + addInfo.cardImg = info->cardImg; + addInfo.addFlag = false; + for (uint8_t j = 0; j < cardCount; j++) { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Settings:cardId = %d", cardSettings[j]); + if (cardSettings[j] == i) { + addInfo.addFlag = true; + break; + } + } + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SetUpListInfo::%d %s %d", + addInfo.id, addInfo.cardImg, addInfo.addFlag); + addCardAdapter_->AddListItem(addInfo); + } + } +} + +void AddCardView::SetUpListView(void) +{ + contentList_.SetPosition(0, 0); + contentList_.Resize(HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION); + contentList_.SetScrollBlankSize(VERTICAL_RESOLUTION / 2); + contentList_.SetSelectPosition(VERTICAL_RESOLUTION / 2); + contentList_.SetDraggable(true); + contentList_.SetThrowDrag(true); + contentList_.EnableAutoAlign(true); + contentList_.SetScrollStateListener(presenter_); + contentList_.SetOnDragListener(presenter_); + contentList_.SetMaxScrollDistance(1000); + contentList_.SetAdapter(addCardAdapter_); + contentList_.SetVisible(true); + container_->Add(&contentList_); +} + +void AddCardView::RefreshCardList(void) +{ + SetUpListInfo(); + contentList_.RefreshList(); +} + +} diff --git a/code/sdk/application/wearable/fd230app/nativeui/applist/include/AppItemView.h b/code/sdk/application/wearable/fd230app/nativeui/applist/include/AppItemView.h index 12c5591dc..6e5dc5e85 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/applist/include/AppItemView.h +++ b/code/sdk/application/wearable/fd230app/nativeui/applist/include/AppItemView.h @@ -35,6 +35,20 @@ private: UILabel label_; AppItem itemInfo_ = { VIEW_INVALID, nullptr, nullptr, nullptr, nullptr }; }; + +class HexagonsItemView : public UIImageView { +public: + explicit HexagonsItemView(); + virtual ~HexagonsItemView(); + void SetItemInfo(const AppItem &itemInfo); + AppViewId GetViewId(); + const char *GetAppUid(); +private: + HexagonsItemView(const HexagonsItemView &); + HexagonsItemView &operator = (const HexagonsItemView &); + AppItem itemInfo_ = { VIEW_INVALID, nullptr, nullptr, nullptr, nullptr }; +}; + } #endif diff --git a/code/sdk/application/wearable/fd230app/nativeui/applist/include/ApplistModel.h b/code/sdk/application/wearable/fd230app/nativeui/applist/include/ApplistModel.h index 435c1910e..0f888a720 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/applist/include/ApplistModel.h +++ b/code/sdk/application/wearable/fd230app/nativeui/applist/include/ApplistModel.h @@ -38,7 +38,7 @@ class ApplistModel { public: static ApplistModel &GetInstance(void); - void initApplist(); + void Init(); const AppItem *GetApplistItems() const; uint8 GetAppListNum() const; void ResolvingJSAppItems(void); @@ -48,7 +48,7 @@ public: int GetHeadItemY(void); void ApplistUpdate(void); void SetPresenter(ApplistPresenter *p); - + bool GetIsUseListStyle(void); private: ApplistModel(); ApplistModel(const ApplistModel &); @@ -63,6 +63,7 @@ private: uint16_t startIndex = 0; int headItemY = 0; + bool initFlag{false}; }; } diff --git a/code/sdk/application/wearable/fd230app/nativeui/applist/include/ApplistPresenter.h b/code/sdk/application/wearable/fd230app/nativeui/applist/include/ApplistPresenter.h index 844f49840..c0d53a29d 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/applist/include/ApplistPresenter.h +++ b/code/sdk/application/wearable/fd230app/nativeui/applist/include/ApplistPresenter.h @@ -17,7 +17,8 @@ #include "KeyInputListener.h" namespace OHOS { - class ApplistPresenter : public Presenter, public UIView::OnClickListener { + class ApplistPresenter : public Presenter, public UIView::OnClickListener, + public ListScrollListener { public: ApplistPresenter(); virtual ~ApplistPresenter(); @@ -28,17 +29,18 @@ namespace OHOS { virtual void OnStop() override; bool OnClick(UIView &view, const ClickEvent &event) override; + void OnItemSelected(int16 index, UIView *view) override; void SetStartIndex(uint16_t index); uint16_t GetStartIndex(void); void SetHeadItemY(int y); int GetHeadItemY(void); uint8_t GetListItemNum(void); ApplistView* GetAppListView(); - ApplistModel *GetApplistModelPtr(void) - { - return model; - } + bool GetIsUseListStyle(void); + private: + AppItemView *itemViewSele{nullptr}; + AppItemView *preItemViewSele{nullptr}; ApplistModel *model{nullptr}; KeyInputListener *keyActListenr{nullptr}; }; diff --git a/code/sdk/application/wearable/fd230app/nativeui/applist/include/ApplistView.h b/code/sdk/application/wearable/fd230app/nativeui/applist/include/ApplistView.h index 441e9832f..f2439d420 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/applist/include/ApplistView.h +++ b/code/sdk/application/wearable/fd230app/nativeui/applist/include/ApplistView.h @@ -9,6 +9,7 @@ #include "components/ui_label.h" #include "components/ui_label_ext.h" #include "components/ui_list.h" +#include "components/ui_custom_hexagons_list.h" #include "window/window.h" #include "ohos_types.h" #include "BaseView.h" @@ -65,31 +66,41 @@ namespace OHOS bool continueDrag{false}; }; - class ApplistPresenter; - class ApplistView : public View, public ListScrollListener, public UIViewGroup - { - public: - ApplistView(); - virtual ~ApplistView(); +class ApplistPresenter; +class ApplistView : public View { +public: + ApplistView(); + virtual ~ApplistView(); - virtual void OnStart() override; - virtual void OnSetUpView() override; - virtual void OnTearDownView() override; - virtual void OnStop() override; - bool InitPage(); - bool SetupViewPage(ApplistView *applistView); - ApplistPresenter *g_ApplistPresenter{nullptr}; - void AddAppItemToList(const AppItem &item); - void ClearAppItemToList(); - void OnItemSelected(int16 index, UIView *view) override; - UIList *GetAppUIList(void); + virtual void OnStart() override; + virtual void OnSetUpView() override; + virtual void OnTearDownView() override; + virtual void OnStop() override; - private: - ApplistAdapter *listAdapter_{nullptr}; - UIList *contentList_{nullptr}; - UIView::OnDragListener *dragListener{nullptr}; - AppItemView *itemViewSele{nullptr}; - AppItemView *preItemViewSele{nullptr}; - }; + void AddAppItemToList(const AppItem &item); + void ClearAppItemToList(); + void RefreshAppList(void); +private: + void HexagonsStyleOnStart(); + void ListStyleOnStart(); + void HexagonsStyleOnSetUpView(); + void ListStyleOnSetUpView(); + void HexagonsStyleOnStop(); + void ListStyleOnStop(); + + /* for list style */ + ApplistAdapter *listAdapter_{nullptr}; + UIList *contentList_{nullptr}; + UIView::OnDragListener *dragListener{nullptr}; + + /* for hexagons style */ + UICustomHexagonsList* hexagonsList_{nullptr}; + std::list listHexagonsView_; + int16_t horMargin_ = 0; + int16_t verMargin_ = 0; + uint16_t imgSize_ = 0; + uint16_t imgDistance_ = 0; + +}; } #endif // APPLIST_VIEW_H \ No newline at end of file diff --git a/code/sdk/application/wearable/fd230app/nativeui/applist/src/AppItemView.cpp b/code/sdk/application/wearable/fd230app/nativeui/applist/src/AppItemView.cpp index e4ff34f9f..cd35ebb0f 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/applist/src/AppItemView.cpp +++ b/code/sdk/application/wearable/fd230app/nativeui/applist/src/AppItemView.cpp @@ -22,8 +22,7 @@ namespace OHOS { AppItemView::AppItemView() { SetPosition(0, 0, HORIZONTAL_RESOLUTION, APP_ITEM_BUTTON_HEIGHT); - SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full); - SetStyle(STYLE_BACKGROUND_OPA, OPA_OPAQUE); + SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT); SetTouchable(true); SetUpChild(); Add(&icon_); @@ -40,6 +39,7 @@ namespace OHOS { { icon_.SetPosition(ICON_X, 0); icon_.SetStyle(STYLE_IMAGE_OPA, OPA_OPAQUE); + icon_.SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT); icon_.Resize(APP_ITEM_BUTTON_WIDTH, APP_ITEM_BUTTON_HEIGHT); icon_.SetResizeMode(UIImageView::CENTER); icon_.SetAutoEnable(false); @@ -50,8 +50,7 @@ namespace OHOS { label_.SetAlign(TEXT_ALIGNMENT_LEFT, TEXT_ALIGNMENT_CENTER); label_.SetStyle(STYLE_TEXT_OPA, OPA_OPAQUE); label_.SetStyle(STYLE_TEXT_COLOR, Color::Gray().full); - label_.SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full); - label_.SetStyle(STYLE_BACKGROUND_OPA, OPA_OPAQUE); + label_.SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT); } void AppItemView::SetItemInfo(const AppItem &itemInfo) @@ -83,4 +82,25 @@ namespace OHOS { icon_.ResetTransParameter(); } + HexagonsItemView::HexagonsItemView() + { + } + + HexagonsItemView::~HexagonsItemView() + { + } + void HexagonsItemView::SetItemInfo(const AppItem &itemInfo) + { + itemInfo_ = itemInfo; + } + + AppViewId HexagonsItemView::GetViewId() + { + return itemInfo_.id; + } + + const char *HexagonsItemView::GetAppUid() + { + return itemInfo_.uid; + } } diff --git a/code/sdk/application/wearable/fd230app/nativeui/applist/src/ApplistAdapter.cpp b/code/sdk/application/wearable/fd230app/nativeui/applist/src/ApplistAdapter.cpp index e7f38f325..8e26721c8 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/applist/src/ApplistAdapter.cpp +++ b/code/sdk/application/wearable/fd230app/nativeui/applist/src/ApplistAdapter.cpp @@ -27,14 +27,7 @@ void ApplistAdapter::ClearItem(void) UIView *ApplistAdapter::GetView(UIView *inView, int16 index) { - if (listData_.empty()) { - return nullptr; - } - if (index < 0) { - return nullptr; - } - size_t uindex = index; - if (uindex >= listData_.size()) { + if (index >= (int16)listData_.size() || index < 0) { return nullptr; } diff --git a/code/sdk/application/wearable/fd230app/nativeui/applist/src/ApplistCardView.cpp b/code/sdk/application/wearable/fd230app/nativeui/applist/src/ApplistCardView.cpp index 34d85ff6d..8add32d82 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/applist/src/ApplistCardView.cpp +++ b/code/sdk/application/wearable/fd230app/nativeui/applist/src/ApplistCardView.cpp @@ -1,5 +1,5 @@ #include "ApplistCardView.h" - +#if 0 namespace OHOS { ApplistCardView::ApplistCardView() @@ -63,6 +63,5 @@ namespace OHOS void ApplistCardView::UnLoad(void) { - } - -} \ No newline at end of file + }} +#endif diff --git a/code/sdk/application/wearable/fd230app/nativeui/applist/src/ApplistModel.cpp b/code/sdk/application/wearable/fd230app/nativeui/applist/src/ApplistModel.cpp index 5cfe6b578..4b99fe64d 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/applist/src/ApplistModel.cpp +++ b/code/sdk/application/wearable/fd230app/nativeui/applist/src/ApplistModel.cpp @@ -16,9 +16,10 @@ #include "UiConfig.h" #include "AppViewIDs.h" #include "components/ui_label_ext.h" -#include"language/font/ui_resource_string.h" +#include "language/font/ui_resource_string.h" #include "ApplistModel.h" #include "ApplistPresenter.h" +#include "SetDesktopModel.h" namespace OHOS { @@ -37,8 +38,8 @@ namespace OHOS {VIEW_CALLER_LOG, PNG_APPLIST_CALLLOG_IMAGE, PNG_APPLIST_CALLLOG_IMAGE, "通话记录", nullptr}, {VIEW_PHONE, PNG_APPLIST_CALLER_IMAGE, PNG_APPLIST_CALLER_IMAGE, "电话", nullptr}, {VIEW_MAIN_STOPWATCH, PNG_APPLIST_STOPWATCH_IMAGE, PNG_APPLIST_STOPWATCH_IMAGE, "秒表", nullptr}, - //{VIEW_CONNECT_PHONE, PNG_CONNECT_PHONE_IMAGE, PNG_CONNECT_PHONE_IMAGE, "连接手机", nullptr}, - //{VIEW_LANGUAGE_SWITCH, PNG_CONNECT_PHONE_IMAGE, PNG_CONNECT_PHONE_IMAGE, "语言切换", nullptr}, + //{VIEW_CONNECT_PHONE, PNG_CONNECT_PHONE_IMAGE, PNG_CONNECT_PHONE_IMAGE, "连接手机", nullptr}, + //{VIEW_LANGUAGE_SWITCH, PNG_CONNECT_PHONE_IMAGE, PNG_CONNECT_PHONE_IMAGE, "语言切换", nullptr}, #ifdef SUPPORT_ALIPAY_SEC {VIEW_MAIN_ALIPAY, PNG_APPLIST_ALIPAY_IMAGE, PNG_APPLIST_ALIPAY_IMAGE, "支付宝", nullptr}, #endif @@ -67,9 +68,13 @@ namespace OHOS WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ApplistModel::~ApplistModel()"); } - void ApplistModel::initApplist() + void ApplistModel::Init() { - ResolvingJSAppItems(); + if (!initFlag) + { + ResolvingJSAppItems(); + initFlag = true; + } } void ApplistModel::ResolvingJSAppItems(void) @@ -93,13 +98,11 @@ namespace OHOS #endif bundleLen = 0; appLen = 0; - nativeAppNum = sizeof(g_nativeAppList) / sizeof(AppItem); if (nativeAppNum >= APP_MAX_NUM) { nativeAppNum = APP_MAX_NUM; } - ret = memcpy_s(applist, sizeof(AppItem) * APP_MAX_NUM, g_nativeAppList, sizeof(AppItem) * nativeAppNum); if (ret != EOK) { @@ -132,6 +135,10 @@ namespace OHOS bundleInfos[len].abilityInfo = nullptr; } } + else + { + WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "ResolvingJSAppItems GetBundleInfos ret = %d \r", ret); + } #endif } @@ -175,7 +182,7 @@ namespace OHOS { presenter->GetAppListView()->AddAppItemToList(itemInfo[i]); } - presenter->GetAppListView()->GetAppUIList()->RefreshList(); + presenter->GetAppListView()->RefreshAppList(); } } @@ -183,4 +190,9 @@ namespace OHOS { presenter = p; } + + bool ApplistModel::GetIsUseListStyle(void) + { + return (SetDesktopModel::GetInstance().GetDesktopStyle() == APPLIST_STYLE); + } } diff --git a/code/sdk/application/wearable/fd230app/nativeui/applist/src/ApplistPresenter.cpp b/code/sdk/application/wearable/fd230app/nativeui/applist/src/ApplistPresenter.cpp index 1f2337b65..cb70db1fd 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/applist/src/ApplistPresenter.cpp +++ b/code/sdk/application/wearable/fd230app/nativeui/applist/src/ApplistPresenter.cpp @@ -16,13 +16,12 @@ namespace OHOS { WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ApplistPresenter::ApplistPresenter()"); model = &ApplistModel::GetInstance(); + model->Init(); model->SetPresenter(this); } - ApplistPresenter::~ApplistPresenter() - { - if (keyActListenr != nullptr) - { + ApplistPresenter::~ApplistPresenter() { + if (keyActListenr != nullptr) { delete keyActListenr; keyActListenr = nullptr; } @@ -33,7 +32,6 @@ namespace OHOS { WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ApplistPresenter::OnStart()"); Presenter::OnStart(); - model->initApplist(); if (keyActListenr == nullptr) { @@ -62,6 +60,7 @@ namespace OHOS { view_->AddAppItemToList(itemInfo[i]); } + view_->RefreshAppList(); } void ApplistPresenter::OnPause() @@ -78,24 +77,30 @@ namespace OHOS bool ApplistPresenter::OnClick(UIView &view, const ClickEvent &event) { UNUSED(event); - AppItemView *itemView = static_cast(&view); - AppViewId viewId = itemView->GetViewId(); - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ApplistPresenter::OnClick viewid = %d\n", viewId); - if (viewId < VIEW_MAX_INTER_APP) - { + AppViewId viewId = VIEW_INVALID; + char *uid = nullptr; + if (GetIsUseListStyle() == true) { + AppItemView *itemView = static_cast(&view); + viewId = itemView->GetViewId(); + uid = (char *)itemView->GetAppUid(); + } else { + HexagonsItemView *itemView = static_cast(&view); + viewId = itemView->GetViewId(); + uid = (char *)itemView->GetAppUid(); + } + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ApplistPresenter::OnClick viewid = %d", viewId); + if (viewId < VIEW_MAX_INTER_APP) { NativeAbility::GetInstance().ChangeSlice(viewId); return true; - } - else if (viewId == VIEW_EXTERN_APP) - { + } else if (viewId == VIEW_EXTERN_APP) { #ifdef JS_ENABLE - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ApplistPresenter::OnClick bundleName = %s", itemView->GetAppUid()); + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ApplistPresenter::OnClick bundleName = %s", uid); Want *want = new Want(); memset_s(want, sizeof(Want), 0, sizeof(Want)); ElementName startElement = {}; startElement.abilityName = (char *)"default"; - startElement.bundleName = (char *)itemView->GetAppUid(); + startElement.bundleName = uid; startElement.deviceId = nullptr; SetWantElement(want, startElement); @@ -106,7 +111,19 @@ namespace OHOS } return false; } + void ApplistPresenter::OnItemSelected(int16 index, UIView *view) + { + UNUSED(index); + if (view != nullptr) { + itemViewSele = static_cast(view); + itemViewSele->SelectedChange(); + if (preItemViewSele != nullptr && preItemViewSele != itemViewSele) { + preItemViewSele->Reset(); + } + preItemViewSele = itemViewSele; + } + } void ApplistPresenter::SetStartIndex(uint16_t index) { model->SetStartIndex(index); @@ -134,7 +151,12 @@ namespace OHOS return model->GetAppListNum(); } - ApplistView *ApplistPresenter::GetAppListView() + bool ApplistPresenter::GetIsUseListStyle(void) + { + return model->GetIsUseListStyle(); + } + + ApplistView* ApplistPresenter::GetAppListView() { return view_; } diff --git a/code/sdk/application/wearable/fd230app/nativeui/applist/src/ApplistView.cpp b/code/sdk/application/wearable/fd230app/nativeui/applist/src/ApplistView.cpp index b42eb6140..07b7ef0e1 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/applist/src/ApplistView.cpp +++ b/code/sdk/application/wearable/fd230app/nativeui/applist/src/ApplistView.cpp @@ -10,233 +10,226 @@ #include "ApplistPresenter.h" #include "AppItemView.h" -namespace OHOS -{ - static constexpr int16 NUM_2 = 2; - static constexpr int16 MAX_SCROLL_DIS = 1000; +namespace OHOS { +static constexpr int16 NUM_2 = 2; +static constexpr int16 MAX_SCROLL_DIS = 1000; - ApplistView::ApplistView() - { - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ApplistView::ApplistView "); - UIViewGroup::SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION); - } +ApplistView::ApplistView() +{ + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ApplistView::ApplistView "); +} - ApplistView::~ApplistView() - { - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ApplistView::~ApplistView "); +ApplistView::~ApplistView() +{ + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ApplistView::~ApplistView "); + if (listAdapter_ != nullptr) { delete listAdapter_; listAdapter_ = nullptr; + } + if (contentList_ != nullptr) { delete contentList_; contentList_ = nullptr; + } + if (dragListener != nullptr) { delete dragListener; dragListener = nullptr; + } + if (hexagonsList_ != nullptr) { + delete hexagonsList_; + hexagonsList_ = nullptr; } +} - // 初始化页面 - bool ApplistView::InitPage() - { - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, " ApplistView::InitPage"); - g_ApplistPresenter = new ApplistPresenter(); - g_ApplistPresenter->GetApplistModelPtr()->initApplist(); - // BaseView::RootView(Color::Black().full); - listAdapter_ = new ApplistAdapter(); - if (listAdapter_ == nullptr) - { - return false; - } - listAdapter_->SetItemClickListener(g_ApplistPresenter); - - contentList_ = new UIList(UIList::VERTICAL); - if (contentList_ == nullptr) - { - return false; - } - contentList_->SetPosition(0, 0); - contentList_->Resize(HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION); - contentList_->SetScrollBlankSize(VERTICAL_RESOLUTION / NUM_2); - contentList_->SetSelectPosition(VERTICAL_RESOLUTION / NUM_2); // middle position - contentList_->SetDraggable(true); - contentList_->SetThrowDrag(true); - contentList_->EnableAutoAlign(true); - contentList_->SetScrollStateListener(this); - contentList_->SetMaxScrollDistance(MAX_SCROLL_DIS); - contentList_->SetVisible(true); - Add(contentList_); - dragListener = new AppListOnDragListener(); - if (dragListener == nullptr) - { - return false; - } - contentList_->SetOnDragListener(dragListener); - - return true; +void ApplistView::OnStart() +{ + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ApplistView::OnStart "); + View::OnStart(); + SetContainerView(new UIViewGroup()); + container_->SetPosition(0, 0, Screen::GetInstance().GetWidth(), Screen::GetInstance().GetHeight()); + if (presenter_->GetIsUseListStyle() == true) { + ListStyleOnStart(); + } else { + HexagonsStyleOnStart(); } +} - // 设置页面视图 - bool ApplistView::SetupViewPage(ApplistView *applistView) - { - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, " ApplistView::SetupViewPage"); - const AppItem *itemInfo = g_ApplistPresenter->GetApplistModelPtr()->GetApplistItems(); - for (uint8 i = 0; i < g_ApplistPresenter->GetApplistModelPtr()->GetAppListNum(); i++) - { - applistView->AddAppItemToList(itemInfo[i]); - } - /* -------------------------------------------------------------------------- */ - if (contentList_ == nullptr || listAdapter_ == nullptr) - { - return false; - } - uint16_t startIndex = 0; - int16_t headY = 0; - if (g_ApplistPresenter->GetStartIndex() >= g_ApplistPresenter->GetListItemNum()) - { - startIndex = g_ApplistPresenter->GetListItemNum() - 1; - headY = VERTICAL_RESOLUTION / NUM_2; - } - else - { - startIndex = g_ApplistPresenter->GetStartIndex(); - headY = g_ApplistPresenter->GetHeadItemY(); - if (headY == 0) - { - headY = VERTICAL_RESOLUTION / NUM_2; - } - } - contentList_->SetStartIndex(startIndex); - contentList_->SetAdapter(listAdapter_); - contentList_->ScrollBy(headY); - return true; +void ApplistView::HexagonsStyleOnStart() +{ + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ApplistView::HexagonsStyleOnStart "); + if (hexagonsList_ == nullptr) { + hexagonsList_ = new UICustomHexagonsList(); } + container_->Add(hexagonsList_); + hexagonsList_->SetPosition(0, 0, + container_->GetWidth() - 2 * (horMargin_ + 1), container_->GetHeight() - 2 * (verMargin_ + 1)); // 2, two + imgDistance_ = container_->GetWidth() * 0.25991; // 0.25991, empirical coefficient + imgSize_ = container_->GetWidth() * 0.23348; // 0.23348, empirical coefficient + hexagonsList_->SetImageDistance(imgDistance_); + hexagonsList_->SetImageSizeInCenter(imgSize_); + int16_t blankSize = hexagonsList_->GetRelativeRect().GetWidth() > hexagonsList_->GetRelativeRect().GetHeight() ? + hexagonsList_->GetRelativeRect().GetWidth() / 2 : hexagonsList_->GetRelativeRect().GetHeight() / 2; // 2, half + hexagonsList_->SetScrollBlankSize(blankSize); + hexagonsList_->SetReboundSize(blankSize); + hexagonsList_->SetThrowDrag(true); +} - void ApplistView::OnStart() - { - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ApplistView::OnStart "); - View::OnStart(); - - BaseView::RootView(Color::Black().full); +void ApplistView::ListStyleOnStart() +{ + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ApplistView::ListStyleOnStart"); + listAdapter_ = new ApplistAdapter(); + if (listAdapter_ == nullptr) { + return; + } + listAdapter_->SetItemClickListener(presenter_); - listAdapter_ = new ApplistAdapter(); - if (listAdapter_ == nullptr) - { - return; - } - listAdapter_->SetItemClickListener(presenter_); + contentList_ = new UIList(UIList::VERTICAL); + if (contentList_ == nullptr) { + return; + } + contentList_->SetPosition(0, 0); + contentList_->Resize(HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION); + contentList_->SetScrollBlankSize(VERTICAL_RESOLUTION / NUM_2); + contentList_->SetSelectPosition(VERTICAL_RESOLUTION / NUM_2); // middle position + contentList_->SetDraggable(true); + contentList_->SetThrowDrag(true); + contentList_->EnableAutoAlign(true); + contentList_->SetScrollStateListener(presenter_); + contentList_->SetMaxScrollDistance(MAX_SCROLL_DIS); + contentList_->SetYScrollBarVisible(true); + container_->Add(contentList_); + + dragListener = new AppListOnDragListener(); + if (dragListener == nullptr) { + return; + } + contentList_->SetOnDragListener(dragListener); +} - contentList_ = new UIList(UIList::VERTICAL); - if (contentList_ == nullptr) - { - return; - } - contentList_->SetPosition(0, 0); - contentList_->Resize(HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION); - contentList_->SetScrollBlankSize(VERTICAL_RESOLUTION / NUM_2); - contentList_->SetSelectPosition(VERTICAL_RESOLUTION / NUM_2); // middle position - contentList_->SetDraggable(true); - contentList_->SetThrowDrag(true); - contentList_->EnableAutoAlign(true); - contentList_->SetScrollStateListener(this); - contentList_->SetMaxScrollDistance(MAX_SCROLL_DIS); - contentList_->SetYScrollBarVisible(true); - SetContainerView(contentList_); - - dragListener = new AppListOnDragListener(); - if (dragListener == nullptr) - { - return; - } - contentList_->SetOnDragListener(dragListener); - contentList_->SetRotateFactor(2); - contentList_->RequestFocus(); +void ApplistView::OnSetUpView() +{ + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ApplistView::OnSetUpView"); + View::OnSetUpView(); + if (presenter_->GetIsUseListStyle() == true) { + ListStyleOnSetUpView(); + } else { + HexagonsStyleOnSetUpView(); } +} - void ApplistView::OnSetUpView() - { - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ApplistView::OnSetUpView"); - View::OnSetUpView(); +void ApplistView::HexagonsStyleOnSetUpView() +{ + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ApplistView::HexagonsStyleOnSetUpView "); +} - if (contentList_ == nullptr || listAdapter_ == nullptr) - { - return; - } +void ApplistView::ListStyleOnSetUpView() +{ + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ApplistView::ListStyleOnSetUpView"); - uint16_t startIndex = 0; - int16_t headY = 0; - if (presenter_->GetStartIndex() >= presenter_->GetListItemNum()) - { - startIndex = presenter_->GetListItemNum() - 1; - headY = VERTICAL_RESOLUTION / NUM_2; - } - else - { - startIndex = presenter_->GetStartIndex(); - headY = presenter_->GetHeadItemY(); - if (headY == 0) - { - headY = VERTICAL_RESOLUTION / NUM_2; - } - } - contentList_->SetStartIndex(startIndex); - contentList_->SetAdapter(listAdapter_); - contentList_->ScrollBy(headY); - Draw(); + if (contentList_ == nullptr || listAdapter_ == nullptr) { return; } - void ApplistView::OnTearDownView() - { - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ApplistView::OnTearDownView"); - View::OnTearDownView(); - return; + uint16_t startIndex = 0; + int16_t headY = 0; + if (presenter_->GetStartIndex() >= presenter_->GetListItemNum()) { + startIndex = presenter_->GetListItemNum() - 1; + headY = VERTICAL_RESOLUTION / NUM_2; + } else { + startIndex = presenter_->GetStartIndex(); + headY = presenter_->GetHeadItemY(); + if (headY == 0) { + headY = VERTICAL_RESOLUTION / NUM_2; + } } + contentList_->SetStartIndex(startIndex); + contentList_->SetAdapter(listAdapter_); + contentList_->ScrollBy(headY); + return; +} - void ApplistView::OnStop() - { - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ApplistView::OnStop"); - int16_t listHeadY = contentList_->GetChildrenHead()->GetY(); - int16_t listHeadIndex = contentList_->GetChildrenHead()->GetViewIndex(); - - presenter_->SetHeadItemY(listHeadY); - presenter_->SetStartIndex(listHeadIndex); +void ApplistView::OnTearDownView() +{ + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ApplistView::OnTearDownView"); + View::OnTearDownView(); + return; +} - View::OnStop(); - container_ = nullptr; +void ApplistView::OnStop() +{ + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ApplistView::OnStop"); + if (presenter_->GetIsUseListStyle() == true) { + ListStyleOnStop(); + } else { + HexagonsStyleOnStop(); + } + if (container_ != nullptr) { + container_->RemoveAll(); + } + View::OnStop(); + RootView::GetInstance()->ClearOnKeyActListener(); + return; +} - RootView::GetInstance()->ClearOnKeyActListener(); - RootView::GetInstance()->RemoveAll(); - RootView::GetInstance()->ClearFocus(); - return; +void ApplistView::HexagonsStyleOnStop() +{ + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ApplistView::HexagonsStyleOnStop"); + if (hexagonsList_ != nullptr) { + hexagonsList_->RemoveAll(); + } + for (auto iter : listHexagonsView_) { + delete iter; } + listHexagonsView_.clear(); +} - void ApplistView::AddAppItemToList(const AppItem &item) - { +void ApplistView::ListStyleOnStop() +{ + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ApplistView::ListStyleOnStop"); + int16_t listHeadY = contentList_->GetChildrenHead()->GetY(); + int16_t listHeadIndex = contentList_->GetChildrenHead()->GetViewIndex(); + presenter_->SetHeadItemY(listHeadY); + presenter_->SetStartIndex(listHeadIndex); +} + +void ApplistView::AddAppItemToList(const AppItem &item) +{ + if (presenter_->GetIsUseListStyle() == true) { listAdapter_->AddListItem(item); + } else { + HexagonsItemView *itemView = new HexagonsItemView(); + itemView->SetItemInfo(item); + itemView->SetSrc(item.iconSmall); + itemView->SetTouchable(true); + itemView->SetOnClickListener(presenter_); + + hexagonsList_->Add(itemView); + listHexagonsView_.push_back(itemView); } +} - void ApplistView::ClearAppItemToList() - { +void ApplistView::ClearAppItemToList() +{ + if (presenter_->GetIsUseListStyle() == true) { listAdapter_->ClearItem(); - } - - void ApplistView::OnItemSelected(int16 index, UIView *view) - { - UNUSED(index); - if (view != nullptr) - { - itemViewSele = static_cast(view); - itemViewSele->SelectedChange(); - - if (preItemViewSele != nullptr && preItemViewSele != itemViewSele) - { - preItemViewSele->Reset(); - } - preItemViewSele = itemViewSele; + } else { + if (hexagonsList_ != nullptr) { + hexagonsList_->RemoveAll(); } + for (auto iter : listHexagonsView_) { + delete iter; + } + listHexagonsView_.clear(); } +} - UIList *ApplistView::GetAppUIList(void) - { - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ApplistView::GetAppUIList"); - return contentList_; +void ApplistView::RefreshAppList(void) +{ + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ApplistView::RefreshAppList"); + if (presenter_->GetIsUseListStyle() == true) { + contentList_->RefreshList(); + } else { + hexagonsList_->LayoutChildren(true); } +} } diff --git a/code/sdk/application/wearable/fd230app/nativeui/clock/include/MainClockView.h b/code/sdk/application/wearable/fd230app/nativeui/clock/include/MainClockView.h index 750a39d67..9f67b8134 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/clock/include/MainClockView.h +++ b/code/sdk/application/wearable/fd230app/nativeui/clock/include/MainClockView.h @@ -12,7 +12,6 @@ #include #include "View.h" #include "components/ui_label.h" -#include "components/ui_label_ext.h" #include "components/root_view.h" #include "components/ui_view_group.h" #include "components/ui_image_view.h" @@ -30,120 +29,8 @@ #include "animator/animator_manager.h" #include "time.h" #include "sys/time.h" -#include "animator/animator.h" -#include "common/image_cache_manager.h" -#include -#include "sys/time.h" -#include "components/ui_box_progress.h" -#include "components/ui_image_view.h" -#include "components/ui_label.h" -#include "components/ui_label_ext.h" -#include "battery_hal.h" - -#include "hal_tick.h" - -#ifdef __cplusplus -#if __cplusplus -extern "C" { -#endif -#endif - -extern uint8_t battery_get_voltage(float *voltage); -#ifdef XTS_SUPPORT -extern uint8_t is_xts_test_done(void); -#endif -#ifdef __cplusplus -#if __cplusplus -} -#endif -#endif namespace OHOS { -static constexpr int16_t SEC_TO_MILLI = 1000; -static constexpr int16_t USEC_TO_MILLI = 1000; -static constexpr int16_t MIN_TO_HOUR = 60; -static constexpr int16_t HOURLY_SYSTEM = 24; -static constexpr int16_t INTERVAL = 30; - -class ClockAnimatorCallback : public AnimatorCallback { -public: - explicit ClockAnimatorCallback(UISweepClock *clock) : sweepClock(clock) {} - ~ClockAnimatorCallback() {} - virtual void Callback(UIView *view) - { - UNUSED(view); - struct timeval tv; - gettimeofday(&tv, NULL); - uint64_t second = tv.tv_sec; - uint64_t uSecond = tv.tv_usec; - uint64_t minute = second / MIN_TO_HOUR; - uint64_t hour = minute / MIN_TO_HOUR; - uint8_t realHour = static_cast(hour % HOURLY_SYSTEM); - uint8_t realMinute = static_cast(minute % MIN_TO_HOUR); - uint16_t realMilliSecond = static_cast((second % MIN_TO_HOUR) * - SEC_TO_MILLI + uSecond / USEC_TO_MILLI); - sweepClock->SetSweepTime12Hour(realHour, realMinute, realMilliSecond, 1); - } - -private: - UISweepClock *sweepClock{nullptr}; -}; - -class ProgressCallback : public AnimatorCallback { -public: - explicit ProgressCallback(UIBoxProgress *progress, UILabel *batterylabel, UILabel *XTSlabel) : progress(progress), batterylabel(batterylabel),XTSlabel(XTSlabel) {} - ~ProgressCallback() {} - virtual void Callback(UIView *view) - { - float voltage = 0.0F; - uint8_t value = 0; - uint8_t xts_testing = 1; - uint32_t RunTime_ = HALTick::GetInstance().GetTime(); - #ifdef XTS_SUPPORT - xts_testing = is_xts_test_done(); - #endif - - if (!xts_testing) { - // XTS测试进行 - xts_flag = 1; - XTSlabel->SetText("XTS测试进行中"); - XTSlabel->SetTextColor(Color::GetColorFromRGBA(0xe6, 0x04, 0x09, 0xff)); - value = 0; - //printf("bat check stamp %u xts_testing %u,xts_flag %u\r\n", RunTime_, xts_testing,xts_flag); - } else { - // XTS测试结束 - if (xts_flag) { - XTSlabel->SetText("XTS测试结束"); - XTSlabel->SetTextColor(Color::GetColorFromRGBA(0x4e, 0xe6, 0x04, 0xff)); - xts_flag = 0; // 复位 - } - value = battery_get_voltage(&voltage); - //printf("bat check stamp %u xts_testing %u,xts_flag %u\r\n", RunTime_, xts_testing,xts_flag); - } - - const char* progress1ForeImageSrc = nullptr; - const char* progress1BackImageSrc = nullptr; - if (value <= 10) { - progress1ForeImageSrc = "/user/res/Battery/Battery_Limit.bin"; - } else if (value <= 20) { - progress1ForeImageSrc = "/user/res/Battery/Battery_Save.bin"; - } else { - progress1ForeImageSrc = "/user/res/Battery/Battery_Nomoal.bin"; - } - - progress->SetImage(progress1ForeImageSrc, progress1BackImageSrc); - progress->SetValue(value); // 更新界面 - batterylabel->SetText((std::to_string(value) + "%").c_str()); // 更新百分比显示 - } - -private: - uint8_t xts_flag = 0; //标志位 - UILabel *batterylabel{nullptr}; - UILabel *XTSlabel{nullptr}; - UIBoxProgress *progress{nullptr}; - //std::thread workerThread; - //std::atomic stopThread; -}; class MainClockView : public UICardPage { public: MainClockView(); @@ -156,6 +43,8 @@ public: void RefreshHeartRate(int value); void ClockAnimatorStart(void); void ClockAnimatorStop(void); + void UpdateTime(void); + private: void InitStepValue(); bool InitLabelView(void); @@ -165,27 +54,19 @@ private: bool InitSweepClock(void); bool LoadClockImage(Image *view, uint32_t resId); bool LoadClockImage(UIImageView *view, uint32_t resId); - - UIBoxProgress* progress = nullptr; - AnimatorCallback* progress1callback_ = nullptr; - Animator *progress1animator_ = nullptr; UIImageView *curFace{nullptr}; UILabelButton *stepLabel{nullptr}; UILabel *batteryLabel{nullptr}; UILabel *weekLabel{nullptr}; UILabel *heartRateLabel{nullptr}; - UILabel *XTSLabel{nullptr}; - ClockAnimatorCallback *callBack{nullptr}; - Animator *clockAnimator{nullptr}; UISweepClock *mainSweepClock{nullptr}; Image *secondHand{nullptr}; Image *minuteHand{nullptr}; - UILabel *dataLabel{nullptr}; Image *hourHand{nullptr}; UIImageView *heartRate{nullptr}; Image *hand24Hour{nullptr}; UIImageView *weekDay{nullptr}; - //UIImageView *progress{nullptr}; + UIImageView *progress{nullptr}; Image *bigCircle{nullptr}; Image *medCircle{nullptr}; Image *smallCircle{nullptr}; diff --git a/code/sdk/application/wearable/fd230app/nativeui/clock/src/MainClockView.cpp b/code/sdk/application/wearable/fd230app/nativeui/clock/src/MainClockView.cpp index 826eeb060..974434b43 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/clock/src/MainClockView.cpp +++ b/code/sdk/application/wearable/fd230app/nativeui/clock/src/MainClockView.cpp @@ -8,369 +8,296 @@ #include "MainClockView.h" #include "MainPresenterSample.h" #include "components/ui_label.h" -#include "components/ui_label_ext.h" #include "wearable_log.h" #include "ui_resource_image.h" #include "common/image_cache_manager.h" #include -extern uint8_t battery_get_voltage(float *voltage); - -namespace OHOS { -static MainClockView *g_pMainClockView = nullptr; - - -#if 0 -static constexpr uint16_t FONT_DEFAULT_SIZE = 25; -static constexpr uint16_t FONT_TEXT_SIZE = 24; -static constexpr uint16_t STEP_LABEL_X = 100; -static constexpr uint16_t STEP_LABEL_Y = 230; -static constexpr uint16_t BATTERYP_LABEL_X = 315; -static constexpr uint16_t BATTERYP_LABEL_Y = 230; -static constexpr uint16_t TEXT_WIDTH = 60; -static constexpr uint16_t TEXT_HEIGHT = 35; -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; -static constexpr uint16_t POINT_CENTER_X = 25; -static constexpr uint16_t POINT_CENTER_Y = 211; -static constexpr uint16_t STEP_CHAR_NUM = 255; -static constexpr int16_t STEP_LABLE_WIDTH = 75; -static constexpr int16_t STEP_LABLE_SIZE = 35; -static constexpr uint16_t WEEKLABEL_POSITION_X = 247; -static constexpr uint16_t WEEKLABEL_POSITION_Y = 122; -static constexpr uint16_t HEARTRATELABEL_POSITION_X = 198; -static constexpr uint16_t HEARTRATELABEL_POSITION_Y = 330; -static constexpr uint16_t HEARTRATE_POSITION_X = 156; -static constexpr uint16_t HEARTRATE_POSITION_Y = 260; -static constexpr uint16_t PROGRESS_POSITION_X = 53; -static constexpr uint16_t PROGRESS_POSITION_Y = 54; -static constexpr uint16_t BIGCIRCLE_POSITION_X = 202; -static constexpr uint16_t BIGCIRCLE_POSITION_Y = 202; -static constexpr uint16_t MEDCIRCLE_POSITION_X = 202; -static constexpr uint16_t MEDCIRCLE_POSITION_Y = 202; -static constexpr uint16_t SMALLCIRCLE_POSITION_X = 202; -static constexpr uint16_t SMALLCIRCLE_POSITION_Y = 202; -static constexpr uint16_t WEEKDAY_POSITION_X = 193; -static constexpr uint16_t WEEKDAY_POSITION_Y = 127; -#endif - -static constexpr uint16_t SECOND_POINT_POSITION_X = 221; -static constexpr uint16_t SECOND_POINT_POSITION_Y = 28; -static constexpr uint16_t MINUTE_POINT_POSITION_X = 221; -static constexpr uint16_t MINUTE_POINT_POSITION_Y = 33; -static constexpr uint16_t HOUR_POINT_POSITION_X = 221; -static constexpr uint16_t HOUR_POINT_POSITION_Y = 87; - -static constexpr uint16_t SECOND_POINT_CENTER_X = 12; -static constexpr uint16_t SECOND_POINT_CENTER_Y = 205; -static constexpr uint16_t MINUTE_POINT_CENTER_X = 12; -static constexpr uint16_t MINUTE_POINT_CENTER_Y = 200; -static constexpr uint16_t HOUR_POINT_CENTER_X = 12; -static constexpr uint16_t HOUR_POINT_CENTER_Y = 146; - - - - -MainClockView::MainClockView() -{ - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MainClockView::MainClockView"); - SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION); - g_pMainClockView = this; -} - -MainClockView::~MainClockView() -{ - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MainClockView::~MainClockView"); - if (clockAnimator != nullptr) { - clockAnimator->Stop(); - delete clockAnimator; - clockAnimator = nullptr; - } - if(progress1animator_ != nullptr) { - progress1animator_->Stop(); - delete progress1animator_; - progress1animator_ = nullptr; - } - mainSweepClock->RemoveAll(); - - delete batteryLabel; - batteryLabel = nullptr; - delete weekLabel; - weekLabel = nullptr; - delete dataLabel; - dataLabel = nullptr; - delete mainSweepClock; - mainSweepClock = nullptr; - #if 0 - delete curFace; - curFace = nullptr; - delete stepLabel; - stepLabel = nullptr; - delete batteryLabel; - batteryLabel = nullptr; - delete callBack; - callBack = nullptr; - delete secondHand; - secondHand = nullptr; - delete minuteHand; - minuteHand = nullptr; - delete hourHand; - hourHand = nullptr; - delete weekLabel; - weekLabel = nullptr; - delete heartRateLabel; - heartRateLabel = nullptr; - delete heartRate; - heartRate = nullptr; - delete hand24Hour; - hand24Hour = nullptr; - delete weekDay; - weekDay = nullptr; - delete progress; - progress = nullptr; - delete bigCircle; - bigCircle = nullptr; - delete medCircle; - medCircle = nullptr; - delete smallCircle; - smallCircle = nullptr; - Remove(mainSweepClock); - delete mainSweepClock; - mainSweepClock = nullptr; -#endif - g_pMainClockView = nullptr; -} - -MainClockView *MainClockView::GetInstance(void) -{ - return g_pMainClockView; -} - -void MainClockView::InitStepValue() +namespace OHOS { -#if 0 - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MainClockView::InitStepValue"); - uint32_t stepValue; - int weekToday = ActivityModel::GetInstance()->GetWeekToday(); - ActivityModel::GetInstance()->GetStepData((StepDataDistribute)weekToday, &stepValue); - char stepChar[STEP_CHAR_NUM] = {0}; - if (sprintf_s(stepChar, STEP_CHAR_NUM, "%d", stepValue) == -1) { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "MainClockView::InitStepValue error"); - return; - } - if (stepLabel == nullptr) { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "MainClockView::InitStepValue nullptr"); - return; - } - stepLabel->SetText(stepChar); - stepLabel->SetStyleForState(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT, UIButton::RELEASED); - stepLabel->SetStyleForState(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT, UIButton::PRESSED); - stepLabel->SetStyleForState(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT, UIButton::INACTIVE); -#endif -} + static MainClockView *g_pMainClockView = nullptr; + + static constexpr uint16_t FONT_DEFAULT_SIZE = 25; + static constexpr uint16_t FONT_TEXT_SIZE = 24; + static constexpr uint16_t STEP_LABEL_X = 100; + static constexpr uint16_t STEP_LABEL_Y = 230; + static constexpr uint16_t BATTERYP_LABEL_X = 315; + static constexpr uint16_t BATTERYP_LABEL_Y = 230; + static constexpr uint16_t TEXT_WIDTH = 60; + static constexpr uint16_t TEXT_HEIGHT = 35; + 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; + static constexpr uint16_t POINT_CENTER_X = 25; + static constexpr uint16_t POINT_CENTER_Y = 211; + static constexpr uint16_t STEP_CHAR_NUM = 255; + static constexpr int16_t STEP_LABLE_WIDTH = 75; + static constexpr int16_t STEP_LABLE_SIZE = 35; + static constexpr uint16_t WEEKLABEL_POSITION_X = 247; + static constexpr uint16_t WEEKLABEL_POSITION_Y = 122; + static constexpr uint16_t HEARTRATELABEL_POSITION_X = 198; + static constexpr uint16_t HEARTRATELABEL_POSITION_Y = 330; + static constexpr uint16_t HEARTRATE_POSITION_X = 156; + static constexpr uint16_t HEARTRATE_POSITION_Y = 260; + static constexpr uint16_t PROGRESS_POSITION_X = 53; + static constexpr uint16_t PROGRESS_POSITION_Y = 54; + static constexpr uint16_t BIGCIRCLE_POSITION_X = 202; + static constexpr uint16_t BIGCIRCLE_POSITION_Y = 202; + static constexpr uint16_t MEDCIRCLE_POSITION_X = 202; + static constexpr uint16_t MEDCIRCLE_POSITION_Y = 202; + static constexpr uint16_t SMALLCIRCLE_POSITION_X = 202; + static constexpr uint16_t SMALLCIRCLE_POSITION_Y = 202; + static constexpr uint16_t WEEKDAY_POSITION_X = 193; + static constexpr uint16_t WEEKDAY_POSITION_Y = 127; + static constexpr int16_t SEC_TO_MILLI = 1000; + static constexpr int16_t USEC_TO_MILLI = 1000; + static constexpr int16_t MIN_TO_HOUR = 60; + static constexpr int16_t HOURLY_SYSTEM = 24; + static constexpr int16_t INTERVAL = 30; + + MainClockView::MainClockView() + { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MainClockView::MainClockView"); + SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION); + g_pMainClockView = this; + } + + MainClockView::~MainClockView() + { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MainClockView::~MainClockView"); + mainSweepClock->RemoveAll(); + delete curFace; + curFace = nullptr; + delete stepLabel; + stepLabel = nullptr; + delete batteryLabel; + batteryLabel = nullptr; + delete secondHand; + secondHand = nullptr; + delete minuteHand; + minuteHand = nullptr; + delete hourHand; + hourHand = nullptr; + delete weekLabel; + weekLabel = nullptr; + delete heartRateLabel; + heartRateLabel = nullptr; + delete heartRate; + heartRate = nullptr; + delete hand24Hour; + hand24Hour = nullptr; + delete weekDay; + weekDay = nullptr; + delete progress; + progress = nullptr; + delete bigCircle; + bigCircle = nullptr; + delete medCircle; + medCircle = nullptr; + delete smallCircle; + smallCircle = nullptr; + Remove(mainSweepClock); + delete mainSweepClock; + mainSweepClock = nullptr; + g_pMainClockView = nullptr; + } + + MainClockView *MainClockView::GetInstance(void) + { + return g_pMainClockView; + } + + void MainClockView::InitStepValue() + { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MainClockView::InitStepValue"); + uint32_t stepValue; + int weekToday = ActivityModel::GetInstance()->GetWeekToday(); + ActivityModel::GetInstance()->GetStepData((StepDataDistribute)weekToday, &stepValue); + char stepChar[STEP_CHAR_NUM] = {0}; + if (sprintf_s(stepChar, STEP_CHAR_NUM, "%d", stepValue) == -1) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "MainClockView::InitStepValue error"); + return; + } + if (stepLabel == nullptr) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "MainClockView::InitStepValue nullptr"); + return; + } + stepLabel->SetText(stepChar); + stepLabel->SetStyleForState(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT, UIButton::RELEASED); + stepLabel->SetStyleForState(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT, UIButton::PRESSED); + stepLabel->SetStyleForState(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT, UIButton::INACTIVE); + } + + bool MainClockView::InitLabelView(void) + { + UIView::OnClickListener *clickListener = (UIView::OnClickListener *)OHOS::MainPresenterSample::GetInstance(); + stepLabel = new UILabelButton(); + if (stepLabel == nullptr) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "stepLabel new fail"); + return false; + } + stepLabel->SetPosition(STEP_LABEL_X, STEP_LABEL_Y); + stepLabel->Resize(STEP_LABLE_WIDTH, STEP_LABLE_SIZE); + stepLabel->SetFont(DEFAULT_VECTOR_FONT_FILENAME, FONT_DEFAULT_SIZE); + stepLabel->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT); + stepLabel->SetViewId(MAIN_CLICK_ACTIVITY); + stepLabel->SetTouchable(true); + stepLabel->SetOnClickListener(clickListener); + InitStepValue(); + + batteryLabel = new UILabel(); + if (batteryLabel == nullptr) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "batteryLabel new fail"); + return false; + } + batteryLabel->SetPosition(BATTERYP_LABEL_X, BATTERYP_LABEL_Y, TEXT_WIDTH, TEXT_HEIGHT); + batteryLabel->SetText("90%"); + batteryLabel->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER); + batteryLabel->SetFont(DEFAULT_VECTOR_FONT_FILENAME, FONT_DEFAULT_SIZE); + batteryLabel->SetStyle(STYLE_BACKGROUND_COLOR, OPA_TRANSPARENT); + + heartRateLabel = new UILabel(); + if (heartRateLabel == nullptr) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "heartRateLabel new fail"); + return false; + } + heartRateLabel->SetPosition(HEARTRATELABEL_POSITION_X, HEARTRATELABEL_POSITION_Y, TEXT_WIDTH, TEXT_HEIGHT); + heartRateLabel->SetText("--"); + heartRateLabel->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER); + heartRateLabel->SetFont(DEFAULT_VECTOR_FONT_FILENAME, FONT_DEFAULT_SIZE); + heartRateLabel->SetStyle(STYLE_BACKGROUND_COLOR, OPA_OPAQUE); -bool MainClockView::InitLabelView(void) -{ -#if 0 - UIView::OnClickListener *clickListener = (UIView::OnClickListener *)OHOS::MainPresenterSample::GetInstance(); - stepLabel = new UILabelButton(); - if (stepLabel == nullptr) { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "stepLabel new fail"); - return false; - } - stepLabel->SetPosition(STEP_LABEL_X, STEP_LABEL_Y); - stepLabel->Resize(STEP_LABLE_WIDTH, STEP_LABLE_SIZE); - stepLabel->SetFont(DEFAULT_VECTOR_FONT_FILENAME, FONT_DEFAULT_SIZE); - stepLabel->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT); - stepLabel->SetViewId(MAIN_CLICK_ACTIVITY); - stepLabel->SetTouchable(true); - stepLabel->SetOnClickListener(clickListener); - InitStepValue(); - - batteryLabel = new UILabel(); - if (batteryLabel == nullptr) { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "batteryLabel new fail"); - return false; - } - batteryLabel->SetPosition(BATTERYP_LABEL_X, BATTERYP_LABEL_Y, TEXT_WIDTH, TEXT_HEIGHT); - batteryLabel->SetText("90%"); - batteryLabel->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER); - batteryLabel->SetFont(DEFAULT_VECTOR_FONT_FILENAME, FONT_DEFAULT_SIZE); - batteryLabel->SetStyle(STYLE_BACKGROUND_COLOR, OPA_TRANSPARENT); - - heartRateLabel = new UILabel(); - if (heartRateLabel == nullptr) { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "heartRateLabel new fail"); - return false; - } - heartRateLabel->SetPosition(HEARTRATELABEL_POSITION_X, HEARTRATELABEL_POSITION_Y, TEXT_WIDTH, TEXT_HEIGHT); - heartRateLabel->SetText("--"); - heartRateLabel->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER); - heartRateLabel->SetFont(DEFAULT_VECTOR_FONT_FILENAME, FONT_DEFAULT_SIZE); - heartRateLabel->SetStyle(STYLE_BACKGROUND_COLOR, OPA_OPAQUE); - - weekLabel = new UILabel(); - if (weekLabel == nullptr) { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "weekLabel new fail"); - return false; - } - weekLabel->SetPosition(WEEKLABEL_POSITION_X, WEEKLABEL_POSITION_Y, TEXT_WIDTH, TEXT_HEIGHT); - weekLabel->SetText("2"); - weekLabel->SetFont(DEFAULT_VECTOR_FONT_FILENAME, FONT_TEXT_SIZE); - weekLabel->SetStyle(STYLE_BACKGROUND_COLOR, OPA_TRANSPARENT); -#endif -#if 0 - printf("lable init\n"); - batteryLabel = new UILabel(); - if (batteryLabel == nullptr) { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "batteryLabel new fail"); - return false; - } - batteryLabel->SetPosition(228, 52); // widget's left position and top position - batteryLabel->Resize(66, 33); - batteryLabel->SetText("2%"); - batteryLabel->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER); - batteryLabel->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 28); - batteryLabel->SetStyle(STYLE_BACKGROUND_COLOR, OPA_TRANSPARENT); - mainSweepClock->Add(batteryLabel); - batteryLabel->SetVisible(true); - - if (dataLabel == nullptr) { - dataLabel = new UILabel(); - } - dataLabel->SetPosition(177, 358); // widget's left position and top position - dataLabel->Resize(200, 60); // widget's width and height - dataLabel->SetViewId("data");// Set style - dataLabel->SetStyle(STYLE_TEXT_FONT, 30); - dataLabel->SetStyle(STYLE_LINE_HEIGHT, 30); - dataLabel->SetText("12月22号"); - dataLabel->SetLineBreakMode(UILabel::LINE_BREAK_ADAPT); - dataLabel->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER); - dataLabel->SetRollSpeed(0); - dataLabel->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 30); - mainSweepClock->Add(dataLabel); - dataLabel->SetVisible(true); - - if (weekLabel == nullptr) { weekLabel = new UILabel(); - } - weekLabel->SetPosition(194, 395); // widget's left position and top position - weekLabel->Resize(200, 60); // widget's width and height - weekLabel->SetViewId("weekday");// Set style - weekLabel->SetStyle(STYLE_TEXT_FONT, 26); - weekLabel->SetStyle(STYLE_LINE_HEIGHT, 30); - weekLabel->SetText("星期五"); - weekLabel->SetLineBreakMode(UILabel::LINE_BREAK_ADAPT); - weekLabel->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER); - weekLabel->SetRollSpeed(0); - weekLabel->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 26); - - mainSweepClock->Add(weekLabel); - weekLabel->SetVisible(true); -#endif - return true; -} - -bool MainClockView::InitCenterCircleView(void) -{ -#if 0 - bigCircle = new Image(); - if (bigCircle == nullptr) { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "bigCircle new fail"); - return false; - } - if (LoadClockImage(bigCircle, CLOCK_BIGCIRCLE_IMAGE_PATH) == false) { - return false; - } + if (weekLabel == nullptr) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "weekLabel new fail"); + return false; + } + weekLabel->SetPosition(WEEKLABEL_POSITION_X, WEEKLABEL_POSITION_Y, TEXT_WIDTH, TEXT_HEIGHT); + weekLabel->SetText("2"); + weekLabel->SetFont(DEFAULT_VECTOR_FONT_FILENAME, FONT_TEXT_SIZE); + weekLabel->SetStyle(STYLE_BACKGROUND_COLOR, OPA_TRANSPARENT); + return true; + } + + bool MainClockView::InitCenterCircleView(void) + { + bigCircle = new Image(); + if (bigCircle == nullptr) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "bigCircle new fail"); + return false; + } + if (LoadClockImage(bigCircle, CLOCK_CLASSIC_GEOMETRY) == false) + { + return false; + } - medCircle = new Image(); - if (medCircle == nullptr) { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "medCircle new fail"); - return false; - } - if (LoadClockImage(medCircle, CLOCK_MEDCIRCLE_IMAGE_PATH) == false) { - return false; - } + medCircle = new Image(); + if (medCircle == nullptr) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "medCircle new fail"); + return false; + } + if (LoadClockImage(medCircle, CLOCK_CLASSIC_GEOMETRY) == false) + { + return false; + } - smallCircle = new Image(); - if (smallCircle == nullptr) { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "smallCircle new fail"); - return false; - } - if (LoadClockImage(smallCircle, CLOCK_CIRCLE_IMAGE_PATH) == false) { - return false; + smallCircle = new Image(); + if (smallCircle == nullptr) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "smallCircle new fail"); + return false; + } + if (LoadClockImage(smallCircle, CLOCK_CLASSIC_GEOMETRY) == false) + { + return false; + } + return true; } -#endif - return true; -} -bool MainClockView::InitHandView(void) -{ - secondHand = new Image(); - if (secondHand == nullptr) { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "secondHand new fail"); - return false; - } - if (LoadClockImage(secondHand, CLOCK_SECOND) == false) { - return false; - } + bool MainClockView::InitHandView(void) + { + secondHand = new Image(); + if (secondHand == nullptr) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "secondHand new fail"); + return false; + } + if (LoadClockImage(secondHand, CLOCK_CLOCK_SECOND) == false) + { + return false; + } - minuteHand = new Image(); - if (minuteHand == nullptr) { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "minuteHand new fail"); - return false; - } - if (LoadClockImage(minuteHand, CLOCK_MINUTE) == false) { - return false; - } - hourHand = new Image(); - if (hourHand == nullptr) { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "hourHand new fail"); - return false; - } - if (LoadClockImage(hourHand, CLOCK_HOUR) == false) { - return false; - } -#if 0 - hand24Hour = new Image(); - if (hand24Hour == nullptr) { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "hand24Hour new fail"); - return false; - } - if (LoadClockImage(hand24Hour, CLOCK_HAND24HOUR_IMAGE_PATH) == false) { - return false; - } -#endif - return true; -} + minuteHand = new Image(); + if (minuteHand == nullptr) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "minuteHand new fail"); + return false; + } + if (LoadClockImage(minuteHand, CLOCK_CLOCK_MINUTE) == false) + { + return false; + } + hourHand = new Image(); + if (hourHand == nullptr) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "hourHand new fail"); + return false; + } + if (LoadClockImage(hourHand, CLOCK_CLOCK_HOUR) == false) + { + return false; + } -bool MainClockView::LoadClockImage(Image *view, uint32_t resId) -{ - std::string file = CLOCK_IAMGES; - ImageInfo* image = ImageCacheManager::GetInstance().LoadOneInMultiRes(resId, file); - if (image == nullptr) { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "LoadClockImage %x fail", resId); - return false; + hand24Hour = new Image(); + if (hand24Hour == nullptr) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "hand24Hour new fail"); + return false; + } + if (LoadClockImage(hand24Hour, CLOCK_CLASSIC_GEOMETRY) == false) + { + return false; + } + return true; } - view->SetSrc(image); - return true; -} -bool MainClockView::LoadClockImage(UIImageView *view, uint32_t resId) -{ - std::string file = CLOCK_IAMGES; - ImageInfo* image = ImageCacheManager::GetInstance().LoadOneInMultiRes(resId, file); - if (image == nullptr) { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "LoadClockImage %x fail", resId); - return false; + bool MainClockView::LoadClockImage(Image *view, uint32_t resId) + { + std::string file = CLOCK_IAMGES; + ImageInfo *image = ImageCacheManager::GetInstance().LoadOneInMultiRes(resId, file); + if (image == nullptr) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "LoadClockImage %x fail", resId); + return false; + } + view->SetSrc(image); + return true; + } + + bool MainClockView::LoadClockImage(UIImageView *view, uint32_t resId) + { + std::string file = CLOCK_IAMGES; + ImageInfo *image = ImageCacheManager::GetInstance().LoadOneInMultiRes(resId, file); + if (image == nullptr) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "LoadClockImage %x fail", resId); + return false; + } + view->SetSrc(image); + return true; } - view->SetSrc(image); - return true; -} -bool MainClockView::InitSweepClock(void) -{ + bool MainClockView::InitSweepClock(void) + { +#if 0 curFace = new UIImageView(); if (curFace == nullptr) { WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "curFace new fail"); @@ -378,12 +305,11 @@ bool MainClockView::InitSweepClock(void) } curFace->SetPosition(0, 0); - if (LoadClockImage(curFace, CLOCK_CLASSIC_GEOMETRY) == false) { + if (LoadClockImage(curFace, CLOCK_CLOCK0) == false) { WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "curFace LoadClockImage CLOCK_MAIN_FACE_IMAGE fail"); return false; } - //InitLabelView(); -#if 0 + if (InitLabelView() == false) { WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "InitLabelView() fail"); return false; @@ -413,93 +339,8 @@ bool MainClockView::InitSweepClock(void) WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "progress LoadClockImage CLOCK_PROGRESS_IMAGE_PATH fail"); return false; } -#endif + InitHandView(); - /**************************************************************/ - //printf("lable init\n"); - batteryLabel = new UILabel(); - if (batteryLabel == nullptr) { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "batteryLabel new fail"); - return false; - } - batteryLabel->SetPosition(228, 52); // widget's left position and top position - batteryLabel->Resize(66, 33); - float voltage = 0.0F; - uint8_t value = battery_get_voltage(&voltage); - batteryLabel->SetText((std::to_string(value) + "%").c_str()); // 更新百分比显示 - batteryLabel->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER); - batteryLabel->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 28); - batteryLabel->SetStyle(STYLE_BACKGROUND_COLOR, OPA_TRANSPARENT); - //mainSweepClock->Add(batteryLabel); - if (dataLabel == nullptr) { - dataLabel = new UILabel(); - } - dataLabel->SetPosition(177, 358); // widget's left position and top position - dataLabel->Resize(200, 60); // widget's width and height - dataLabel->SetViewId("data");// Set style - dataLabel->SetStyle(STYLE_TEXT_FONT, 30); - dataLabel->SetStyle(STYLE_LINE_HEIGHT, 30); - dataLabel->SetText("12月22号"); - dataLabel->SetLineBreakMode(UILabel::LINE_BREAK_ADAPT); - dataLabel->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER); - dataLabel->SetRollSpeed(0); - dataLabel->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 30); - //mainSweepClock->Add(dataLabel); - if (weekLabel == nullptr) { - weekLabel = new UILabel(); - } - weekLabel->SetPosition(194, 395); // widget's left position and top position - //weekLabel->Resize(200, 60); // widget's width and height - weekLabel->SetViewId("weekday");// Set style - weekLabel->SetStyle(STYLE_TEXT_FONT, 30); - weekLabel->SetStyle(STYLE_LINE_HEIGHT, 30); - weekLabel->SetText("星期五"); - weekLabel->SetLineBreakMode(UILabel::LINE_BREAK_ADAPT); - weekLabel->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER); - weekLabel->SetRollSpeed(0); - weekLabel->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 26); - - // Add Label to App - if (XTSLabel == nullptr) { - XTSLabel = new UILabel(); - } - XTSLabel->SetPosition(130, 273); // widget's left position and top position - XTSLabel->Resize(200, 60); // widget's width and height - XTSLabel->SetViewId("label1");// Set style - XTSLabel->SetStyle(STYLE_TEXT_FONT, 30); - - // Set additional property - //XTSLabel->SetText("XTS测试进行中"); - XTSLabel->SetLineBreakMode(UILabel::LINE_BREAK_ADAPT); - //XTSLabel->SetTextColor(Color::GetColorFromRGBA(0xe6, 0x04, 0x09, 0xff)); - XTSLabel->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER); - XTSLabel->SetRollSpeed(0); - XTSLabel->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 30); - - // Add BoxProgress to App - if (progress == nullptr) { - progress = new UIBoxProgress(); - } - progress->SetPosition(180, 58); // widget's left position and top position - progress->Resize(31, 19); // widget's width and height - progress->SetViewId("progress1");// Set style - progress->SetStyle(STYLE_BACKGROUND_OPA, 0xff); - - // Set additional property - progress->SetValue(value); - // Set BackgroundStyle - progress->SetBackgroundStyle(STYLE_TEXT_COLOR, 0xff000000); - // Set ForegroundStyle - progress->SetForegroundStyle(STYLE_TEXT_COLOR, 0xff000000); - progress->SetForegroundStyle(STYLE_LINE_COLOR, 0xff000000); - progress->SetForegroundStyle(STYLE_LINE_WIDTH, 0); - const char* progress1ForeImageSrc = "/user/res/Battery/Battery_Nomoal.bin"; - char * progress1BackImageSrc = nullptr; - progress->SetImage(progress1ForeImageSrc, progress1BackImageSrc); - - /**************************************************************/ - //InitLabelView(); -#if 0 weekDay = new UIImageView(); if (weekDay == nullptr) { WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "weekDay new fail"); @@ -511,140 +352,115 @@ bool MainClockView::InitSweepClock(void) return false; } #endif - return true; -} - -void MainClockView::PreLoad(void) -{ - if (!viewiInitStatus) { - InitView(); - viewiInitStatus = true; + return true; } -} -void MainClockView::UnLoad(void) -{ - // Main clock view is commonly used page, so we do not release it's resources inner slice. -} - -bool MainClockView::InitView(void) -{ - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MainClockView::InitView"); - - mainSweepClock = new UISweepClock(); - if (mainSweepClock == nullptr) { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "mainSweepClock new fail"); - return false; + void MainClockView::PreLoad(void) + { + if (!viewiInitStatus) + { + InitView(); + viewiInitStatus = true; } - if (InitSweepClock() == false) { - return false; } - mainSweepClock->Add(curFace); - mainSweepClock->Add(weekLabel); - mainSweepClock->Add(dataLabel); - mainSweepClock->Add(batteryLabel); - mainSweepClock->Add(XTSLabel); - mainSweepClock->Add(progress); -#if 0 - mainSweepClock->Add(stepLabel); - mainSweepClock->Add(heartRate); - mainSweepClock->Add(weekLabel); - mainSweepClock->Add(heartRateLabel); - mainSweepClock->Add(weekDay); - mainSweepClock->Add(progress); - mainSweepClock->Add(batteryLabel); -#endif - - Add(mainSweepClock); - - mainSweepClock->SetDragParentInstead(true); - mainSweepClock->SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION); - - // {214, 3}: position x, y {14, 223}: center x, y - mainSweepClock->SetHandImage(UISweepClock::HandType::SECOND_HAND, *secondHand, - { SECOND_POINT_POSITION_X, SECOND_POINT_POSITION_Y }, { SECOND_POINT_CENTER_X, SECOND_POINT_CENTER_Y }); - mainSweepClock->SetHandImage(UISweepClock::HandType::MINUTE_HAND, *minuteHand, - { MINUTE_POINT_POSITION_X, MINUTE_POINT_POSITION_Y }, { MINUTE_POINT_CENTER_X, MINUTE_POINT_CENTER_Y }); - mainSweepClock->SetHandImage(UISweepClock::HandType::HOUR_HAND, *hourHand, { HOUR_POINT_POSITION_X, HOUR_POINT_POSITION_Y }, - { HOUR_POINT_CENTER_X, HOUR_POINT_CENTER_Y }); -#if 0 - mainSweepClock->SetHandCircleImage(UISweepClock::HandType::SECOND_HAND, *smallCircle, - { SMALLCIRCLE_POSITION_X, SMALLCIRCLE_POSITION_Y }); - mainSweepClock->SetHandCircleImage(UISweepClock::HandType::MINUTE_HAND, *medCircle, - { MEDCIRCLE_POSITION_X, MEDCIRCLE_POSITION_Y }); - mainSweepClock->SetHandCircleImage(UISweepClock::HandType::HOUR_HAND, *bigCircle, - { BIGCIRCLE_POSITION_X, BIGCIRCLE_POSITION_Y }); -#endif - mainSweepClock->SetInitTime24Hour(0, 0, 0); - mainSweepClock->SetWorkMode(UISweepClock::WorkMode::NORMAL); - InitDateTime(); - - callBack = new ClockAnimatorCallback(mainSweepClock); - if (callBack == nullptr) { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "callBack new fail"); - return false; - } - clockAnimator = new Animator(callBack, mainSweepClock, 50, true); - if (clockAnimator == nullptr) { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "clockAnimator new fail"); - return false; + void MainClockView::UnLoad(void) + { + // Main clock view is commonly used page, so we do not release it's resources inner slice. } - progress1callback_ = new ProgressCallback(progress,batteryLabel,XTSLabel); - progress1animator_ = new Animator(progress1callback_,progress,10000,true); - progress1animator_->Start(); - clockAnimator->Start(); - SetCoverable(true); - return true; -} -void MainClockView::RefreshStep(int step) -{ -#if 0 - char stepChar[STEP_CHAR_NUM] = {0}; + bool MainClockView::InitView(void) + { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MainClockView::InitView"); - (void)sprintf_s(stepChar, STEP_CHAR_NUM, "%d", step); - stepLabel->SetText(stepChar); -#endif -} - -void MainClockView::RefreshHeartRate(int value) -{ -#if 0 - if (value == 0) { - heartRateLabel->SetText("--"); - return; - } - char heartRateChar[STEP_CHAR_NUM] = {0}; - - (void)sprintf_s(heartRateChar, STEP_CHAR_NUM, "%d", value); - heartRateLabel->SetText(heartRateChar); -#endif -} - -void MainClockView::InitDateTime(void) -{ - struct tm pTM; - time_t seconds; - time(&seconds); - localtime_r(&seconds, &pTM); - mainSweepClock->SetTime24Hour(pTM.tm_hour, pTM.tm_min, pTM.tm_sec); -} - -void MainClockView::ClockAnimatorStart(void) -{ - if (clockAnimator != nullptr) { - progress1animator_->Start(); - clockAnimator->Start(); - } -} + mainSweepClock = new UISweepClock(); + if (mainSweepClock == nullptr) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "mainSweepClock new fail"); + return false; + } + if (InitSweepClock() == false) + { + return false; + } -void MainClockView::ClockAnimatorStop(void) -{ - if (clockAnimator != nullptr) { - clockAnimator->Stop(); - progress1animator_->Stop(); + mainSweepClock->Add(curFace); + mainSweepClock->Add(stepLabel); + mainSweepClock->Add(heartRate); + mainSweepClock->Add(weekLabel); + mainSweepClock->Add(heartRateLabel); + mainSweepClock->Add(weekDay); + mainSweepClock->Add(progress); + mainSweepClock->Add(batteryLabel); + Add(mainSweepClock); + + mainSweepClock->SetDragParentInstead(true); + mainSweepClock->SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION); + + // {214, 3}: position x, y {14, 223}: center x, y + mainSweepClock->SetHandImage(UISweepClock::HandType::SECOND_HAND, *secondHand, + {POINT_POSITION_X, SECOND_POINT_POSITION_Y}, {POINT_CENTER_X, POINT_CENTER_Y}); + mainSweepClock->SetHandImage(UISweepClock::HandType::MINUTE_HAND, *minuteHand, + {POINT_POSITION_X, POINT_POSITION_Y}, {POINT_CENTER_X, POINT_CENTER_Y}); + mainSweepClock->SetHandImage(UISweepClock::HandType::HOUR_HAND, *hourHand, {POINT_POSITION_X, POINT_POSITION_Y}, + {POINT_CENTER_X, POINT_CENTER_Y}); + mainSweepClock->SetHandCircleImage(UISweepClock::HandType::SECOND_HAND, *smallCircle, + {SMALLCIRCLE_POSITION_X, SMALLCIRCLE_POSITION_Y}); + mainSweepClock->SetHandCircleImage(UISweepClock::HandType::MINUTE_HAND, *medCircle, + {MEDCIRCLE_POSITION_X, MEDCIRCLE_POSITION_Y}); + mainSweepClock->SetHandCircleImage(UISweepClock::HandType::HOUR_HAND, *bigCircle, + {BIGCIRCLE_POSITION_X, BIGCIRCLE_POSITION_Y}); + + mainSweepClock->SetInitTime24Hour(0, 0, 0); + mainSweepClock->SetWorkMode(UISweepClock::WorkMode::NORMAL); + InitDateTime(); + SetCoverable(true); + return true; + } + + void MainClockView::RefreshStep(int step) + { + char stepChar[STEP_CHAR_NUM] = {0}; + + (void)sprintf_s(stepChar, STEP_CHAR_NUM, "%d", step); + stepLabel->SetText(stepChar); + } + + void MainClockView::RefreshHeartRate(int value) + { + if (value == 0) + { + heartRateLabel->SetText("--"); + return; + } + char heartRateChar[STEP_CHAR_NUM] = {0}; + + (void)sprintf_s(heartRateChar, STEP_CHAR_NUM, "%d", value); + heartRateLabel->SetText(heartRateChar); + } + + void MainClockView::InitDateTime(void) + { + struct tm pTM; + time_t seconds; + time(&seconds); + localtime_r(&seconds, &pTM); + mainSweepClock->SetTime24Hour(pTM.tm_hour, pTM.tm_min, pTM.tm_sec); + } + + void MainClockView::UpdateTime(void) + { + struct timeval tv; + gettimeofday(&tv, NULL); + uint64_t second = tv.tv_sec; + uint64_t uSecond = tv.tv_usec; + uint64_t minute = second / MIN_TO_HOUR; + uint64_t hour = minute / MIN_TO_HOUR + timezone / (MIN_TO_HOUR * MIN_TO_HOUR); + uint8_t realHour = static_cast(hour % HOURLY_SYSTEM); + uint8_t realMinute = static_cast(minute % MIN_TO_HOUR); + uint16_t realMilliSecond = static_cast((second % MIN_TO_HOUR) * + SEC_TO_MILLI + + uSecond / USEC_TO_MILLI); + mainSweepClock->SetSweepTime12Hour(realHour, realMinute, realMilliSecond, 1); } } - -} diff --git a/code/sdk/application/wearable/fd230app/nativeui/compass/include/CompassControlView.h b/code/sdk/application/wearable/fd230app/nativeui/compass/include/CompassControlView.h index 7fa5ee943..3867489bb 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/compass/include/CompassControlView.h +++ b/code/sdk/application/wearable/fd230app/nativeui/compass/include/CompassControlView.h @@ -23,10 +23,12 @@ public: bool InitView(void); void PreLoad(void) override; void UnLoad(void) override; + void SetCalibrationView(bool flag); private: CompassCalibrationView *compassCalibrationView{nullptr}; CompassView *compassView{nullptr}; bool viewiInitStatus{false}; + bool isCalibration{false}; void ClearAll(void); }; diff --git a/code/sdk/application/wearable/fd230app/nativeui/compass/src/CompassControlView.cpp b/code/sdk/application/wearable/fd230app/nativeui/compass/src/CompassControlView.cpp index bd87bff20..be71dc868 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/compass/src/CompassControlView.cpp +++ b/code/sdk/application/wearable/fd230app/nativeui/compass/src/CompassControlView.cpp @@ -36,7 +36,7 @@ void CompassControlView::ClearAll(void) bool CompassControlView::InitView(void) { - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "CompassControlView::InitView(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"); @@ -64,10 +64,24 @@ bool CompassControlView::InitView(void) compassView->SetVisible(true); compassCalibrationView->SetVisible(false); } - // SetCoverable(true); return true; } +void CompassControlView::SetCalibrationView(bool flag) +{ + if (flag == isCalibration) { + return; + } + + if (flag) { + compassCalibrationView->SetVisible(true); + compassView->SetVisible(false); + } else { + compassCalibrationView->SetVisible(false); + compassView->SetVisible(true); + } +} + void CompassControlView::PreLoad(void) { if (!viewiInitStatus) { diff --git a/code/sdk/application/wearable/fd230app/nativeui/dialupdate/src/DialUpdateModel.cpp b/code/sdk/application/wearable/fd230app/nativeui/dialupdate/src/DialUpdateModel.cpp index 3efc336c8..6c1252984 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/dialupdate/src/DialUpdateModel.cpp +++ b/code/sdk/application/wearable/fd230app/nativeui/dialupdate/src/DialUpdateModel.cpp @@ -30,6 +30,7 @@ DialInfo dialInfo[MAX_DIALNUM] = { int dial_num; void read_dial(void) { +#if 0 DIR *dirp = opendir(DIAL_DIR); // 遍历文件 dial_num = 0; @@ -84,6 +85,7 @@ void read_dial(void) } // 关闭目录 closedir(dirp); +#endif } void printf_dial(void) diff --git a/code/sdk/application/wearable/fd230app/nativeui/heartrate/src/HeartModel.cpp b/code/sdk/application/wearable/fd230app/nativeui/heartrate/src/HeartModel.cpp index 167ef3878..023b24356 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/heartrate/src/HeartModel.cpp +++ b/code/sdk/application/wearable/fd230app/nativeui/heartrate/src/HeartModel.cpp @@ -448,7 +448,7 @@ namespace OHOS if (MainViewSample::GetInstance() != nullptr && HeartRateView::GetInstance() != nullptr) { - if (MainViewSample::GetInstance()->GetHorCurrentPage() == HEART_RATE) + if (MainViewSample::GetInstance()->GetHorCurrentCard() == HEART_RATE) { HeartRateView::GetInstance()->SetHeartRateData(rateData, sizeof(Point) * len); HeartRateView::GetInstance()->RefreshElectrocardiogram(); diff --git a/code/sdk/application/wearable/fd230app/nativeui/indoorwalk/include/CustomizationView.h b/code/sdk/application/wearable/fd230app/nativeui/indoorwalk/include/CustomizationView.h index e94a38e00..557cde567 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/indoorwalk/include/CustomizationView.h +++ b/code/sdk/application/wearable/fd230app/nativeui/indoorwalk/include/CustomizationView.h @@ -10,7 +10,6 @@ #include "View.h" #include "common/screen.h" #include "components/ui_label.h" -#include "components/ui_label_ext.h" #include "components/ui_scroll_view.h" #include "components/ui_radio_button.h" #include "components/ui_label_button.h" diff --git a/code/sdk/application/wearable/fd230app/nativeui/indoorwalk/include/IndoorWalkEndView.h b/code/sdk/application/wearable/fd230app/nativeui/indoorwalk/include/IndoorWalkEndView.h index 42afc8f20..06fc19dd7 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/indoorwalk/include/IndoorWalkEndView.h +++ b/code/sdk/application/wearable/fd230app/nativeui/indoorwalk/include/IndoorWalkEndView.h @@ -8,7 +8,6 @@ #define INDOORWALK_END_VIEW_H #include "components/ui_label.h" -#include "components/ui_label_ext.h" #include "components/ui_button.h" #include "components/ui_view_group.h" #include "common/screen.h" diff --git a/code/sdk/application/wearable/fd230app/nativeui/indoorwalk/include/IndoorWalkModel.h b/code/sdk/application/wearable/fd230app/nativeui/indoorwalk/include/IndoorWalkModel.h index 0c132035f..679802aec 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/indoorwalk/include/IndoorWalkModel.h +++ b/code/sdk/application/wearable/fd230app/nativeui/indoorwalk/include/IndoorWalkModel.h @@ -11,7 +11,6 @@ #include "string" #include "gfx_utils/list.h" #include "components/ui_label.h" -#include "components/ui_label_ext.h" #ifdef __cplusplus extern "C" { diff --git a/code/sdk/application/wearable/fd230app/nativeui/indoorwalk/include/IndoorWalkMotionView.h b/code/sdk/application/wearable/fd230app/nativeui/indoorwalk/include/IndoorWalkMotionView.h index 4a4ebaa49..303045f66 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/indoorwalk/include/IndoorWalkMotionView.h +++ b/code/sdk/application/wearable/fd230app/nativeui/indoorwalk/include/IndoorWalkMotionView.h @@ -50,7 +50,6 @@ private: bool pageStatus[MAX_MOTIONPAGE]{false}; UISwipeView::OnSwipeListener* motionclickListener{nullptr}; UIView::OnDragListener* motionDragListener{nullptr}; - AppGroupView *GreatePage(int32_t MotionPageId); }; } // namespace OHOS #endif // INDOORWALK_MOTION_VIEW_H \ No newline at end of file diff --git a/code/sdk/application/wearable/fd230app/nativeui/indoorwalk/include/IndoorWalkPreparedView.h b/code/sdk/application/wearable/fd230app/nativeui/indoorwalk/include/IndoorWalkPreparedView.h index 26428fb90..8f073adba 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/indoorwalk/include/IndoorWalkPreparedView.h +++ b/code/sdk/application/wearable/fd230app/nativeui/indoorwalk/include/IndoorWalkPreparedView.h @@ -9,7 +9,6 @@ #include "View.h" #include "components/ui_label.h" -#include "components/ui_label_ext.h" #include "components/ui_image_view.h" #include "components/ui_label_button.h" #include "components/ui_image_animator.h" diff --git a/code/sdk/application/wearable/fd230app/nativeui/indoorwalk/include/IndoorWalkPresenter.h b/code/sdk/application/wearable/fd230app/nativeui/indoorwalk/include/IndoorWalkPresenter.h index 1048f3f7c..b3f4c7df5 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/indoorwalk/include/IndoorWalkPresenter.h +++ b/code/sdk/application/wearable/fd230app/nativeui/indoorwalk/include/IndoorWalkPresenter.h @@ -9,13 +9,10 @@ #include "Presenter.h" #include "components/ui_label.h" -#include "components/ui_label_ext.h" #include "NativeLauncher.h" #include "NativeAbility.h" #include "components/ui_swipe_view.h" -#include "KeyInputListener.h" -#include "common/key_code.h" namespace OHOS { enum IndoorWalkPresenterNum : uint8_t { @@ -65,7 +62,7 @@ static constexpr const char *STEPS_BUTTON = "stepsView"; // 步数 class IndoorWalkView; class IndoorWalkPresenter : public Presenter, public UISwipeView::OnSwipeListener, - public UIView::OnClickListener, public UIView::OnLongPressListener,public RootView::OnKeyActListener, + public UIView::OnClickListener, public UIView::OnLongPressListener, public UIView::OnDragListener { public: IndoorWalkPresenter(); @@ -77,7 +74,6 @@ public: void OnStop() override; bool OnClick(UIView& view, const ClickEvent& event) override; bool OnDrag(UIView& view, const DragEvent& event) override; - bool OnKeyAct(UIView &view, const KeyEvent &event) override; bool OnLongPress(UIView& view, const LongPressEvent& event) override; virtual void OnSwipe(UISwipeView& view) override; void HidePageImageView(void); diff --git a/code/sdk/application/wearable/fd230app/nativeui/indoorwalk/include/MotionPageFifth.h b/code/sdk/application/wearable/fd230app/nativeui/indoorwalk/include/MotionPageFifth.h index 5b8dcff66..745f0fce0 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/indoorwalk/include/MotionPageFifth.h +++ b/code/sdk/application/wearable/fd230app/nativeui/indoorwalk/include/MotionPageFifth.h @@ -12,7 +12,6 @@ #include "wearable_log.h" #include "ohos_types.h" #include "components/ui_label.h" -#include "components/ui_label_ext.h" #include "components/ui_image_view.h" #include "AppGroupView.h" diff --git a/code/sdk/application/wearable/fd230app/nativeui/indoorwalk/include/MotionPageFirst.h b/code/sdk/application/wearable/fd230app/nativeui/indoorwalk/include/MotionPageFirst.h index c782855f2..8b0c1d188 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/indoorwalk/include/MotionPageFirst.h +++ b/code/sdk/application/wearable/fd230app/nativeui/indoorwalk/include/MotionPageFirst.h @@ -12,7 +12,6 @@ #include "wearable_log.h" #include "ohos_types.h" #include "components/ui_label.h" -#include "components/ui_label_ext.h" #include "components/ui_image_view.h" #include "AppGroupView.h" diff --git a/code/sdk/application/wearable/fd230app/nativeui/indoorwalk/include/MotionPageFourth.h b/code/sdk/application/wearable/fd230app/nativeui/indoorwalk/include/MotionPageFourth.h index c5671dafc..f141257d1 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/indoorwalk/include/MotionPageFourth.h +++ b/code/sdk/application/wearable/fd230app/nativeui/indoorwalk/include/MotionPageFourth.h @@ -12,7 +12,6 @@ #include "wearable_log.h" #include "ohos_types.h" #include "components/ui_label.h" -#include "components/ui_label_ext.h" #include "components/ui_image_view.h" #include "AppGroupView.h" diff --git a/code/sdk/application/wearable/fd230app/nativeui/indoorwalk/include/MotionPageSecond.h b/code/sdk/application/wearable/fd230app/nativeui/indoorwalk/include/MotionPageSecond.h index 9c27255aa..005178aa7 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/indoorwalk/include/MotionPageSecond.h +++ b/code/sdk/application/wearable/fd230app/nativeui/indoorwalk/include/MotionPageSecond.h @@ -12,7 +12,6 @@ #include "wearable_log.h" #include "ohos_types.h" #include "components/ui_label.h" -#include "components/ui_label_ext.h" #include "components/ui_image_view.h" #include "AppGroupView.h" diff --git a/code/sdk/application/wearable/fd230app/nativeui/indoorwalk/include/MotionPageThird.h b/code/sdk/application/wearable/fd230app/nativeui/indoorwalk/include/MotionPageThird.h index 3b1c816e9..de2e51743 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/indoorwalk/include/MotionPageThird.h +++ b/code/sdk/application/wearable/fd230app/nativeui/indoorwalk/include/MotionPageThird.h @@ -12,7 +12,6 @@ #include "wearable_log.h" #include "ohos_types.h" #include "components/ui_label.h" -#include "components/ui_label_ext.h" #include "components/ui_image_view.h" #include "AppGroupView.h" diff --git a/code/sdk/application/wearable/fd230app/nativeui/indoorwalk/src/IndoorWalkMotionView.cpp b/code/sdk/application/wearable/fd230app/nativeui/indoorwalk/src/IndoorWalkMotionView.cpp index 866e42f86..a3350f28e 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/indoorwalk/src/IndoorWalkMotionView.cpp +++ b/code/sdk/application/wearable/fd230app/nativeui/indoorwalk/src/IndoorWalkMotionView.cpp @@ -127,7 +127,7 @@ UIViewGroup *IndoorWalkMotionView::WalkMotionViewInit(void) walkMotionList->SetAnimatorTime(50); // 50:animator drag time(ms) for (uint16_t i = 0; i < maxPage; i++) { - recordCard[i] = GreatePage(i); + recordCard[i] = (this->*(g_pageMapper[i].func))(); if (recordCard[i] == nullptr) { WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "IndoorWalkMotionView:: recordCard %d error", i); return nullptr; @@ -170,20 +170,4 @@ void IndoorWalkMotionView::InitialStep() IndoorWalkModel::GetInstance()->SetInitialStep(stepValue); } -AppGroupView *IndoorWalkMotionView::GreatePage(int32_t StreamId) -{ - uint16_t i; - AppGroupView *view = nullptr; - int32_t MotionPageId = ScreenModels::GetInstance()->GetCardPage(StreamId); - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "GreatePage MotionPageId:%d", MotionPageId); - for (i = 0; i < sizeof(g_pageMapper) / sizeof(g_pageMapper[0]); i++) { - if (g_pageMapper[i].id == MotionPageId) { - view = (this->*(g_pageMapper[i].func))(); - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "GreatePage view:%p", view); - return view; - } - } - return nullptr; -} - } \ No newline at end of file diff --git a/code/sdk/application/wearable/fd230app/nativeui/indoorwalk/src/IndoorWalkPreparedView.cpp b/code/sdk/application/wearable/fd230app/nativeui/indoorwalk/src/IndoorWalkPreparedView.cpp index 47eeb84e3..326e8605f 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/indoorwalk/src/IndoorWalkPreparedView.cpp +++ b/code/sdk/application/wearable/fd230app/nativeui/indoorwalk/src/IndoorWalkPreparedView.cpp @@ -135,7 +135,7 @@ bool IndoorWalkPreparedView::InitBatteryView() // 加载电量 return false; } battery->SetPosition(BATTERY_X, BATTERY_Y); - //ScreenModels::GetInstance()->LoadAppImages(DROPDOWN_IAMGES, battery, DROPDOWN_DROPDOWN_BATTERY); + // ScreenModels::GetInstance()->LoadAppImages(DROPDOWN_IAMGES, battery, DROPDOWN_DROPDOWN_BATTERY); group->Add(battery); batteryLable = new UILabel(); diff --git a/code/sdk/application/wearable/fd230app/nativeui/indoorwalk/src/IndoorWalkPresenter.cpp b/code/sdk/application/wearable/fd230app/nativeui/indoorwalk/src/IndoorWalkPresenter.cpp index 543b3626c..6e33f8f50 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/indoorwalk/src/IndoorWalkPresenter.cpp +++ b/code/sdk/application/wearable/fd230app/nativeui/indoorwalk/src/IndoorWalkPresenter.cpp @@ -165,19 +165,6 @@ void IndoorWalkPresenter::OnSwipe(UISwipeView &view) return; } -bool IndoorWalkPresenter::OnKeyAct(UIView &view, const KeyEvent &event) -{ - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "IndoorWalkPresenter::OnKeyAct"); - uint16 keyID = event.GetKeyId(); - // 如果是power键就返回上一级 - if (keyID == static_cast(ZliteKeyCode::ZLITE_KEY_POWER)) - { - uint16_t preSlice = NativeAbility::GetInstance().GetPreSliceId(); - NativeAbility::GetInstance().ChangeSlice(VIEW_APPLIST); - } - return true; -} - bool IndoorWalkPresenter::OnClick(UIView& view, const ClickEvent& event) { UNUSED(event); diff --git a/code/sdk/application/wearable/fd230app/nativeui/indoorwalk/src/IndoorWalkView.cpp b/code/sdk/application/wearable/fd230app/nativeui/indoorwalk/src/IndoorWalkView.cpp index bbb5d69b2..23bd60810 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/indoorwalk/src/IndoorWalkView.cpp +++ b/code/sdk/application/wearable/fd230app/nativeui/indoorwalk/src/IndoorWalkView.cpp @@ -39,9 +39,7 @@ void IndoorWalkView::OnStart() WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "IndoorWalkView::~OnStart"); View::OnStart(); BaseView::RootView(Color::Black().full); - // 增加按键监听 - RootView::OnKeyActListener *keyactListener =(RootView::OnKeyActListener *)OHOS::IndoorWalkPresenter::GetInstance(); - RootView::GetInstance()->SetOnKeyActListener(keyactListener); + ChangeView(INDOORWALK_MAX, INDOORWALKPREPAREDVIEW); RootView::GetInstance()->Invalidate(); return; diff --git a/code/sdk/application/wearable/fd230app/nativeui/key/include/KeyInputListener.h b/code/sdk/application/wearable/fd230app/nativeui/key/include/KeyInputListener.h index a5bd57cc4..3e22e2c69 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/key/include/KeyInputListener.h +++ b/code/sdk/application/wearable/fd230app/nativeui/key/include/KeyInputListener.h @@ -23,17 +23,16 @@ namespace OHOS virtual ~KeyInputListener() {} bool OnKeyAct(UIView &view, const KeyEvent &event) override; - private: - void OnKeyPress(void); - void OnKeyLongPress(const KeyEvent &event); - void OnKeyRelease(const KeyEvent &event); - void CallVolumeDipSwitchControl(uint8_t status); - void PlayerVolumeDipSwitchControl(uint8_t model); - - private: - int32 pressFlag{0}; // 按下标志 - int32 longPressFlag{0}; // 长按标志 - VolumeSliderEventListener *volumeSliderEventListener{nullptr}; - }; +private: + void OnKeyPress(void); + void OnKeyLongPress(const KeyEvent& event); + void OnKeyRelease(const KeyEvent& event); + void CallVolumeDipSwitchControl(VolumeChangeStatus status); + void PlayerVolumeDipSwitchControl(VolumeChangeStatus status); +private: + int32 pressFlag{0}; + int32 longPressFlag{0}; + VolumeSliderEventListener *volumeSliderEventListener{nullptr}; +}; } #endif // KEY_INPUT_LISTENER_H \ No newline at end of file diff --git a/code/sdk/application/wearable/fd230app/nativeui/key/src/KeyInputListener.cpp b/code/sdk/application/wearable/fd230app/nativeui/key/src/KeyInputListener.cpp index 63b086b22..684b0f94e 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/key/src/KeyInputListener.cpp +++ b/code/sdk/application/wearable/fd230app/nativeui/key/src/KeyInputListener.cpp @@ -88,43 +88,33 @@ namespace OHOS return; } - void KeyInputListener::CallVolumeDipSwitchControl(uint8_t model) - { - if (MainCallingPresenter::GetInstance() != nullptr && CallerLogModel::GetInstance()->GetCallStatus()) - { - if (CallerLogModel::GetInstance()->GetVolumeScreenStatus() == true) - { - volumeSliderEventListener = VolumeSliderEventListener::GetInstance(); - if (volumeSliderEventListener == nullptr) - { - return; - } - volumeSliderEventListener->ChangeVolume(model); - } - else - { - MainCallingPresenter::GetInstance()->HonrsViewChange(); - CallerLogModel::GetInstance()->SetVolumeScreenStatus(true); +void KeyInputListener::CallVolumeDipSwitchControl(VolumeChangeStatus status) +{ + if (MainCallingPresenter::GetInstance() != nullptr && CallerLogModel::GetInstance()->GetCallStatus()) { + if (CallerLogModel::GetInstance()->GetVolumeScreenStatus() == true) { + volumeSliderEventListener = VolumeSliderEventListener::GetInstance(); + if (volumeSliderEventListener == nullptr) { + return; } + volumeSliderEventListener->ChangeVolume(status); + } else { + MainCallingPresenter::GetInstance()->HonrsViewChange(); + CallerLogModel::GetInstance()->SetVolumeScreenStatus(true); } - if (IsNotifyCallStatus() == true) - { - if (NotificationManager::GetInstance()->GetVolumeScreenStatus() == true) - { - volumeSliderEventListener = VolumeSliderEventListener::GetInstance(); - if (volumeSliderEventListener == nullptr) - { - return; - } - volumeSliderEventListener->ChangeVolume(model); - } - else - { - HonrsViewChange(); - NotificationManager::GetInstance()->SetVolumeScreenStatus(true); + } + if (IsNotifyCallStatus() == true) { + if (NotificationManager::GetInstance()->GetVolumeScreenStatus() == true) { + volumeSliderEventListener = VolumeSliderEventListener::GetInstance(); + if (volumeSliderEventListener == nullptr) { + return; } + volumeSliderEventListener->ChangeVolume(status); + } else { + HonrsViewChange(); + NotificationManager::GetInstance()->SetVolumeScreenStatus(true); } } +} extern "C" { @@ -144,7 +134,7 @@ namespace OHOS // 如果当前页面是音量卡片或正在通话中,则执行音量+操作 if (currentViewId == VIEW_INCOMING_CALL || IsCallingNotify() == true) // 音量卡片 { - CallVolumeDipSwitchControl(1); // 音量+ + CallVolumeDipSwitchControl(VOLUMEUP); // 音量+ } else if (currentViewId != VIEW_MAIN) // 如果当前页面不是主表盘,如果屏幕亮起,则先处理闹钟通知再切换到主表盘页面 { @@ -179,7 +169,7 @@ namespace OHOS // 如果当前页面是音量卡片或正在通话中,则执行音量减操作 if (currentViewId == VIEW_INCOMING_CALL || IsCallingNotify() == true) // 音量卡片 { - CallVolumeDipSwitchControl(0); // 音量- + CallVolumeDipSwitchControl(VOLUMEDOWN); // 音量- } else if (currentViewId != VIEW_MAIN) // 如果当前页面不是主表盘,如果屏幕亮起,则先处理闹钟通知再切换到主表盘页面。 { diff --git a/code/sdk/application/wearable/fd230app/nativeui/main/src/dial/parser/DialBinParser.h b/code/sdk/application/wearable/fd230app/nativeui/main/include/DialBinParser.h similarity index 86% rename from code/sdk/application/wearable/fd230app/nativeui/main/src/dial/parser/DialBinParser.h rename to code/sdk/application/wearable/fd230app/nativeui/main/include/DialBinParser.h index 0a30225cb..dc737236f 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/main/src/dial/parser/DialBinParser.h +++ b/code/sdk/application/wearable/fd230app/nativeui/main/include/DialBinParser.h @@ -22,12 +22,12 @@ #include "components/ui_abstract_progress.h" namespace OHOS { - class DialBinParser { public: static DialBinParser* GetInstance(void); bool UpdateDial(const std::string& file, FILE* fp, DialViewGroup* group); - void* MallocAndReadBuf(FILE* file, uint32_t readSize); + bool GetDialPreviewInfo(FILE* fp, DialPreviewInfo* info); + protected: int32_t ParseDialHeader(FILE* file); int32_t ParserDialStaticImg(FILE* fp); @@ -41,21 +41,21 @@ protected: int32_t ParserDialArcProgress(FILE* fp); int32_t ParserDialVideo(FILE* fp); int32_t ParserDialClick(FILE* fp); - + int32_t ParserDialKaleidoscope(FILE* fp); + private: DialBinParser(); virtual ~DialBinParser(); - + void* MallocAndReadBuf(FILE* file, uint32_t readSize); bool SetProgressType(FILE* fp, UIAbstractProgress* view, DialProgressType data); - static constexpr uint8_t DIAL_BIN_PARSER_FUNC_NUM = 11; + static constexpr uint8_t DIAL_BIN_PARSER_FUNC_NUM = 12; // 12: func max value int32_t (DialBinParser::*funcArray_[DIAL_BIN_PARSER_FUNC_NUM])(FILE*); DialViewGroup* dialGroup_ = nullptr; std::string file_; - uint32_t dirId_ = 0xfef << 20; + uint32_t dirId_ = 0xfef << 20; // 20: offset uint32_t imageOffset_ = 0; - uint32_t pre_ = 0; }; } -#endif \ No newline at end of file +#endif diff --git a/code/sdk/application/wearable/fd230app/nativeui/main/src/dial/parser/DialBinTypes.h b/code/sdk/application/wearable/fd230app/nativeui/main/include/DialBinTypes.h similarity index 77% rename from code/sdk/application/wearable/fd230app/nativeui/main/src/dial/parser/DialBinTypes.h rename to code/sdk/application/wearable/fd230app/nativeui/main/include/DialBinTypes.h index aadaf2181..1f8f49375 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/main/src/dial/parser/DialBinTypes.h +++ b/code/sdk/application/wearable/fd230app/nativeui/main/include/DialBinTypes.h @@ -19,6 +19,18 @@ #include "components/ui_canvas_ext.h" namespace OHOS { +static constexpr uint8_t DIAL_NAME_MAX_LEN = 16; +static constexpr uint8_t DIAL_VERSION_MAX_LEN = 16; +static constexpr uint8_t DIAL_DESCRIPTION_MAX_LEN = 128; +static constexpr uint8_t DIAL_DIGITALIMG_IMG_MAX_NUM = 10; + +struct DialPreviewInfo { + char dialName[DIAL_NAME_MAX_LEN]; + char description[DIAL_DESCRIPTION_MAX_LEN]; + uint32_t imgId; + uint32_t offset; +}; + struct DialRect { int16_t x; int16_t y; @@ -27,12 +39,12 @@ struct DialRect { }; struct DialHeader { - char dialName[16]; + char dialName[DIAL_NAME_MAX_LEN]; int16_t width; int16_t height; - char version[16]; + char version[DIAL_VERSION_MAX_LEN]; uint16_t previewImgId; - char description[128]; + char description[DIAL_DESCRIPTION_MAX_LEN]; uint32_t imageOffset; uint8_t freq; uint8_t dialViewCount; @@ -69,12 +81,11 @@ struct DialOptionImg { uint8_t count; }; -constexpr uint8_t DIGITALIMG_IMG_MAX_NUM = 10; struct DialDigitalImg { uint8_t alignType : 4; uint8_t integerLength : 4; uint8_t decimalPrecision; - uint16_t imgIds[DIGITALIMG_IMG_MAX_NUM]; + uint16_t imgIds[DIAL_DIGITALIMG_IMG_MAX_NUM]; int16_t signImgId; int16_t decimalPointImgId; uint16_t space; @@ -154,5 +165,11 @@ struct DialClick { char bundleName[64]; }; }; + +struct DialKaleidoscope { + uint16_t imgId; + float crownRotateStep; + float animatorRotateStep; +}; } #endif // GRAPHIC_LITE_DIAL_BIN_TYPE_H \ No newline at end of file diff --git a/code/sdk/application/wearable/fd230app/nativeui/main/include/MainModel.h b/code/sdk/application/wearable/fd230app/nativeui/main/include/MainModel.h new file mode 100644 index 000000000..6bc09a099 --- /dev/null +++ b/code/sdk/application/wearable/fd230app/nativeui/main/include/MainModel.h @@ -0,0 +1,59 @@ +/* + * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved. + * Description: MainModel.h + * Author: + * Create: 2021-11-23 + */ + +#ifndef MAIN_MODEL_H +#define MAIN_MODEL_H + +#include +#include "UiConfig.h" + +namespace OHOS { + typedef struct { + CardId id; + const char *cardImg; + } CardInfo; + + typedef struct { + DialId id; + const char *dialName; + const char *dialImg; + uint8_t freq; + } DialInfo; + + typedef struct { + uint8_t dialFlag; + uint8_t dialId; + std::string dialFullName; + } DialSetting; + + class MainModel { + public: + static MainModel &GetInstance(void); + void InitCardSettings(void); + uint8_t GetCardSettingCount(void); + CardId *GetCardSettings(void); + void DeleteCardSetting(uint8_t index); + void AddCardSetting(uint8_t index); + const CardInfo *GetCardInfo(CardId card) const; + const DialInfo *GetDialInfo(DialId dial) const; + void AddDialSetting(const DialSetting &setting); + void InitDialSettings(void); + DialSetting &GetDialSetting(); + private: + void InitDialSettingDefault(void); + MainModel(); + MainModel(const MainModel &); + MainModel &operator=(const MainModel &); + virtual ~MainModel(); + + CardId cardSettings[CARD_SETTING_COUNT_MAX] = { MAX_CARD }; + uint8_t cardSettingCount{0}; + DialSetting dialSetting; + }; +} + +#endif \ No newline at end of file diff --git a/code/sdk/application/wearable/fd230app/nativeui/main/include/MainPresenterSample.h b/code/sdk/application/wearable/fd230app/nativeui/main/include/MainPresenterSample.h index 6d2dc9046..c375d34e8 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/main/include/MainPresenterSample.h +++ b/code/sdk/application/wearable/fd230app/nativeui/main/include/MainPresenterSample.h @@ -15,6 +15,7 @@ #include "KeyInputListener.h" #include "drag_event.h" #include "MainViewSample.h" +#include "MainModel.h" #include "components/ui_swipe_view.h" #include "components/ui_view.h" #include "CompassView.h" @@ -44,13 +45,14 @@ namespace OHOS constexpr uint16_t VERTICAL_STATUS = 1; constexpr uint16_t HORIZONTAL_STATUS = 0; - class MainViewSample; - class MainPresenterSample : public Presenter, public ModelListenerSample, public UIView::OnClickListener, public UISwipeView::OnSwipeListener, public UISwipeView, public CompassPresenter, public UIView::OnLongPressListener - { - public: - MainPresenterSample(); - virtual ~MainPresenterSample(); - static MainPresenterSample *GetInstance(void); +class MainViewSample; +class MainPresenterSample : public Presenter, public ModelListenerSample, + public UIView::OnClickListener, public UISwipeView::OnSwipeListener, + public UIView::OnLongPressListener, public UISwipeView, public CompassPresenter { +public: + MainPresenterSample(); + virtual ~MainPresenterSample(); + static MainPresenterSample *GetInstance(void); void OnStart() override; void OnPause() override; @@ -61,37 +63,29 @@ namespace OHOS bool OnLongPress(UIView &view, const LongPressEvent &event) override; virtual void OnSwipe(UISwipeView &view) override; void SetPage(int8_t id); - void SetTaskPeroid(int page); + void SetTaskPeroid(CardId cardId); void setCallback(ZoomEffect *callback) { callback_ = callback; } - void SetDialPath(std::string filePath) - { - filePath_ = filePath; - } - - std::string GetDialPath() - { - return filePath_; - } - - private: - void ProcessDataNotify(void); - void SetCircleProgress(void); - void SetCompassRotate(void); - KeyInputListener *keyActListener_{nullptr}; - ZoomEffect *callback_{nullptr}; - uint8_t state = UICheckBox::UICheckBoxState::MAX_STATUS_NUM; - int16_t musicCount{0}; - int64_t playerCurrentTime{0}; - int64_t playerMusicDuration{0}; - int64_t playerProgressVlaue{0}; - int8_t entryTimes{1}; - std::string filePath_; - bool isCompassSensorOpened_{false}; - }; + void InitCardSettings(void); + uint8_t GetCardSettingCount(void); + CardId *GetCardSettings(void); + void InitDialSettings(void); + DialSetting& GetDialSetting(); +private: + void ProcessDataNotify(void); + void SetCircleProgress(void); + void SetCompassRotate(void); + KeyInputListener *keyActListener_{nullptr}; + ZoomEffect* callback_{nullptr}; + uint8_t state_ = UICheckBox::UICheckBoxState::MAX_STATUS_NUM; + int64_t playerCurrentTime_{0}; + int64_t playerMusicDuration_{0}; + int64_t playerProgressValue_{0}; + bool isCompassSensorOpened_{false}; +}; } #endif // MAIN_PRESENTER_H diff --git a/code/sdk/application/wearable/fd230app/nativeui/main/include/MainViewSample.h b/code/sdk/application/wearable/fd230app/nativeui/main/include/MainViewSample.h index c193757f6..de9e751ab 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/main/include/MainViewSample.h +++ b/code/sdk/application/wearable/fd230app/nativeui/main/include/MainViewSample.h @@ -20,12 +20,9 @@ #include "ModelListenerSample.h" #include "ScreenModels.h" #include "ActivityWeekView.h" -#include "compass/include/CompassControlView.h" -#if USE_OFFLINE_DIAL +#include "CompassControlView.h" #include "DialViewGroup.h" -#else #include "MainClockView.h" -#endif #include "PlayersView.h" #include "MainPresenterSample.h" #include "HeartRateView.h" @@ -33,6 +30,7 @@ #include "PullUpDownView.h" #include "components/ui_cross_view.h" +#include "SetCardModel.h" #include "heart_blood/include/BloodCardView.h" #include "traing/training_card/include/Training_CardView.h" #include "ApplistCardView.h" @@ -51,6 +49,7 @@ namespace OHOS void OnSetUpView() override; void OnTearDownView() override; void OnStop() override; + UICardPage *InitWatchFacePage(void); UICardPage *InitHeartRatePage(void); UICardPage *InitActivityPage(void); @@ -60,12 +59,10 @@ namespace OHOS UICardPage *InitWeatherPage(void); UICardPage *InitTrainingPage(void); UICardPage *InitApplistPage(void); + void AnimatorStart(int pageIndex); void AnimatorStop(void); - uint16_t GetHorCurrentPage() const - { - return mainSwipeGroup->GetCurrentPageId(UISwipeView::HORIZONTAL); // 0: horizontal; 1: vertical - } + CardId GetHorCurrentCard() const; UIView *GetMainViewGroup(void) const { @@ -82,8 +79,6 @@ namespace OHOS if (mainClockView != nullptr) { SetPage(mainClockView->GetViewIndex()); - mainClockView->ComeBack(); - mainClockView->Invalidate(); } } @@ -94,19 +89,9 @@ namespace OHOS private: PullUpDownView *dropDownView{nullptr}; -#if USE_OFFLINE_DIAL - DialViewGroup *mainClockView{nullptr}; -#else - MainClockView *mainClockView{nullptr}; -#endif - - /* -------------------------------------------------------------------------- */ + UICardPage *mainClockView{nullptr}; MessageCardView *messageView{nullptr}; UILabel *MessageLable = nullptr; - // UIList *Messagelist = nullptr; - // IconAdapter *list1adapter_ = nullptr; - // List *Messagelistdate = nullptr; - /* -------------------------------------------------------------------------- */ ActivityWeekView *activityWeekView{nullptr}; PlayersView *playersView{nullptr}; CompassControlView *compassControlView{nullptr}; @@ -126,6 +111,9 @@ namespace OHOS void VerticalViewInit(void); void VertViewLoad(void); void HorViewLoad(void); + + UICardPage *InitWathOffDial(DialSetting &setting); + UICardPage *InitWathDial(DialSetting &setting); }; } // namespace OHOS #endif // MAIN_VIEW_SAMPLE_H diff --git a/code/sdk/application/wearable/fd230app/nativeui/main/include/VolumeSettingPresenter.h b/code/sdk/application/wearable/fd230app/nativeui/main/include/VolumeSettingPresenter.h index 7daf8e600..f18dac441 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/main/include/VolumeSettingPresenter.h +++ b/code/sdk/application/wearable/fd230app/nativeui/main/include/VolumeSettingPresenter.h @@ -24,11 +24,12 @@ namespace OHOS { typedef enum : uint16_t { VOLUMEPHONE = 1, VOLUMEPLAYERS = 3, + VOLUMEPHONENOTIFY = 4, } VolumeFactor; typedef enum : uint8_t { - VOLUMELOWERS = 0, - VOLUMELEVATED = 1, + VOLUMEDOWN = 0, + VOLUMEUP = 1, VOLUMEDRAG = 2, } VolumeChangeStatus; @@ -41,8 +42,7 @@ public: static VolumeSliderEventListener *GetInstance(); void OnChange(int32_t progress) override; void OnRelease(int32_t progress) override; - void ChangeImage(void); - void ChangeVolume(uint8_t status); + void ChangeVolume(VolumeChangeStatus status); bool OnClick(UIView& view, const ClickEvent& event) override; bool OnDrag(UIView& view, const DragEvent& event) override; void SetPlayerCoefficients(int16_t value); diff --git a/code/sdk/application/wearable/fd230app/nativeui/main/include/VolumeSettingView.h b/code/sdk/application/wearable/fd230app/nativeui/main/include/VolumeSettingView.h index 5248864f0..efdb0d883 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/main/include/VolumeSettingView.h +++ b/code/sdk/application/wearable/fd230app/nativeui/main/include/VolumeSettingView.h @@ -31,10 +31,13 @@ public: bool SetUpVolume(void); UIButton *GetIncreaseButton(void); UIButton *GetDecreaseButton(void); + int get_progress_vlaue() + { + return progress->GetValue(); + } private: VolumeSliderEventListener *listener{nullptr}; UISlider *progress{nullptr}; - UIImageView* VolumeVetor = nullptr; UIButton *increaseButton{nullptr}; UIButton *decreaseButton{nullptr}; int ShowVolume(); diff --git a/code/sdk/application/wearable/fd230app/nativeui/main/include/dial/DialKaleidoscopeView.h b/code/sdk/application/wearable/fd230app/nativeui/main/include/dial/DialKaleidoscopeView.h new file mode 100644 index 000000000..f73c2b817 --- /dev/null +++ b/code/sdk/application/wearable/fd230app/nativeui/main/include/dial/DialKaleidoscopeView.h @@ -0,0 +1,11 @@ +/* + * Copyright (c) @CompanyNameMagicTag. 2024. All rights reserved. + */ + +#ifndef DIAL_KALEIDOSCOPE_VIEW_H +#define DIAL_KALEIDOSCOPE_VIEW_H +#include "components/ui_kaleidoscope_view.h" +namespace OHOS{ +using DialKaleidoscopeView = UIKaleidoscopeView; +} +#endif diff --git a/code/sdk/application/wearable/fd230app/nativeui/main/src/MainModel.cpp b/code/sdk/application/wearable/fd230app/nativeui/main/src/MainModel.cpp new file mode 100644 index 000000000..53a0dd307 --- /dev/null +++ b/code/sdk/application/wearable/fd230app/nativeui/main/src/MainModel.cpp @@ -0,0 +1,203 @@ +/* + * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved. + * Description: MainModel.cpp + * Author: + * Create: 2021-11-23 + */ + +#include "unistd.h" +#include "MainModel.h" +#include "kv_store.h" +#include "securec.h" +#include "wearable_log.h" + +namespace OHOS { + static const int CARD_SETTING_VALUE_LEN = 32; + static const int DIAL_SETTING_VALUE_LEN = 64; + const CardInfo cardInfoMap[] = { + { HEART_RATE, PNG_SET_CARD_HEART }, + { COMPASS, PNG_SET_CARD_COMPASS }, + { ACTIVITY, PNG_SET_CARD_ACTIVITY }, + { MUSIC_PLAYER, PNG_SET_CARD_PLAYER }, + }; + + const DialInfo dialInfoMap[] = { + { DIAL_CLOCK, "扫秒表盘", PNG_SET_DIAL_CLOCK, DEFAULT_TASK_PERIOD }, + }; + + MainModel::MainModel() {} + + MainModel::~MainModel() {} + + MainModel &MainModel::GetInstance() + { + static MainModel instance; + return instance; + } + + const CardInfo *MainModel::GetCardInfo(CardId card) const + { + for (uint8_t i = 0; i < (sizeof(cardInfoMap) / sizeof(cardInfoMap[0])); i++) { + if (card == cardInfoMap[i].id) { + return &cardInfoMap[i]; + } + } + return nullptr; + } + + const DialInfo *MainModel::GetDialInfo(DialId dialId) const + { + for (uint8_t i = 0; i < (sizeof(dialInfoMap) / sizeof(dialInfoMap[0])); i++) { + if (dialId == dialInfoMap[i].id) { + return &dialInfoMap[i]; + } + } + return nullptr; + } + + void MainModel::InitCardSettings(void) + { + char temp[CARD_SETTING_VALUE_LEN] = { 0 }; + int len; + int index = 0; + + memset_s(cardSettings, CARD_SETTING_COUNT_MAX, 0, CARD_SETTING_COUNT_MAX); + len = UtilsGetValue("card_setting", temp, CARD_SETTING_VALUE_LEN); + if (len >= 0) { + /* 读取用户card配置 */ + char *setBuffer = nullptr; + char *setValue = strtok_s(temp, ",", &setBuffer); + while (setValue != nullptr) { + if (index >= CARD_SETTING_COUNT_MAX) { + break; + } + cardSettings[index++] = (CardId)atoi(setValue); + setValue = strtok_s(nullptr, ",", &setBuffer); + } + cardSettingCount = index; + } else { + /* 使用默认card配置 */ + cardSettings[index++] = WATCH_FACE; + cardSettings[index++] = HEART_RATE; + cardSettings[index++] = COMPASS; + cardSettings[index++] = ACTIVITY; + cardSettings[index++] = MUSIC_PLAYER; + cardSettingCount = index; + } + } + + void MainModel::DeleteCardSetting(uint8_t index) + { + char temp[CARD_SETTING_VALUE_LEN] = { 0 }; + for (uint8_t i = 0; i < cardSettingCount; i++) { + if (i == index + 1) { + uint8_t j = i; + for (; j < cardSettingCount - 1; j++) { + cardSettings[j] = cardSettings[j + 1]; + } + cardSettings[j] = MAX_CARD; + cardSettingCount--; + } + } + + for (uint8_t i = 0; i < cardSettingCount; i++) { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "cardSettings[%d] = %d", i, cardSettings[i]); + (void)sprintf_s(temp + strlen(temp), CARD_SETTING_VALUE_LEN, "%d,", cardSettings[i]); + } + (void)UtilsSetValue("card_setting", temp); + } + + void MainModel::AddCardSetting(uint8_t index) + { + char temp[CARD_SETTING_VALUE_LEN] = { 0 }; + if (cardSettingCount >= CARD_SETTING_COUNT_MAX) { + return; + } + for (int i = 0; i < cardSettingCount; i++) { + if (cardSettings[i] == cardInfoMap[index].id) { + return; + } + } + cardSettings[cardSettingCount++] = cardInfoMap[index].id; + for (uint8_t i = 0; i < cardSettingCount; i++) { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "cardSettings[%d] = %d", i, cardSettings[i]); + (void)sprintf_s(temp + strlen(temp), CARD_SETTING_VALUE_LEN, "%d,", cardSettings[i]); + } + (void)UtilsSetValue("card_setting", temp); + } + + uint8_t MainModel::GetCardSettingCount(void) + { + return cardSettingCount; + } + + CardId *MainModel::GetCardSettings(void) + { + return cardSettings; + } + + void MainModel::InitDialSettingDefault(void) + { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "InitDialSettingDefault"); + dialSetting.dialFlag = 0; + dialSetting.dialId = DIAL_CLOCK; + dialSetting.dialFullName = ""; + } + + void MainModel::AddDialSetting(const DialSetting &setting) + { + std::string tmp; + tmp += std::to_string(setting.dialFlag); + tmp += ","; + tmp += std::to_string(setting.dialId); + tmp += ","; + tmp += setting.dialFullName; + tmp += ","; + (void)UtilsSetValue("dial_setting", tmp.c_str()); + } + + void MainModel::InitDialSettings(void) + { + char temp[DIAL_SETTING_VALUE_LEN] = { 0 }; + int len; + len = UtilsGetValue("dial_setting", temp, DIAL_SETTING_VALUE_LEN); + if (len >= 0) { + char *setBuffer = nullptr; + char *setValue = strtok_s(temp, ",", &setBuffer); + if (setValue != nullptr) { + dialSetting.dialFlag = atoi(setValue); + } else { + InitDialSettingDefault(); + return; + } + + setValue = strtok_s(nullptr, ",", &setBuffer); + if (setValue != nullptr) { + dialSetting.dialId = atoi(setValue); + } else { + InitDialSettingDefault(); + return; + } + + setValue = strtok_s(nullptr, ",", &setBuffer); + if (setValue != nullptr) { + dialSetting.dialFullName = setValue; + if (!((dialSetting.dialFullName.length() > 0) && + (access(dialSetting.dialFullName.c_str(), F_OK) == 0))) { + InitDialSettingDefault(); + return; + } + } else { + InitDialSettingDefault(); + return; + } + } else { + InitDialSettingDefault(); + } + } + + DialSetting& MainModel::GetDialSetting() + { + return dialSetting; + } +} \ No newline at end of file diff --git a/code/sdk/application/wearable/fd230app/nativeui/main/src/MainPresenterSample.cpp b/code/sdk/application/wearable/fd230app/nativeui/main/src/MainPresenterSample.cpp index 7d451916e..c0731e932 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/main/src/MainPresenterSample.cpp +++ b/code/sdk/application/wearable/fd230app/nativeui/main/src/MainPresenterSample.cpp @@ -84,7 +84,7 @@ namespace OHOS void MainPresenterSample::OnStop(void) { - if (entryTimes == 0) + if (isCompassSensorOpened_) { CompassModel::GetInstance()->CloseCompassSensor(); } @@ -96,20 +96,13 @@ namespace OHOS keyActListener_ = nullptr; } } - // 长按进入切换表盘页面 - bool MainPresenterSample::OnLongPress(UIView &view, const LongPressEvent &event) - { - UNUSED(event); - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "OnLongPress OnLongPress"); - NativeAbility::GetInstance().ChangeSlice(VIEW_DIALUPDATE); - return true; - } + bool MainPresenterSample::OnClick(UIView &view, const ClickEvent &event) { UNUSED(event); WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "StatusButtonClickListener: %s", view.GetViewId()); string curViewId = view.GetViewId(); -#if 0 + UIImageView *imgView = static_cast(&view); if (HealthModel::GetInstance() == nullptr) { @@ -118,35 +111,29 @@ namespace OHOS } if (curViewId == DROPDOWN_CLICK_DONOTDISTURB) { - if (HealthModel::GetInstance()->GetDntDistStatus() == 0) - { - ScreenModels::GetInstance()->LoadAppImages(DROPDOWN_IAMGES, imgView, DROPDOWN_DROPDOWN_DN_DISTURB_B); - HealthModel::GetInstance()->UpdateDntDistStatus(1); - } - else - { - ScreenModels::GetInstance()->LoadAppImages(DROPDOWN_IAMGES, imgView, DROPDOWN_DROPDOWN_DN_DISTURB); - HealthModel::GetInstance()->UpdateDntDistStatus(0); - } +#if 0 + if (HealthModel::GetInstance()->GetDntDistStatus() == 0) { + ScreenModels::GetInstance()->LoadAppImages(DROPDOWN_IAMGES, imgView, DROPDOWN_DROPDOWN_DN_DISTURB_B); + HealthModel::GetInstance()->UpdateDntDistStatus(1); + } else { + ScreenModels::GetInstance()->LoadAppImages(DROPDOWN_IAMGES, imgView, DROPDOWN_DROPDOWN_DN_DISTURB); + HealthModel::GetInstance()->UpdateDntDistStatus(0); } - if (curViewId == DROPDOWN_CLICK_BRIGHTENSCREEN) - { - if (HealthModel::GetInstance()->GetBriScrStatus() == 0) - { - ScreenModels::GetInstance()->LoadAppImages(DROPDOWN_IAMGES, imgView, DROPDOWN_DROPDOWN_BRI_SCREEN_B); - HealthModel::GetInstance()->UpdateBriScrStatus(1); - int32_t enable = 0; - SendMsgToUIService(SCREEN_OFF_ENABLE_TO_UI, 0, &enable, sizeof(int32_t)); - } - else - { - ScreenModels::GetInstance()->LoadAppImages(DROPDOWN_IAMGES, imgView, DROPDOWN_DROPDOWN_BRI_SCREEN); - HealthModel::GetInstance()->UpdateBriScrStatus(0); - int32_t enable = 1; - SendMsgToUIService(SCREEN_OFF_ENABLE_TO_UI, 0, &enable, sizeof(int32_t)); - } + } + if (curViewId == DROPDOWN_CLICK_BRIGHTENSCREEN) { + if (HealthModel::GetInstance()->GetBriScrStatus() == 0) { + ScreenModels::GetInstance()->LoadAppImages(DROPDOWN_IAMGES, imgView, DROPDOWN_DROPDOWN_BRI_SCREEN_B); + HealthModel::GetInstance()->UpdateBriScrStatus(1); + int32_t enable = 0; + SendMsgToUIService(SCREEN_OFF_ENABLE_TO_UI, 0, &enable, sizeof(int32_t)); + } else { + ScreenModels::GetInstance()->LoadAppImages(DROPDOWN_IAMGES, imgView, DROPDOWN_DROPDOWN_BRI_SCREEN); + HealthModel::GetInstance()->UpdateBriScrStatus(0); + int32_t enable = 1; + SendMsgToUIService(SCREEN_OFF_ENABLE_TO_UI, 0, &enable, sizeof(int32_t)); } #endif + } if (g_jumpView.count(curViewId) != 0) { NativeAbility::GetInstance().ChangeSlice(g_jumpView[curViewId]); @@ -154,6 +141,24 @@ namespace OHOS return true; } + bool MainPresenterSample::OnLongPress(UIView &view, const LongPressEvent &event) + { + UNUSED(event); + UNUSED(view); + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MainPresenterSample OnLongPress"); + uint8_t cardId = view_->GetHorCurrentCard(); + if (cardId != WATCH_FACE) + { + SetCardModel::GetInstance().SetSelectedCard(cardId); + NativeAbility::GetInstance().ChangeSlice(VIEW_SET_CARD); + } + else + { + NativeAbility::GetInstance().ChangeSlice(VIEW_SET_DIAL); + } + return true; + } + void MainPresenterSample::SetPage(int8_t id) { if (view_ != nullptr) @@ -162,22 +167,27 @@ namespace OHOS } } - void MainPresenterSample::SetTaskPeroid(int page) + void MainPresenterSample::SetTaskPeroid(CardId cardId) { - if (page == COMPASS) + if (cardId == COMPASS) { PresenterTask::GetInstance()->SetPeriod(DEFAULT_TASK_PERIOD); } - else if (page == WATCH_FACE) + else if (cardId == WATCH_FACE) { -#if USE_OFFLINE_DIAL - uint32_t time = dynamic_cast(view_->GetViewById(WATCH_FACE))->GetPeriod(); -#else - uint32_t time = DEFAULT_TASK_PERIOD; -#endif + uint32_t time; + DialSetting &setting = GetDialSetting(); + if (setting.dialFlag) + { + time = dynamic_cast(view_->GetViewById(WATCH_FACE))->GetPeriod(); + } + else + { + time = DEFAULT_TASK_PERIOD; + } PresenterTask::GetInstance()->SetPeriod(time); } - else if (page == MUSIC_PLAYER) + else if (cardId == MUSIC_PLAYER) { PresenterTask::GetInstance()->SetPeriod(PLAYER_PERIOD); } @@ -189,31 +199,28 @@ namespace OHOS void MainPresenterSample::OnSwipe(UISwipeView &view) { -#if TESTCHECK - MemCheck::GetInstance()->DumpMemInfo(); - printf("total size:%d\n", view_->GetHorCurrentPage()); -#endif UNUSED(view); - int page = view_->GetHorCurrentPage(); + CardId cardId = view_->GetHorCurrentCard(); callback_->OnSwipe(view); - SetTaskPeroid(page); - if (page == COMPASS) + SetTaskPeroid(cardId); + if (cardId == COMPASS) { if (!isCompassSensorOpened_) { CompassModel::GetInstance()->OpenCompassSensor(); isCompassSensorOpened_ = true; } - else if (entryTimes == 0) - { - CompassModel::GetInstance()->CloseCompassSensor(); - entryTimes++; - } - - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "OnSwipe OnSwipe"); - return; } + else if (isCompassSensorOpened_) + { + CompassModel::GetInstance()->CloseCompassSensor(); + isCompassSensorOpened_ = false; + } + + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "OnSwipe OnSwipe"); + return; } + void MainPresenterSample::ProcessDataNotify(void) { HealthMsg healthMsg; @@ -243,75 +250,82 @@ namespace OHOS { return; } - state = playersView->GetPlayerButtonState(); - if (state == UICheckBox::UICheckBoxState::SELECTED) + state_ = playersView->GetPlayerButtonState(); + if (state_ == UICheckBox::UICheckBoxState::SELECTED) { - PlayersModel::GetInstance()->GetPlayerCtr()->GetCurrentTime(playerCurrentTime); - PlayersModel::GetInstance()->GetDuration(playerMusicDuration); - if (playerMusicDuration != 0) + int32_t playerState; + PlayersModel::GetInstance()->GetPlayerCtr()->GetPlayerState(playerState); + if (playerState != PLAYER_STARTED) + { + playersView->SetPlayerButtonState(UICheckBox::UICheckBoxState::UNSELECTED); + return; + } + PlayersModel::GetInstance()->GetPlayerCtr()->GetCurrentTime(playerCurrentTime_); + PlayersModel::GetInstance()->GetDuration(playerMusicDuration_); + if (playerMusicDuration_ != 0) { - playerProgressVlaue = (playerCurrentTime * PROGRESS_PERCENTAGE) / playerMusicDuration; - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "playerProgressVlaue %lld", playerProgressVlaue); + playerProgressValue_ = (playerCurrentTime_ * PROGRESS_PERCENTAGE) / playerMusicDuration_; + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "playerProgressValue_ %lld", playerProgressValue_); } else { - playerProgressVlaue = 100; // 100: max progress value + playerProgressValue_ = 100; // 100: max progress value } - PlayersModel::GetInstance()->SetCircleProgress(playerProgressVlaue); - PlayersPresenter::GetInstance()->SetPlaybackProgress(playerProgressVlaue); + PlayersModel::GetInstance()->SetCircleProgress(playerProgressValue_); + PlayersPresenter::GetInstance()->SetPlaybackProgress(playerProgressValue_); } } void MainPresenterSample::SetCompassRotate() { - if (CompassCalibrationView::GetInstance() == nullptr) - { - return; - } - if (CompassView::GetInstance() == nullptr) - { - return; - } - - uint8_t status = CompassModel::GetInstance()->GetCalibrationStatus(); - if (status == 1) + bool status = CompassModel::GetInstance()->GetCalibrationStatus(); + dynamic_cast(view_->GetViewById(COMPASS))->SetCalibrationView(status); + if (!status) { - CompassCalibrationView::GetInstance()->SetVisible(true); - CompassView::GetInstance()->SetVisible(false); - } - else - { - CompassCalibrationView::GetInstance()->SetVisible(false); - CompassView::GetInstance()->SetVisible(true); DetermineToRotate(); } } - void MainPresenterSample::Notify(void) - { - if (view_->GetHorCurrentPage() == COMPASS) - { - // WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "COMPASS"); - SetCompassRotate(); - } - else if (view_->GetHorCurrentPage() == MUSIC_PLAYER) - { - // WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "MUSIC_PLAYER"); - SetCircleProgress(); - } - else if (view_->GetHorCurrentPage() == WATCH_FACE) - { -#if USE_OFFLINE_DIAL +void MainPresenterSample::Notify(void) +{ + CardId cardId = view_->GetHorCurrentCard(); + if (cardId == COMPASS) { + SetCompassRotate(); + } else if (cardId == MUSIC_PLAYER) { + SetCircleProgress(); + } else if (cardId == WATCH_FACE) { + DialSetting &setting = GetDialSetting(); + if (setting.dialFlag) { DialModelTime::GetInstance()->UpdateTime(); - dynamic_cast(view_->GetViewById(WATCH_FACE))->UpdateViewsByPeriodicUpdateData(); -#else - dynamic_cast(view_->GetViewById(WATCH_FACE))->UpdateTime(); -#endif - } - else if (view_->GetHorCurrentPage() == BLOODOXGEN) - { - // WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BloodCardView"); + dynamic_cast(view_->GetViewById(WATCH_FACE))->UpdateViewsByPeriodicUpdateData(); + } else { + dynamic_cast(view_->GetViewById(WATCH_FACE))->UpdateTime(); } } +} + + void MainPresenterSample::InitCardSettings(void) + { + MainModel::GetInstance().InitCardSettings(); + } + + uint8_t MainPresenterSample::GetCardSettingCount(void) + { + return MainModel::GetInstance().GetCardSettingCount(); + } + + CardId *MainPresenterSample::GetCardSettings(void) + { + return MainModel::GetInstance().GetCardSettings(); + } + + void MainPresenterSample::InitDialSettings(void) + { + return MainModel::GetInstance().InitDialSettings(); + } + DialSetting &MainPresenterSample::GetDialSetting() + { + return MainModel::GetInstance().GetDialSetting(); + } } \ No newline at end of file diff --git a/code/sdk/application/wearable/fd230app/nativeui/main/src/MainViewSample.cpp b/code/sdk/application/wearable/fd230app/nativeui/main/src/MainViewSample.cpp index 687f8a245..a031c0ac5 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/main/src/MainViewSample.cpp +++ b/code/sdk/application/wearable/fd230app/nativeui/main/src/MainViewSample.cpp @@ -26,7 +26,7 @@ namespace OHOS UICardPage *(MainViewSample::*func)(void); }; - static const MainViewMapper PageMapper[] = { + static const MainViewMapper CardMapper[] = { {WATCH_FACE, &MainViewSample::InitWatchFacePage}, {HEART_RATE, &MainViewSample::InitHeartRatePage}, {BLOODOXGEN, &MainViewSample::InitBloodOxygenPage}, @@ -35,9 +35,7 @@ namespace OHOS {WEATHER, &MainViewSample::InitWeatherPage}, {MUSIC_PLAYER, &MainViewSample::InitMusicPlayerPage}, {ACTIVITY, &MainViewSample::InitActivityPage}, -#if 0 - {APPLIST,&MainViewSample::InitApplistPage} -#endif + }; MainViewSample::MainViewSample() @@ -145,10 +143,13 @@ namespace OHOS delete mainSwipeGroup; mainSwipeGroup = nullptr; } - - g_pMainView = nullptr; + if (callback != nullptr) + { + delete callback; + callback = nullptr; + g_pMainView = nullptr; + } } - MainViewSample *MainViewSample::GetInstance(void) { return g_pMainView; @@ -178,14 +179,15 @@ namespace OHOS return; } } + HorizontalViewInit(); HorViewLoad(); VerticalViewInit(); VertViewLoad(); mainSwipeGroup->SetPosition(0, 0, Screen::GetInstance().GetWidth(), Screen::GetInstance().GetHeight()); - mainSwipeGroup->SetAnimatorTime(10); // 50: animator drag time(ms); + mainSwipeGroup->SetAnimatorTime(50); // 50: animator drag time(ms); mainSwipeGroup->SetLoopState(true); - mainSwipeGroup->EnableScreenCap(true); // 屏幕截图展示,取消使用实时绘制 + mainSwipeGroup->EnableScreenCap(true); mainSwipeGroup->RegisterSwipeCallback(callback); SwitchToClockPage(); SetContainerView(mainSwipeGroup); @@ -194,40 +196,56 @@ namespace OHOS bool MainViewSample::HorizontalViewInit(void) { WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MainViewSample::HorizontalViewInit"); - UISwipeView::OnSwipeListener *listener = nullptr; - - for (int16_t i = 0; i < MAX_CARD; i++) - { - recordCard[i] = (this->*(PageMapper[i].func))(); - if (recordCard[i] == nullptr) + presenter_->InitDialSettings(); + presenter_->InitCardSettings(); + uint8_t cardSettingNum = presenter_->GetCardSettingCount(); + CardId *cardSettings = presenter_->GetCardSettings(); + uint8_t cardMapNumber = sizeof(CardMapper) / sizeof(CardMapper[0]); + for (int16_t i = 0; i < cardSettingNum; i++) + { + for (uint8_t j = 0; j < cardMapNumber; j++) { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "MainViewSample:: recordCard %d error", i); - return false; + if (cardSettings[i] == CardMapper[j].id) + { + recordCard[j] = (this->*(CardMapper[j].func))(); + if (recordCard[j] == nullptr) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, + "MainViewSample:: recordCard %d error", j); + return false; + } + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, + "MainViewSample:: recordCard[%d]:%p", j, recordCard[j]); + break; + } } - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MainViewSample:: recordCard[%d]:%p", i, recordCard[i]); } - - listener = static_cast(MainPresenterSample::GetInstance()); - if (listener == nullptr) - { - return false; - } - MainPresenterSample::GetInstance()->setCallback(callback); - mainSwipeGroup->SetOnSwipeListener(listener); + presenter_->setCallback(callback); + mainSwipeGroup->SetOnSwipeListener(presenter_); + mainSwipeGroup->SetOnLongPressListener(presenter_); WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MainViewSample::InitPage over"); return true; } void MainViewSample::HorViewLoad(void) { - for (int16_t i = 0; i < MAX_CARD; i++) + uint8_t cardSettingNum = presenter_->GetCardSettingCount(); + CardId *cardSettings = presenter_->GetCardSettings(); + for (int16_t i = 0; i < cardSettingNum; i++) { - mainSwipeGroup->HorAdd(recordCard[i]); + CardId cardId = cardSettings[i]; + if (recordCard[cardId] != nullptr) + { + mainSwipeGroup->HorAdd(recordCard[cardId]); + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MainViewSample:: HorViewLoad cardid = %d ViewIndex = %d", + cardId, recordCard[cardId]->GetViewIndex()); + } } } void MainViewSample::VerticalViewInit(void) { +#ifdef FD230 dropDownView = new PullUpDownView(); if (dropDownView == nullptr) { @@ -238,7 +256,6 @@ namespace OHOS dropDownView->SetViewId("dropDownView"); dropDownView->SetPosition(0, 0, Screen::GetInstance().GetWidth(), Screen::GetInstance().GetHeight()); dropDownView->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT); -#if 1 messageView = new MessageCardView(); if (messageView == nullptr) { @@ -259,43 +276,12 @@ namespace OHOS MessageLable->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 30); messageView->Add(MessageLable); /* -------------------------------------------------------------------------- */ - messageView->SetViewId("messageView"); messageView->SetPosition(0, 0, Screen::GetInstance().GetWidth(), Screen::GetInstance().GetHeight()); messageView->PreLoad(); messageView->SetDraggable(false); messageView->SetIntercept(true); messageView->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT); -#endif -/* -------------------------------------------------------------------------- */ -#if 0 - messageView = new UICardPage(); - if (messageView == nullptr) - { - { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "messageView new fail"); - return; - } - } - messageView->SetPosition(0, 0); - messageView->SetWidth(Screen::GetInstance().GetWidth()); - messageView->SetHeight(Screen::GetInstance().GetHeight()); - messageView->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT); - messageView->SetViewId("messageView"); - messageView->SetTouchable(true); - messageView->SetIntercept(true); - MessageLable = new UILabel(); - if (MessageLable == nullptr) - { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "messageLable new fail"); - return; - } - MessageLable->SetPosition(MESLABLE_X_TMP, MESLABLE_Y_TMP, MESLABLE_WIDTH_TMP, MESLABLE_HEIGHT_TMP); - MessageLable->SetText("无消息"); - MessageLable->SetAlign(TEXT_ALIGNMENT_CENTER); - MessageLable->SetFont(DEFAULT_VECTOR_FONT_FILENAME, FONT_SIZE_TMP); - MessageLable->SetStyle(STYLE_BACKGROUND_COLOR, OPA_TRANSPARENT); - messageView->Add(MessageLable); #endif } @@ -305,23 +291,19 @@ namespace OHOS mainSwipeGroup->VerAdd(messageView, UICrossView::VPage::DOWN_PAGE); WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MainViewSample::PullViewLoad::Pull View Load complete"); } - void MainViewSample::OnSetUpView() { WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MainViewSample::OnSetUpView"); View::OnSetUpView(); - // show timerView Draw(); } - void MainViewSample::OnTearDownView() { WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MainViewSample::OnTearDownView"); View::OnTearDownView(); return; } - void MainViewSample::OnStop() { WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MainViewSample::OnStop"); @@ -333,50 +315,42 @@ namespace OHOS RootView::GetInstance()->RemoveAll(); return; } - + UICardPage *MainViewSample::InitWathOffDial(DialSetting &setting) + { + DialViewGroup *dial = new DialViewGroup(); + dial->SetDial(setting.dialFullName); + return dial; + } + UICardPage *MainViewSample::InitWathDial(DialSetting &setting) + { + switch (setting.dialId) + { + case DIAL_CLOCK: + return new MainClockView(); + default: + return nullptr; + } + } UICardPage *MainViewSample::InitWatchFacePage(void) { -#if USE_OFFLINE_DIAL - mainClockView = new DialViewGroup(); -#if 0 - std::string filePath = dynamic_cast(presenter_)->GetDialPath(); - if (filePath.size() == 0) + DialSetting &setting = presenter_->GetDialSetting(); + if (setting.dialFlag) { - filePath = RES_PATH "/dials/Dynamic_cat.bin"; + mainClockView = InitWathOffDial(setting); + } + else + { + mainClockView = InitWathDial(setting); } -#endif - uint8_t fileid = DialUpdateModel::GetInstance()->GetDialConfigPath(); - std::string filePath = dialInfo_1[fileid].dialPath; - mainClockView->SetDial(filePath); -#else - mainClockView = new MainClockView(); -#endif if (mainClockView == nullptr) { WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "MainClockView new fail"); return nullptr; } - - mainClockView->SetStyle(STYLE_BACKGROUND_OPA, OPA_OPAQUE); - mainClockView->SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full); - UIView::OnLongPressListener *buttonLongPress = static_cast(MainPresenterSample::GetInstance()); - mainClockView->SetOnLongPressListener(buttonLongPress); - return mainClockView; } - UICardPage *MainViewSample::InitHeartRatePage(void) - { - heartRateView = new HeartRateView(); - if (heartRateView == nullptr) - { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "heartRateView new fail"); - return nullptr; - } - return heartRateView; - } - // 主界面音乐界面 UICardPage *MainViewSample::InitMusicPlayerPage(void) { @@ -432,21 +406,16 @@ namespace OHOS } return weatherControlView; } - void MainViewSample::SetPage(int16_t page) - { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SetPage is %d", page); - if (mainSwipeGroup != nullptr) - { - mainSwipeGroup->SetHorCurrentPage(page); - // 刷新 - OHOS::UISwipeView swipe; - mainSwipeGroup->OnSwipe(swipe); - } - if (presenter_ != nullptr) + UICardPage *MainViewSample::InitHeartRatePage(void) + { + heartRateView = new HeartRateView(); + if (heartRateView == nullptr) { - presenter_->SetTaskPeroid(page); + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "heartRateView new fail"); + return nullptr; } + return heartRateView; } // 运动界面 UICardPage *MainViewSample::InitActivityPage(void) @@ -459,12 +428,27 @@ namespace OHOS } return activityWeekView; } - bool MainViewSample::IsMainClockPage(void) + + void MainViewSample::SetPage(int16_t page) { - // mainSwipeGroup->GetCurrentPageView(1) == dropDownView || mainSwipeGroup->GetCurrentPageView(1) == messageView - if (mainSwipeGroup->GetCurrentPageId(0) == WATCH_FACE && mainSwipeGroup->GetCurrentPageId(1) == 1) + if (mainSwipeGroup != nullptr) { - // 0: horizontal; 1: vertical + mainSwipeGroup->SetHorCurrentPage(page); + } + + if (presenter_ != nullptr) + { + CardId *cardSettings = presenter_->GetCardSettings(); + /* page 与CardId 没有对应关系,需要一次转换 */ + presenter_->SetTaskPeroid(cardSettings[page]); + } + } + + bool MainViewSample::IsMainClockPage(void) + { + if (mainSwipeGroup->GetCurrentPageId(0) == mainClockView->GetViewIndex() && + mainSwipeGroup->GetCurrentPageId(1) == 1) + { // 0: horizontal; 1: vertical return true; } else @@ -472,4 +456,13 @@ namespace OHOS return false; } } + + CardId MainViewSample::GetHorCurrentCard() const + { + CardId *cardSettings = presenter_->GetCardSettings(); + int pageId = mainSwipeGroup->GetCurrentPageId(UISwipeView::HORIZONTAL); // 0: horizontal; 1: vertical + /* pageId 与CardId 没有对应关系,需要一次转换 */ + return cardSettings[pageId]; + } + } diff --git a/code/sdk/application/wearable/fd230app/nativeui/main/src/VolumeSettingPresenter.cpp b/code/sdk/application/wearable/fd230app/nativeui/main/src/VolumeSettingPresenter.cpp index c83ba6b3d..88a3091bf 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/main/src/VolumeSettingPresenter.cpp +++ b/code/sdk/application/wearable/fd230app/nativeui/main/src/VolumeSettingPresenter.cpp @@ -15,8 +15,16 @@ #include "CallerLogModel.h" #include "bts_avrcp_controller.h" #include "bts_avrcp_target.h" +#include "notification_manager.h" +#include "BluetoothHeadsetEvent.h" +#include "bts_avrcp_controller.h" namespace OHOS { + +#ifdef __cplusplus +extern "C" { +#endif + static VolumeSliderEventListener *g_pVolumeSliderEventListener = nullptr; constexpr int16_t SOUND_CHANGE = 10; @@ -45,51 +53,18 @@ bool VolumeSliderEventListener::OnClick(UIView& view, const ClickEvent& event) WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "OnClick OnClick"); if (strcmp(view.GetViewId(), INCREASE_BUTTON) == 0) { WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "GetIncreaseButton OnClick"); - ChangeVolume(VOLUMELEVATED); + ChangeVolume(VOLUMEUP); } else if (strcmp(view.GetViewId(), DECREASE_BUTTON) == 0) { WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "GetDecreaseButton OnClick"); - ChangeVolume(VOLUMELOWERS); + ChangeVolume(VOLUMEDOWN); } else if (strcmp(view.GetViewId(), VOLUME_PROGRESS) == 0) { - ChangeImage(); + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "GetDragButton OnClick"); ChangeVolume(VOLUMEDRAG); } return true; } -void VolumeSliderEventListener::ChangeImage() -{ - ImageInfo *image; - VolumeSettingView *volumeSettingView = VolumeSettingView::GetInstance(); - if (volumeSettingView == nullptr) { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ChangeImage:volumeSettingView new fail"); - return; - } - UISlider *progress = volumeSettingView->GetProgress(); - if (progress == nullptr) { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ChangeImage:progress new fail"); - return; - } - UIButton *decrease = volumeSettingView->GetDecreaseButton(); - if (decrease == nullptr) { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ChangeImage:decrease new fail"); - return; - } - - volumeSettingView->sounding = progress->GetValue(); - if (volumeSettingView->sounding == 0) { - image = ImageCacheManager::GetInstance().LoadOneInMultiRes(PLAYER_MUTE_BUTTON, PLAYER_IAMGES); - decrease->SetImageSrc(image, image); - // 刷新UI - decrease->Invalidate(); - } else { - image = ImageCacheManager::GetInstance().LoadOneInMultiRes(PLAYER_DECREASE_BUTTON, PLAYER_IAMGES); - decrease->SetImageSrc(image, image); - // 刷新UI - decrease->Invalidate(); - } -} - -void VolumeSliderEventListener::ChangeVolume(uint8_t status) +void VolumeSliderEventListener::ChangeVolume(VolumeChangeStatus status) { ImageInfo *image; VolumeSettingView *volumeSettingView = VolumeSettingView::GetInstance(); @@ -109,7 +84,7 @@ void VolumeSliderEventListener::ChangeVolume(uint8_t status) } preSound = volumeSettingView->sounding; - if (status == 1) { + if (status == VOLUMEUP) { volumeSettingView->sounding = progress->GetValue() + SOUND_CHANGE; if (volumeSettingView->sounding > VOLUME_MAX) { volumeSettingView->sounding = VOLUME_MAX; @@ -118,39 +93,71 @@ void VolumeSliderEventListener::ChangeVolume(uint8_t status) decrease->SetImageSrc(image, image); // 刷新UI decrease->Invalidate(); - } else if (status == 0) { + progress->SetValue(volumeSettingView->sounding); + } else if (status == VOLUMEDOWN) { volumeSettingView->sounding = progress->GetValue() - SOUND_CHANGE; if (volumeSettingView->sounding < VOLUME_MIN) { volumeSettingView->sounding = VOLUME_MIN; } + if (volumeSettingView->sounding == VOLUME_MIN && + (playerCoefficients == VOLUMEPHONE || playerCoefficients == VOLUMEPHONENOTIFY)) { + // 通话场景音量不能设置为0 + volumeSettingView->sounding = SOUND_CHANGE; + } if ((volumeSettingView->sounding == 0) && (preSound != 0)) { image = ImageCacheManager::GetInstance().LoadOneInMultiRes(PLAYER_MUTE_BUTTON, PLAYER_IAMGES); decrease->SetImageSrc(image, image); // 刷新UI decrease->Invalidate(); } + progress->SetValue(volumeSettingView->sounding); + } else if (status == VOLUMEDRAG) { + volumeSettingView->sounding = progress->GetValue(); + if (volumeSettingView->sounding == VOLUME_MIN && + (playerCoefficients == VOLUMEPHONE || playerCoefficients == VOLUMEPHONENOTIFY)) { + // 通话场景音量不能设置为0 + volumeSettingView->sounding = SOUND_CHANGE; + progress->SetValue(volumeSettingView->sounding); + } + if (volumeSettingView->sounding == 0) { + image = ImageCacheManager::GetInstance().LoadOneInMultiRes(PLAYER_MUTE_BUTTON, PLAYER_IAMGES); + decrease->SetImageSrc(image, image); + // 刷新UI + decrease->Invalidate(); + } else { + image = ImageCacheManager::GetInstance().LoadOneInMultiRes(PLAYER_DECREASE_BUTTON, PLAYER_IAMGES); + decrease->SetImageSrc(image, image); + // 刷新UI + decrease->Invalidate(); + } } - progress->SetValue(volumeSettingView->sounding); + if (playerCoefficients == VOLUMEPLAYERS) { BtAndLocalVolumeSet(volumeSettingView->sounding); } - if (playerCoefficients == VOLUMEPHONE) { + if (playerCoefficients == VOLUMEPHONE || playerCoefficients == VOLUMEPHONENOTIFY) { unsigned char volumeValue; volumeValue = (unsigned char) ((double) (volumeSettingView->sounding * CALL_VOLUME_MAX) / (VOLUME_MAX - VOLUME_MIN)); // 音量转换 SetSpeakerVolume(volumeValue); } } +extern BtAvrcpTgInf g_avrcp_srv_inf; void VolumeSliderEventListener::BtAndLocalVolumeSet(int16_t sounding) { - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BtAndLocalVolumeSet %d", sounding); - AudioManager::GetInstance().SetVolume(AUDIO_STREAM_MUSIC, sounding); // 本地音量设置 + WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "BtAndLocalVolumeSet %d", sounding); + if (g_avrcp_srv_inf.avrcp_srv_conn_stat == PROFILE_STATE_CONNECTED) { + uint8_t volume = sounding * AVRCP_ABSOLUTE_VOLUME_PERCENTAGE_100 / 100; // 100:本地音量最大值 + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "volume 0x%x", volume); + (void)avrcp_ct_set_absolute_volume(&(g_avrcp_srv_inf.bd_addr), volume); // 手表音量设置同步远端BT音量 + } else { + AudioManager::GetInstance().SetVolume(AUDIO_STREAM_MUSIC, sounding); // 本地音量设置 + } } void VolumeSliderEventListener::OnRelease(int32_t value) { WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "OnRelease %d", value); - ChangeImage(); ChangeVolume(VOLUMEDRAG); } @@ -162,7 +169,6 @@ void VolumeSliderEventListener::SetPlayerCoefficients(int16_t value) void VolumeSliderEventListener::OnChange(int32_t value) { WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "OnChange %d", value); - ChangeImage(); ChangeVolume(VOLUMEDRAG); } @@ -197,9 +203,16 @@ bool VolumeSliderEventListener::OnDrag(UIView& view, const DragEvent& event) mainCallView->GetCallingGroup()->SetVisible(true); CallerLogModel::GetInstance()->SetVolumeScreenStatus(false); } + if (playerCoefficients == VOLUMEPHONENOTIFY) { + volumeSettingView->SetVisible(false); + NotificationManager::GetInstance()->SetVolumeScreenStatus(false); + } RootView::GetInstance()->Invalidate(); } } return true; } -} \ No newline at end of file +#ifdef __cplusplus +} +#endif +} diff --git a/code/sdk/application/wearable/fd230app/nativeui/main/src/VolumeSettingView.cpp b/code/sdk/application/wearable/fd230app/nativeui/main/src/VolumeSettingView.cpp index 042b9a582..4276373a0 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/main/src/VolumeSettingView.cpp +++ b/code/sdk/application/wearable/fd230app/nativeui/main/src/VolumeSettingView.cpp @@ -16,10 +16,10 @@ static constexpr uint16_t BUTTON_Y = 0; static constexpr uint16_t BUTTON_Y2 = 363; static constexpr uint16_t BUTTON_WIDTH = 90; static constexpr uint16_t BUTTON_HEIGHT = 90; -static constexpr uint16_t SLIDER_X = 167; -static constexpr uint16_t SLIDER_Y = 77; -static constexpr uint16_t SLIDER_WIDTH = 130; -static constexpr uint16_t SLIDER_HEIGHT = 310; +static constexpr uint16_t SLIDER_X = 207; +static constexpr uint16_t SLIDER_Y = 90; +static constexpr uint16_t SLIDER_WIDTH = 40; +static constexpr uint16_t SLIDER_HEIGHT = 274; constexpr uint16_t VOLUME_OK = 0; constexpr int16_t VOLUME_ERROR = (-1); @@ -77,23 +77,6 @@ bool VolumeSettingView::SetUpVolume(void) progress->SetViewId(VOLUME_PROGRESS); progress->SetRange(VOLUME_MAX, VOLUME_MIN); - progress->SetStyle(STYLE_BORDER_RADIUS, 100); - progress->SetBackgroundStyle(STYLE_LINE_CAP, CapType::CAP_ROUND); - progress->SetForegroundStyle(STYLE_LINE_CAP,CapType::CAP_ROUND); - progress->SetSliderColor(Color::GetColorFromRGBA(0x19, 0x19, 0x19, 0xff), Color::GetColorFromRGBA(0xff, 0xff, 0xff, 0xff)); - progress->SetForegroundStyle(STYLE_BACKGROUND_OPA, 0xff); - - if(VolumeVetor == nullptr) - { - VolumeVetor = new UIImageView(); - if (progress == nullptr) { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "VolumeVetor new fail"); - return false; - } - } - VolumeVetor->SetPosition(213, 213,40,40); - VolumeVetor->SetSrc(PNG_VOLUME_CONTROL_VECTOR); - if (listener == nullptr) { listener = new VolumeSliderEventListener(); if (listener == nullptr) { @@ -111,7 +94,6 @@ bool VolumeSettingView::SetUpVolume(void) SetDraggable(true); SetTouchable(true); Add(progress); - Add(VolumeVetor); ShowVolume(); return true; @@ -148,7 +130,6 @@ int VolumeSettingView::ShowVolume(void) image = ImageCacheManager::GetInstance().LoadOneInMultiRes(PLAYER_INCREASE_BUTTON, PLAYER_IAMGES); increaseButton->SetImageSrc(image, image); increaseButton->SetOnClickListener(clickListener); - increaseButton->SetVisible(false); Add(increaseButton); if (decreaseButton == nullptr) { @@ -163,7 +144,6 @@ int VolumeSettingView::ShowVolume(void) image = ImageCacheManager::GetInstance().LoadOneInMultiRes(PLAYER_DECREASE_BUTTON, PLAYER_IAMGES); decreaseButton->SetImageSrc(image, image); decreaseButton->SetOnClickListener(clickListener); - decreaseButton->SetVisible(false); Add(decreaseButton); return VOLUME_OK; diff --git a/code/sdk/application/wearable/fd230app/nativeui/main/src/dial/parser/DialBinParser.cpp b/code/sdk/application/wearable/fd230app/nativeui/main/src/dial/parser/DialBinParser.cpp index a027a9818..6e54b0a92 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/main/src/dial/parser/DialBinParser.cpp +++ b/code/sdk/application/wearable/fd230app/nativeui/main/src/dial/parser/DialBinParser.cpp @@ -29,7 +29,7 @@ #include "DialBoxProgressView.h" #include "DialArcProgressView.h" #include "DialArcLabelView.h" -#include "wearable_log.h" +#include "DialKaleidoscopeView.h" namespace OHOS { DialBinParser::DialBinParser() @@ -45,6 +45,7 @@ DialBinParser::DialBinParser() funcArray_[8] = &DialBinParser::ParserDialArcProgress; // 8: index funcArray_[9] = &DialBinParser::ParserDialVideo; // 9: index funcArray_[10] = &DialBinParser::ParserDialClick; // 10: index + funcArray_[11] = &DialBinParser::ParserDialKaleidoscope; // 11: index } DialBinParser::~DialBinParser() @@ -77,6 +78,39 @@ DialBinParser* DialBinParser::GetInstance(void) return &instance; } +bool DialBinParser::GetDialPreviewInfo(FILE* fp, DialPreviewInfo* info) +{ + if (fp == nullptr || info == nullptr) { + GRAPHIC_LOGE("Get dial preview fail, param error!\n"); + return false; + } + + DialHeader* dialHeader = static_cast(MallocAndReadBuf(fp, sizeof(DialHeader))); + if (dialHeader == nullptr) { + GRAPHIC_LOGE("[%s: %d]malloc or read fail!\n", __FUNCTION__, __LINE__); + return false; + } + + if (memcpy_s(info->dialName, DIAL_NAME_MAX_LEN, dialHeader->dialName, DIAL_NAME_MAX_LEN) != EOK) { + GRAPHIC_LOGE("[%s: %d]memcpy_s dial name fail!\n", __FUNCTION__, __LINE__); + free(dialHeader); + return false; + } + + if (memcpy_s(info->description, DIAL_DESCRIPTION_MAX_LEN, + dialHeader->description, DIAL_DESCRIPTION_MAX_LEN) != EOK) { + GRAPHIC_LOGE("[%s: %d]memcpy_s dial description fail!\n", __FUNCTION__, __LINE__); + free(dialHeader); + return false; + } + + info->imgId = dialHeader->previewImgId | dirId_; + info->offset = dialHeader->imageOffset; + + free(dialHeader); + return true; +} + bool DialBinParser::UpdateDial(const std::string& file, FILE* fp, DialViewGroup* group) { if (fp == nullptr) { @@ -115,6 +149,7 @@ int32_t DialBinParser::ParseDialHeader(FILE* file) dialGroup_->SetHeight(dialHeader->height); dialGroup_->SetPeriod(1000 / dialHeader->freq); // 1000: ms imageOffset_ = dialHeader->imageOffset; + uint8_t* viewType = static_cast(MallocAndReadBuf(file, (sizeof(uint8_t) * dialHeader->dialViewCount))); if (viewType == nullptr) { UIFree(dialHeader); @@ -131,15 +166,7 @@ int32_t DialBinParser::ParseDialHeader(FILE* file) } } } - /* -------------------------------------------------------------------------- */ - #if 1 - uint32_t resId = dialHeader->previewImgId | dirId_; - uint32_t curReadPt = ftell(file); - ImageInfo* info = ImageCacheManager::GetInstance().LoadOneInMultiRes(resId, file_, file, false, imageOffset_); - fseek(file, curReadPt, SEEK_SET); - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "previewImgId %p %s", resId,info); - #endif - /* -------------------------------------------------------------------------- */ + UIFree(viewType); UIFree(dialHeader); return 0; @@ -170,7 +197,6 @@ int32_t DialBinParser::ParserDialStaticImg(FILE* fp) return -1; } fseek(fp, curReadPt, SEEK_SET); - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ParserDialStaticImg %s %p", info,resId); view->SetSrc(info); dialGroup_->AddView(view); @@ -349,8 +375,8 @@ int32_t DialBinParser::ParserDialDigitalImg(FILE* fp) fseek(fp, curReadPt, SEEK_SET); } - ImageInfo* numInfoArray[DIGITALIMG_IMG_MAX_NUM] = {}; - for (uint16_t i = 0; i < DIGITALIMG_IMG_MAX_NUM; i++) { + ImageInfo* numInfoArray[DIAL_DIGITALIMG_IMG_MAX_NUM] = {}; + for (uint16_t i = 0; i < DIAL_DIGITALIMG_IMG_MAX_NUM; i++) { resId = data->imgIds[i] | dirId_; curReadPt = ftell(fp); numInfoArray[i] = ImageCacheManager::GetInstance().LoadOneInMultiRes(resId, @@ -364,7 +390,7 @@ int32_t DialBinParser::ParserDialDigitalImg(FILE* fp) fseek(fp, curReadPt, SEEK_SET); } view->SetParent(dialGroup_); - view->SetNumRes(const_cast(numInfoArray), DIGITALIMG_IMG_MAX_NUM); + view->SetNumRes(const_cast(numInfoArray), DIAL_DIGITALIMG_IMG_MAX_NUM); dialGroup_->AddView(static_cast(data->bindData), view, data->isPeriod); UIFree(data); @@ -453,7 +479,11 @@ bool DialBinParser::SetProgressType(FILE* fp, UIAbstractProgress* view, DialProg fseek(fp, curReadPt, SEEK_SET); view->SetImage(foregroundInfo, nullptr); } else if (data.type == 1) { - view->SetForegroundStyle(STYLE_BACKGROUND_COLOR, data.color.full); + if (view->GetViewType() == UI_BOX_PROGRESS) { + view->SetForegroundStyle(STYLE_BACKGROUND_COLOR, data.color.full); + } else if (view->GetViewType() == UI_CIRCLE_PROGRESS) { + view->SetForegroundStyle(STYLE_LINE_COLOR, data.color.full); + } } else if (data.type == 2) { // 2: gradient ColorStop* stopArray = static_cast(MallocAndReadBuf(fp, (sizeof(ColorStop) * data.stopCount))); if (stopArray == nullptr) { @@ -576,4 +606,40 @@ int32_t DialBinParser::ParserDialClick(FILE* fp) return 0; } -} \ No newline at end of file + +int32_t DialBinParser::ParserDialKaleidoscope(FILE* fp) +{ + if (fp == nullptr) { + GRAPHIC_LOGE("Parser dial option image fail, file is nullptr!\n"); + return -1; + } + + DialKaleidoscope* data = static_cast(MallocAndReadBuf(fp, sizeof(DialKaleidoscope))); + if (data == nullptr) { + GRAPHIC_LOGE("[%s: %d]malloc or read fail!\n", __FUNCTION__, __LINE__); + return -1; + } + + DialKaleidoscopeView* view = new DialKaleidoscopeView(); + uint32_t resId = data->imgId | dirId_; + uint32_t curReadPt = ftell(fp); + ImageInfo* imgInfo = ImageCacheManager::GetInstance().LoadOneInMultiRes(resId, + file_, fp, false, imageOffset_); + if (imgInfo == nullptr) { + GRAPHIC_LOGE("[%s: %d]load img fail! file: %s resId: %x\n", + __FUNCTION__, __LINE__, file_.c_str(), resId); + return false; + } + fseek(fp, curReadPt, SEEK_SET); + + view->SetSrc(imgInfo); + view->RequestFocus(); + view->SetRotateEventFactor(data->crownRotateStep); // 0.2: rotate event factor + view->SetRotateAnimatorValue(data->animatorRotateStep); // 0.1: rotate animator value + view->StartRotateAnimator(); + dialGroup_->AddView(view); + + UIFree(data); + return 0; +} +} diff --git a/code/sdk/application/wearable/fd230app/nativeui/screensetting/include/ScreenModels.h b/code/sdk/application/wearable/fd230app/nativeui/screensetting/include/ScreenModels.h index a37e746a7..ffa8c36d0 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/screensetting/include/ScreenModels.h +++ b/code/sdk/application/wearable/fd230app/nativeui/screensetting/include/ScreenModels.h @@ -1,5 +1,3 @@ - - /* * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved. * Description: ScreenModels @@ -13,50 +11,17 @@ #include "gfx_utils/list.h" #include "ui_image_view.h" -namespace OHOS -{ - typedef enum - { - WATCH_FACE = 0, - HEART_RATE, - TRAINING, - BLOODOXGEN, - COMPASS, - WEATHER, - MUSIC_PLAYER, - ACTIVITY, - // APPLIST, - MAX_CARD, - } CardId; - - struct CardInfo - { - int16_t cardId; - }; - - class ScreenModels - { - public: - ScreenModels(); - ~ScreenModels(); - static ScreenModels *GetInstance(void); - // card funtion - bool SetUpListCase(void); - bool SaveCardConfig(void); - bool InitCardConfig(void); - void SetCardConfigDefault(void); - int16_t GetCardPage(uint16_t page); - bool CardInsertFirst(int32_t card); - bool CardDelete(int32_t card); - int16_t GetMaxCard(void); - int16_t GetLastCardPage(void); - bool LoadAppImages(std::string file, UIImageView *view, uint32_t resId); - void PreLoadAppimages(void); - - private: - void LoadAppMultiImages(std::string file, uint32_t startId, uint32_t lastId); - List *listMainView{nullptr}; // record main view pages - int16_t maxPage = MAX_CARD; - }; +namespace OHOS { +class ScreenModels { +public: + ScreenModels(); + ~ScreenModels(); + static ScreenModels *GetInstance(void); + bool LoadAppImages(std::string file, UIImageView *view, uint32_t resId); + void PreLoadAppimages(void); + void InitKvStorage(void); +private: + void LoadAppMultiImages(std::string file, uint32_t startId, uint32_t lastId); +}; } #endif diff --git a/code/sdk/application/wearable/fd230app/nativeui/screensetting/src/ScreenModels.cpp b/code/sdk/application/wearable/fd230app/nativeui/screensetting/src/ScreenModels.cpp index 8b593c13c..feb639c4b 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/screensetting/src/ScreenModels.cpp +++ b/code/sdk/application/wearable/fd230app/nativeui/screensetting/src/ScreenModels.cpp @@ -11,189 +11,61 @@ #include "stdio.h" #include #include +#include "kvstore_env.h" +#include "kv_store.h" #include "ScreenModels.h" #include "common/image_cache_manager.h" #include "UiConfig.h" #include "ui_resource_image.h" -namespace OHOS +namespace OHOS { + +ScreenModels::ScreenModels() { +} - ScreenModels::ScreenModels() - { - } +ScreenModels::~ScreenModels() +{ +} - ScreenModels::~ScreenModels() - { - } +ScreenModels *ScreenModels::GetInstance(void) +{ + static ScreenModels screenModel; + return &screenModel; +} - ScreenModels *ScreenModels::GetInstance(void) - { - static ScreenModels screenModel; - return &screenModel; - } +void ScreenModels::InitKvStorage(void) +{ + int ret = UtilsSetEnv("/user"); + WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "UtilsSetEnv /user ret = %d", ret); +} - bool ScreenModels::SetUpListCase(void) - { - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SetUpListCase"); - listMainView = new List(); - if (listMainView == nullptr) - { - return false; +void ScreenModels::LoadAppMultiImages(std::string file, uint32_t startId, uint32_t lastId) +{ + for (uint32_t i = startId; i <= lastId; i++) { + ImageInfo* image = ImageCacheManager::GetInstance().LoadOneInMultiRes(i, file); + if (image == nullptr) { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "LoadAppMultiImages %x fail", i); + return; } - listMainView->Clear(); - return true; + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "LoadAppMultiImages %x", i); } +} - bool ScreenModels::InitCardConfig(void) - { - if (SetUpListCase() == false) - { - return false; - } - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "InitCardConfig1"); - int32_t fd = open(CARD_CONFIG_PATH, O_RDWR, S_IRWXU); - ListNode *node; - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "InitCardConfig2"); - struct CardInfo cardInfoData; - if (fd < 0) - { - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "InitCardConfig open fail"); - fd = open(CARD_CONFIG_PATH, O_RDWR | O_CREAT, S_IRWXU); - if (fd < 0) - { - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "InitCardConfig open fail 2"); - return false; - } - SetCardConfigDefault(); - node = listMainView->Begin(); - for (int32_t i = 0; i < maxPage; i++) - { - cardInfoData = node->data_; - node = node->next_; - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Init write cardInfoData.i:%d ", cardInfoData.cardId); - if (write(fd, &cardInfoData, sizeof(CardInfo)) != sizeof(CardInfo)) - { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Init SaveGlobalHealthToFile fail"); - } - } - close(fd); - return true; - } - else - { - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "InitCardConfig3"); - for (int32_t i = 0; i < maxPage; i++) - { - if (read(fd, &cardInfoData, sizeof(CardInfo)) != sizeof(CardInfo)) - { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Init Read GlobalHealthToFile fail"); - } - listMainView->PushBack(cardInfoData); - } - close(fd); - return true; - } +bool ScreenModels::LoadAppImages(std::string file, UIImageView *view, uint32_t resId) +{ + ImageInfo* image = ImageCacheManager::GetInstance().LoadOneInMultiRes(resId, file); + if (image == nullptr) { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "LoadAppImages %x fail", resId); return false; } + view->SetSrc(image); + return true; +} - bool ScreenModels::SaveCardConfig(void) - { - int32_t fd = open(CARD_CONFIG_PATH, O_RDWR | O_CREAT, S_IRWXU); - if (fd < 0) - { - close(fd); - return false; - } - else - { - if (write(fd, &listMainView, listMainView->Size()) != listMainView->Size()) - { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, " SaveGlobalHealthToFile fail"); - } - close(fd); - return true; - } - } - - void ScreenModels::SetCardConfigDefault(void) - { - int16_t i; - struct CardInfo cardInfoData; - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SetCardConfigDefault"); - for (i = 0; i < MAX_CARD; i++) - { - cardInfoData.cardId = i; - listMainView->PushBack(cardInfoData); - } - } - - int16_t ScreenModels::GetCardPage(uint16_t page) - { - ListNode *node = listMainView->Begin(); - for (uint8_t i = 0; i < page; i++) - { - if (node->next_ != NULL) - { - node = node->next_; - } - else - { - return -1; - } - } - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "GetCardPage cardId:%d", node->data_.cardId); - return node->data_.cardId; - } - - int16_t ScreenModels::GetLastCardPage(void) - { - ListNode *node = listMainView->Begin(); - for (uint8_t i = 0; i < MAX_CARD; i++) - { - if (node->next_ == NULL) - { - node = node->next_; - } - } - return node->data_.cardId; - } - - int16_t ScreenModels::GetMaxCard(void) - { - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "GetMaxCard maxPage:%d", maxPage); - return maxPage; - } - - void ScreenModels::LoadAppMultiImages(std::string file, uint32_t startId, uint32_t lastId) - { - for (uint32_t i = startId; i <= lastId; i++) - { - ImageInfo *image = ImageCacheManager::GetInstance().LoadOneInMultiRes(i, file); - if (image == nullptr) - { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "LoadAppMultiImages %x fail", i); - return; - } - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "LoadAppMultiImages %x", i); - } - } - - bool ScreenModels::LoadAppImages(std::string file, UIImageView *view, uint32_t resId) - { - ImageInfo *image = ImageCacheManager::GetInstance().LoadOneInMultiRes(resId, file); - if (image == nullptr) - { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "LoadAppImages %x fail", resId); - return false; - } - view->SetSrc(image); - return true; - } - - void ScreenModels::PreLoadAppimages(void) - { - LoadAppMultiImages(PLAYER_IAMGES, PLAYER_BACKGROUND, PLAYER_PLAYING); +void ScreenModels::PreLoadAppimages(void) +{ + LoadAppMultiImages(PLAYER_IAMGES, PLAYER_BACKGROUND, PLAYER_PLAYING); LoadAppMultiImages(CLOCK_IAMGES, CLOCK_CLOCK0, CLOCK_SECOND); LoadAppMultiImages(COMPASS_IAMGES, COMPASS_COMPASS0, COMPASS_COMPASS2); LoadAppMultiImages(DROPDOWN_IAMGES, DROPDOWN_BLUETOOTHCONNECTED, DROPDOWN_SETTING); @@ -201,5 +73,6 @@ namespace OHOS LoadAppMultiImages(BLOOD_IAMGES, BLOODOXYGEN_BACKGOUND, BLOODOXYGEN_BACKGOUND); LoadAppMultiImages(TRAINING_IAMGES, TRAINING_BOUTTONGROUND, TRAINING_WALKING_BIG); LoadAppMultiImages(MESSAGE_IAMGES, MESSAGE_MESSAGE, MESSAGE_WECHAT); - } + +} } diff --git a/code/sdk/application/wearable/fd230app/nativeui/set_card/include/SetCardAdapter.h b/code/sdk/application/wearable/fd230app/nativeui/set_card/include/SetCardAdapter.h new file mode 100644 index 000000000..417891c87 --- /dev/null +++ b/code/sdk/application/wearable/fd230app/nativeui/set_card/include/SetCardAdapter.h @@ -0,0 +1,40 @@ +/* + * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved. + * Description: SetCardAdapter.h + * Author: + * Create: 2021-09-18 + */ + +#ifndef SET_CARD_ADAPTER_H +#define SET_CARD_ADAPTER_H + +#include +#include +#include "components/ui_list.h" +#include "components/ui_label.h" +#include "components/ui_view_group.h" +#include "components/ui_image_view.h" +#include "components/abstract_adapter.h" +#include "UiConfig.h" +#include "wearable_log.h" +#include "SetCardItem.h" + +namespace OHOS { +class SetCardAdapter : public AbstractAdapter { +public: + explicit SetCardAdapter(); + virtual ~SetCardAdapter(); + + virtual uint16 GetCount(void) override; + + virtual UIView *GetView(UIView *inView, int16 index) override; + + virtual void AddListItem(const CardInfo &item); + + void ClearItem(void); + +private: + std::list listData_; +}; +} +#endif \ No newline at end of file diff --git a/code/sdk/application/wearable/fd230app/nativeui/set_card/include/SetCardDeleteView.h b/code/sdk/application/wearable/fd230app/nativeui/set_card/include/SetCardDeleteView.h new file mode 100644 index 000000000..99b0c8c2a --- /dev/null +++ b/code/sdk/application/wearable/fd230app/nativeui/set_card/include/SetCardDeleteView.h @@ -0,0 +1,26 @@ +/** + * Copyright (c) CompanyNameMagicTag 2023-2023. All rights reserved. + * Description: + * Author: + * Create: + */ + +#ifndef SET_CARD_DELETE_VIEW_H +#define SET_CARD_DELETE_VIEW_H + +#include "components/ui_label_button.h" +#include "SetCardPresenter.h" + +namespace OHOS { +class SetCardDeleteView : public UIViewGroup { +public: + SetCardDeleteView(SetCardPresenter *presenter); + virtual ~SetCardDeleteView(); + bool InitView(); +private: + SetCardPresenter *presenter_; + UILabelButton confirmBtn; + UILabelButton cancelBtn; +}; +} +#endif \ No newline at end of file diff --git a/code/sdk/application/wearable/fd230app/nativeui/set_card/include/SetCardItem.h b/code/sdk/application/wearable/fd230app/nativeui/set_card/include/SetCardItem.h new file mode 100644 index 000000000..646f24fbf --- /dev/null +++ b/code/sdk/application/wearable/fd230app/nativeui/set_card/include/SetCardItem.h @@ -0,0 +1,34 @@ +/* + * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved. + * Description: SetCardItem.h + * Author: + * Create: 2021-11-23 + */ + +#ifndef SET_CARD_ITEM_H +#define SET_CARD_ITEM_H + +#include +#include +#include "components/ui_view.h" +#include "components/ui_view_group.h" +#include "components/ui_image_view.h" +#include "MainModel.h" +#include "UiConfig.h" + +namespace OHOS { + +class SetCardItem :public UIViewGroup { +public: + SetCardItem(); + virtual ~SetCardItem(); + void SetItemInfo(const CardInfo &cardInfo); +private: + void SetUpChild(); + UIImageView cardImg_; + CardInfo cardInfo_; +}; + +} + +#endif // SET_CARD_ITEM_H \ No newline at end of file diff --git a/code/sdk/application/wearable/fd230app/nativeui/set_card/include/SetCardModel.h b/code/sdk/application/wearable/fd230app/nativeui/set_card/include/SetCardModel.h new file mode 100644 index 000000000..43ed70b26 --- /dev/null +++ b/code/sdk/application/wearable/fd230app/nativeui/set_card/include/SetCardModel.h @@ -0,0 +1,43 @@ +/* + * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved. + * Description: SetCardModel.h + * Author: + * Create: 2021-11-23 + */ + +#ifndef SET_CARD_MODEL_H +#define SET_CARD_MODEL_H + +#include +#include +#include "AppViewIDs.h" +#include "UiConfig.h" +#include "SetCardPresenter.h" +#include "SetCardItem.h" + +namespace OHOS { + class SetCardModel { + public: + static SetCardModel &GetInstance(void); + uint8_t *GetCardShowList(void); + uint8_t GetCardShowCount(void) const; + void InitCardShowList(void); + void SetSelectedCardIndex(uint8_t cardIndex); + uint8_t GetSelectedCardIndex(void) const; + void DeleteCardSetting(void); + void SetSelectedCard(uint8_t cardId); + uint8_t GetSelectedCard(void); + private: + SetCardModel(); + SetCardModel(const SetCardModel &); + SetCardModel &operator=(const SetCardModel &); + virtual ~SetCardModel(); + + uint8_t cardShowList[CARD_SETTING_COUNT_MAX] = { 0 }; + uint8_t cardShowCount{0}; + uint8_t selectedCardIndex{0}; + uint8_t selectedCardId{MAX_CARD}; + }; +} + +#endif // SET_CARD_MODEL_H \ No newline at end of file diff --git a/code/sdk/application/wearable/fd230app/nativeui/set_card/include/SetCardNoCardView.h b/code/sdk/application/wearable/fd230app/nativeui/set_card/include/SetCardNoCardView.h new file mode 100644 index 000000000..16264fac7 --- /dev/null +++ b/code/sdk/application/wearable/fd230app/nativeui/set_card/include/SetCardNoCardView.h @@ -0,0 +1,27 @@ +/** + * Copyright (c) CompanyNameMagicTag 2023-2023. All rights reserved. + * Description: + * Author: + * Create: + */ + +#ifndef SET_CARD_NO_CARD_VIEW_H +#define SET_CARD_NO_CARD_VIEW_H + +#include "components/ui_image_view.h" +#include "components/ui_label.h" +#include "components/ui_label_button.h" +#include "SetCardPresenter.h" + +namespace OHOS { +class SetCardNoCardView : public UIViewGroup { +public: + SetCardNoCardView(SetCardPresenter *presenter); + virtual ~SetCardNoCardView(); + bool InitView(); +private: + SetCardPresenter *presenter_; + UILabelButton addBtn; +}; +} +#endif \ No newline at end of file diff --git a/code/sdk/application/wearable/fd230app/nativeui/set_card/include/SetCardPresenter.h b/code/sdk/application/wearable/fd230app/nativeui/set_card/include/SetCardPresenter.h new file mode 100644 index 000000000..5c9b4e016 --- /dev/null +++ b/code/sdk/application/wearable/fd230app/nativeui/set_card/include/SetCardPresenter.h @@ -0,0 +1,51 @@ +/* + * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved. + * Description: SetCardPresenter.h + * Author: + * Create: 2021-11-23 + */ + +#ifndef SET_CARD_PRESENTER_H +#define SET_CARD_PRESENTER_H + +#include "Presenter.h" +#include "components/ui_list.h" +#include "components/ui_view.h" +#include "KeyInputListener.h" + +namespace OHOS { + +static const char *SET_CARD_ADD = "setcardadd"; +static const char *SET_CARD_DEL = "setcarddel"; +static const char *SET_CARD_DEL_CONFIRM = "setcarddelconfirm"; +static const char *SET_CARD_DEL_CANCEL = "setcarddelcancel"; + +class SetCardView; +class SetCardModel; +class SetCardPresenter : public Presenter, + public UIView::OnClickListener, + public ListScrollListener { +public: + SetCardPresenter(); + virtual ~SetCardPresenter(); + + virtual void OnStart() override; + virtual void OnResume() override; + virtual void OnStop() override; + bool OnClick(UIView &view, const ClickEvent &event) override; + virtual void OnScrollStart(int16_t index, UIView *view) override; + virtual void OnScrollEnd(int16_t index, UIView *view) override; + virtual void OnItemSelected(int16_t index, UIView* view) override; + void InitCardShowList(void); + uint8_t *GetCardShowList(void); + uint8_t GetCardShowCount(void) const; + void SetSelectedCard(uint8_t cardId); + uint8_t GetSelectedCard(void); +private: + KeyInputListener *keyActListenr{nullptr}; + SetCardModel *model{nullptr}; + +}; +} + +#endif // SET_CARD_PRESENTER_H \ No newline at end of file diff --git a/code/sdk/application/wearable/fd230app/nativeui/set_card/include/SetCardView.h b/code/sdk/application/wearable/fd230app/nativeui/set_card/include/SetCardView.h new file mode 100644 index 000000000..9c18e0d09 --- /dev/null +++ b/code/sdk/application/wearable/fd230app/nativeui/set_card/include/SetCardView.h @@ -0,0 +1,62 @@ +/* + * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved. + * Description: SetCardView.h + * Author: + * Create: 2021-11-23 + */ + +#ifndef SET_CARD_VIEW_H +#define SET_CARD_VIEW_H + +#include "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 "window/window.h" +#include "BaseView.h" +#include "ChangeSliceListener.h" +#include "UiConfig.h" +#include "SetCardAdapter.h" +#include "SetCardModel.h" +#include "SetCardDeleteView.h" +#include "SetCardNoCardView.h" + +namespace OHOS { +class SetCardPresenter; + +class SetCardView : public View { +public: + SetCardView(); + virtual ~SetCardView(); + + static SetCardView *GetInstance() + { + static SetCardView instance; + return &instance; + } + + virtual void OnStart() override; + virtual void OnSetUpView() override; + virtual void OnTearDownView() override; + virtual void OnStop() override; + void ShowDeleteView(bool show); + void ShowAddView(bool show); + void RefreshCardList(void); +private: + void SetUpListInfo(void); + void SetUpListView(void); + void SetUpDeleteView(void); + void SetUpAddView(void); + void ShowCardListView(bool show); + UIImageView addImg_; + UIList contentList_; + UIImageView delImg_; + + SetCardDeleteView *deleteView_{nullptr}; + SetCardNoCardView *noCardView_{nullptr}; + SetCardAdapter *setCardAdapter_{nullptr}; + uint32_t scrollIndex_{0}; +}; +} +#endif // SET_CARD_VIEW_H diff --git a/code/sdk/application/wearable/fd230app/nativeui/set_card/src/SetCardAdapter.cpp b/code/sdk/application/wearable/fd230app/nativeui/set_card/src/SetCardAdapter.cpp new file mode 100644 index 000000000..4bce9dbb0 --- /dev/null +++ b/code/sdk/application/wearable/fd230app/nativeui/set_card/src/SetCardAdapter.cpp @@ -0,0 +1,58 @@ +/* + * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved. + * Description: SetCardAdapter.cpp + * Author: + * Create: 2021-09-18 + */ + +#include "SetCardAdapter.h" + +namespace OHOS { +SetCardAdapter::SetCardAdapter() {} + +SetCardAdapter::~SetCardAdapter() +{ + listData_.clear(); +} + +uint16 SetCardAdapter::GetCount(void) +{ + return listData_.size(); +} + +void SetCardAdapter::ClearItem(void) +{ + listData_.clear(); +} + +UIView *SetCardAdapter::GetView(UIView *inView, int16 index) +{ + if (index >= (int16)listData_.size() || index < 0) { + return nullptr; + } + + std::list::iterator it = listData_.begin(); + for (int i = 0; i < index; i++) { + it++; + } + + SetCardItem *item = nullptr; + if (inView == nullptr) { + item = new SetCardItem(); + if (item == nullptr) { + return nullptr; + } + } else { + item = static_cast(inView); + } + + item->SetItemInfo(*it); + item->SetViewIndex(index); + return item; +} + +void SetCardAdapter::AddListItem(const CardInfo &item) +{ + listData_.push_back(item); +} +} // namespace OHOS diff --git a/code/sdk/application/wearable/fd230app/nativeui/set_card/src/SetCardDeleteView.cpp b/code/sdk/application/wearable/fd230app/nativeui/set_card/src/SetCardDeleteView.cpp new file mode 100644 index 000000000..d957515c8 --- /dev/null +++ b/code/sdk/application/wearable/fd230app/nativeui/set_card/src/SetCardDeleteView.cpp @@ -0,0 +1,53 @@ +/** + * Copyright (c) CompanyNameMagicTag 2023-2023. All rights reserved. + * Description. + * Author: + * Create: + */ + +#include "UiConfig.h" +#include +#include "cmsis_os.h" +#include "SetCardDeleteView.h" + +namespace OHOS { + +SetCardDeleteView::SetCardDeleteView(SetCardPresenter *presenter) +{ + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SetCardDeleteView::SetCardDeleteView"); + presenter_ = presenter; + SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION); + SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT); + InitView(); + Add(&confirmBtn); + Add(&cancelBtn); +} + +SetCardDeleteView::~SetCardDeleteView() +{ + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SetCardDeleteView::~SetCardDeleteView"); + Remove(&confirmBtn); + Remove(&cancelBtn); +} + +bool SetCardDeleteView::InitView() +{ + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SetCardDeleteView::InitView"); + confirmBtn.SetPosition(184, 118); + confirmBtn.Resize(86, 50); + confirmBtn.SetViewId(SET_CARD_DEL_CONFIRM); + confirmBtn.SetText("删除"); + confirmBtn.SetFont(DEFAULT_VECTOR_FONT_FILENAME, 30); + confirmBtn.SetStyleForState(STYLE_BORDER_COLOR, 0xff0b1928, UIButton::PRESSED); + confirmBtn.SetOnClickListener(presenter_); + + cancelBtn.SetPosition(186, 231); + cancelBtn.Resize(82, 50); + cancelBtn.SetViewId(SET_CARD_DEL_CANCEL); + cancelBtn.SetText("取消"); + cancelBtn.SetFont(DEFAULT_VECTOR_FONT_FILENAME, 30); + cancelBtn.SetStyleForState(STYLE_BORDER_COLOR, 0xff0b1928, UIButton::PRESSED); + cancelBtn.SetOnClickListener(presenter_); + return true; +} +} \ No newline at end of file diff --git a/code/sdk/application/wearable/fd230app/nativeui/set_card/src/SetCardItem.cpp b/code/sdk/application/wearable/fd230app/nativeui/set_card/src/SetCardItem.cpp new file mode 100644 index 000000000..61b9c4989 --- /dev/null +++ b/code/sdk/application/wearable/fd230app/nativeui/set_card/src/SetCardItem.cpp @@ -0,0 +1,32 @@ +#include "SetCardItem.h" +#include "SetCardPresenter.h" +#include "wearable_log.h" + +namespace OHOS { + SetCardItem::SetCardItem() + { + SetPosition(0, 0, 454, 280); + SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT); + SetUpChild(); + Add(&cardImg_); + } + + SetCardItem::~SetCardItem() + { + Remove(&cardImg_); + } + + void SetCardItem::SetUpChild() + { + cardImg_.SetPosition(87, 0); + cardImg_.Resize(280, 280); + cardImg_.SetResizeMode(UIImageView::FILL); + cardImg_.SetStyle(STYLE_IMAGE_OPA, OPA_OPAQUE); + } + + void SetCardItem::SetItemInfo(const CardInfo &cardInfo) + { + cardInfo_ = cardInfo; + cardImg_.SetSrc(cardInfo.cardImg); + } +}; diff --git a/code/sdk/application/wearable/fd230app/nativeui/set_card/src/SetCardModel.cpp b/code/sdk/application/wearable/fd230app/nativeui/set_card/src/SetCardModel.cpp new file mode 100644 index 000000000..32ca2b547 --- /dev/null +++ b/code/sdk/application/wearable/fd230app/nativeui/set_card/src/SetCardModel.cpp @@ -0,0 +1,72 @@ +/* + * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved. + * Description: SetCardModel.cpp + * Author: + * Create: 2021-11-23 + */ + +#include "SetCardModel.h" +#include "MainModel.h" +#include "kv_store.h" +#include "securec.h" + +namespace OHOS { + SetCardModel::SetCardModel() {} + + SetCardModel::~SetCardModel() {} + + SetCardModel &SetCardModel::GetInstance() + { + static SetCardModel instance; + return instance; + } + + void SetCardModel::InitCardShowList(void) + { + MainModel::GetInstance().InitCardSettings(); + uint8_t cardCount = MainModel::GetInstance().GetCardSettingCount(); + CardId *cardSettings = MainModel::GetInstance().GetCardSettings(); + cardShowCount = 0; + for (uint8_t i = 0; i < cardCount; i++) { + if (cardSettings[i] == WATCH_FACE) { + continue; + } + cardShowList[cardShowCount++] = cardSettings[i]; + } + } + + uint8_t *SetCardModel::GetCardShowList(void) + { + return cardShowList; + } + + uint8_t SetCardModel::GetCardShowCount(void) const + { + return cardShowCount; + } + + void SetCardModel::SetSelectedCardIndex(uint8_t cardIndex) + { + selectedCardIndex = cardIndex; + } + + uint8_t SetCardModel::GetSelectedCardIndex(void) const + { + return selectedCardIndex; + } + + void SetCardModel::DeleteCardSetting(void) + { + MainModel::GetInstance().DeleteCardSetting(selectedCardIndex); + } + + void SetCardModel::SetSelectedCard(uint8_t cardId) + { + selectedCardId = cardId; + } + + uint8_t SetCardModel::GetSelectedCard(void) + { + return selectedCardId; + } +} diff --git a/code/sdk/application/wearable/fd230app/nativeui/set_card/src/SetCardNoCardView.cpp b/code/sdk/application/wearable/fd230app/nativeui/set_card/src/SetCardNoCardView.cpp new file mode 100644 index 000000000..15cb462b6 --- /dev/null +++ b/code/sdk/application/wearable/fd230app/nativeui/set_card/src/SetCardNoCardView.cpp @@ -0,0 +1,43 @@ +/** + * Copyright (c) CompanyNameMagicTag 2023-2023. All rights reserved. + * Description. + * Author: + * Create: + */ + +#include "UiConfig.h" +#include +#include "cmsis_os.h" +#include "SetCardNoCardView.h" + +namespace OHOS { + +SetCardNoCardView::SetCardNoCardView(SetCardPresenter *presenter) +{ + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SetCardNoCardView::SetCardNoCardView"); + presenter_ = presenter; + SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION); + SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT); + InitView(); + Add(&addBtn); +} + +SetCardNoCardView::~SetCardNoCardView() +{ + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SetCardNoCardView::~SetCardNoCardView"); + Remove(&addBtn); +} + +bool SetCardNoCardView::InitView() +{ + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SetCardNoCardView::InitView"); + addBtn.SetPosition(184, 118); + addBtn.Resize(86, 50); + addBtn.SetViewId(SET_CARD_ADD); + addBtn.SetText("添加"); + addBtn.SetFont(DEFAULT_VECTOR_FONT_FILENAME, 30); + addBtn.SetStyleForState(STYLE_BORDER_COLOR, 0xff0b1928, UIButton::PRESSED); + addBtn.SetOnClickListener(presenter_); + return true; +} +} \ No newline at end of file diff --git a/code/sdk/application/wearable/fd230app/nativeui/set_card/src/SetCardPresenter.cpp b/code/sdk/application/wearable/fd230app/nativeui/set_card/src/SetCardPresenter.cpp new file mode 100644 index 000000000..f32df85a9 --- /dev/null +++ b/code/sdk/application/wearable/fd230app/nativeui/set_card/src/SetCardPresenter.cpp @@ -0,0 +1,116 @@ +/* + * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved. + * Description: SetCardPresenter.cpp + * Author: + * Create: 2021-11-23 + */ + +#include "SetCardView.h" +#include "SetCardModel.h" +#include "SetCardPresenter.h" + +namespace OHOS { + SetCardPresenter::SetCardPresenter() + { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SetCardPresenter::SetCardPresenter"); + model = &SetCardModel::GetInstance(); + } + + SetCardPresenter::~SetCardPresenter() { + if (keyActListenr != nullptr) { + delete keyActListenr; + keyActListenr = nullptr; + } + } + + void SetCardPresenter::OnStart() + { + Presenter::OnStart(); + if (keyActListenr == nullptr) { + keyActListenr = new KeyInputListener(); + if (keyActListenr != nullptr) { + RootView::GetInstance()->SetOnKeyActListener(keyActListenr); + } else { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ApplistPresenter::OnStart: new KeyInputListener fail"); + } + } + } + + void SetCardPresenter::OnResume(void) + { + } + + void SetCardPresenter::OnStop(void) + { + RootView::GetInstance()->ClearOnKeyActListener(); + } + + bool SetCardPresenter::OnClick(UIView &view, const ClickEvent &event) + { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SetCardPresenter::OnClick"); + if (strcmp(view.GetViewId(), SET_CARD_ADD) == 0) { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SetCardPresenter::SET_CARD_ADD"); + NativeAbility::GetInstance().ChangeSlice(VIEW_ADD_CARD); + } else if (strcmp(view.GetViewId(), SET_CARD_DEL) == 0) { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SetCardPresenter::SET_CARD_DEL"); + view_->ShowDeleteView(true); + } else if (strcmp(view.GetViewId(), SET_CARD_DEL_CONFIRM) == 0) { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SetCardPresenter::SET_CARD_DEL_CONFIRM"); + model->DeleteCardSetting(); + view_->ShowDeleteView(false); + view_->RefreshCardList(); + } else if (strcmp(view.GetViewId(), SET_CARD_DEL_CANCEL) == 0) { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SetCardPresenter::SET_CARD_DEL_CANCEL"); + view_->ShowDeleteView(false); + } + return true; + } + + void SetCardPresenter::OnScrollStart(int16_t index, UIView *view) + { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SetCardPresenter::OnScrollStart index = %d", index); + return; + } + + void SetCardPresenter::OnScrollEnd(int16_t index, UIView *view) + { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SetCardPresenter::OnScrollEnd index = %d", index); + if (view == nullptr) { + return; + } + model->SetSelectedCardIndex(index); + } + + void SetCardPresenter::OnItemSelected(int16_t index, UIView* view) + { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SetCardPresenter::OnItemSelected index = %d", index); + if (view == nullptr) { + return; + } + } + void SetCardPresenter::InitCardShowList(void) + { + model->InitCardShowList(); + } + + uint8_t *SetCardPresenter::GetCardShowList(void) + { + return model->GetCardShowList(); + } + + uint8_t SetCardPresenter::GetCardShowCount(void) const + { + return model->GetCardShowCount(); + } + + void SetCardPresenter::SetSelectedCard(uint8_t cardId) + { + model->SetSelectedCard(cardId); + } + + uint8_t SetCardPresenter::GetSelectedCard(void) + { + return model->GetSelectedCard(); + } + +} diff --git a/code/sdk/application/wearable/fd230app/nativeui/set_card/src/SetCardView.cpp b/code/sdk/application/wearable/fd230app/nativeui/set_card/src/SetCardView.cpp new file mode 100644 index 000000000..f18a1c8e4 --- /dev/null +++ b/code/sdk/application/wearable/fd230app/nativeui/set_card/src/SetCardView.cpp @@ -0,0 +1,208 @@ +/* + * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved. + * Description: SetCardView.cpp + * Author: + * Create: 2021-11-23 + */ + +#include +#include "SetCardView.h" +#include "SetCardPresenter.h" + +namespace OHOS { +SetCardView::SetCardView():contentList_(UIList::HORIZONTAL) +{ + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SetCardView::SetCardView"); +} + +SetCardView::~SetCardView() +{ + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SetCardView::~SetCardView"); + if (deleteView_ != nullptr) { + delete deleteView_; + deleteView_ = nullptr; + } + + if (noCardView_ != nullptr) { + delete noCardView_; + noCardView_ = nullptr; + } + + if (setCardAdapter_ != nullptr) { + delete setCardAdapter_; + setCardAdapter_ = nullptr; + } +} + +void SetCardView::OnStart() +{ + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SetCardView::OnStart"); + View::OnStart(); + SetContainerView(new UIViewGroup()); + container_->SetPosition(0, 0, Screen::GetInstance().GetWidth(), Screen::GetInstance().GetHeight()); + setCardAdapter_ = new SetCardAdapter(); + SetUpListInfo(); + SetUpListView(); + SetUpDeleteView(); + SetUpAddView(); +} + +void SetCardView::OnSetUpView() +{ + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SetCardView::OnSetUpView"); + View::OnSetUpView(); + ShowDeleteView(false); + if (setCardAdapter_->GetCount() == 0) { + ShowAddView(true); + } +} + +void SetCardView::OnTearDownView() +{ + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SetCardView::OnTearDownView"); + View::OnTearDownView(); +} + +void SetCardView::OnStop() +{ + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SetCardView::OnStop"); + View::OnStop(); + RootView::GetInstance()->ClearOnKeyActListener(); + if (container_ != nullptr) { + container_->RemoveAll(); + delete container_; + container_ = nullptr; + } +} + +void SetCardView::SetUpListInfo(void) +{ + presenter_->InitCardShowList(); + uint8_t num = presenter_->GetCardShowCount(); + uint8_t *cardSettings = presenter_->GetCardShowList(); + uint8_t selectCardId = presenter_->GetSelectedCard(); + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SetUpListInfo::selectCardId = %u", selectCardId); + setCardAdapter_->ClearItem(); + for (uint8_t i = 0; i < num; i++) { + const CardInfo *info = MainModel::GetInstance().GetCardInfo( + static_cast(cardSettings[i])); + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SetUpListInfo::%d %s", info->id, info->cardImg); + if (selectCardId == info->id) { + scrollIndex_ = i; + presenter_->SetSelectedCard(MAX_CARD); + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SetUpListInfo::scrollIndex_ = %u", scrollIndex_); + } + setCardAdapter_->AddListItem(*info); + } +} + +void SetCardView::SetUpListView(void) +{ + addImg_.SetPosition(187, 10); + addImg_.Resize(80, 80); + addImg_.SetResizeMode(UIImageView::FILL); + addImg_.SetStyle(STYLE_IMAGE_OPA, OPA_OPAQUE); + addImg_.SetSrc(PNG_SET_CARD_ADD); + addImg_.SetViewId(SET_CARD_ADD); + addImg_.SetVisible(false); + + contentList_.SetPosition(0, 92); + contentList_.Resize(HORIZONTAL_RESOLUTION, 280); + contentList_.SetScrollBlankSize(HORIZONTAL_RESOLUTION / 2); + contentList_.SetSelectPosition(HORIZONTAL_RESOLUTION / 2); + contentList_.SetDraggable(true); + contentList_.SetThrowDrag(true); + contentList_.EnableAutoAlign(true); + contentList_.SetScrollStateListener(presenter_); + contentList_.SetMaxScrollDistance(1000); + contentList_.SetAdapter(setCardAdapter_); + contentList_.SetVisible(false); + contentList_.ScrollTo(scrollIndex_); + + delImg_.SetPosition(187, 374); + delImg_.Resize(80, 80); + delImg_.SetResizeMode(UIImageView::FILL); + delImg_.SetStyle(STYLE_IMAGE_OPA, OPA_OPAQUE); + delImg_.SetSrc(PNG_SET_CARD_DEL); + delImg_.SetViewId(SET_CARD_DEL); + delImg_.SetVisible(false); + + addImg_.SetTouchable(true); + addImg_.SetOnClickListener(presenter_); + delImg_.SetTouchable(true); + delImg_.SetOnClickListener(presenter_); + + container_->Add(&addImg_); + container_->Add(&contentList_); + container_->Add(&delImg_); +} + +void SetCardView::SetUpDeleteView(void) +{ + deleteView_ = new SetCardDeleteView(presenter_); + if (deleteView_ == nullptr) { + return; + } + deleteView_->SetVisible(false); + container_->Add(deleteView_); +} + +void SetCardView::SetUpAddView(void) +{ + noCardView_ = new SetCardNoCardView(presenter_); + if (noCardView_ == nullptr) { + return; + } + noCardView_->SetVisible(false); + container_->Add(noCardView_); +} + +void SetCardView::ShowCardListView(bool show) +{ + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SetCardView::ShowCardListView %u", show); + if (show) { + addImg_.SetVisible(true); + contentList_.SetVisible(true); + delImg_.SetVisible(true); + } else { + addImg_.SetVisible(false); + contentList_.SetVisible(false); + delImg_.SetVisible(false); + } +} + +void SetCardView::ShowDeleteView(bool show) +{ + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SetCardView::ShowDeleteView %u", show); + if (show) { + ShowCardListView(false); + deleteView_->SetVisible(true); + } else { + ShowCardListView(true); + deleteView_->SetVisible(false); + } +} + +void SetCardView::ShowAddView(bool show) +{ + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SetCardView::ShowAddView %u", show); + if (show) { + ShowCardListView(false); + noCardView_->SetVisible(true); + } else { + ShowCardListView(true); + noCardView_->SetVisible(false); + } +} + +void SetCardView::RefreshCardList(void) +{ + contentList_.RemoveAll(); + SetUpListInfo(); + contentList_.RefreshList(); + if (setCardAdapter_->GetCount() == 0) { + ShowAddView(true); + } +} + +} diff --git a/code/sdk/application/wearable/fd230app/nativeui/set_desktop/include/SetDesktopModel.h b/code/sdk/application/wearable/fd230app/nativeui/set_desktop/include/SetDesktopModel.h new file mode 100644 index 000000000..5c5a9261e --- /dev/null +++ b/code/sdk/application/wearable/fd230app/nativeui/set_desktop/include/SetDesktopModel.h @@ -0,0 +1,37 @@ +/* + * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved. + * Description: SetDesktopModel.h + * Author: + * Create: 2021-11-23 + */ + +#ifndef SET_DESKTOP_MODEL_H +#define SET_DESKTOP_MODEL_H + +#include +#include +#include "AppViewIDs.h" +#include "UiConfig.h" +#include "SetDesktopPresenter.h" + +typedef enum { + APPLIST_STYLE, + HEXAGONS_STYLE, +} DesktopStyle; + +namespace OHOS { + class SetDesktopModel { + public: + static SetDesktopModel &GetInstance(void); + DesktopStyle GetDesktopStyle(void); + void SetDesktopStyle(DesktopStyle style); + private: + SetDesktopModel(); + SetDesktopModel(const SetDesktopModel &); + SetDesktopModel &operator=(const SetDesktopModel &); + virtual ~SetDesktopModel(); + + }; +} + +#endif // SET_DESKTOP_MODEL_H \ No newline at end of file diff --git a/code/sdk/application/wearable/fd230app/nativeui/set_desktop/include/SetDesktopPresenter.h b/code/sdk/application/wearable/fd230app/nativeui/set_desktop/include/SetDesktopPresenter.h new file mode 100644 index 000000000..1e8d0c19f --- /dev/null +++ b/code/sdk/application/wearable/fd230app/nativeui/set_desktop/include/SetDesktopPresenter.h @@ -0,0 +1,39 @@ +/* + * 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"; + +class SetDesktopView; +class SetDesktopModel; +class SetDesktopPresenter : public Presenter, + public UIView::OnClickListener, + public UIView::OnDragListener { +public: + SetDesktopPresenter(); + virtual ~SetDesktopPresenter(); + + virtual void OnStart() override; + virtual void OnResume() override; + virtual void OnStop() override; + + bool OnClick(UIView &view, const ClickEvent &event) override; + virtual bool OnDrag(UIView& view, const DragEvent& event) override; + bool GetHexagonsStyleState(void); +private: + +}; +} + +#endif // SET_DESKTOP_PRESENTER_H \ No newline at end of file diff --git a/code/sdk/application/wearable/fd230app/nativeui/set_desktop/include/SetDesktopView.h b/code/sdk/application/wearable/fd230app/nativeui/set_desktop/include/SetDesktopView.h new file mode 100644 index 000000000..4c992747f --- /dev/null +++ b/code/sdk/application/wearable/fd230app/nativeui/set_desktop/include/SetDesktopView.h @@ -0,0 +1,50 @@ +/* + * 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_view_group.h" +#include "components/ui_label.h" +#include "components/ui_image_view.h" +#include "components/ui_toggle_button.h" +#include "window/window.h" +#include "BaseView.h" +#include "ChangeSliceListener.h" +#include "UiConfig.h" + +namespace OHOS { +class SetDesktopPresenter; + +class SetDesktopView : public View { +public: + SetDesktopView(); + virtual ~SetDesktopView(); + + static SetDesktopView *GetInstance() + { + static SetDesktopView instance; + return &instance; + } + + virtual void OnStart() override; + virtual void OnSetUpView() override; + virtual void OnTearDownView() override; + virtual void OnStop() override; + void UpdateSelectedStyle(bool hexagonsSelected); +private: + UILabel titleText; + UIToggleButton hexagonsBtn; + UIToggleButton listBtn; + UIImageView hexagonsImage; + UIImageView listImage; + UILabel listText; + UILabel hexagonsText; +}; +} +#endif // SET_DESKTOP_VIEW_H diff --git a/code/sdk/application/wearable/fd230app/nativeui/set_desktop/src/SetDesktopModel.cpp b/code/sdk/application/wearable/fd230app/nativeui/set_desktop/src/SetDesktopModel.cpp new file mode 100644 index 000000000..d5f64f315 --- /dev/null +++ b/code/sdk/application/wearable/fd230app/nativeui/set_desktop/src/SetDesktopModel.cpp @@ -0,0 +1,46 @@ +/* + * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved. + * Description: SettingModel.cpp + * Author: + * Create: 2021-11-23 + */ + +#include "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() + { + static SetDesktopModel instance; + return instance; + } + + DesktopStyle SetDesktopModel::GetDesktopStyle(void) + { + DesktopStyle style; + char temp[STYLE_VALUE_LEN] = { 0 }; + (void)UtilsGetValue("applist_style", temp, STYLE_VALUE_LEN); + if (strcmp(temp, "hexagons") == 0) { + style = HEXAGONS_STYLE; + } else { + style = APPLIST_STYLE; + } + return style; + } + + void SetDesktopModel::SetDesktopStyle(DesktopStyle style) + { + if (style == APPLIST_STYLE) { + (void)UtilsSetValue("applist_style", "list"); + } else if (style == HEXAGONS_STYLE) { + (void)UtilsSetValue("applist_style", "hexagons"); + } + } + +} diff --git a/code/sdk/application/wearable/fd230app/nativeui/set_desktop/src/SetDesktopPresenter.cpp b/code/sdk/application/wearable/fd230app/nativeui/set_desktop/src/SetDesktopPresenter.cpp new file mode 100644 index 000000000..0c361bcb1 --- /dev/null +++ b/code/sdk/application/wearable/fd230app/nativeui/set_desktop/src/SetDesktopPresenter.cpp @@ -0,0 +1,62 @@ +/* + * 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" + +namespace OHOS { + SetDesktopPresenter::SetDesktopPresenter() + { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SetDesktopPresenter::SetDesktopPresenter"); + } + + SetDesktopPresenter::~SetDesktopPresenter() {} + + void SetDesktopPresenter::OnStart() + { + Presenter::OnStart(); + } + + void SetDesktopPresenter::OnResume(void) + { + } + + void SetDesktopPresenter::OnStop(void) + { + } + + 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(HEXAGONS_STYLE); + } else if (strcmp(view.GetViewId(), SET_DESKTOP_LIST) == 0) { + SetDesktopModel::GetInstance().SetDesktopStyle(APPLIST_STYLE); + } + uint16_t preSlice = NativeAbility::GetInstance().GetPreSliceId(); + NativeAbility::GetInstance().ChangeSlice(preSlice); + return true; + } + bool SetDesktopPresenter::GetHexagonsStyleState(void) + { + return (SetDesktopModel::GetInstance().GetDesktopStyle() == HEXAGONS_STYLE); + } +} diff --git a/code/sdk/application/wearable/fd230app/nativeui/set_desktop/src/SetDesktopView.cpp b/code/sdk/application/wearable/fd230app/nativeui/set_desktop/src/SetDesktopView.cpp new file mode 100644 index 000000000..c5f2b49df --- /dev/null +++ b/code/sdk/application/wearable/fd230app/nativeui/set_desktop/src/SetDesktopView.cpp @@ -0,0 +1,107 @@ +/* + * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved. + * Description: SetDesktopView.cpp + * Author: + * Create: 2021-11-23 + */ + +#include +#include "SetDesktopView.h" +#include "SetDesktopPresenter.h" + +namespace OHOS { +SetDesktopView::SetDesktopView() +{ + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SetDesktopView::SetDesktopView"); +} + +SetDesktopView::~SetDesktopView() +{ + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SetDesktopView::~SetDesktopView"); +} + +void SetDesktopView::OnStart() +{ + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SetDesktopView::OnStart"); + View::OnStart(); + SetContainerView(new UIViewGroup()); + container_->SetDraggable(true); + container_->SetPosition(0, 0, Screen::GetInstance().GetWidth(), Screen::GetInstance().GetHeight()); + container_->SetOnDragListener(presenter_); + container_->SetTouchable(true); +} + +void SetDesktopView::OnSetUpView() +{ + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SetDesktopView::OnSetUpView"); + View::OnSetUpView(); + + 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); + container_->Add(&titleText); + + listImage.SetPosition(25, 135, 190, 190); + listImage.SetSrc(PNG_SET_DESKTOP_BG_IMAGE); + container_->Add(&listImage); + + listBtn.SetPosition(47, 157, 148, 148); + listBtn.SetImages(PNG_SET_DESKTOP_LIST_IMAGE, PNG_SET_DESKTOP_LIST_IMAGE); + listBtn.SetViewId(SET_DESKTOP_LIST); + container_->Add(&listBtn); + + listText.SetPosition(96, 328, 200, 60); + listText.SetText("列表"); + listText.SetLineBreakMode(UILabel::LINE_BREAK_ADAPT); + listText.SetFont(DEFAULT_VECTOR_FONT_FILENAME, 30); + listText.SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER); + container_->Add(&listText); + + hexagonsImage.SetPosition(247, 135, 190, 190); + hexagonsImage.SetSrc(PNG_SET_DESKTOP_BG_IMAGE); + container_->Add(&hexagonsImage); + + hexagonsBtn.SetPosition(267, 157, 148, 148); + hexagonsBtn.SetImages(PNG_SET_DESKTOP_HEXAGONS_IMAGE, PNG_SET_DESKTOP_HEXAGONS_IMAGE); + hexagonsBtn.SetViewId(SET_DESKTOP_HEXAGONS); + container_->Add(&hexagonsBtn); + + hexagonsText.SetPosition(305, 328, 200, 60); + hexagonsText.SetText("蜂窝"); + hexagonsText.SetLineBreakMode(UILabel::LINE_BREAK_ADAPT); + hexagonsText.SetFont(DEFAULT_VECTOR_FONT_FILENAME, 30); + hexagonsText.SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER); + container_->Add(&hexagonsText); + + listBtn.SetOnClickListener(presenter_); + hexagonsBtn.SetOnClickListener(presenter_); + UpdateSelectedStyle(presenter_->GetHexagonsStyleState()); +} + +void SetDesktopView::OnTearDownView() +{ + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SetDesktopView::OnTearDownView"); + View::OnTearDownView(); +} + +void SetDesktopView::OnStop() +{ + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SetDesktopView::OnStop"); + View::OnStop(); + if (container_ != nullptr) { + container_->RemoveAll(); + delete container_; + container_ = nullptr; + } +} + +void SetDesktopView::UpdateSelectedStyle(bool hexagonsSelected) +{ + listImage.SetVisible(!hexagonsSelected); + hexagonsImage.SetVisible(hexagonsSelected); + hexagonsBtn.SetState(hexagonsSelected); + listBtn.SetState(!hexagonsSelected); +} +} diff --git a/code/sdk/application/wearable/fd230app/nativeui/set_dial/include/SetDialInfo.h b/code/sdk/application/wearable/fd230app/nativeui/set_dial/include/SetDialInfo.h new file mode 100644 index 000000000..7ccb7984d --- /dev/null +++ b/code/sdk/application/wearable/fd230app/nativeui/set_dial/include/SetDialInfo.h @@ -0,0 +1,26 @@ +/* + * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved. + * Description: SetDialInfo.h + * Author: + * Create: 2021-11-23 + */ + +#ifndef SET_DIAL_INFO_H +#define SET_DIAL_INFO_H +#include +#include +#include +#include "common/image_cache_manager.h" +namespace OHOS { + typedef struct { + uint8_t dialFlag; /* 1:离线表盘 0:预制表盘 */ + uint8_t id; /* 仅预制表盘使用 */ + std::string dialFullName; /* 仅离线表盘使用 */ + std::string imageFullName; /* 仅预制表盘使用 */ + std::string dialName; + std::string description; /* 仅离线表盘使用 */ + uint8_t freq; + ImageInfo *preImageInfo; + } SetDialInfo; +} +#endif \ No newline at end of file diff --git a/code/sdk/application/wearable/fd230app/nativeui/set_dial/include/SetDialModel.h b/code/sdk/application/wearable/fd230app/nativeui/set_dial/include/SetDialModel.h new file mode 100644 index 000000000..695c5beea --- /dev/null +++ b/code/sdk/application/wearable/fd230app/nativeui/set_dial/include/SetDialModel.h @@ -0,0 +1,36 @@ +/* + * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved. + * Description: SetDialModel.h + * Author: + * Create: 2021-11-23 + */ + +#ifndef SET_DIAL_MODEL_H +#define SET_DIAL_MODEL_H +#include "AppViewIDs.h" +#include "UiConfig.h" +#include "SetDialInfo.h" + +namespace OHOS { + class SetDialModel { + public: + static SetDialModel &GetInstance(void); + void LoadAllDial(void); + size_t GetDialCount(void); + std::vector& GetDialInfo(void); + void SaveDialSetting(uint8_t pageIndex); + uint8_t GetPageIndex(void); + private: + void LoadAllDialFromRam(void); + void LoadAllDialFromFs(void); + SetDialModel(); + SetDialModel(const SetDialModel &); + SetDialModel &operator=(const SetDialModel &); + virtual ~SetDialModel(); + int32_t ParseDialHeader(const std::string &dialFileName, SetDialInfo &dialInfo); + std::vector dialInfoList; + uint8_t pageIndex_{0}; + }; +} + +#endif // SET_DIAL_MODEL_H \ No newline at end of file diff --git a/code/sdk/application/wearable/fd230app/nativeui/set_dial/include/SetDialPresenter.h b/code/sdk/application/wearable/fd230app/nativeui/set_dial/include/SetDialPresenter.h new file mode 100644 index 000000000..65b4a746d --- /dev/null +++ b/code/sdk/application/wearable/fd230app/nativeui/set_dial/include/SetDialPresenter.h @@ -0,0 +1,40 @@ +/* + * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved. + * Description: SetDialPresenter.h + * Author: + * Create: 2021-11-23 + */ + +#ifndef SET_DIAL_PRESENTER_H +#define SET_DIAL_PRESENTER_H +#include "SetDialInfo.h" +#include "SetDialModel.h" +#include "Presenter.h" +#include "components/ui_view.h" +#include "KeyInputListener.h" + +namespace OHOS { + +class SetDialView; +class SetDialModel; +class SetDialPresenter : public Presenter, + public UIView::OnClickListener, + public UICoverflowView::OnCoverflowScrollListener { +public: + SetDialPresenter(); + virtual ~SetDialPresenter(); + size_t GetDialCount(void); + std::vector& GetDialInfo(void); + uint8_t GetPageIndex(void); + virtual void OnStart() override; + virtual void OnResume() override; + virtual void OnStop() override; + bool OnScroll() override; + bool OnClick(UIView &view, const ClickEvent &event) override; +private: + KeyInputListener *keyActListenr{nullptr}; + SetDialModel *model{nullptr}; +}; +} + +#endif // SET_DIAL_PRESENTER_H \ No newline at end of file diff --git a/code/sdk/application/wearable/fd230app/nativeui/set_dial/include/SetDialView.h b/code/sdk/application/wearable/fd230app/nativeui/set_dial/include/SetDialView.h new file mode 100644 index 000000000..85ee938c9 --- /dev/null +++ b/code/sdk/application/wearable/fd230app/nativeui/set_dial/include/SetDialView.h @@ -0,0 +1,47 @@ +/* + * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved. + * Description: SetDialView.h + * Author: + * Create: 2021-11-23 + */ + +#ifndef SET_DIAL_VIEW_H +#define SET_DIAL_VIEW_H + +#include "View.h" +#include "components/ui_view_group.h" +#include "components/ui_coverflow_view.h" +#include "window/window.h" +#include "BaseView.h" +#include "ChangeSliceListener.h" +#include "UiConfig.h" + +namespace OHOS { +static constexpr uint8_t DIVISOR_TWO = 2; +class SetDialPresenter; + +class SetDialView : public View { +public: + SetDialView(); + virtual ~SetDialView(); + + static SetDialView *GetInstance() + { + static SetDialView instance; + return &instance; + } + + virtual void OnStart() override; + virtual void OnSetUpView() override; + virtual void OnTearDownView() override; + virtual void OnStop() override; + void CoverflowViewScroll(void); + uint8_t GetCoverflowPage(void); +private: + void SetUpCoverflowView(void); + UICoverflowView coverflow_; + UILabel label_; + uint8_t lastIndex_; +}; +} +#endif // SET_DIAL_VIEW_H diff --git a/code/sdk/application/wearable/fd230app/nativeui/set_dial/src/SetDialModel.cpp b/code/sdk/application/wearable/fd230app/nativeui/set_dial/src/SetDialModel.cpp new file mode 100644 index 000000000..122c0adb0 --- /dev/null +++ b/code/sdk/application/wearable/fd230app/nativeui/set_dial/src/SetDialModel.cpp @@ -0,0 +1,161 @@ +/* + * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved. + * Description: SetDialModel.cpp + * Author: + * Create: 2021-11-23 + */ + +#include "MainModel.h" +#include "SetDialModel.h" +#include "kv_store.h" +#include "securec.h" +#include "dirent.h" +#include "DialBinTypes.h" +#include "wearable_log.h" + +namespace OHOS { + SetDialModel::SetDialModel() {} + + SetDialModel::~SetDialModel() {} + + SetDialModel &SetDialModel::GetInstance() + { + static SetDialModel instance; + return instance; + } + void SetDialModel::LoadAllDial() + { + dialInfoList.clear(); + LoadAllDialFromRam(); + LoadAllDialFromFs(); + } + + void SetDialModel::LoadAllDialFromRam() + { + for (uint8_t i = DIAL_CLOCK; i < DIAL_MAX; i++) { + const DialInfo *info = MainModel::GetInstance().GetDialInfo((DialId)i); + if (info != nullptr) { + SetDialInfo dialInfo; + dialInfo.dialFlag = 0; + dialInfo.id = i; + dialInfo.dialName = info->dialName; + dialInfo.imageFullName = info->dialImg; + dialInfo.freq = info->freq; + ImageInfo* imageInfo = ImageCacheManager::GetInstance().LoadSingleRes(info->dialImg, false); + if (info == nullptr) { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "LoadAllDialFromRam loadimage %s fail", + info->dialImg); + continue; + } + dialInfo.preImageInfo = imageInfo; + dialInfoList.push_back(dialInfo); + } + } + } + + void SetDialModel::LoadAllDialFromFs() + { + int ret; + struct dirent *direntp; + + // 打开目录 + DIR *dirp = opendir(APP_DIAL_PATH); + // 遍历文件 + if (dirp != NULL) { + while ((direntp = readdir(dirp)) != NULL) { + SetDialInfo dialInfo; + int ret = ParseDialHeader(direntp->d_name, dialInfo); + if (ret == 0) { + dialInfoList.push_back(dialInfo); + } + } + } + // 关闭目录 + closedir(dirp); + return; + } + + int32_t SetDialModel::ParseDialHeader(const std::string &dialFileName, SetDialInfo &dialInfo) + { + DialHeader dialHeader{0}; + std::string dialFullName = APP_DIAL_PATH; + dialFullName += "/"; + dialFullName += dialFileName; + FILE *fp = fopen(dialFullName.c_str(), "rb"); + if (fp == nullptr) { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ParseDialHeader cannot open file: %s", + dialFullName.c_str()); + return -1; + } + if (fread(&dialHeader, 1, sizeof(dialHeader), fp) != sizeof(dialHeader)) { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ParseDialHeader fread %s fail", + dialFullName.c_str()); + return -1; + } + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ParseDialHeader dialFullName: %s", + dialFullName.c_str()); + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ParseDialHeader dialName: %s", + dialHeader.dialName); + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ParseDialHeader description: %s", + dialHeader.description); + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ParseDialHeader freq: %u", + dialHeader.freq); + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ParseDialHeader previewImgId: %u", + dialHeader.previewImgId); + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ParseDialHeader imageOffset: %u", + dialHeader.imageOffset); + ImageInfo *info = ImageCacheManager::GetInstance().LoadOneInMultiRes( + dialHeader.previewImgId | (0xfef << 20), dialFullName, fp, false, dialHeader.imageOffset); + if (info == nullptr) { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ParseDialHeader loadimage fail"); + return -1; + } + + dialInfo.dialFlag = 1; + dialInfo.id = 0; + dialInfo.dialFullName = dialFullName; + dialInfo.dialName = dialHeader.dialName; + dialInfo.description = dialHeader.description; + dialInfo.freq = dialHeader.freq; + dialInfo.preImageInfo = info; + + fclose(fp); + return 0; + } + + void SetDialModel::SaveDialSetting(uint8_t pageIndex) + { + if (pageIndex >= dialInfoList.size()) { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SetDialModel SaveDialSetting [%u %u]", + pageIndex, dialInfoList.size()); + return; + } + DialSetting diagSetting; + SetDialInfo &info = dialInfoList[pageIndex]; + diagSetting.dialFlag = info.dialFlag; + diagSetting.dialId = info.id; + diagSetting.dialFullName = info.dialFullName; + MainModel::GetInstance().AddDialSetting(diagSetting); + pageIndex_ = pageIndex; + } + + size_t SetDialModel::GetDialCount(void) + { + return dialInfoList.size(); + } + + std::vector& SetDialModel::GetDialInfo(void) + { + return dialInfoList; + } + + uint8_t SetDialModel::GetPageIndex(void) + { + if (pageIndex_ >= dialInfoList.size()) { + return 0; + } else { + return pageIndex_; + } + } + +} diff --git a/code/sdk/application/wearable/fd230app/nativeui/set_dial/src/SetDialPresenter.cpp b/code/sdk/application/wearable/fd230app/nativeui/set_dial/src/SetDialPresenter.cpp new file mode 100644 index 000000000..2fbaa9943 --- /dev/null +++ b/code/sdk/application/wearable/fd230app/nativeui/set_dial/src/SetDialPresenter.cpp @@ -0,0 +1,79 @@ +/* + * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved. + * Description: SetDialPresenter.cpp + * Author: + * Create: 2021-11-23 + */ + +#include "SetDialView.h" +#include "SetDialModel.h" +#include "SetDialPresenter.h" + +namespace OHOS { + SetDialPresenter::SetDialPresenter() + { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SetDialPresenter::SetDialPresenter"); + model = &SetDialModel::GetInstance(); + model->LoadAllDial(); + } + + SetDialPresenter::~SetDialPresenter() + { + if (keyActListenr != nullptr) { + delete keyActListenr; + keyActListenr = nullptr; + } + } + + void SetDialPresenter::OnStart() + { + Presenter::OnStart(); + if (keyActListenr == nullptr) { + keyActListenr = new KeyInputListener(); + if (keyActListenr != nullptr) { + RootView::GetInstance()->SetOnKeyActListener(keyActListenr); + } else { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ApplistPresenter::OnStart: new KeyInputListener fail"); + } + } + } + + void SetDialPresenter::OnResume(void) + { + } + + void SetDialPresenter::OnStop(void) + { + } + + bool SetDialPresenter::OnClick(UIView &view, const ClickEvent &event) + { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SetDialPresenter::OnClick"); + uint8_t pageIndex = view_->GetCoverflowPage(); + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SetDialPresenter select pageIndex = %u", pageIndex); + model->SaveDialSetting(pageIndex); + NativeAbility::GetInstance().ChangeSlice(VIEW_MAIN); + return true; + } + + bool SetDialPresenter::OnScroll() + { + view_->CoverflowViewScroll(); + return true; + } + + size_t SetDialPresenter::GetDialCount(void) + { + return model->GetDialCount(); + } + + std::vector& SetDialPresenter::GetDialInfo(void) + { + return model->GetDialInfo(); + } + + uint8_t SetDialPresenter::GetPageIndex(void) + { + return model->GetPageIndex(); + } +} diff --git a/code/sdk/application/wearable/fd230app/nativeui/set_dial/src/SetDialView.cpp b/code/sdk/application/wearable/fd230app/nativeui/set_dial/src/SetDialView.cpp new file mode 100644 index 000000000..b683a860f --- /dev/null +++ b/code/sdk/application/wearable/fd230app/nativeui/set_dial/src/SetDialView.cpp @@ -0,0 +1,118 @@ +/* + * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved. + * Description: SetDialView.cpp + * Author: + * Create: 2021-11-23 + */ + +#include +#include "SetDialView.h" +#include "SetDialPresenter.h" + +namespace OHOS { +SetDialView::SetDialView() +{ + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SetDialView::SetDialView"); +} + +SetDialView::~SetDialView() +{ + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SetDialView::~SetDialView"); +} + +void SetDialView::OnStart() +{ + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SetDialView::OnStart"); + View::OnStart(); + SetContainerView(new UIViewGroup()); + container_->SetPosition(0, 0, Screen::GetInstance().GetWidth(), Screen::GetInstance().GetHeight()); + SetUpCoverflowView(); +} + +void SetDialView::SetUpCoverflowView(void) +{ + coverflow_.SetPosition(0, 0, Screen::GetInstance().GetWidth(), Screen::GetInstance().GetHeight()); + coverflow_.SetIntercept(true); + coverflow_.SetOnCoverflowListener(presenter_); + coverflow_.SetOnClickListener(presenter_); + std::vector &dialInfo = presenter_->GetDialInfo(); + for (auto iter : dialInfo) { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SetDialView::SetUpCoverflowView %s", + iter.dialName.c_str()); + coverflow_.Add(iter.dialName.c_str(), iter.preImageInfo); + } + lastIndex_ = presenter_->GetPageIndex(); + coverflow_.SetCurrentPage(lastIndex_); + + label_.SetPosition(127, 50, 200, 50); + label_.SetTextColor(Color::White()); + label_.SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER); + label_.SetText(dialInfo[lastIndex_].dialName.c_str()); + label_.SetFont(DEFAULT_VECTOR_FONT_FILENAME, 30); + + container_->Add(&coverflow_); + container_->Add(&label_); +} + +void SetDialView::OnSetUpView() +{ + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SetDialView::OnSetUpView"); + View::OnSetUpView(); +} + +void SetDialView::OnTearDownView() +{ + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SetDialView::OnTearDownView"); + View::OnTearDownView(); +} + +void SetDialView::OnStop() +{ + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SetDialView::OnStop"); + View::OnStop(); + if (container_ != nullptr) { + container_->RemoveAll(); + delete container_; + container_ = nullptr; + } +} + +void SetDialView::CoverflowViewScroll(void) +{ + int16_t contMidX = static_cast(Screen::GetInstance().GetWidth() / DIVISOR_TWO); + int16_t minOffset = contMidX; + uint8_t newCenterIndex = lastIndex_; + for (uint8_t i = 0; i < coverflow_.GetChildrenNumber(); i++) { + Rect rect = coverflow_.GetViewByIndex(i)->GetOrigRect(); + int16_t x = rect.GetLeft(); + int16_t x1 = rect.GetRight(); + int16_t xMid = static_cast(x + (x1 - x + 1) / DIVISOR_TWO); + int16_t distance = MATH_ABS(xMid - contMidX); + if (distance < minOffset) { + newCenterIndex = i; + minOffset = distance; + } + } + if (newCenterIndex != lastIndex_) { + lastIndex_ = newCenterIndex; + std::vector &dialInfo = presenter_->GetDialInfo(); + label_.SetText(dialInfo[lastIndex_].dialName.c_str()); + } + + Rect curViewRect = coverflow_.GetViewByIndex(lastIndex_)->GetOrigRect(); + int16_t centerMid = curViewRect.GetLeft() + curViewRect.GetWidth() / DIVISOR_TWO; + int16_t offset = MATH_ABS(contMidX - centerMid); + if (offset > curViewRect.GetWidth() / DIVISOR_TWO) { + label_.SetStyle(STYLE_TEXT_OPA, 0); + } else { + uint8_t alpha = (uint8_t)((1.0f - ((float)offset / (curViewRect.GetWidth() / DIVISOR_TWO))) * OPA_OPAQUE); + label_.SetStyle(STYLE_TEXT_OPA, alpha); + } +} + +uint8_t SetDialView::GetCoverflowPage(void) +{ + return lastIndex_; +} + +} diff --git a/code/sdk/application/wearable/nativeapp/CMakeLists.txt b/code/sdk/application/wearable/nativeapp/CMakeLists.txt index 15f8c8f22..38ebe73c7 100755 --- a/code/sdk/application/wearable/nativeapp/CMakeLists.txt +++ b/code/sdk/application/wearable/nativeapp/CMakeLists.txt @@ -57,8 +57,8 @@ set(PRIVATE_HEADER ${ROOT_DIR}/middleware/services/gui/uikit/proprietary/src/ui/frameworks ${ROOT_DIR}/middleware/services/gui/uikit/proprietary/src/ui/innerkits - ${ROOT_DIR}/middleware/services/gui/uikit/ui/interfaces/kits/events - ${ROOT_DIR}/middleware/services/gui/uikit/ui/interfaces/kits +c + ${ROOT_DIR}/middleware/services/gui/uikit/utils/interfaces/kits ${ROOT_DIR}/middleware/services/gui/uikit/utils/interfaces/kits/gfx_utils ${ROOT_DIR}/middleware/services/gui/uikit/utils/interfaces/innerkits @@ -111,6 +111,7 @@ set(SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/nativeui/main/src/dial/DialModelHeartRate.cpp ${CMAKE_CURRENT_SOURCE_DIR}/nativeui/main/src/dial/DialModelSteps.cpp ${CMAKE_CURRENT_SOURCE_DIR}/nativeui/main/src/dial/DialModelPower.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/nativeui/bloodoxygen/src/BloodOxygenView.cpp ${CMAKE_CURRENT_SOURCE_DIR}/nativeui/bloodoxygen/src/BloodBandoffView.cpp ${CMAKE_CURRENT_SOURCE_DIR}/nativeui/bloodoxygen/src/BloodOxygenPresenter.cpp diff --git a/code/sdk/application/wearable/nativeapp/nativeui/main/src/MainViewSample.cpp b/code/sdk/application/wearable/nativeapp/nativeui/main/src/MainViewSample.cpp index b540ca6e3..e6280653b 100755 --- a/code/sdk/application/wearable/nativeapp/nativeui/main/src/MainViewSample.cpp +++ b/code/sdk/application/wearable/nativeapp/nativeui/main/src/MainViewSample.cpp @@ -320,16 +320,6 @@ UICardPage *MainViewSample::InitCompassPage(void) return compassControlView; } -UICardPage *MainViewSample::InitMusicPlayerPage(void) -{ - playersView = new PlayersView(); - if (playersView == nullptr) { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "playersView new fail"); - return nullptr; - } - return playersView; -} - void MainViewSample::SetPage(int16_t page) { if (mainSwipeGroup != nullptr) { diff --git a/code/sdk/application/wearable/nativeapp/nativeui/main/src/dial/parser/DialBinParser.h b/code/sdk/application/wearable/nativeapp/nativeui/main/src/dial/parser/DialBinParser.h deleted file mode 100644 index cb81a18bc..000000000 --- a/code/sdk/application/wearable/nativeapp/nativeui/main/src/dial/parser/DialBinParser.h +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Copyright (c) 2023 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 GRAPHIC_LITE_DIAL_BIN_PARSER_H -#define GRAPHIC_LITE_DIAL_BIN_PARSER_H -#include -#include -#include "graphic_types.h" -#include "DialViewGroup.h" -#include "DialBinTypes.h" -#include "components/ui_abstract_progress.h" - -namespace OHOS -{ - - class DialBinParser - { - public: - static DialBinParser *GetInstance(void); - bool UpdateDial(const std::string &file, FILE *fp, DialViewGroup *group); - void *MallocAndReadBuf(FILE *file, uint32_t readSize); - - protected: - int32_t ParseDialHeader(FILE *file); - int32_t ParserDialStaticImg(FILE *fp); - int32_t ParserDialSequenceImg(FILE *fp); - int32_t ParserDialRotateImg(FILE *fp); - int32_t ParserDialOptionImg(FILE *fp); - int32_t ParserDialDigitalImg(FILE *fp); - int32_t ParserDialLabel(FILE *fp); - int32_t ParserDialArcLabel(FILE *fp); - int32_t ParserDialBoxProgress(FILE *fp); - int32_t ParserDialArcProgress(FILE *fp); - int32_t ParserDialVideo(FILE *fp); - int32_t ParserDialClick(FILE *fp); - - private: - DialBinParser(); - virtual ~DialBinParser(); - // void* MallocAndReadBuf(FILE* file, uint32_t readSize); - bool SetProgressType(FILE *fp, UIAbstractProgress *view, DialProgressType data); - - static constexpr uint8_t DIAL_BIN_PARSER_FUNC_NUM = 11; - int32_t (DialBinParser::*funcArray_[DIAL_BIN_PARSER_FUNC_NUM])(FILE *); - - DialViewGroup *dialGroup_ = nullptr; - std::string file_; - uint32_t dirId_ = 0xfef << 20; - uint32_t imageOffset_ = 0; - }; -} -#endif \ No newline at end of file diff --git a/code/sdk/application/wearable/nativeapp/nativeui/main/src/dial/parser/DialBinTypes.h b/code/sdk/application/wearable/nativeapp/nativeui/main/src/dial/parser/DialBinTypes.h deleted file mode 100644 index aadaf2181..000000000 --- a/code/sdk/application/wearable/nativeapp/nativeui/main/src/dial/parser/DialBinTypes.h +++ /dev/null @@ -1,158 +0,0 @@ -/* - * Copyright (c) 2023 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 GRAPHIC_LITE_DIAL_BIN_TYPE_H -#define GRAPHIC_LITE_DIAL_BIN_TYPE_H -#include "color.h" -#include "graphic_types.h" -#include "components/ui_canvas_ext.h" - -namespace OHOS { -struct DialRect { - int16_t x; - int16_t y; - int16_t w; - int16_t h; -}; - -struct DialHeader { - char dialName[16]; - int16_t width; - int16_t height; - char version[16]; - uint16_t previewImgId; - char description[128]; - uint32_t imageOffset; - uint8_t freq; - uint8_t dialViewCount; -}; - -struct DialStaticImg { - Point pos; - Point center; - float rotate; - uint16_t imgId; -}; - -struct DialSequenceImg { - Point pos; - uint16_t interval; - bool repeat; - uint8_t imgNum; -}; - -struct DialRotateImg { - Point pos; - Point center; - int16_t rotateStart; - int16_t rotateEnd; - uint16_t imgId; - int16_t bindData; - bool isPeriod; -}; - -struct DialOptionImg { - Point pos; - int16_t bindData; - bool isPeriod; - uint8_t count; -}; - -constexpr uint8_t DIGITALIMG_IMG_MAX_NUM = 10; -struct DialDigitalImg { - uint8_t alignType : 4; - uint8_t integerLength : 4; - uint8_t decimalPrecision; - uint16_t imgIds[DIGITALIMG_IMG_MAX_NUM]; - int16_t signImgId; - int16_t decimalPointImgId; - uint16_t space; - Point alignPosition; - int16_t bindData; - bool isPeriod; -}; - -struct DialLabel { - uint8_t breakMode; - uint8_t align; - uint8_t fontSize; - bool isPeriod; - DialRect rect; - uint32_t color; - char fontName[64]; - char text[64]; - int16_t bindData; -}; - -struct DialArcLabel { - uint8_t align; - uint8_t fontSize; - Point center; - int16_t radius; - int16_t rotateStart; - int16_t rotateEnd; - uint32_t color; - char fontName[64]; - char text[64]; - int16_t bindData; - bool isPeriod; -}; - -struct DialProgressType { - uint8_t type; // image | color | gradient_color - DialRect rect; - union { - uint8_t stopCount; - uint16_t imgId; - Color32 color; - }; -}; - -struct DialBoxProgress { - uint8_t cap; - uint8_t direction; - bool isPeriod; - int16_t bindData; - uint32_t bgColor; - DialProgressType typeData; -}; - -struct DialArcProgress { - uint8_t cap; - bool isPeriod; - uint16_t radius; - uint16_t startAngle; - uint16_t endAngle; - uint16_t lineWidth; - int16_t bindData; - uint32_t bgColor; - DialProgressType typeData; -}; - -struct DialVideo { - DialRect rect; - uint32_t offset; - Color32 colorKey; -}; - -struct DialClick { - uint8_t type; - DialRect rect; - union { - uint32_t sliceId; - char bundleName[64]; - }; -}; -} -#endif // GRAPHIC_LITE_DIAL_BIN_TYPE_H \ No newline at end of file diff --git a/code/sdk/application/wearable/nativeapp/nativeui/phoneservice/include/PhoneService.h b/code/sdk/application/wearable/nativeapp/nativeui/phoneservice/include/PhoneService.h index 36eeaa6e7..8ac11c662 100755 --- a/code/sdk/application/wearable/nativeapp/nativeui/phoneservice/include/PhoneService.h +++ b/code/sdk/application/wearable/nativeapp/nativeui/phoneservice/include/PhoneService.h @@ -14,246 +14,253 @@ #include "PhoneAudio.h" #ifdef __cplusplus -extern "C" { +extern "C" +{ #endif #define MULTI_CALL_MAX_NUME 5 // 最大多路通话路数 -#define CALL_LOG_MAX_NUM 30 // 最多记录30条通话记录,超出后删除最老的记录 +#define CALL_LOG_MAX_NUM 30 // 最多记录30条通话记录,超出后删除最老的记录 #define NAME_SIZE 20 #define MAX_PHONE_NUM 20 #define CALL_VOLUME_MAX 15 -typedef struct { - int operate; - int lastStatus; - char name[NAME_SIZE]; - unsigned char nameLen; - unsigned char tel[MAX_PHONE_NUM]; - unsigned char telLen; - uint64 activeTime; // 首次电话接通时间点 - uint64 creationTime; // 通话创建时间(不是接通时间) - hfp_hf_calls_info_t unitCalls; -} PhoneCallInfo; - -enum OperateType { - OPERATE_NO_OPE = 0, // 无操作 - OPERATE_DIALING, // 呼出,正在拨号中 - OPERATE_ALERTING, // 呼出,对方响铃 - OPERATE_INCOMING, // 来电呼入 - OPERATE_WAITING, // 来电呼入(等待) - OPERATE_WATCH_ACTIVE, // 对方呼入,手表接听 - OPERATE_PHONE_ACTIVE, // 对方呼入,手机接听 (手表接收到此操作,调用DisconnectSco接口断开SCO连接) - OPERATE_PEER_ACTIVE, // 呼出,对方接听 - OPERATE_PHONE_HOLD, // 手机挂起通话 - OPERATE_WATCH_REJECT, // 手表拒接来电 - OPERATE_WATCH_FINISH, // 手表发起通话结束(挂断通话) - OPERATE_NON_WATCH_FINISH, // 非手表发起通话结束(手机挂断+拒接来电) -}; - -// 通话失败类型 -typedef enum { - ERROR_BT = 0, // 蓝牙 - ERROR_DIAL, // 拨号 -} PhoneServiceErrorType; - -// 通话结束类型 -typedef enum { - CALL_OUTGOING = 0, // 呼出电话 - CALL_INCOMING, // 呼入电话 - CALL_MISSED, // 未接来电 -} CallFinishStatus; - -typedef struct { - char name[NAME_SIZE]; - unsigned char nameLen; - unsigned char tel[MAX_PHONE_NUM]; - unsigned char telLen; - CallFinishStatus status; - uint64 creationTime; // 通话创建时间(不是接通时间) - uint64 callDurTime; // 通话持续时间 -} CallLogInfo; - -// 通话状态改变回调函数 -typedef void (*PhoneServiceCallChangedCb)(const PhoneCallInfo *phoneCall); -// 电话服务失败回调函数 -typedef void (*PhoneServiceErrorCb)(PhoneServiceErrorType type, int volume); -// sco连接回调函数(状态只有断开和连接两种状态) 通话转移会导致sco连接和断连 -typedef void (*PhoneServiceScoStatusCb)(hfp_sco_connect_state_t state); - -typedef struct { - PhoneServiceCallChangedCb callChanged; - PhoneServiceErrorCb phoneServiceErrorCb; - PhoneServiceScoStatusCb scoStatusCb; -} PhoneServiceCb; - -void AddToCallLog(CallLogInfo *info); -/** - * @brief 注册电话服务回调函数 - * - * @param phoneServiceFun 注册函数 - * @return 返回值 成功返回0,失败返回错误码 - */ -int RegisterCallChangedCb(PhoneServiceCb *phoneServiceFun); - -/** - * @brief 电话服务初始化 - */ -void PhoneServiceInit(void); - -/** - * @brief 手表呼出电话 - * - * @param number 呼出号码 - * @param len 号码长度,只包括号码数字部分,不包括结尾'\0' - * @return 返回值 成功返回0,失败返回错误码 - */ -int DialCall(unsigned char *number, unsigned char len); - -/** - * @brief 手表接听呼入来电 - * - * @return 返回值 成功返回0,失败返回错误码 - */ -int AcceptIncomingCall(void); - -/** - * @brief 手表拒接呼入来电 - * - * @return 返回值 成功返回0,失败返回错误码 - */ -int RejectIncomingCall(void); - -/** - * @brief 手表结束通话 - * - * @return 返回值 成功返回0,失败返回错误码 - */ -int FinishCall(void); - -/** - * @brief 获取当前通话的最新变化状态 - * - * @return 返回值 通话变化状态 - */ -int GetCurrCallState(void); - -/** - * @brief 判断此次通话是否是完整通话流程 - * - * @return 返回值 true:是;false:不是 - */ -bool IsCompleteCallFlow(void); - -/** - * @brief 获取当前正在通话路数 - * - * @return 返回值 返回当前正在通话路数 - */ -int GetCurrCallNum(void); - -/** - * @brief 获取当前通话路数和对应的通话信息 - * - * @param callList 用来接收通话信息,需调用者分配空间,大小为MULTI_CALL_MAX_NUME * sizeof(PhoneCallInfo) - * @param listNum callList中PhoneCallInfo个数,大小为MULTI_CALL_MAX_NUME - * @param retNum 接收当前正在进行的通话路数 - * @return 返回值 成功返回0,失败返回错误码 - */ -int GetCallInfoInCallList(PhoneCallInfo callList[], int listNum, int *retNum); - -/** - * @brief 获取当前通话音量大小(0 -15) - * - * @param volume - * - * @return 返回值 当前通话音量大小 - */ -unsigned char GetCallCurrVolume(void); - -/** - * @brief 设置手表通话Speaker音量 - * - * @param volume - * - * @return 返回值 void - */ -void SetSpeakerVolume(unsigned char volume); - -/** - * @brief 设置通话Speaker静音/取消静音 - * - * @param isMute true:设置通话Speaker静音;false:设置通话Speaker取消静音 - * @return 返回值 成功返回ture,失败返回false - */ -bool SetSpeakerMute(bool isMute); - -/** - * @brief 设置通话mic静音/取消静音 - * - * @param isMute true:设置通话mic静音;false:设置通话mic取消静音 - * @return 返回值 成功返回ture,失败返回false - */ -bool SetMicMute(bool isMute); - -/** - * @brief 获取SCO的连接状态 - * - * @return 返回值 返回SCO的连接状态 - */ -int GetScoConnectState(void); - -/** - * @brief 通话转移到手表 - * - * @return 返回值 成功返回0,失败返回错误码 - */ -int TransCallToWatch(void); - -/** - * @brief 通话转移到手机 - * - * @return 返回值 成功返回0,失败返回错误码 - */ -int TransCallToMobilePhone(void); - -/** - * @brief 获取通话记录 - * - * @param info 接收获取的通话记录,由调用者释放free - * @param num 接收通话记录条数 - * @return 返回值 成功返回0,失败返回错误码 - */ -int GetCallLog(CallLogInfo **info, int *num); - -/** - * @brief 删除第一条通话记录 - * - * @return 返回值 成功返回0,失败返回错误码 - */ -int RemoveFirstCallLog(void); - -/** - * @brief 清空通话记录 - * - * @return 返回值 成功返回0,失败返回错误码 - */ -int ClearCallLogFile(void); - -/** - * @brief 获取蓝牙状态 - * - * @return 返回值 蓝牙连接状态 - */ -uint32 GetBtConnectStatus(void); - -/** - * @brief 释放蓝牙通话媒体资源 - * - * @return 返回值 无 - */ -void AudioRelease(void); - -uint32 GetCallCodec(void); + typedef struct + { + int operate; + int lastStatus; + char name[NAME_SIZE]; + unsigned char nameLen; + unsigned char tel[MAX_PHONE_NUM]; + unsigned char telLen; + uint64 activeTime; // 首次电话接通时间点 + uint64 creationTime; // 通话创建时间(不是接通时间) + hfp_hf_calls_info_t unitCalls; + } PhoneCallInfo; + + enum OperateType + { + OPERATE_NO_OPE = 0, // 无操作 + OPERATE_DIALING, // 呼出,正在拨号中 + OPERATE_ALERTING, // 呼出,对方响铃 + OPERATE_INCOMING, // 来电呼入 + OPERATE_WAITING, // 来电呼入(等待) + OPERATE_WATCH_ACTIVE, // 对方呼入,手表接听 + OPERATE_PHONE_ACTIVE, // 对方呼入,手机接听 (手表接收到此操作,调用DisconnectSco接口断开SCO连接) + OPERATE_PEER_ACTIVE, // 呼出,对方接听 + OPERATE_PHONE_HOLD, // 手机挂起通话 + OPERATE_WATCH_REJECT, // 手表拒接来电 + OPERATE_WATCH_FINISH, // 手表发起通话结束(挂断通话) + OPERATE_NON_WATCH_FINISH, // 非手表发起通话结束(手机挂断+拒接来电) + }; + + // 通话失败类型 + typedef enum + { + ERROR_BT = 0, // 蓝牙 + ERROR_DIAL, // 拨号 + } PhoneServiceErrorType; + + // 通话结束类型 + typedef enum + { + CALL_OUTGOING = 0, // 呼出电话 + CALL_INCOMING, // 呼入电话 + CALL_MISSED, // 未接来电 + } CallFinishStatus; + + typedef struct + { + char name[NAME_SIZE]; + unsigned char nameLen; + unsigned char tel[MAX_PHONE_NUM]; + unsigned char telLen; + CallFinishStatus status; + uint64 creationTime; // 通话创建时间(不是接通时间) + uint64 callDurTime; // 通话持续时间 + } CallLogInfo; + + // 通话状态改变回调函数 + typedef void (*PhoneServiceCallChangedCb)(const PhoneCallInfo *phoneCall); + // 电话服务失败回调函数 + typedef void (*PhoneServiceErrorCb)(PhoneServiceErrorType type, int volume); + // sco连接回调函数(状态只有断开和连接两种状态) 通话转移会导致sco连接和断连 + typedef void (*PhoneServiceScoStatusCb)(hfp_sco_connect_state_t state); + + typedef struct + { + PhoneServiceCallChangedCb callChanged; + PhoneServiceErrorCb phoneServiceErrorCb; + PhoneServiceScoStatusCb scoStatusCb; + } PhoneServiceCb; + + void AddToCallLog(CallLogInfo *info); + /** + * @brief 注册电话服务回调函数 + * + * @param phoneServiceFun 注册函数 + * @return 返回值 成功返回0,失败返回错误码 + */ + int RegisterCallChangedCb(PhoneServiceCb *phoneServiceFun); + + /** + * @brief 电话服务初始化 + */ + void PhoneServiceInit(void); + + /** + * @brief 手表呼出电话 + * + * @param number 呼出号码 + * @param len 号码长度,只包括号码数字部分,不包括结尾'\0' + * @return 返回值 成功返回0,失败返回错误码 + */ + int DialCall(unsigned char *number, unsigned char len); + + /** + * @brief 手表接听呼入来电 + * + * @return 返回值 成功返回0,失败返回错误码 + */ + int AcceptIncomingCall(void); + + /** + * @brief 手表拒接呼入来电 + * + * @return 返回值 成功返回0,失败返回错误码 + */ + int RejectIncomingCall(void); + + /** + * @brief 手表结束通话 + * + * @return 返回值 成功返回0,失败返回错误码 + */ + int FinishCall(void); + + /** + * @brief 获取当前通话的最新变化状态 + * + * @return 返回值 通话变化状态 + */ + int GetCurrCallState(void); + + /** + * @brief 判断此次通话是否是完整通话流程 + * + * @return 返回值 true:是;false:不是 + */ + bool IsCompleteCallFlow(void); + + /** + * @brief 获取当前正在通话路数 + * + * @return 返回值 返回当前正在通话路数 + */ + int GetCurrCallNum(void); + + /** + * @brief 获取当前通话路数和对应的通话信息 + * + * @param callList 用来接收通话信息,需调用者分配空间,大小为MULTI_CALL_MAX_NUME * sizeof(PhoneCallInfo) + * @param listNum callList中PhoneCallInfo个数,大小为MULTI_CALL_MAX_NUME + * @param retNum 接收当前正在进行的通话路数 + * @return 返回值 成功返回0,失败返回错误码 + */ + int GetCallInfoInCallList(PhoneCallInfo callList[], int listNum, int *retNum); + + /** + * @brief 获取当前通话音量大小(0 -15) + * + * @param volume + * + * @return 返回值 当前通话音量大小 + */ + unsigned char GetCallCurrVolume(void); + + /** + * @brief 设置手表通话Speaker音量 + * + * @param volume + * + * @return 返回值 void + */ + void SetSpeakerVolume(unsigned char volume); + + /** + * @brief 设置通话Speaker静音/取消静音 + * + * @param isMute true:设置通话Speaker静音;false:设置通话Speaker取消静音 + * @return 返回值 成功返回ture,失败返回false + */ + bool SetSpeakerMute(bool isMute); + + /** + * @brief 设置通话mic静音/取消静音 + * + * @param isMute true:设置通话mic静音;false:设置通话mic取消静音 + * @return 返回值 成功返回ture,失败返回false + */ + bool SetMicMute(bool isMute); + + /** + * @brief 获取SCO的连接状态 + * + * @return 返回值 返回SCO的连接状态 + */ + int GetScoConnectState(void); + + /** + * @brief 通话转移到手表 + * + * @return 返回值 成功返回0,失败返回错误码 + */ + int TransCallToWatch(void); + + /** + * @brief 通话转移到手机 + * + * @return 返回值 成功返回0,失败返回错误码 + */ + int TransCallToMobilePhone(void); + + /** + * @brief 获取通话记录 + * + * @param info 接收获取的通话记录,由调用者释放free + * @param num 接收通话记录条数 + * @return 返回值 成功返回0,失败返回错误码 + */ + int GetCallLog(CallLogInfo **info, int *num); + + /** + * @brief 删除第一条通话记录 + * + * @return 返回值 成功返回0,失败返回错误码 + */ + int RemoveFirstCallLog(void); + + /** + * @brief 清空通话记录 + * + * @return 返回值 成功返回0,失败返回错误码 + */ + int ClearCallLogFile(void); + + /** + * @brief 获取蓝牙状态 + * + * @return 返回值 蓝牙连接状态 + */ + uint32 GetBtConnectStatus(void); + + /** + * @brief 释放蓝牙通话媒体资源 + * + * @return 返回值 无 + */ + void AudioRelease(void); + + uint32 GetCallCodec(void); #ifdef __cplusplus } diff --git a/code/sdk/application/wearable/nativeapp/nativeui/phoneservice/src/PhoneService.cpp b/code/sdk/application/wearable/nativeapp/nativeui/phoneservice/src/PhoneService.cpp index a15639445..bd9effd0b 100755 --- a/code/sdk/application/wearable/nativeapp/nativeui/phoneservice/src/PhoneService.cpp +++ b/code/sdk/application/wearable/nativeapp/nativeui/phoneservice/src/PhoneService.cpp @@ -25,7 +25,8 @@ #include "samgr_lite.h" #include "ui_service.h" #ifdef __cplusplus -extern "C" { +extern "C" +{ #endif #define CALL_LOG_PATH "/user/data/calllog.bin" @@ -38,561 +39,637 @@ extern "C" { #define INVALID_PHONE_SERVICE_VALUE (-1) -typedef enum { - AUDIO_UNKNOW = 0, - AUDIO_ACT_INTERRUPT_WATCH_RING, // 手表铃声焦点 - AUDIO_ACT_INTERRUPT_BT_SCO, // 蓝牙通话焦点 - AUDIO_CONN_IN_BT_SCO, - AUDIO_CONN_OUT_BT_SCO, - AUDIO_STREAM_INIT, - AUDIO_STREAM_START_SCO, - AUDIO_STREAM_START_DN, - AUDIO_STREAM_START_UP, -} AudioState; - -static PhoneCallInfo g_callList[MULTI_CALL_MAX_NUME]; -static uint32 g_currCallNum = 0; -static uint32 g_finishOperate = OPERATE_NON_WATCH_FINISH; -static uint32 g_scoFlag = HFP_SCO_STATE_DISCONNECTED; // sco连接状态,同时也表示通话在手表还是在手机 -static uint32 g_btConnState = PROFILE_STATE_DISCONNECTED; // 蓝牙连接状态 -static bd_addr_t g_bdAddr; // 设备的蓝牙地址 -static uint32 g_currCallState = HFP_HF_CALL_STATE_FINISHED; -static bool g_completeCallFlag = false; // 完整通话流程:从incoming、dialing或alerting开始才算完整 -static uint32 g_audioState = AUDIO_UNKNOW; -static MutexId g_audioMutex; -static uint32 g_call_codec = mSBC; - -static int g_hdlUpMic = INVALID_PHONE_SERVICE_VALUE; -static int g_hdlUpSco = INVALID_PHONE_SERVICE_VALUE; -static int g_hdlDnSpk = INVALID_PHONE_SERVICE_VALUE; -static int g_hdlDnSco = INVALID_PHONE_SERVICE_VALUE; - -PhoneServiceCb g_callChanged; -void HfpIncomingEventPublish(uint16 topic, hfp_hf_calls_info_t callsInfo); - -static void PhoneServiceScreenCtr(bool turnOnFlag) -{ - if (turnOnFlag) { - int32_t timeout = -1; - SendMsgToUIService(SCREEN_TURN_ON_TO_UI, 0, &timeout, sizeof(int32_t)); - } else { - SendMsgToUIService(SCREEN_TURN_OFF_TO_UI, 0, NULL, 0); + typedef enum + { + AUDIO_UNKNOW = 0, + AUDIO_ACT_INTERRUPT_WATCH_RING, // 手表铃声焦点 + AUDIO_ACT_INTERRUPT_BT_SCO, // 蓝牙通话焦点 + AUDIO_CONN_IN_BT_SCO, + AUDIO_CONN_OUT_BT_SCO, + AUDIO_STREAM_INIT, + AUDIO_STREAM_START_SCO, + AUDIO_STREAM_START_DN, + AUDIO_STREAM_START_UP, + } AudioState; + + static PhoneCallInfo g_callList[MULTI_CALL_MAX_NUME]; + static uint32 g_currCallNum = 0; + static uint32 g_finishOperate = OPERATE_NON_WATCH_FINISH; + static uint32 g_scoFlag = HFP_SCO_STATE_DISCONNECTED; // sco连接状态,同时也表示通话在手表还是在手机 + static uint32 g_btConnState = PROFILE_STATE_DISCONNECTED; // 蓝牙连接状态 + static bd_addr_t g_bdAddr; // 设备的蓝牙地址 + static uint32 g_currCallState = HFP_HF_CALL_STATE_FINISHED; + static bool g_completeCallFlag = false; // 完整通话流程:从incoming、dialing或alerting开始才算完整 + static uint32 g_audioState = AUDIO_UNKNOW; + static MutexId g_audioMutex; + static uint32 g_call_codec = mSBC; + + static int g_hdlUpMic = INVALID_PHONE_SERVICE_VALUE; + static int g_hdlUpSco = INVALID_PHONE_SERVICE_VALUE; + static int g_hdlDnSpk = INVALID_PHONE_SERVICE_VALUE; + static int g_hdlDnSco = INVALID_PHONE_SERVICE_VALUE; + + PhoneServiceCb g_callChanged; + void HfpIncomingEventPublish(uint16 topic, hfp_hf_calls_info_t callsInfo); + + static void PhoneServiceScreenCtr(bool turnOnFlag) + { + if (turnOnFlag) + { + int32_t timeout = -1; + SendMsgToUIService(SCREEN_TURN_ON_TO_UI, 0, &timeout, sizeof(int32_t)); + } + else + { + SendMsgToUIService(SCREEN_TURN_OFF_TO_UI, 0, NULL, 0); + } } -} - -static void InitMutex(void) -{ - g_audioMutex = MUTEX_InitValue(); -} -uint32 GetCallCodec(void) -{ - return g_call_codec; -} - -int RegisterCallChangedCb(PhoneServiceCb *phoneServiceFun) -{ - if (phoneServiceFun == NULL) { - return OHOS_FAILURE; + static void InitMutex(void) + { + g_audioMutex = MUTEX_InitValue(); } - (void)memcpy_s(&g_callChanged, sizeof(g_callChanged), phoneServiceFun, sizeof(g_callChanged)); - - return OHOS_SUCCESS; -} - -static void CallChangedCb(const PhoneCallInfo *phoneCall) -{ - g_callChanged.callChanged(phoneCall); -} - -static void PhoneServiceErrorCallback(PhoneServiceErrorType type, int volume) -{ - g_callChanged.phoneServiceErrorCb(type, volume); -} + uint32 GetCallCodec(void) + { + return g_call_codec; + } -static void ScoStatusCb(hfp_sco_connect_state_t state) -{ - g_callChanged.scoStatusCb(state); -} + int RegisterCallChangedCb(PhoneServiceCb *phoneServiceFun) + { + if (phoneServiceFun == NULL) + { + return OHOS_FAILURE; + } -int GetCurrCallState(void) -{ - return g_currCallState; -} + (void)memcpy_s(&g_callChanged, sizeof(g_callChanged), phoneServiceFun, sizeof(g_callChanged)); -// 初始化媒体 -static void AudioInit(void) -{ - int ret; - ret = PhoneAudioManagerInit(); - if (ret != OHOS_SUCCESS) { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[AudioInit] [PhoneAudioManagerInit] failed!"); + return OHOS_SUCCESS; } -} - -// 释放音频焦点 -static void AudioDeactInterrupt(AudioStreamType type) -{ - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[AudioDeactInterrupt] start type: 0x%x, g_audioState: 0x%x", - type, g_audioState); - if ((type == AUDIO_STREAM_VOICE_CALL_BT_SCO && g_audioState >= AUDIO_ACT_INTERRUPT_BT_SCO) || - (type == AUDIO_STREAM_RING && g_audioState == AUDIO_ACT_INTERRUPT_WATCH_RING)) { - (void)PhoneAudioManagerDeactInterrupt(); + static void CallChangedCb(const PhoneCallInfo *phoneCall) + { + g_callChanged.callChanged(phoneCall); } -} -// 申请音频焦点 -static void AudioActInterrupt(AudioStreamType type) -{ - int ret = OHOS_SUCCESS; + static void PhoneServiceErrorCallback(PhoneServiceErrorType type, int volume) + { + g_callChanged.phoneServiceErrorCb(type, volume); + } - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[AudioActInterrupt] start type: 0x%x, g_audioState: 0x%x", - type, g_audioState); + static void ScoStatusCb(hfp_sco_connect_state_t state) + { + g_callChanged.scoStatusCb(state); + } - if (type != AUDIO_STREAM_VOICE_CALL_BT_SCO && type != AUDIO_STREAM_RING) { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[AudioActInterrupt] failed! type: 0x%x, g_audioState: 0x%x", - type, g_audioState); - return; + int GetCurrCallState(void) + { + return g_currCallState; } - MUTEX_Lock(g_audioMutex); - // 申请蓝牙通话焦点 - if (type == AUDIO_STREAM_VOICE_CALL_BT_SCO && g_audioState < AUDIO_ACT_INTERRUPT_BT_SCO) { - if (g_audioState == AUDIO_ACT_INTERRUPT_WATCH_RING) { - AudioDeactInterrupt(AUDIO_STREAM_RING); + // 初始化媒体 + static void AudioInit(void) + { + int ret; + ret = PhoneAudioManagerInit(); + if (ret != OHOS_SUCCESS) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[AudioInit] [PhoneAudioManagerInit] failed!"); } + } - ret = PhoneAudioManagerActInterrupt(type); - if (ret == OHOS_SUCCESS) { - g_audioState = AUDIO_ACT_INTERRUPT_BT_SCO; - } - } else if (type == AUDIO_STREAM_RING && g_audioState < AUDIO_ACT_INTERRUPT_WATCH_RING) { - ret = PhoneAudioManagerActInterrupt(type); - if (ret == OHOS_SUCCESS) { - g_audioState = AUDIO_ACT_INTERRUPT_WATCH_RING; + // 释放音频焦点 + static void AudioDeactInterrupt(AudioStreamType type) + { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[AudioDeactInterrupt] start type: 0x%x, g_audioState: 0x%x", + type, g_audioState); + + if ((type == AUDIO_STREAM_VOICE_CALL_BT_SCO && g_audioState >= AUDIO_ACT_INTERRUPT_BT_SCO) || + (type == AUDIO_STREAM_RING && g_audioState == AUDIO_ACT_INTERRUPT_WATCH_RING)) + { + (void)PhoneAudioManagerDeactInterrupt(); } } - if (ret != OHOS_SUCCESS) { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[AudioActInterrupt] failed! type: 0x%x, g_audioState: 0x%x", - type, g_audioState); - } + // 申请音频焦点 + static void AudioActInterrupt(AudioStreamType type) + { + int ret = OHOS_SUCCESS; - MUTEX_Unlock(g_audioMutex); -} + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[AudioActInterrupt] start type: 0x%x, g_audioState: 0x%x", + type, g_audioState); -// 媒体连接SCO设备 -static void AudioConnectScoDevInit(void) -{ - int ret; + if (type != AUDIO_STREAM_VOICE_CALL_BT_SCO && type != AUDIO_STREAM_RING) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[AudioActInterrupt] failed! type: 0x%x, g_audioState: 0x%x", + type, g_audioState); + return; + } - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[AudioConnectScoDevInit] start g_scoFlag: 0x%x, g_audioState: 0x%x", - g_scoFlag, g_audioState); - if (g_scoFlag != HFP_SCO_STATE_CONNECTED || g_audioState < AUDIO_ACT_INTERRUPT_BT_SCO) { - return; - } + MUTEX_Lock(g_audioMutex); + // 申请蓝牙通话焦点 + if (type == AUDIO_STREAM_VOICE_CALL_BT_SCO && g_audioState < AUDIO_ACT_INTERRUPT_BT_SCO) + { + if (g_audioState == AUDIO_ACT_INTERRUPT_WATCH_RING) + { + AudioDeactInterrupt(AUDIO_STREAM_RING); + } - MUTEX_Lock(g_audioMutex); - if (g_audioState < AUDIO_STREAM_INIT) { - if (g_audioState < AUDIO_CONN_IN_BT_SCO) { - // 配置媒体连接SCO设配状态(下行),只有在SCO连接后才能设置 - ret = PhoneAudioManagerSetDeviceConnState(IN_BLUETOOTH_SCO, AUDIO_DEVICE_CONNECTED); - if (ret != OHOS_SUCCESS) { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[AudioConnectScoDevInit] [PhoneAudioManagerSetDeviceConnState] \ - IN_BLUETOOTH_SCO failed! ret = %d", ret); - MUTEX_Unlock(g_audioMutex); - return; - } else { - g_audioState = AUDIO_CONN_IN_BT_SCO; + ret = PhoneAudioManagerActInterrupt(type); + if (ret == OHOS_SUCCESS) + { + g_audioState = AUDIO_ACT_INTERRUPT_BT_SCO; } } - - if (g_audioState < AUDIO_CONN_OUT_BT_SCO) { - // 配置媒体连接SCO设配状态(上行),只有在SCO连接后才能设置 - ret = PhoneAudioManagerSetDeviceConnState(OUT_BLUETOOTH_SCO, AUDIO_DEVICE_CONNECTED); - if (ret != OHOS_SUCCESS) { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[AudioConnectScoDevInit] [PhoneAudioManagerSetDeviceConnState] \ - OUT_BLUETOOTH_SCO failed! ret = %d", ret); - MUTEX_Unlock(g_audioMutex); - return; - } else { - g_audioState = AUDIO_CONN_OUT_BT_SCO; + else if (type == AUDIO_STREAM_RING && g_audioState < AUDIO_ACT_INTERRUPT_WATCH_RING) + { + ret = PhoneAudioManagerActInterrupt(type); + if (ret == OHOS_SUCCESS) + { + g_audioState = AUDIO_ACT_INTERRUPT_WATCH_RING; } } - if (g_hdlUpSco == INVALID_PHONE_SERVICE_VALUE) { - g_hdlUpSco = PhoneAudioStreamOutInit(AUDIO_UP_LINK); + if (ret != OHOS_SUCCESS) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[AudioActInterrupt] failed! type: 0x%x, g_audioState: 0x%x", + type, g_audioState); } - if (g_hdlDnSco == INVALID_PHONE_SERVICE_VALUE) { - g_hdlDnSco = PhoneAudioStreamInInit(AUDIO_DOWN_LINK); - } + MUTEX_Unlock(g_audioMutex); + } - if (g_hdlUpSco != INVALID_PHONE_SERVICE_VALUE && g_hdlDnSco != INVALID_PHONE_SERVICE_VALUE) { - g_audioState = AUDIO_STREAM_INIT; + // 媒体连接SCO设备 + static void AudioConnectScoDevInit(void) + { + int ret; + + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[AudioConnectScoDevInit] start g_scoFlag: 0x%x, g_audioState: 0x%x", + g_scoFlag, g_audioState); + if (g_scoFlag != HFP_SCO_STATE_CONNECTED || g_audioState < AUDIO_ACT_INTERRUPT_BT_SCO) + { + return; } - } - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[AudioConnectScoDevInit] end g_audioState: %d, g_hdlUpSco: %d, g_hdlDnSco: %d", - g_audioState, g_hdlUpSco, g_hdlDnSco); - MUTEX_Unlock(g_audioMutex); - return; -} + MUTEX_Lock(g_audioMutex); + if (g_audioState < AUDIO_STREAM_INIT) + { + if (g_audioState < AUDIO_CONN_IN_BT_SCO) + { + // 配置媒体连接SCO设配状态(下行),只有在SCO连接后才能设置 + ret = PhoneAudioManagerSetDeviceConnState(IN_BLUETOOTH_SCO, AUDIO_DEVICE_CONNECTED); + if (ret != OHOS_SUCCESS) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[AudioConnectScoDevInit] [PhoneAudioManagerSetDeviceConnState] \ + IN_BLUETOOTH_SCO failed! ret = %d", + ret); + MUTEX_Unlock(g_audioMutex); + return; + } + else + { + g_audioState = AUDIO_CONN_IN_BT_SCO; + } + } -// 建立上行通路 -static void AudioUpStart(void) -{ - int ret = OHOS_SUCCESS; - uint32 micShmId = 0; + if (g_audioState < AUDIO_CONN_OUT_BT_SCO) + { + // 配置媒体连接SCO设配状态(上行),只有在SCO连接后才能设置 + ret = PhoneAudioManagerSetDeviceConnState(OUT_BLUETOOTH_SCO, AUDIO_DEVICE_CONNECTED); + if (ret != OHOS_SUCCESS) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[AudioConnectScoDevInit] [PhoneAudioManagerSetDeviceConnState] \ + OUT_BLUETOOTH_SCO failed! ret = %d", + ret); + MUTEX_Unlock(g_audioMutex); + return; + } + else + { + g_audioState = AUDIO_CONN_OUT_BT_SCO; + } + } + + if (g_hdlUpSco == INVALID_PHONE_SERVICE_VALUE) + { + g_hdlUpSco = PhoneAudioStreamOutInit(AUDIO_UP_LINK); + } + + if (g_hdlDnSco == INVALID_PHONE_SERVICE_VALUE) + { + g_hdlDnSco = PhoneAudioStreamInInit(AUDIO_DOWN_LINK); + } - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[AudioUpStart] start g_scoFlag: %d, g_audioState: %d", g_scoFlag, g_audioState); + if (g_hdlUpSco != INVALID_PHONE_SERVICE_VALUE && g_hdlDnSco != INVALID_PHONE_SERVICE_VALUE) + { + g_audioState = AUDIO_STREAM_INIT; + } + } + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[AudioConnectScoDevInit] end g_audioState: %d, g_hdlUpSco: %d, g_hdlDnSco: %d", + g_audioState, g_hdlUpSco, g_hdlDnSco); + MUTEX_Unlock(g_audioMutex); - if (g_scoFlag != HFP_SCO_STATE_CONNECTED || g_audioState < AUDIO_STREAM_INIT) { return; } - MUTEX_Lock(g_audioMutex); - if (g_audioState < AUDIO_STREAM_START_UP) { - if (g_hdlUpMic == INVALID_PHONE_SERVICE_VALUE) { - g_hdlUpMic = PhoneAudioStreamInInit(AUDIO_UP_LINK); + // 建立上行通路 + static void AudioUpStart(void) + { + int ret = OHOS_SUCCESS; + uint32 micShmId = 0; + + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[AudioUpStart] start g_scoFlag: %d, g_audioState: %d", g_scoFlag, g_audioState); + + if (g_scoFlag != HFP_SCO_STATE_CONNECTED || g_audioState < AUDIO_STREAM_INIT) + { + return; } - if (g_audioState < AUDIO_STREAM_START_SCO) { - ret = PhoneAudioStreamInStart(g_hdlDnSco); - if (ret != OHOS_SUCCESS) { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[AudioUpStart] [AudioStreamInStart] [dn_sco] error! ret: %d", ret); + MUTEX_Lock(g_audioMutex); + if (g_audioState < AUDIO_STREAM_START_UP) + { + if (g_hdlUpMic == INVALID_PHONE_SERVICE_VALUE) + { + g_hdlUpMic = PhoneAudioStreamInInit(AUDIO_UP_LINK); } - ret |= PhoneAudioStreamOutStart(g_hdlUpSco); - if (ret != OHOS_SUCCESS) { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[AudioUpStart] [AudioStreamOutStart] [up_sco] error ret: %d", ret); + if (g_audioState < AUDIO_STREAM_START_SCO) + { + ret = PhoneAudioStreamInStart(g_hdlDnSco); + if (ret != OHOS_SUCCESS) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[AudioUpStart] [AudioStreamInStart] [dn_sco] error! ret: %d", ret); + } + + ret |= PhoneAudioStreamOutStart(g_hdlUpSco); + if (ret != OHOS_SUCCESS) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[AudioUpStart] [AudioStreamOutStart] [up_sco] error ret: %d", ret); + } + if (ret == OHOS_SUCCESS) + { + g_audioState = AUDIO_STREAM_START_SCO; + } } - if (ret == OHOS_SUCCESS) { - g_audioState = AUDIO_STREAM_START_SCO; - } - } - ret |= PhoneAudioStreamInStart(g_hdlUpMic); - if (ret != OHOS_SUCCESS) { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[AudioUpStart] [PhoneAudioStreamInStart] [up_mic] error! ret = %d", ret); - } + ret |= PhoneAudioStreamInStart(g_hdlUpMic); + if (ret != OHOS_SUCCESS) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[AudioUpStart] [PhoneAudioStreamInStart] [up_mic] error! ret = %d", ret); + } - ret |= PhoneAudioStreamInGetChannelId(g_hdlUpMic, &micShmId); - if (ret != OHOS_SUCCESS) { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[AudioUpStart] [AudioStreamInGetChannelId] [up_mic] error ret: %d", ret); - } + ret |= PhoneAudioStreamInGetChannelId(g_hdlUpMic, &micShmId); + if (ret != OHOS_SUCCESS) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[AudioUpStart] [AudioStreamInGetChannelId] [up_mic] error ret: %d", ret); + } - ret |= PhoneAudioStreamOutAttachFrontend(g_hdlUpSco, micShmId); - if (ret != OHOS_SUCCESS) { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[AudioUpStart] [AudioStreamOutAttachFrontend] [up_sco] error ret:%d", ret); - } + ret |= PhoneAudioStreamOutAttachFrontend(g_hdlUpSco, micShmId); + if (ret != OHOS_SUCCESS) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[AudioUpStart] [AudioStreamOutAttachFrontend] [up_sco] error ret:%d", ret); + } - if (ret == OHOS_SUCCESS) { - g_audioState = AUDIO_STREAM_START_UP; + if (ret == OHOS_SUCCESS) + { + g_audioState = AUDIO_STREAM_START_UP; + } } + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[AudioUpStart] end g_audioState:%d, g_hdlUpMic:%d, g_hdlUpSco:%d, micShmId:0x%x", + g_audioState, g_hdlUpMic, g_hdlUpSco, micShmId); + MUTEX_Unlock(g_audioMutex); + return; } - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[AudioUpStart] end g_audioState:%d, g_hdlUpMic:%d, g_hdlUpSco:%d, micShmId:0x%x", - g_audioState, g_hdlUpMic, g_hdlUpSco, micShmId); - MUTEX_Unlock(g_audioMutex); - return; -} - -// 建立下行通路 -static void AudioDnStart(void) -{ - int ret = OHOS_SUCCESS; - uint32 spkShmId = 0; - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[AudioDnStart] start g_scoFlag: %d, g_audioState: %d", g_scoFlag, g_audioState); + // 建立下行通路 + static void AudioDnStart(void) + { + int ret = OHOS_SUCCESS; + uint32 spkShmId = 0; - if (g_scoFlag != HFP_SCO_STATE_CONNECTED || g_audioState < AUDIO_STREAM_INIT) { - return; - } + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[AudioDnStart] start g_scoFlag: %d, g_audioState: %d", g_scoFlag, g_audioState); - MUTEX_Lock(g_audioMutex); - if (g_audioState < AUDIO_STREAM_START_DN) { - if (g_hdlDnSpk == INVALID_PHONE_SERVICE_VALUE) { - g_hdlDnSpk = PhoneAudioStreamOutInit(AUDIO_DOWN_LINK); + if (g_scoFlag != HFP_SCO_STATE_CONNECTED || g_audioState < AUDIO_STREAM_INIT) + { + return; } - if (g_audioState < AUDIO_STREAM_START_SCO) { - ret = PhoneAudioStreamOutStart(g_hdlUpSco); - if (ret != OHOS_SUCCESS) { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[AudioDnStart] [AudioStreamOutStart] [up_sco] error! ret = %d", ret); + MUTEX_Lock(g_audioMutex); + if (g_audioState < AUDIO_STREAM_START_DN) + { + if (g_hdlDnSpk == INVALID_PHONE_SERVICE_VALUE) + { + g_hdlDnSpk = PhoneAudioStreamOutInit(AUDIO_DOWN_LINK); } - ret |= PhoneAudioStreamInStart(g_hdlDnSco); - if (ret != OHOS_SUCCESS) { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[AudioDnStart] [AudioStreamInStart] [dn_sco] error! ret = %d", ret); + if (g_audioState < AUDIO_STREAM_START_SCO) + { + ret = PhoneAudioStreamOutStart(g_hdlUpSco); + if (ret != OHOS_SUCCESS) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[AudioDnStart] [AudioStreamOutStart] [up_sco] error! ret = %d", ret); + } + + ret |= PhoneAudioStreamInStart(g_hdlDnSco); + if (ret != OHOS_SUCCESS) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[AudioDnStart] [AudioStreamInStart] [dn_sco] error! ret = %d", ret); + } + + if (ret == OHOS_SUCCESS) + { + g_audioState = AUDIO_STREAM_START_SCO; + } } - if (ret == OHOS_SUCCESS) { - g_audioState = AUDIO_STREAM_START_SCO; + ret |= PhoneAudioStreamOutStart(g_hdlDnSpk); + if (ret != OHOS_SUCCESS) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[AudioDnStart] [PhoneAudioStreamOutStart] [dn_spk] error! ret = %d", ret); } - } - ret |= PhoneAudioStreamOutStart(g_hdlDnSpk); - if (ret != OHOS_SUCCESS) { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[AudioDnStart] [PhoneAudioStreamOutStart] [dn_spk] error! ret = %d", ret); - } + ret |= PhoneAudioStreamOutGetChannelId(g_hdlDnSpk, &spkShmId); + if (ret != OHOS_SUCCESS) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[AudioDnStart] [AudioStreamOutGetChannelId] [dn_spk] error ret: %d", ret); + } - ret |= PhoneAudioStreamOutGetChannelId(g_hdlDnSpk, &spkShmId); - if (ret != OHOS_SUCCESS) { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[AudioDnStart] [AudioStreamOutGetChannelId] [dn_spk] error ret: %d", ret); - } + ret |= PhoneAudioStreamInAttachBackend(g_hdlDnSco, spkShmId); + if (ret != OHOS_SUCCESS) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[AudioDnStart] [AudioStreamInAttachBackend] [dn_sco] error ret: %d", ret); + } - ret |= PhoneAudioStreamInAttachBackend(g_hdlDnSco, spkShmId); - if (ret != OHOS_SUCCESS) { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[AudioDnStart] [AudioStreamInAttachBackend] [dn_sco] error ret: %d", ret); + if (ret == OHOS_SUCCESS) + { + g_audioState = AUDIO_STREAM_START_DN; + } } + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[AudioDnStart] end g_audioState:%d, g_hdlDnSpk:%d, g_hdlDnSco:%d, spkShmId: 0x%x", + g_audioState, g_hdlDnSpk, g_hdlDnSco, spkShmId); + MUTEX_Unlock(g_audioMutex); - if (ret == OHOS_SUCCESS) { - g_audioState = AUDIO_STREAM_START_DN; - } + return; } - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[AudioDnStart] end g_audioState:%d, g_hdlDnSpk:%d, g_hdlDnSco:%d, spkShmId: 0x%x", - g_audioState, g_hdlDnSpk, g_hdlDnSco, spkShmId); - MUTEX_Unlock(g_audioMutex); - return; -} - -// 同步音量 -static void SyncVolume(void) -{ - unsigned char volume; + // 同步音量 + static void SyncVolume(void) + { + unsigned char volume; - volume = GetCallCurrVolume(); - SetSpeakerVolume(volume); -} + volume = GetCallCurrVolume(); + SetSpeakerVolume(volume); + } #ifdef __cplusplus -extern "C" { + extern "C" + { #endif -static void PostGraphicEvent(void (*fun)(void)) -{ - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[PostGraphicEvent] start"); - GraphicService::GetInstance()->PostGraphicEvent(*fun); -} + static void PostGraphicEvent(void (*fun)(void)) + { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[PostGraphicEvent] start"); + GraphicService::GetInstance()->PostGraphicEvent(*fun); + } #ifdef __cplusplus -} + } #endif -// 蓝牙通话下行 -static void AudioDn(void) -{ - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[AudioDn] start g_audioState: %d", g_audioState); + // 蓝牙通话下行 + static void AudioDn(void) + { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[AudioDn] start g_audioState: %d", g_audioState); - // 申请蓝牙通话音频焦点 - AudioActInterrupt(AUDIO_STREAM_VOICE_CALL_BT_SCO); + // 申请蓝牙通话音频焦点 + AudioActInterrupt(AUDIO_STREAM_VOICE_CALL_BT_SCO); - // 媒体连接SCO设备 - AudioConnectScoDevInit(); + // 媒体连接SCO设备 + AudioConnectScoDevInit(); - // 建立音频下行通路 - AudioDnStart(); - if (g_audioState == AUDIO_STREAM_START_DN) { - // 同步音量 - PostGraphicEvent(SyncVolume); + // 建立音频下行通路 + AudioDnStart(); + if (g_audioState == AUDIO_STREAM_START_DN) + { + // 同步音量 + PostGraphicEvent(SyncVolume); + } + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[AudioDn] end g_audioState: %d", g_audioState); } - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[AudioDn] end g_audioState: %d", g_audioState); -} - -// 蓝牙通话上行 -static void AudioUp(void) -{ - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[AudioUp] start g_audioState: %d", g_audioState); - // 申请蓝牙通话音频焦点 - AudioActInterrupt(AUDIO_STREAM_VOICE_CALL_BT_SCO); + // 蓝牙通话上行 + static void AudioUp(void) + { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[AudioUp] start g_audioState: %d", g_audioState); - // 媒体连接SCO设备 - AudioConnectScoDevInit(); + // 申请蓝牙通话音频焦点 + AudioActInterrupt(AUDIO_STREAM_VOICE_CALL_BT_SCO); - // 建立音频上行通路 - AudioUpStart(); - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[AudioUp] end g_audioState: %d", g_audioState); + // 媒体连接SCO设备 + AudioConnectScoDevInit(); -} + // 建立音频上行通路 + AudioUpStart(); + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[AudioUp] end g_audioState: %d", g_audioState); + } -static void AudioUpRelease(void) -{ - int ret; + static void AudioUpRelease(void) + { + int ret; - if (g_hdlUpSco != INVALID_PHONE_SERVICE_VALUE) { - ret = PhoneAudioStreamOutStop(g_hdlUpSco); - if (ret != OHOS_SUCCESS) { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[AudioUpRelease] [OutStop] g_hdlUpSco error! ret = %d", ret); - } - ret = PhoneAudioStreamOutDeinit(g_hdlUpSco); - if (ret != OHOS_SUCCESS) { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[AudioUpRelease] [OutDeinit] g_hdlUpSco error! ret = %d", ret); + if (g_hdlUpSco != INVALID_PHONE_SERVICE_VALUE) + { + ret = PhoneAudioStreamOutStop(g_hdlUpSco); + if (ret != OHOS_SUCCESS) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[AudioUpRelease] [OutStop] g_hdlUpSco error! ret = %d", ret); + } + ret = PhoneAudioStreamOutDeinit(g_hdlUpSco); + if (ret != OHOS_SUCCESS) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[AudioUpRelease] [OutDeinit] g_hdlUpSco error! ret = %d", ret); + } } - } - if (g_hdlUpMic != INVALID_PHONE_SERVICE_VALUE) { - ret = PhoneAudioStreamInStop(g_hdlUpMic); - if (ret != OHOS_SUCCESS) { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[AudioDnRelease] [InStop] g_hdlUpMic error! ret = %d", ret); - } - ret = PhoneAudioStreamInDeinit(g_hdlUpMic); - if (ret != OHOS_SUCCESS) { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[AudioDnRelease] [InDeinit] g_hdlUpMic error! ret = %d", ret); + if (g_hdlUpMic != INVALID_PHONE_SERVICE_VALUE) + { + ret = PhoneAudioStreamInStop(g_hdlUpMic); + if (ret != OHOS_SUCCESS) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[AudioDnRelease] [InStop] g_hdlUpMic error! ret = %d", ret); + } + ret = PhoneAudioStreamInDeinit(g_hdlUpMic); + if (ret != OHOS_SUCCESS) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[AudioDnRelease] [InDeinit] g_hdlUpMic error! ret = %d", ret); + } } - } - if (g_audioState >= AUDIO_CONN_OUT_BT_SCO) { - ret = PhoneAudioManagerSetDeviceConnState(OUT_BLUETOOTH_SCO, AUDIO_DEVICE_DISCONNECTED); - if (ret != OHOS_SUCCESS) { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[AudioDnRelease] OUT_BLUETOOTH_SCO error! ret = %d", ret); + if (g_audioState >= AUDIO_CONN_OUT_BT_SCO) + { + ret = PhoneAudioManagerSetDeviceConnState(OUT_BLUETOOTH_SCO, AUDIO_DEVICE_DISCONNECTED); + if (ret != OHOS_SUCCESS) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[AudioDnRelease] OUT_BLUETOOTH_SCO error! ret = %d", ret); + } } - } - g_hdlUpSco = INVALID_PHONE_SERVICE_VALUE; - g_hdlUpMic = INVALID_PHONE_SERVICE_VALUE; - -} + g_hdlUpSco = INVALID_PHONE_SERVICE_VALUE; + g_hdlUpMic = INVALID_PHONE_SERVICE_VALUE; + } -static void AudioDnRelease(void) -{ - int ret; + static void AudioDnRelease(void) + { + int ret; - if (g_hdlDnSco != INVALID_PHONE_SERVICE_VALUE) { - ret = PhoneAudioStreamInStop(g_hdlDnSco); - if (ret != OHOS_SUCCESS) { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[AudioUpRelease] [InStop] g_hdlDnSco error! ret = %d", ret); - } - ret = PhoneAudioStreamInDeinit(g_hdlDnSco); - if (ret != OHOS_SUCCESS) { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[AudioUpRelease] [InDeinit] g_hdlDnSco error! ret = %d", ret); + if (g_hdlDnSco != INVALID_PHONE_SERVICE_VALUE) + { + ret = PhoneAudioStreamInStop(g_hdlDnSco); + if (ret != OHOS_SUCCESS) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[AudioUpRelease] [InStop] g_hdlDnSco error! ret = %d", ret); + } + ret = PhoneAudioStreamInDeinit(g_hdlDnSco); + if (ret != OHOS_SUCCESS) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[AudioUpRelease] [InDeinit] g_hdlDnSco error! ret = %d", ret); + } } - } - if (g_hdlDnSpk != INVALID_PHONE_SERVICE_VALUE) { - ret = PhoneAudioStreamOutStop(g_hdlDnSpk); - if (ret != OHOS_SUCCESS) { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[AudioDnRelease] [OutStop] g_hdlDnSpk error! ret = %d", ret); + if (g_hdlDnSpk != INVALID_PHONE_SERVICE_VALUE) + { + ret = PhoneAudioStreamOutStop(g_hdlDnSpk); + if (ret != OHOS_SUCCESS) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[AudioDnRelease] [OutStop] g_hdlDnSpk error! ret = %d", ret); + } + ret = PhoneAudioStreamOutDeinit(g_hdlDnSpk); + if (ret != OHOS_SUCCESS) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[AudioDnRelease] [OutDeinit] g_hdlDnSpk error! ret = %d", ret); + } } - ret = PhoneAudioStreamOutDeinit(g_hdlDnSpk); - if (ret != OHOS_SUCCESS) { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[AudioDnRelease] [OutDeinit] g_hdlDnSpk error! ret = %d", ret); + + if (g_audioState >= AUDIO_CONN_IN_BT_SCO) + { + ret = PhoneAudioManagerSetDeviceConnState(IN_BLUETOOTH_SCO, AUDIO_DEVICE_DISCONNECTED); + if (ret != OHOS_SUCCESS) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[AudioDnRelease] IN_BLUETOOTH_SCO error! ret = %d", ret); + } } + + g_hdlDnSco = INVALID_PHONE_SERVICE_VALUE; + g_hdlDnSpk = INVALID_PHONE_SERVICE_VALUE; } - if (g_audioState >= AUDIO_CONN_IN_BT_SCO) { - ret = PhoneAudioManagerSetDeviceConnState(IN_BLUETOOTH_SCO, AUDIO_DEVICE_DISCONNECTED); - if (ret != OHOS_SUCCESS) { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[AudioDnRelease] IN_BLUETOOTH_SCO error! ret = %d", ret); + /* 销毁上下行通路 释放音频焦点 */ + void AudioRelease(void) + { + if (g_audioState == AUDIO_UNKNOW) + { + return; } - } - g_hdlDnSco = INVALID_PHONE_SERVICE_VALUE; - g_hdlDnSpk = INVALID_PHONE_SERVICE_VALUE; -} + MUTEX_Lock(g_audioMutex); + AudioUpRelease(); + AudioDnRelease(); + /* 释放音频焦点 */ + AudioDeactInterrupt(AUDIO_STREAM_VOICE_CALL_BT_SCO); + AudioDeactInterrupt(AUDIO_STREAM_RING); // 适配某些机型不触发SCO + g_audioState = AUDIO_UNKNOW; -/* 销毁上下行通路 释放音频焦点 */ -void AudioRelease(void) -{ - if (g_audioState == AUDIO_UNKNOW) { - return; + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[AudioRelease] end g_audioState: %d,", g_audioState); + MUTEX_Unlock(g_audioMutex); } - MUTEX_Lock(g_audioMutex); - AudioUpRelease(); - AudioDnRelease(); - - /* 释放音频焦点 */ - AudioDeactInterrupt(AUDIO_STREAM_VOICE_CALL_BT_SCO); - AudioDeactInterrupt(AUDIO_STREAM_RING); // 适配某些机型不触发SCO - g_audioState = AUDIO_UNKNOW; - - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[AudioRelease] end g_audioState: %d,", g_audioState); - MUTEX_Unlock(g_audioMutex); -} - -static void CallListInit(void) -{ - int i; + static void CallListInit(void) + { + int i; - g_currCallNum = 0; + g_currCallNum = 0; - (void)memset_s(g_callList, sizeof(g_callList), 0, sizeof(g_callList)); - for (i = 0; i < MULTI_CALL_MAX_NUME; i++) { - (void)memset_s(g_callList[i].name, NAME_SIZE, '\0', NAME_SIZE); - (void)memset_s(g_callList[i].tel, MAX_PHONE_NUM, '\0', MAX_PHONE_NUM); - g_callList[i].lastStatus = HFP_HF_CALL_STATE_FINISHED; + (void)memset_s(g_callList, sizeof(g_callList), 0, sizeof(g_callList)); + for (i = 0; i < MULTI_CALL_MAX_NUME; i++) + { + (void)memset_s(g_callList[i].name, NAME_SIZE, '\0', NAME_SIZE); + (void)memset_s(g_callList[i].tel, MAX_PHONE_NUM, '\0', MAX_PHONE_NUM); + g_callList[i].lastStatus = HFP_HF_CALL_STATE_FINISHED; + } } -} -static void CopyBdAddr(const bd_addr_t *bdAddr) -{ - unsigned char addr[BD_ADDR_LEN] = {0}; - if (strncmp((const char*)g_bdAddr.addr, (const char*)addr, BD_ADDR_LEN) == 0) { - (void)memcpy_s(g_bdAddr.addr, BD_ADDR_LEN, bdAddr->addr, BD_ADDR_LEN); + static void CopyBdAddr(const bd_addr_t *bdAddr) + { + unsigned char addr[BD_ADDR_LEN] = {0}; + if (strncmp((const char *)g_bdAddr.addr, (const char *)addr, BD_ADDR_LEN) == 0) + { + (void)memcpy_s(g_bdAddr.addr, BD_ADDR_LEN, bdAddr->addr, BD_ADDR_LEN); + } } -} -static void CatBdAddr(const bd_addr_t *bdAddr) -{ + static void CatBdAddr(const bd_addr_t *bdAddr) + { #if WEARABLEOG_DEBUG_ENABLE - for (unsigned char i = 0; i < BD_ADDR_LEN; i++) { - printf("%X", bdAddr->addr[i]); - } - printf(""); + for (unsigned char i = 0; i < BD_ADDR_LEN; i++) + { + printf("%X", bdAddr->addr[i]); + } + printf(""); #else UNUSED(bdAddr); #endif -} + } -static void BtConnectedPro(const bd_addr_t *bdAddr) -{ - g_btConnState = PROFILE_STATE_CONNECTED; - CopyBdAddr(bdAddr); - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[BtConnectedPro] g_bdAddr: "); - CatBdAddr(&g_bdAddr); -} + static void BtConnectedPro(const bd_addr_t *bdAddr) + { + g_btConnState = PROFILE_STATE_CONNECTED; + CopyBdAddr(bdAddr); + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[BtConnectedPro] g_bdAddr: "); + CatBdAddr(&g_bdAddr); + } -static void BtDisconnectedPro(void) -{ - g_btConnState = PROFILE_STATE_DISCONNECTED; - (void)memset_s(g_bdAddr.addr, BD_ADDR_LEN, 0, BD_ADDR_LEN); - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[BtDisconnectedPro] g_bdAddr: "); - CatBdAddr(&g_bdAddr); + static void BtDisconnectedPro(void) + { + g_btConnState = PROFILE_STATE_DISCONNECTED; + (void)memset_s(g_bdAddr.addr, BD_ADDR_LEN, 0, BD_ADDR_LEN); + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[BtDisconnectedPro] g_bdAddr: "); + CatBdAddr(&g_bdAddr); - // 通知APP蓝牙断开连接 - PhoneServiceErrorCallback(ERROR_BT, PROFILE_STATE_DISCONNECTED); - CallListInit(); + // 通知APP蓝牙断开连接 + PhoneServiceErrorCallback(ERROR_BT, PROFILE_STATE_DISCONNECTED); + CallListInit(); - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BtDisconnectedPro callState: %d", g_currCallState); - if (g_currCallState == HFP_HF_CALL_STATE_INCOMING) { - /* 处理呼入阶段,取消手表配对 */ - hfp_hf_calls_info_t call = {0}; - HfpIncomingEventPublish(TOPIC_EVENT_HFP_FINISHED, call); - } + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BtDisconnectedPro callState: %d", g_currCallState); + if (g_currCallState == HFP_HF_CALL_STATE_INCOMING) + { + /* 处理呼入阶段,取消手表配对 */ + hfp_hf_calls_info_t call = {0}; + HfpIncomingEventPublish(TOPIC_EVENT_HFP_FINISHED, call); + } - g_currCallState = HFP_HF_CALL_STATE_FINISHED; - g_scoFlag = HFP_SCO_STATE_DISCONNECTED; - g_completeCallFlag = false; -} + g_currCallState = HFP_HF_CALL_STATE_FINISHED; + g_scoFlag = HFP_SCO_STATE_DISCONNECTED; + g_completeCallFlag = false; + } -// 蓝牙状态连接 -static void ConnStateChanged(const bd_addr_t *bdAddr, profile_connect_state_t state) -{ - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[ConnStateChanged] state = 0x%X bdAddr: ", state); - CatBdAddr(bdAddr); + // 蓝牙状态连接 + static void ConnStateChanged(const bd_addr_t *bdAddr, profile_connect_state_t state) + { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[ConnStateChanged] state = 0x%X bdAddr: ", state); + CatBdAddr(bdAddr); - if (state == PROFILE_STATE_CONNECTED) { - SendMsgToUIService(BT_CONNECTED_TO_UI, 0, NULL, 0); - } else if (state == PROFILE_STATE_DISCONNECTED) { - SendMsgToUIService(BT_DISCONNECTED_TO_UI, 0, NULL, 0); - } + if (state == PROFILE_STATE_CONNECTED) + { + SendMsgToUIService(BT_CONNECTED_TO_UI, 0, NULL, 0); + } + else if (state == PROFILE_STATE_DISCONNECTED) + { + SendMsgToUIService(BT_DISCONNECTED_TO_UI, 0, NULL, 0); + } - switch (state) { + switch (state) + { case PROFILE_STATE_CONNECTING: // 蓝牙正在连接 WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[ConnStateChanged] BT connecting"); break; @@ -609,67 +686,72 @@ static void ConnStateChanged(const bd_addr_t *bdAddr, profile_connect_state_t st break; default: break; + } } -} - -// 获取蓝牙状态 -uint32 GetBtConnectStatus(void) -{ - g_btConnState = (uint32)hfp_hf_get_device_connect_state(&g_bdAddr); - return g_btConnState; -} -// SCO连接处理 -static void ScoConnectPro(void) -{ - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[ScoConnectPro] g_currCallNum = %d, g_scoFlag = %d", g_currCallNum, g_scoFlag); - // 通知sco建立连接(或通话转移:手机 -> 手表) - ScoStatusCb(HFP_SCO_STATE_CONNECTED); - if (g_currCallState == HFP_HF_CALL_STATE_ACTIVE && g_scoFlag == HFP_SCO_STATE_CONNECTED) { - // The call is transferred from the phone to the watch. Need to show the call notification view. - hfp_hf_calls_info_t call = {0}; - HfpIncomingEventPublish(TOPIC_EVENT_HFP_PHONE_TO_WATCH, call); - } - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[ScoConnectPro] g_audioState: %d ", g_audioState); + // 获取蓝牙状态 + uint32 GetBtConnectStatus(void) + { + g_btConnState = (uint32)hfp_hf_get_device_connect_state(&g_bdAddr); + return g_btConnState; + } + + // SCO连接处理 + static void ScoConnectPro(void) + { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[ScoConnectPro] g_currCallNum = %d, g_scoFlag = %d", g_currCallNum, g_scoFlag); + // 通知sco建立连接(或通话转移:手机 -> 手表) + ScoStatusCb(HFP_SCO_STATE_CONNECTED); + if (g_currCallState == HFP_HF_CALL_STATE_ACTIVE && g_scoFlag == HFP_SCO_STATE_CONNECTED) + { + // The call is transferred from the phone to the watch. Need to show the call notification view. + hfp_hf_calls_info_t call = {0}; + HfpIncomingEventPublish(TOPIC_EVENT_HFP_PHONE_TO_WATCH, call); + } + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[ScoConnectPro] g_audioState: %d ", g_audioState); - if (g_audioState < AUDIO_STREAM_START_DN) { - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[ScoConnectPro] post AudioDn"); - PostGraphicEvent(AudioDn); - } + if (g_audioState < AUDIO_STREAM_START_DN) + { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[ScoConnectPro] post AudioDn"); + PostGraphicEvent(AudioDn); + } - if (g_audioState != AUDIO_STREAM_START_UP) { - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[ScoConnectPro] post AudioUp"); - PostGraphicEvent(AudioUp); + if (g_audioState != AUDIO_STREAM_START_UP) + { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[ScoConnectPro] post AudioUp"); + PostGraphicEvent(AudioUp); + } } -} - -// SCO断连处理 -static void ScoDisconnectPro(void) -{ - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[ScoDisconnectPro] start g_currCallState = %d", g_currCallState); + // SCO断连处理 + static void ScoDisconnectPro(void) + { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[ScoDisconnectPro] start g_currCallState = %d", g_currCallState); - ScoStatusCb(HFP_SCO_STATE_DISCONNECTED); - if (g_currCallState == HFP_HF_CALL_STATE_ACTIVE && g_scoFlag == HFP_SCO_STATE_DISCONNECTED) { - // The call is transferred from the watch to the phone. Need to close the call notification view. - hfp_hf_calls_info_t call = {0}; - HfpIncomingEventPublish(TOPIC_EVENT_HFP_WATCH_TO_PHONE, call); + ScoStatusCb(HFP_SCO_STATE_DISCONNECTED); + if (g_currCallState == HFP_HF_CALL_STATE_ACTIVE && g_scoFlag == HFP_SCO_STATE_DISCONNECTED) + { + // The call is transferred from the watch to the phone. Need to close the call notification view. + hfp_hf_calls_info_t call = {0}; + HfpIncomingEventPublish(TOPIC_EVENT_HFP_WATCH_TO_PHONE, call); + } + AudioRelease(); // 为了保持时序,此处采取同步调用 + usleep(5000); // 增加延时确保SCO断开AUDIO通路释放成功 } - AudioRelease(); // 为了保持时序,此处采取同步调用 - usleep(5000); // 增加延时确保SCO断开AUDIO通路释放成功 -} -// Sco连接状态变化回调函数,音频连接状态 -static void ScoStateChanged(const bd_addr_t *bdAddr, hfp_sco_connect_state_t state) -{ - g_scoFlag = state; - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[ScoStateChanged] state = %d, g_scoFlag = %d, g_currCallNum = %d", state, - g_scoFlag, g_currCallNum); + // Sco连接状态变化回调函数,音频连接状态 + static void ScoStateChanged(const bd_addr_t *bdAddr, hfp_sco_connect_state_t state) + { + g_scoFlag = state; + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[ScoStateChanged] state = %d, g_scoFlag = %d, g_currCallNum = %d", state, + g_scoFlag, g_currCallNum); - switch (state) { + switch (state) + { case HFP_SCO_STATE_CONNECTING: PhoneServiceScreenCtr(1); - if (g_scoFlag != HFP_SCO_STATE_CONNECTED) { + if (g_scoFlag != HFP_SCO_STATE_CONNECTED) + { g_scoFlag = HFP_SCO_STATE_CONNECTED; CopyBdAddr(bdAddr); ScoConnectPro(); @@ -694,722 +776,837 @@ static void ScoStateChanged(const bd_addr_t *bdAddr, hfp_sco_connect_state_t sta default: break; + } } -} - -static void CallLogCreatDir(void) -{ - DIR *dir = NULL; - dir = opendir(CALL_LOG_DIR); - if (dir == NULL) { - mkdir(CALL_LOG_DIR, S_IREAD | S_IWRITE); - } else { - closedir(dir); - } - return; -} - -// 获取通话记录文件长度 -static int GetCallLogFileSize(void) -{ - int len = 0; - FILE *fp = fopen(CALL_LOG_PATH, "rb"); - if (fp == NULL) { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[GetCallLogFileSize] fopen CALL_LOG_PATH error"); - return OHOS_FAILURE; - } - - fseek(fp, 0, SEEK_END); - len = ftell(fp); - fseek(fp, 0, SEEK_SET); - fclose(fp); - - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[GetCallLogFileSize] len = %d", len); - return len; -} - -// 添加通话进通话记录文件 -static void AddToCallLog(CallLogInfo *info) -{ - FILE *fp = NULL; - size_t ret; - fp = fopen(CALL_LOG_PATH, "ab"); - if (fp == NULL) { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[AddToCallLog] fopen failed!"); + static void CallLogCreatDir(void) + { + DIR *dir = NULL; + dir = opendir(CALL_LOG_DIR); + if (dir == NULL) + { + mkdir(CALL_LOG_DIR, S_IREAD | S_IWRITE); + } + else + { + closedir(dir); + } return; } - ret = fwrite(info, sizeof(CallLogInfo), 1, fp); - if (ret != 1) { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[AddToCallLog] fwrite failed! ret = %d", ret); - } + // 获取通话记录文件长度 + static int GetCallLogFileSize(void) + { + int len = 0; + FILE *fp = fopen(CALL_LOG_PATH, "rb"); + if (fp == NULL) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[GetCallLogFileSize] fopen CALL_LOG_PATH error"); + return OHOS_FAILURE; + } - fclose(fp); - return; -} + fseek(fp, 0, SEEK_END); + len = ftell(fp); + fseek(fp, 0, SEEK_SET); + fclose(fp); -static int CopyPhoneLogToTmpLog(void) -{ - FILE *fp = NULL; - FILE *ftp = NULL; - CallLogInfo *info = NULL; + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[GetCallLogFileSize] len = %d", len); + return len; + } - int retLen; - int fileSize = GetCallLogFileSize(); + // 添加通话进通话记录文件 + void AddToCallLog(CallLogInfo *info) + { + FILE *fp = NULL; + size_t ret; - if (fileSize == OHOS_FAILURE || fileSize == 0) { - return fileSize; - } + fp = fopen(CALL_LOG_PATH, "ab"); + if (fp == NULL) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[AddToCallLog] fopen failed!"); + return; + } - retLen = fileSize - sizeof(CallLogInfo); - if (retLen == 0) { - return ClearCallLogFile(); // 只有一条记录,清空通话记录 - } + ret = fwrite(info, sizeof(CallLogInfo), 1, fp); + if (ret != 1) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[AddToCallLog] fwrite failed! ret = %d", ret); + } - fp = fopen(CALL_LOG_PATH,"rb"); - if (fp == NULL) { - return OHOS_FAILURE; - } - ftp = fopen(CALL_TMP_LOG_PATH, "wb+"); - if (ftp == NULL) { fclose(fp); - return OHOS_FAILURE; + return; } - info = (CallLogInfo *)malloc(fileSize); - if (info == NULL) { - fclose(fp); - fclose(ftp); - return OHOS_FAILURE; - } + static int CopyPhoneLogToTmpLog(void) + { + FILE *fp = NULL; + FILE *ftp = NULL; + CallLogInfo *info = NULL; - (void)memset_s(info, fileSize, 0, fileSize); - if(fread(info, fileSize, 1, fp) != 1) { - retLen = OHOS_FAILURE; - goto END; - } + int retLen; + int fileSize = GetCallLogFileSize(); - if(fwrite((info + 1), retLen, 1, ftp) != 1) { - retLen = OHOS_FAILURE; - goto END; - } + if (fileSize == OHOS_FAILURE || fileSize == 0) + { + return fileSize; + } -END: - fclose(fp); - fclose(ftp); - free(info); - info = NULL; - return retLen; -} + retLen = fileSize - sizeof(CallLogInfo); + if (retLen == 0) + { + return ClearCallLogFile(); // 只有一条记录,清空通话记录 + } -// 删除第一条通话记录 -int RemoveFirstCallLog(void) -{ - FILE *fp = NULL; - FILE *ftp = NULL; - CallLogInfo *info = NULL; + fp = fopen(CALL_LOG_PATH, "rb"); + if (fp == NULL) + { + return OHOS_FAILURE; + } + ftp = fopen(CALL_TMP_LOG_PATH, "wb+"); + if (ftp == NULL) + { + fclose(fp); + return OHOS_FAILURE; + } - int ret = OHOS_SUCCESS; - int fileSize = CopyPhoneLogToTmpLog(); - if (fileSize == OHOS_FAILURE || fileSize == 0) { - return fileSize; - } + info = (CallLogInfo *)malloc(fileSize); + if (info == NULL) + { + fclose(fp); + fclose(ftp); + return OHOS_FAILURE; + } - fp = fopen(CALL_LOG_PATH,"wb+"); - if (fp == NULL) { - return OHOS_FAILURE; - } - ftp = fopen(CALL_TMP_LOG_PATH, "rb"); - if (ftp == NULL) { - fclose(fp); - return OHOS_FAILURE; - } + (void)memset_s(info, fileSize, 0, fileSize); + if (fread(info, fileSize, 1, fp) != 1) + { + retLen = OHOS_FAILURE; + goto END; + } - info = (CallLogInfo *)malloc(fileSize); - if (info == NULL) { + if (fwrite((info + 1), retLen, 1, ftp) != 1) + { + retLen = OHOS_FAILURE; + goto END; + } + + END: fclose(fp); fclose(ftp); - return OHOS_FAILURE; - } - (void)memset_s(info, fileSize, 0, fileSize); - if(fread(info, fileSize, 1, ftp) != 1) { - ret = OHOS_FAILURE; - goto END; - } + free(info); + info = NULL; + return retLen; + } + + // 删除第一条通话记录 + int RemoveFirstCallLog(void) + { + FILE *fp = NULL; + FILE *ftp = NULL; + CallLogInfo *info = NULL; + + int ret = OHOS_SUCCESS; + int fileSize = CopyPhoneLogToTmpLog(); + if (fileSize == OHOS_FAILURE || fileSize == 0) + { + return fileSize; + } - if(fwrite(info, fileSize, 1, fp) != 1) { - ret = OHOS_FAILURE; - goto END; - } + fp = fopen(CALL_LOG_PATH, "wb+"); + if (fp == NULL) + { + return OHOS_FAILURE; + } + ftp = fopen(CALL_TMP_LOG_PATH, "rb"); + if (ftp == NULL) + { + fclose(fp); + return OHOS_FAILURE; + } -END: - fclose(fp); - fclose(ftp); - free(info); - info = NULL; - return ret; -} + info = (CallLogInfo *)malloc(fileSize); + if (info == NULL) + { + fclose(fp); + fclose(ftp); + return OHOS_FAILURE; + } + (void)memset_s(info, fileSize, 0, fileSize); + if (fread(info, fileSize, 1, ftp) != 1) + { + ret = OHOS_FAILURE; + goto END; + } -// 添加通话记录 -static void AddToCallLogPro(PhoneCallInfo *callInfo) -{ - int ret, num, fileSize; - CallLogInfo info; + if (fwrite(info, fileSize, 1, fp) != 1) + { + ret = OHOS_FAILURE; + goto END; + } - if (callInfo == NULL) { - return; + END: + fclose(fp); + fclose(ftp); + free(info); + info = NULL; + return ret; } - fileSize = GetCallLogFileSize(); - num = fileSize / sizeof(CallLogInfo); - if (num >= CALL_LOG_MAX_NUM) { - ret = RemoveFirstCallLog(); - if (ret == OHOS_FAILURE) { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[AddToCallLogPro] RemoveFirstCallLog error"); + // 添加通话记录 + static void AddToCallLogPro(PhoneCallInfo *callInfo) + { + int ret, num, fileSize; + CallLogInfo info; + + if (callInfo == NULL) + { return; } - } - (void)memset_s(info.name, NAME_SIZE, '\0', NAME_SIZE); - (void)memset_s(info.tel, MAX_PHONE_NUM, '\0', MAX_PHONE_NUM); - ret = memcpy_s(info.name, NAME_SIZE, callInfo->name, callInfo->nameLen); - if (ret != EOK) { - info.nameLen = 0; - } else { - info.nameLen = callInfo->nameLen; - } + fileSize = GetCallLogFileSize(); + num = fileSize / sizeof(CallLogInfo); + if (num >= CALL_LOG_MAX_NUM) + { + ret = RemoveFirstCallLog(); + if (ret == OHOS_FAILURE) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[AddToCallLogPro] RemoveFirstCallLog error"); + return; + } + } - ret = memcpy_s(info.tel, MAX_PHONE_NUM, callInfo->unitCalls.number, callInfo->unitCalls.number_len); - if (ret != EOK) { - info.telLen = 0; - } else { - info.telLen = callInfo->unitCalls.number_len; - } + (void)memset_s(info.name, NAME_SIZE, '\0', NAME_SIZE); + (void)memset_s(info.tel, MAX_PHONE_NUM, '\0', MAX_PHONE_NUM); + ret = memcpy_s(info.name, NAME_SIZE, callInfo->name, callInfo->nameLen); + if (ret != EOK) + { + info.nameLen = 0; + } + else + { + info.nameLen = callInfo->nameLen; + } - info.creationTime = callInfo->creationTime; - if (callInfo->lastStatus == HFP_HF_CALL_STATE_ACTIVE || callInfo->lastStatus == HFP_HF_CALL_STATE_HELD || - callInfo->lastStatus == HFP_HF_CALL_STATE_RESPONSE_HELD) { - info.callDurTime = time(NULL) - callInfo->activeTime; - } else { - info.callDurTime = 0; - } + ret = memcpy_s(info.tel, MAX_PHONE_NUM, callInfo->unitCalls.number, callInfo->unitCalls.number_len); + if (ret != EOK) + { + info.telLen = 0; + } + else + { + info.telLen = callInfo->unitCalls.number_len; + } + + info.creationTime = callInfo->creationTime; + if (callInfo->lastStatus == HFP_HF_CALL_STATE_ACTIVE || callInfo->lastStatus == HFP_HF_CALL_STATE_HELD || + callInfo->lastStatus == HFP_HF_CALL_STATE_RESPONSE_HELD) + { + info.callDurTime = time(NULL) - callInfo->activeTime; + } + else + { + info.callDurTime = 0; + } + + if (callInfo->lastStatus == HFP_HF_CALL_STATE_INCOMING || callInfo->lastStatus == HFP_HF_CALL_STATE_WAITING) + { + info.status = CALL_MISSED; + } + else if (callInfo->unitCalls.outgoing == 1) + { + info.status = CALL_OUTGOING; + } + else + { + info.status = CALL_INCOMING; + } - if (callInfo->lastStatus == HFP_HF_CALL_STATE_INCOMING || callInfo->lastStatus == HFP_HF_CALL_STATE_WAITING) { - info.status = CALL_MISSED; - } else if (callInfo->unitCalls.outgoing == 1) { - info.status = CALL_OUTGOING; - } else { - info.status = CALL_INCOMING; + AddToCallLog(&info); } - AddToCallLog(&info); -} + // 获取通话记录 + int GetCallLog(CallLogInfo **info, int *num) + { + FILE *fp = NULL; + int ret, fileSize, number; + CallLogInfo *callInfo = NULL; -// 获取通话记录 -int GetCallLog(CallLogInfo **info, int *num) -{ - FILE *fp = NULL; - int ret, fileSize, number; - CallLogInfo *callInfo = NULL; + fp = fopen(CALL_LOG_PATH, "rb"); + if (fp == NULL) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[AddToCallLog] fopen CALL_LOG_PATH failed!"); + return OHOS_FAILURE; + } - fp = fopen(CALL_LOG_PATH, "rb"); - if (fp == NULL) { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[AddToCallLog] fopen CALL_LOG_PATH failed!"); - return OHOS_FAILURE; - } + fileSize = GetCallLogFileSize(); + if (fileSize == 0) + { + *info = NULL; + *num = 0; + fclose(fp); + return OHOS_SUCCESS; + } - fileSize = GetCallLogFileSize(); - if (fileSize == 0) { - *info = NULL; - *num = 0; + number = fileSize / sizeof(CallLogInfo); + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[GetCallLog] fileSize = %d, number = %d", fileSize, number); + callInfo = (CallLogInfo *)malloc(fileSize); + if (callInfo == NULL) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[GetCallLog] malloc callInfo fail!"); + *info = NULL; + *num = 0; + fclose(fp); + return OHOS_FAILURE; + } + (void)memset_s(callInfo, fileSize, 0, fileSize); + + ret = fread(callInfo, sizeof(CallLogInfo), number, fp); + if (ret != number) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[GetCallLog] fread fp fail ret = %d", ret); + *info = NULL; + *num = 0; + fclose(fp); + return OHOS_FAILURE; + } + + *info = callInfo; + *num = number; fclose(fp); return OHOS_SUCCESS; } - number = fileSize / sizeof(CallLogInfo); - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[GetCallLog] fileSize = %d, number = %d", fileSize, number); - callInfo = (CallLogInfo *)malloc(fileSize); - if (callInfo == NULL) { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[GetCallLog] malloc callInfo fail!"); - *info = NULL; - *num = 0; - fclose(fp); - return OHOS_FAILURE; - } - (void)memset_s(callInfo, fileSize, 0, fileSize); + // 清空通话记录 + int ClearCallLogFile(void) + { + FILE *fp = fopen(CALL_LOG_PATH, "wb"); + if (fp == NULL) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[ClearCallLogFile] fopen CALL_LOG_PATH failed!"); + return OHOS_FAILURE; + } - ret = fread(callInfo, sizeof(CallLogInfo), number, fp); - if (ret != number) { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[GetCallLog] fread fp fail ret = %d", ret); - *info = NULL; - *num = 0; fclose(fp); - return OHOS_FAILURE; - } - - *info = callInfo; - *num = number; - fclose(fp); - return OHOS_SUCCESS; -} - -// 清空通话记录 -int ClearCallLogFile(void) -{ - FILE *fp = fopen(CALL_LOG_PATH, "wb"); - if (fp == NULL) { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[ClearCallLogFile] fopen CALL_LOG_PATH failed!"); - return OHOS_FAILURE; + return OHOS_SUCCESS; } - fclose(fp); - return OHOS_SUCCESS; -} - -// 查找号码对应的电话信息在list中的位置 -static PhoneCallInfo *FindCallInfoInCallList(const unsigned char *number, unsigned char numberLen) -{ - int i; - const char *str1 = NULL; - const char *str2 = NULL; - - if (g_currCallNum == 0) { - return NULL; - } + // 查找号码对应的电话信息在list中的位置 + static PhoneCallInfo *FindCallInfoInCallList(const unsigned char *number, unsigned char numberLen) + { + int i; + const char *str1 = NULL; + const char *str2 = NULL; - for (i = 0; i < MULTI_CALL_MAX_NUME; i++) { - if (numberLen != g_callList[i].telLen) { - continue; - } else { - str1 = (const char*)number; - str2 = (const char*)g_callList[i].tel; + if (g_currCallNum == 0) + { + return NULL; + } - if (strncmp(str1, str2, numberLen) == 0) { - return &g_callList[i]; + for (i = 0; i < MULTI_CALL_MAX_NUME; i++) + { + if (numberLen != g_callList[i].telLen) + { + continue; + } + else + { + str1 = (const char *)number; + str2 = (const char *)g_callList[i].tel; + + if (strncmp(str1, str2, numberLen) == 0) + { + return &g_callList[i]; + } } } - } - return NULL; -} + return NULL; + } -static void CatPhoneNumber(char *number, unsigned char len) -{ + static void CatPhoneNumber(char *number, unsigned char len) + { #if WEARABLEOG_DEBUG_ENABLE - for (unsigned char i = 0; i < len; i++) { - printf("%c", *(number + i)); - } - printf(""); + for (unsigned char i = 0; i < len; i++) + { + printf("%c", *(number + i)); + } + printf(""); #else UNUSED(number); UNUSED(len); #endif -} + } -static void AddCurrCallToCallList(const hfp_hf_calls_info_t *call) -{ - PhoneCallInfo *phoneCall = NULL; - int tmp, ret; + static void AddCurrCallToCallList(const hfp_hf_calls_info_t *call) + { + PhoneCallInfo *phoneCall = NULL; + int tmp, ret; - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[AddCurrCallToCallList] start, call->state = %d", call->state); - if (call == NULL || g_currCallNum >= MULTI_CALL_MAX_NUME || - (call->state != HFP_HF_CALL_STATE_ACTIVE && call->state != HFP_HF_CALL_STATE_HELD && - call->state != HFP_HF_CALL_STATE_ALERTING)) { - return; - } + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[AddCurrCallToCallList] start, call->state = %d", call->state); + if (call == NULL || g_currCallNum >= MULTI_CALL_MAX_NUME || + (call->state != HFP_HF_CALL_STATE_ACTIVE && call->state != HFP_HF_CALL_STATE_HELD && + call->state != HFP_HF_CALL_STATE_ALERTING)) + { + return; + } - g_currCallNum++; - tmp = g_currCallNum - 1; - phoneCall = &g_callList[tmp]; + g_currCallNum++; + tmp = g_currCallNum - 1; + phoneCall = &g_callList[tmp]; - if (call->state == HFP_HF_CALL_STATE_ACTIVE) { // 正在通话 - phoneCall->operate = OPERATE_PHONE_ACTIVE; - phoneCall->activeTime = time(NULL); - } else if (call->state == HFP_HF_CALL_STATE_HELD) { // 挂起 - phoneCall->operate = OPERATE_PHONE_HOLD; - phoneCall->activeTime = time(NULL); - } else if (call->state == HFP_HF_CALL_STATE_ALERTING) { // 呼出,对方响铃 - phoneCall->operate = OPERATE_ALERTING; - } + if (call->state == HFP_HF_CALL_STATE_ACTIVE) + { // 正在通话 + phoneCall->operate = OPERATE_PHONE_ACTIVE; + phoneCall->activeTime = time(NULL); + } + else if (call->state == HFP_HF_CALL_STATE_HELD) + { // 挂起 + phoneCall->operate = OPERATE_PHONE_HOLD; + phoneCall->activeTime = time(NULL); + } + else if (call->state == HFP_HF_CALL_STATE_ALERTING) + { // 呼出,对方响铃 + phoneCall->operate = OPERATE_ALERTING; + } - // 使用通讯录接口获取当前电话对应的备注人名(通讯录待开发) + // 使用通讯录接口获取当前电话对应的备注人名(通讯录待开发) - phoneCall->lastStatus = call->state; - phoneCall->creationTime = time(NULL); + phoneCall->lastStatus = call->state; + phoneCall->creationTime = time(NULL); - ret = memcpy_s(phoneCall->tel, MAX_PHONE_NUM, call->number, call->number_len); - if (ret != EOK) { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[AddCurrCallToCallList] memcpy_s tel fail, ret = %d", ret); - CatPhoneNumber(call->number, call->number_len); + ret = memcpy_s(phoneCall->tel, MAX_PHONE_NUM, call->number, call->number_len); + if (ret != EOK) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[AddCurrCallToCallList] memcpy_s tel fail, ret = %d", ret); + CatPhoneNumber(call->number, call->number_len); + } + phoneCall->telLen = call->number_len; + (void)memcpy_s(&phoneCall->unitCalls, sizeof(hfp_hf_calls_info_t), call, sizeof(hfp_hf_calls_info_t)); + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[AddCurrCallToCallList] end"); + + // 通知手表电话呼入 + CallChangedCb(phoneCall); } - phoneCall->telLen = call->number_len; - (void)memcpy_s(&phoneCall->unitCalls, sizeof(hfp_hf_calls_info_t), call, sizeof(hfp_hf_calls_info_t)); - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[AddCurrCallToCallList] end"); - // 通知手表电话呼入 - CallChangedCb(phoneCall); -} + // 通话状态变化--呼出,正在拨号处理 + static void CallChangeDialPro(const hfp_hf_calls_info_t *call) + { + PhoneCallInfo *phoneCall = NULL; + int tmp, ret; -// 通话状态变化--呼出,正在拨号处理 -static void CallChangeDialPro(const hfp_hf_calls_info_t *call) -{ - PhoneCallInfo *phoneCall = NULL; - int tmp, ret; + if (call == NULL) + { + return; + } + g_currCallNum++; + tmp = g_currCallNum - 1; - if (call == NULL) { - return; - } - g_currCallNum++; - tmp = g_currCallNum - 1; + phoneCall = &g_callList[tmp]; - phoneCall = &g_callList[tmp]; + // 使用通讯录接口获取当前电话对应的备注人名(通讯录待开发) - // 使用通讯录接口获取当前电话对应的备注人名(通讯录待开发) + phoneCall->operate = OPERATE_DIALING; + phoneCall->lastStatus = call->state; + phoneCall->creationTime = time(NULL); - phoneCall->operate = OPERATE_DIALING; - phoneCall->lastStatus = call->state; - phoneCall->creationTime = time(NULL); + ret = memcpy_s(phoneCall->tel, MAX_PHONE_NUM, call->number, call->number_len); + if (ret != EOK) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[CallChangeDialPro] memcpy_s tel fail, ret = %d", ret); + CatPhoneNumber(call->number, call->number_len); + } + phoneCall->telLen = call->number_len; - ret = memcpy_s(phoneCall->tel, MAX_PHONE_NUM, call->number, call->number_len); - if (ret != EOK) { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[CallChangeDialPro] memcpy_s tel fail, ret = %d", ret); - CatPhoneNumber(call->number, call->number_len); + (void)memcpy_s(&phoneCall->unitCalls, sizeof(hfp_hf_calls_info_t), call, sizeof(hfp_hf_calls_info_t)); + + // 通知手表正在拨号 + CallChangedCb(phoneCall); } - phoneCall->telLen = call->number_len; - (void)memcpy_s(&phoneCall->unitCalls, sizeof(hfp_hf_calls_info_t), call, sizeof(hfp_hf_calls_info_t)); + // 通话状态变化--呼出,对方响铃 + static void CallChangeAlertPro(const hfp_hf_calls_info_t *call) + { + PhoneCallInfo *phoneCall = NULL; - // 通知手表正在拨号 - CallChangedCb(phoneCall); -} + if (call == NULL) + { + return; + } -// 通话状态变化--呼出,对方响铃 -static void CallChangeAlertPro(const hfp_hf_calls_info_t *call) -{ - PhoneCallInfo *phoneCall = NULL; + phoneCall = FindCallInfoInCallList((const unsigned char *)call->number, call->number_len); + if (phoneCall == NULL) + { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[CallChangeAlertPro] FindCallInfoInCallList Alert no this call"); + AddCurrCallToCallList(call); + return; + } + phoneCall->operate = OPERATE_ALERTING; + phoneCall->lastStatus = call->state; - if (call == NULL) { - return; - } + (void)memcpy_s(&phoneCall->unitCalls, sizeof(hfp_hf_calls_info_t), call, sizeof(hfp_hf_calls_info_t)); - phoneCall = FindCallInfoInCallList((const unsigned char*)call->number, call->number_len); - if (phoneCall == NULL) { - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[CallChangeAlertPro] FindCallInfoInCallList Alert no this call"); - AddCurrCallToCallList(call); - return; + // 通知手表正对方响铃 + CallChangedCb(phoneCall); } - phoneCall->operate = OPERATE_ALERTING; - phoneCall->lastStatus = call->state; - (void)memcpy_s(&phoneCall->unitCalls, sizeof(hfp_hf_calls_info_t), call, sizeof(hfp_hf_calls_info_t)); + void HfpIncomingEventPublish(uint16 topic, hfp_hf_calls_info_t callsInfo) + { + int32 ret; + uint32 size = sizeof(hfp_hf_calls_info_t); + Request *request = NULL; + BroadcastApi *broadcastApi = NULL; + IUnknown *api = NULL; - // 通知手表正对方响铃 - CallChangedCb(phoneCall); -} + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HfpIncomingEventPublish topic=%u!!", topic); -void HfpIncomingEventPublish(uint16 topic, hfp_hf_calls_info_t callsInfo) -{ - int32 ret; - uint32 size = sizeof(hfp_hf_calls_info_t); - Request *request = NULL; - BroadcastApi *broadcastApi = NULL; - IUnknown *api = NULL; - - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HfpIncomingEventPublish topic=%u!!", topic); - - /* alloc request */ - request = SAMGR_AllocRequestMsg(0, PLATFORM_CORE, BROADCAST_SVR_ID, size); - if (request == NULL) { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SAMGR_AllocRequestMsg failed"); - return; - } - request->msgId = topic; - ret = memcpy_s(request->data, size, (const void *)&callsInfo, size); - if (ret != EOK) { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HfpIncomingEventPublish memcpy_s rateDataTmp fail! ret = %d", ret); - return; - } - request->len = size; - request->msgValue = 0; + /* alloc request */ + request = SAMGR_AllocRequestMsg(0, PLATFORM_CORE, BROADCAST_SVR_ID, size); + if (request == NULL) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SAMGR_AllocRequestMsg failed"); + return; + } + request->msgId = topic; + ret = memcpy_s(request->data, size, (const void *)&callsInfo, size); + if (ret != EOK) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HfpIncomingEventPublish memcpy_s rateDataTmp fail! ret = %d", ret); + return; + } + request->len = size; + request->msgValue = 0; + + /* public request */ + api = SAMGR_GetInstance()->GetFeatureApi(BROADCAST_SERVICE_NAME, BROADCAST_FEATURE_NAME); + if (api == NULL) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "GetFeatureApi failed"); + SAMGR_FreeRequestMsg(request); + return; + } + ret = api->QueryInterface(api, DEFAULT_VERSION, (void **)&broadcastApi); + if (ret != 0 || broadcastApi == NULL) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "QueryInterface failed"); + SAMGR_FreeRequestMsg(request); + return; + } + broadcastApi->PublishTopic((IUnknown *)broadcastApi, request); + broadcastApi->Release((IUnknown *)broadcastApi); + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HfpIncomingEventPublish end!!"); - /* public request */ - api = SAMGR_GetInstance()->GetFeatureApi(BROADCAST_SERVICE_NAME, BROADCAST_FEATURE_NAME); - if (api == NULL) { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "GetFeatureApi failed"); - SAMGR_FreeRequestMsg(request); - return; - } - ret = api->QueryInterface(api, DEFAULT_VERSION, (void **)&broadcastApi); - if (ret != 0 || broadcastApi == NULL) { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "QueryInterface failed"); - SAMGR_FreeRequestMsg(request); return; } - broadcastApi->PublishTopic((IUnknown *)broadcastApi, request); - broadcastApi->Release((IUnknown *)broadcastApi); - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HfpIncomingEventPublish end!!"); - return; -} + // 通话状态变化--呼入处理 + static void CallChangeIncomePro(const hfp_hf_calls_info_t *call) + { + PhoneCallInfo *phoneCall = NULL; + int tmp, ret; -// 通话状态变化--呼入处理 -static void CallChangeIncomePro(const hfp_hf_calls_info_t *call) -{ - PhoneCallInfo *phoneCall = NULL; - int tmp, ret; + if (call == NULL || g_currCallNum >= MULTI_CALL_MAX_NUME || + (call->state != HFP_HF_CALL_STATE_INCOMING && call->state != HFP_HF_CALL_STATE_WAITING)) + { + return; + } - if (call == NULL || g_currCallNum >= MULTI_CALL_MAX_NUME || - (call->state != HFP_HF_CALL_STATE_INCOMING && call->state != HFP_HF_CALL_STATE_WAITING)) { - return; - } + phoneCall = FindCallInfoInCallList((const unsigned char *)call->number, call->number_len); + if (phoneCall != NULL) + { + // 通话状态由呼入等待转换成呼入情况 + } + else + { + g_currCallNum++; + tmp = g_currCallNum - 1; + phoneCall = &g_callList[tmp]; + } - phoneCall = FindCallInfoInCallList((const unsigned char*)call->number, call->number_len); - if (phoneCall != NULL) { - // 通话状态由呼入等待转换成呼入情况 - } else { - g_currCallNum++; - tmp = g_currCallNum - 1; - phoneCall = &g_callList[tmp]; - } + // 使用通讯录接口获取当前电话对应的备注人名(通讯录待开发) - // 使用通讯录接口获取当前电话对应的备注人名(通讯录待开发) + if (call->state == HFP_HF_CALL_STATE_INCOMING) + { + phoneCall->operate = OPERATE_INCOMING; + } + else + { + phoneCall->operate = OPERATE_WAITING; + } + phoneCall->lastStatus = call->state; + phoneCall->creationTime = time(NULL); + + ret = memcpy_s(phoneCall->tel, MAX_PHONE_NUM, call->number, call->number_len); + if (ret != EOK) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[CallChangeIncomePro] memcpy_s tel fail, ret = %d", ret); + CatPhoneNumber(call->number, call->number_len); + } + phoneCall->telLen = call->number_len; - if (call->state == HFP_HF_CALL_STATE_INCOMING) { - phoneCall->operate = OPERATE_INCOMING; - } else { - phoneCall->operate = OPERATE_WAITING; - } - phoneCall->lastStatus = call->state; - phoneCall->creationTime = time(NULL); + (void)memcpy_s(&phoneCall->unitCalls, sizeof(hfp_hf_calls_info_t), call, sizeof(hfp_hf_calls_info_t)); - ret = memcpy_s(phoneCall->tel, MAX_PHONE_NUM, call->number, call->number_len); - if (ret != EOK) { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[CallChangeIncomePro] memcpy_s tel fail, ret = %d", ret); - CatPhoneNumber(call->number, call->number_len); + // 发布电话呼入事件 + HfpIncomingEventPublish(TOPIC_EVENT_HFP_INCOMMING, phoneCall->unitCalls); + // 通知手表电话呼入 + CallChangedCb(phoneCall); } - phoneCall->telLen = call->number_len; - (void)memcpy_s(&phoneCall->unitCalls, sizeof(hfp_hf_calls_info_t), call, sizeof(hfp_hf_calls_info_t)); + // 通话状态变化--接听流程处理 + static void CallChangeActivePro(const hfp_hf_calls_info_t *call) + { + PhoneCallInfo *phoneCall = NULL; - // 发布电话呼入事件 - HfpIncomingEventPublish(TOPIC_EVENT_HFP_INCOMMING, phoneCall->unitCalls); - // 通知手表电话呼入 - CallChangedCb(phoneCall); -} + if (call == NULL) + { + return; + } -// 通话状态变化--接听流程处理 -static void CallChangeActivePro(const hfp_hf_calls_info_t *call) -{ - PhoneCallInfo *phoneCall = NULL; + phoneCall = FindCallInfoInCallList((const unsigned char *)call->number, call->number_len); + if (phoneCall == NULL) + { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[CallChangeActivePro] FindCallInfoInCallList Active no this call"); + AddCurrCallToCallList(call); + return; + } - if (call == NULL) { - return; - } + if (phoneCall->lastStatus == HFP_HF_CALL_STATE_HELD && IsCompleteCallFlow() == true) + { // 挂起状态切换到接听状态 + phoneCall->operate = OPERATE_WATCH_ACTIVE; + } + else if (phoneCall->lastStatus == HFP_HF_CALL_STATE_HELD && IsCompleteCallFlow() == false) + { + phoneCall->operate = OPERATE_PHONE_ACTIVE; + } + else if (phoneCall->operate == OPERATE_WATCH_ACTIVE) + { // 手表接听 + // 不做操作 + } + else + { + if (phoneCall->unitCalls.outgoing == 1 && + (phoneCall->lastStatus == HFP_HF_CALL_STATE_DIALING || phoneCall->lastStatus == HFP_HF_CALL_STATE_ALERTING)) + { + phoneCall->operate = OPERATE_PEER_ACTIVE; // 对方接听 + } + else + { + // 手机接听 + phoneCall->operate = OPERATE_PHONE_ACTIVE; + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[CallChangeActivePro] phone active!"); + } + } - phoneCall = FindCallInfoInCallList((const unsigned char*)call->number, call->number_len); - if (phoneCall == NULL) { - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[CallChangeActivePro] FindCallInfoInCallList Active no this call"); - AddCurrCallToCallList(call); - return; - } + if (phoneCall->activeTime == 0 && + (phoneCall->lastStatus == HFP_HF_CALL_STATE_DIALING || phoneCall->lastStatus == HFP_HF_CALL_STATE_ALERTING || + phoneCall->lastStatus == HFP_HF_CALL_STATE_INCOMING || phoneCall->lastStatus == HFP_HF_CALL_STATE_WAITING)) + { + phoneCall->activeTime = time(NULL); + } - if (phoneCall->lastStatus == HFP_HF_CALL_STATE_HELD && IsCompleteCallFlow() == true) { // 挂起状态切换到接听状态 - phoneCall->operate = OPERATE_WATCH_ACTIVE; - } else if (phoneCall->lastStatus == HFP_HF_CALL_STATE_HELD && IsCompleteCallFlow() == false) { - phoneCall->operate = OPERATE_PHONE_ACTIVE; - } else if (phoneCall->operate == OPERATE_WATCH_ACTIVE) { // 手表接听 - // 不做操作 - } else { - if (phoneCall->unitCalls.outgoing == 1 && - (phoneCall->lastStatus == HFP_HF_CALL_STATE_DIALING || phoneCall->lastStatus == HFP_HF_CALL_STATE_ALERTING)) { - phoneCall->operate = OPERATE_PEER_ACTIVE; // 对方接听 - } else { - // 手机接听 - phoneCall->operate = OPERATE_PHONE_ACTIVE; - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[CallChangeActivePro] phone active!"); + phoneCall->lastStatus = call->state; + (void)memcpy_s(&phoneCall->unitCalls, sizeof(hfp_hf_calls_info_t), call, sizeof(hfp_hf_calls_info_t)); + if (phoneCall->operate == OPERATE_PHONE_ACTIVE) + { + // 发布电话接听事件,手表关闭来电通知 + HfpIncomingEventPublish(TOPIC_EVENT_HFP_PHONE_ACTIVE, phoneCall->unitCalls); + } + else if (phoneCall->operate == OPERATE_WATCH_ACTIVE && g_scoFlag == HFP_SCO_STATE_CONNECTED) + { + // 发布手表接听事件,通知切换接听界面 + HfpIncomingEventPublish(TOPIC_EVENT_HFP_WATCH_ACTIVE, phoneCall->unitCalls); } + // 通知手表触发接听 + CallChangedCb(phoneCall); } - if (phoneCall->activeTime == 0 && - (phoneCall->lastStatus == HFP_HF_CALL_STATE_DIALING || phoneCall->lastStatus == HFP_HF_CALL_STATE_ALERTING || - phoneCall->lastStatus == HFP_HF_CALL_STATE_INCOMING || phoneCall->lastStatus == HFP_HF_CALL_STATE_WAITING)) { - phoneCall->activeTime = time(NULL); - } + // 通话状态变化--拒接/结束流程处理 + static void CallChangeFinishPro(const hfp_hf_calls_info_t *call) + { + PhoneCallInfo *phoneCall = NULL; + PhoneCallInfo tmp; - phoneCall->lastStatus = call->state; - (void)memcpy_s(&phoneCall->unitCalls, sizeof(hfp_hf_calls_info_t), call, sizeof(hfp_hf_calls_info_t)); - if (phoneCall->operate == OPERATE_PHONE_ACTIVE) { - // 发布电话接听事件,手表关闭来电通知 - HfpIncomingEventPublish(TOPIC_EVENT_HFP_PHONE_ACTIVE, phoneCall->unitCalls); - } else if (phoneCall->operate == OPERATE_WATCH_ACTIVE && g_scoFlag == HFP_SCO_STATE_CONNECTED) { - // 发布手表接听事件,通知切换接听界面 - HfpIncomingEventPublish(TOPIC_EVENT_HFP_WATCH_ACTIVE, phoneCall->unitCalls); - } - // 通知手表触发接听 - CallChangedCb(phoneCall); -} + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[CallChangeFinishPro] start g_scoFlag = %d, g_currCallNum = %d", + g_scoFlag, g_currCallNum); + if (call == NULL || g_currCallNum == 0) + { + return; + } -// 通话状态变化--拒接/结束流程处理 -static void CallChangeFinishPro(const hfp_hf_calls_info_t *call) -{ - PhoneCallInfo *phoneCall = NULL; - PhoneCallInfo tmp; + phoneCall = FindCallInfoInCallList((const unsigned char *)call->number, call->number_len); + if (phoneCall == NULL) + { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[CallChangeFinishPro] FindCallInfoInCallList Finish no this call"); + return; + } + if (g_finishOperate == OPERATE_WATCH_FINISH) + { + phoneCall->operate = OPERATE_WATCH_FINISH; + } + else if (g_finishOperate == OPERATE_WATCH_REJECT) + { + phoneCall->operate = OPERATE_WATCH_REJECT; + } + else + { + phoneCall->operate = OPERATE_NON_WATCH_FINISH; + } + g_finishOperate = OPERATE_NON_WATCH_FINISH; + g_currCallNum--; - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[CallChangeFinishPro] start g_scoFlag = %d, g_currCallNum = %d", - g_scoFlag, g_currCallNum); - if (call == NULL || g_currCallNum == 0) { - return; - } + (void)memcpy_s(&tmp, sizeof(PhoneCallInfo), phoneCall, sizeof(PhoneCallInfo)); + (void)memcpy_s(&tmp.unitCalls, sizeof(hfp_hf_calls_info_t), call, sizeof(hfp_hf_calls_info_t)); + (void)memset_s(phoneCall, sizeof(PhoneCallInfo), 0, sizeof(PhoneCallInfo)); + (void)memset_s(phoneCall->name, NAME_SIZE, '\0', NAME_SIZE); + (void)memset_s(phoneCall->tel, MAX_PHONE_NUM, '\0', MAX_PHONE_NUM); + phoneCall->lastStatus = HFP_HF_CALL_STATE_FINISHED; - phoneCall = FindCallInfoInCallList((const unsigned char*)call->number, call->number_len); - if (phoneCall == NULL) { - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[CallChangeFinishPro] FindCallInfoInCallList Finish no this call"); - return; - } - if (g_finishOperate == OPERATE_WATCH_FINISH) { - phoneCall->operate = OPERATE_WATCH_FINISH; - } else if (g_finishOperate == OPERATE_WATCH_REJECT) { - phoneCall->operate = OPERATE_WATCH_REJECT; - } else { - phoneCall->operate = OPERATE_NON_WATCH_FINISH; - } - g_finishOperate = OPERATE_NON_WATCH_FINISH; - g_currCallNum--; + // 添加通话记录 + AddToCallLogPro(&tmp); - (void)memcpy_s(&tmp, sizeof(PhoneCallInfo), phoneCall, sizeof(PhoneCallInfo)); - (void)memcpy_s(&tmp.unitCalls, sizeof(hfp_hf_calls_info_t), call, sizeof(hfp_hf_calls_info_t)); - (void)memset_s(phoneCall, sizeof(PhoneCallInfo), 0, sizeof(PhoneCallInfo)); - (void)memset_s(phoneCall->name, NAME_SIZE, '\0', NAME_SIZE); - (void)memset_s(phoneCall->tel, MAX_PHONE_NUM, '\0', MAX_PHONE_NUM); - phoneCall->lastStatus = HFP_HF_CALL_STATE_FINISHED; + // 发布电话结束事件 + HfpIncomingEventPublish(TOPIC_EVENT_HFP_FINISHED, phoneCall->unitCalls); + // 通知手表通话结束 + CallChangedCb(&tmp); - // 添加通话记录 - AddToCallLogPro(&tmp); + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[CallChangeFinishPro] end g_scoFlag = %d, g_currCallNum = %d", + g_scoFlag, g_currCallNum); + } - // 发布电话结束事件 - HfpIncomingEventPublish(TOPIC_EVENT_HFP_FINISHED, phoneCall->unitCalls); - // 通知手表通话结束 - CallChangedCb(&tmp); + // 通话状态变化--挂起通话(当前只有手机挂起触发(并且手表不需感知),手表不支持挂起触发,对方挂起不感知) + static void CallChangeHeldPro(const hfp_hf_calls_info_t *call) + { + PhoneCallInfo *phoneCall = NULL; - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[CallChangeFinishPro] end g_scoFlag = %d, g_currCallNum = %d", - g_scoFlag, g_currCallNum); -} + if (call == NULL) + { + return; + } -// 通话状态变化--挂起通话(当前只有手机挂起触发(并且手表不需感知),手表不支持挂起触发,对方挂起不感知) -static void CallChangeHeldPro(const hfp_hf_calls_info_t *call) -{ - PhoneCallInfo *phoneCall = NULL; + phoneCall = FindCallInfoInCallList((const unsigned char *)call->number, call->number_len); + if (phoneCall == NULL) + { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[CallChangeHeldPro] FindCallInfoInCallList Held no this call"); + AddCurrCallToCallList(call); + return; + } - if (call == NULL) { - return; - } + // 手机挂起通话 + phoneCall->operate = OPERATE_PHONE_HOLD; + if (phoneCall->lastStatus == HFP_HF_CALL_STATE_INCOMING || phoneCall->lastStatus == HFP_HF_CALL_STATE_WAITING) + { + phoneCall->activeTime = time(NULL); + } + phoneCall->lastStatus = call->state; + (void)memcpy_s(&phoneCall->unitCalls, sizeof(hfp_hf_calls_info_t), call, sizeof(hfp_hf_calls_info_t)); - phoneCall = FindCallInfoInCallList((const unsigned char*)call->number, call->number_len); - if (phoneCall == NULL) { - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[CallChangeHeldPro] FindCallInfoInCallList Held no this call"); - AddCurrCallToCallList(call); - return; + // 通知手表触发挂起 + CallChangedCb(phoneCall); } - // 手机挂起通话 - phoneCall->operate = OPERATE_PHONE_HOLD; - if (phoneCall->lastStatus == HFP_HF_CALL_STATE_INCOMING || phoneCall->lastStatus == HFP_HF_CALL_STATE_WAITING) { - phoneCall->activeTime = time(NULL); + static void PlayWatchRing(void) + { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[PlayWatchRing] start"); + // 申请手表铃声焦点 + // AudioActInterrupt(AUDIO_STREAM_RING); + // 播放手表铃声(播放方案待定) } - phoneCall->lastStatus = call->state; - (void)memcpy_s(&phoneCall->unitCalls, sizeof(hfp_hf_calls_info_t), call, sizeof(hfp_hf_calls_info_t)); - - // 通知手表触发挂起 - CallChangedCb(phoneCall); -} - -static void PlayWatchRing(void) -{ - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[PlayWatchRing] start"); - // 申请手表铃声焦点 - // AudioActInterrupt(AUDIO_STREAM_RING); - // 播放手表铃声(播放方案待定) -} -static void CallAudioHandle(const hfp_hf_calls_info_t *call) -{ - int state = call->state; + static void CallAudioHandle(const hfp_hf_calls_info_t *call) + { + int state = call->state; - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[CallAudioHandle] start g_audioState: %d", g_audioState); + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[CallAudioHandle] start g_audioState: %d", g_audioState); - if (state == HFP_HF_CALL_STATE_INCOMING || state == HFP_HF_CALL_STATE_DIALING || - state == HFP_HF_CALL_STATE_ALERTING) { // 电话呼入,支持播放手机铃声 - if (call->in_band_ring == true) { - // 播放手机端铃声 - PostGraphicEvent(AudioDn); - } else { - if (g_scoFlag != HFP_SCO_STATE_CONNECTED) { - // 播放手表铃声 - PostGraphicEvent(PlayWatchRing); + if (state == HFP_HF_CALL_STATE_INCOMING || state == HFP_HF_CALL_STATE_DIALING || + state == HFP_HF_CALL_STATE_ALERTING) + { // 电话呼入,支持播放手机铃声 + if (call->in_band_ring == true) + { + // 播放手机端铃声 + PostGraphicEvent(AudioDn); + } + else + { + if (g_scoFlag != HFP_SCO_STATE_CONNECTED) + { + // 播放手表铃声 + PostGraphicEvent(PlayWatchRing); + } } } - } else if (state == HFP_HF_CALL_STATE_FINISHED) { - return; - } else if (g_scoFlag == HFP_SCO_STATE_CONNECTED) { - if (g_audioState < AUDIO_STREAM_START_DN) { - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[CallAudioHandle] post AudioDn"); - PostGraphicEvent(AudioDn); + else if (state == HFP_HF_CALL_STATE_FINISHED) + { + return; } - if (g_audioState != AUDIO_STREAM_START_UP) { - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[CallAudioHandle] post AudioUp"); - PostGraphicEvent(AudioUp); + else if (g_scoFlag == HFP_SCO_STATE_CONNECTED) + { + if (g_audioState < AUDIO_STREAM_START_DN) + { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[CallAudioHandle] post AudioDn"); + PostGraphicEvent(AudioDn); + } + if (g_audioState != AUDIO_STREAM_START_UP) + { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[CallAudioHandle] post AudioUp"); + PostGraphicEvent(AudioUp); + } } - } - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[CallAudioHandle] end g_audioState: %d", g_audioState); -} - -static void CatCallStateChangedInfo(const bd_addr_t *bdAddr, const hfp_hf_calls_info_t *call) -{ - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "***************************CallStateChanged***************************"); - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "g_scoFlag = %d, g_currCallNum = %d, bdAddr: ", g_scoFlag, g_currCallNum); - CatBdAddr(bdAddr); - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "id = %d, state = %d", call->id, call->state); - CatPhoneNumber(call->number, call->number_len); - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "multi_party = %d, outgoing = %d, in_band_ring = %d, creation_time = %ld", - call->multi_party, call->outgoing, call->in_band_ring, call->creation_time); - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "***********************************************************************"); -} + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[CallAudioHandle] end g_audioState: %d", g_audioState); + } -// 设置完整通话标志 -static void SetCompleteCallFlag(const hfp_hf_calls_info_t *call) -{ - if (call->state == HFP_HF_CALL_STATE_INCOMING) { - g_completeCallFlag = true; - } else if ((call->state == HFP_HF_CALL_STATE_DIALING || call->state == HFP_HF_CALL_STATE_ALERTING) && - (g_currCallNum == 1 || g_currCallNum == 0)) { - g_completeCallFlag = true; - } else if (call->state == HFP_HF_CALL_STATE_ACTIVE) { - g_completeCallFlag = true; + static void CatCallStateChangedInfo(const bd_addr_t *bdAddr, const hfp_hf_calls_info_t *call) + { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "***************************CallStateChanged***************************"); + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "g_scoFlag = %d, g_currCallNum = %d, bdAddr: ", g_scoFlag, g_currCallNum); + CatBdAddr(bdAddr); + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "id = %d, state = %d", call->id, call->state); + CatPhoneNumber(call->number, call->number_len); + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "multi_party = %d, outgoing = %d, in_band_ring = %d, creation_time = %ld", + call->multi_party, call->outgoing, call->in_band_ring, call->creation_time); + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "***********************************************************************"); } -} -bool IsCompleteCallFlow(void) -{ - return g_completeCallFlag; -} + // 设置完整通话标志 + static void SetCompleteCallFlag(const hfp_hf_calls_info_t *call) + { + if (call->state == HFP_HF_CALL_STATE_INCOMING) + { + g_completeCallFlag = true; + } + else if ((call->state == HFP_HF_CALL_STATE_DIALING || call->state == HFP_HF_CALL_STATE_ALERTING) && + (g_currCallNum == 1 || g_currCallNum == 0)) + { + g_completeCallFlag = true; + } + else if (call->state == HFP_HF_CALL_STATE_ACTIVE) + { + g_completeCallFlag = true; + } + } -// 通话状态变化上报回调 -static void CallStateChanged(const bd_addr_t *bdAddr, const hfp_hf_calls_info_t *call) -{ - CopyBdAddr(bdAddr); - if (call == NULL || g_btConnState != PROFILE_STATE_CONNECTED) { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "call is null or BT disconnected connStatus: 0x%X", g_btConnState); - return; + bool IsCompleteCallFlow(void) + { + return g_completeCallFlag; } - SetCompleteCallFlag(call); - CatCallStateChangedInfo(bdAddr, call); - CallAudioHandle(call); + // 通话状态变化上报回调 + static void CallStateChanged(const bd_addr_t *bdAddr, const hfp_hf_calls_info_t *call) + { + CopyBdAddr(bdAddr); + if (call == NULL || g_btConnState != PROFILE_STATE_CONNECTED) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "call is null or BT disconnected connStatus: 0x%X", g_btConnState); + return; + } + + SetCompleteCallFlag(call); + CatCallStateChangedInfo(bdAddr, call); + CallAudioHandle(call); - WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "CallStateChanged state = %d", call->state); - switch (call->state) { + WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "CallStateChanged state = %d", call->state); + switch (call->state) + { case HFP_HF_CALL_STATE_ACTIVE: // 正在通话 CallChangeActivePro(call); break; @@ -1438,467 +1635,517 @@ static void CallStateChanged(const bd_addr_t *bdAddr, const hfp_hf_calls_info_t break; default: break; - } + } - // 规避某些型号手机在电话呼入时重复断开和连接SCO - if (call->state == HFP_HF_CALL_STATE_FINISHED) { - if (g_currCallNum == 0) { - g_currCallState = HFP_HF_CALL_STATE_FINISHED; + // 规避某些型号手机在电话呼入时重复断开和连接SCO + if (call->state == HFP_HF_CALL_STATE_FINISHED) + { + if (g_currCallNum == 0) + { + g_currCallState = HFP_HF_CALL_STATE_FINISHED; + } + } + else + { + g_currCallState = call->state; } - } else { - g_currCallState = call->state; - } - if (g_currCallNum == 0) { - g_completeCallFlag = false; + if (g_currCallNum == 0) + { + g_completeCallFlag = false; + } } -} -static void BtHfpVolumeChanged(int volumeType, unsigned char hfpVolume) -{ - int maxVolume, minVolume, volume; - bool ret; + static void BtHfpVolumeChanged(int volumeType, unsigned char hfpVolume) + { + int maxVolume, minVolume, volume; + bool ret; - // mic - if (volumeType == HFP_VOLUME_MIC) { - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "VolumeChanged Type = %d, hfpVolume = %d", - volumeType, hfpVolume); - } + // mic + if (volumeType == HFP_VOLUME_MIC) + { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "VolumeChanged Type = %d, hfpVolume = %d", + volumeType, hfpVolume); + } - // speak - if (volumeType == HFP_VOLUME_SPEAKER) { - minVolume = PhoneAudioGetMinVolume(); - maxVolume = PhoneAudioGetMaxVolume(); - volume = hfpVolume * (maxVolume - minVolume) / CALL_VOLUME_MAX; // 转换 - volume = (volume == 0) ? ((maxVolume - minVolume) / CALL_VOLUME_MAX) : volume; - ret = PhoneAudioSetVolume(volume); - if (ret != true) { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "VolumeChanged Type: %d, ret: %d", - volumeType, ret); + // speak + if (volumeType == HFP_VOLUME_SPEAKER) + { + minVolume = PhoneAudioGetMinVolume(); + maxVolume = PhoneAudioGetMaxVolume(); + volume = hfpVolume * (maxVolume - minVolume) / CALL_VOLUME_MAX; // 转换 + volume = (volume == 0) ? ((maxVolume - minVolume) / CALL_VOLUME_MAX) : volume; + ret = PhoneAudioSetVolume(volume); + if (ret != true) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "VolumeChanged Type: %d, ret: %d", + volumeType, ret); + } + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "VolumeChanged Type: %d, min: %d, max: %d volume: %d ret: %d", + volumeType, minVolume, maxVolume, volume, ret); } - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "VolumeChanged Type: %d, min: %d, max: %d volume: %d ret: %d", - volumeType, minVolume, maxVolume, volume, ret); } -} -// 音量调节回调 -static void VolumeChanged(const bd_addr_t *bdAddr, hfp_volume_type_t type, unsigned char volume) -{ - UNUSED(bdAddr); - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[VolumeChanged] type = %d volume = %d", type, volume); - GraphicService::GetInstance()->PostGraphicEvent(std::bind(BtHfpVolumeChanged, type, volume)); -} - -// 拨号失败回调 -static void DialErrorCode(const bd_addr_t *bdAddr, int code) -{ - UNUSED(bdAddr); - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[DialErrorCode] code = %d", code); - PhoneServiceErrorCallback(ERROR_DIAL, code); -} - -static void HfpBatteryChanged(const bd_addr_t *bdAddr, int batteryLevel) -{ - UNUSED(bdAddr); - UNUSED(batteryLevel); - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[HfpBatteryChanged] batteryLevel: %d", batteryLevel); -} + // 音量调节回调 + static void VolumeChanged(const bd_addr_t *bdAddr, hfp_volume_type_t type, unsigned char volume) + { + UNUSED(bdAddr); + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[VolumeChanged] type = %d volume = %d", type, volume); + GraphicService::GetInstance()->PostGraphicEvent(std::bind(BtHfpVolumeChanged, type, volume)); + } -static void HfpSignalStrengthChanged(const bd_addr_t *bdAddr, int signalStrength) -{ - UNUSED(bdAddr); - UNUSED(signalStrength); - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[HfpSignalStrengthChanged] signalStrength: %d", signalStrength); -} + // 拨号失败回调 + static void DialErrorCode(const bd_addr_t *bdAddr, int code) + { + UNUSED(bdAddr); + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[DialErrorCode] code = %d", code); + PhoneServiceErrorCallback(ERROR_DIAL, code); + } -static void HfpRegistStatusChanged(const bd_addr_t *bdAddr, int status) -{ - UNUSED(bdAddr); - UNUSED(status); - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[HfpRegistStatusChanged] status: %d", status); -} + static void HfpBatteryChanged(const bd_addr_t *bdAddr, int batteryLevel) + { + UNUSED(bdAddr); + UNUSED(batteryLevel); + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[HfpBatteryChanged] batteryLevel: %d", batteryLevel); + } -static void HfpRoamingStatusChanged(const bd_addr_t *bdAddr, int status) -{ - UNUSED(bdAddr); - UNUSED(status); - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[HfpRoamingStatusChanged] status: %d", status); -} + static void HfpSignalStrengthChanged(const bd_addr_t *bdAddr, int signalStrength) + { + UNUSED(bdAddr); + UNUSED(signalStrength); + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[HfpSignalStrengthChanged] signalStrength: %d", signalStrength); + } -static void HfpOperatorSelection(const bd_addr_t *bdAddr, unsigned char *name, unsigned int len) -{ - UNUSED(bdAddr); - UNUSED(name); - UNUSED(len); - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[HfpOperatorSelection] name: %s, len: %d", name, len); -} + static void HfpRegistStatusChanged(const bd_addr_t *bdAddr, int status) + { + UNUSED(bdAddr); + UNUSED(status); + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[HfpRegistStatusChanged] status: %d", status); + } -static void HfpSubscriberNumber(const bd_addr_t *bdAddr, unsigned char *number, unsigned int len) -{ - UNUSED(bdAddr); - UNUSED(number); - UNUSED(len); - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[HfpSubscriberNumber] number: %s, len: %d", number, len); -} + static void HfpRoamingStatusChanged(const bd_addr_t *bdAddr, int status) + { + UNUSED(bdAddr); + UNUSED(status); + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[HfpRoamingStatusChanged] status: %d", status); + } -static void VoiceRecogStatusChanged(const bd_addr_t *bdAddr, int status) -{ - UNUSED(bdAddr); - UNUSED(status); - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[VoiceRecogStatusChanged] status: %d", status); -} + static void HfpOperatorSelection(const bd_addr_t *bdAddr, unsigned char *name, unsigned int len) + { + UNUSED(bdAddr); + UNUSED(name); + UNUSED(len); + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[HfpOperatorSelection] name: %s, len: %d", name, len); + } -static void InbandRingtoneChanged(const bd_addr_t *bdAddr, int status) -{ - UNUSED(bdAddr); - UNUSED(status); - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[InbandRingtoneChanged] status: %d", status); -} + static void HfpSubscriberNumber(const bd_addr_t *bdAddr, unsigned char *number, unsigned int len) + { + UNUSED(bdAddr); + UNUSED(number); + UNUSED(len); + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[HfpSubscriberNumber] number: %s, len: %d", number, len); + } -static void CodecChanged(const bd_addr_t *bdAddr, int codec) -{ - UNUSED(bdAddr); - if (codec == HFP_HF_CODEC_ID_CVSD) { - g_call_codec = PCM; - } else if (codec == HFP_HF_CODEC_ID_MSBC) { - g_call_codec = mSBC; + static void VoiceRecogStatusChanged(const bd_addr_t *bdAddr, int status) + { + UNUSED(bdAddr); + UNUSED(status); + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[VoiceRecogStatusChanged] status: %d", status); } - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[CodecChanged] codec: %d, call_codec: %d", codec, g_call_codec); -} + static void InbandRingtoneChanged(const bd_addr_t *bdAddr, int status) + { + UNUSED(bdAddr); + UNUSED(status); + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[InbandRingtoneChanged] status: %d", status); + } -static void RegisterHfpHfCallbacks(void) -{ - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[RegisterHfpHfCallbacks] start"); - int ret; - hfp_hf_callbacks_t callbacks = { - ConnStateChanged, - ScoStateChanged, - HfpBatteryChanged, - HfpSignalStrengthChanged, - HfpRegistStatusChanged, - HfpRoamingStatusChanged, - HfpOperatorSelection, - HfpSubscriberNumber, - VoiceRecogStatusChanged, - InbandRingtoneChanged, - VolumeChanged, - CallStateChanged, - DialErrorCode, - CodecChanged, - }; - - ret = hfp_hf_register_callbacks(&callbacks); - if (ret != 0) { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[RegisterHfpHfCallbacks] ret = %d", ret); + static void CodecChanged(const bd_addr_t *bdAddr, int codec) + { + UNUSED(bdAddr); + if (codec == HFP_HF_CODEC_ID_CVSD) + { + g_call_codec = PCM; + } + else if (codec == HFP_HF_CODEC_ID_MSBC) + { + g_call_codec = mSBC; + } + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[CodecChanged] codec: %d, call_codec: %d", codec, g_call_codec); + } + + static void RegisterHfpHfCallbacks(void) + { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[RegisterHfpHfCallbacks] start"); + int ret; + hfp_hf_callbacks_t callbacks = { + ConnStateChanged, + ScoStateChanged, + HfpBatteryChanged, + HfpSignalStrengthChanged, + HfpRegistStatusChanged, + HfpRoamingStatusChanged, + HfpOperatorSelection, + HfpSubscriberNumber, + VoiceRecogStatusChanged, + InbandRingtoneChanged, + VolumeChanged, + CallStateChanged, + DialErrorCode, + CodecChanged, + }; + + ret = hfp_hf_register_callbacks(&callbacks); + if (ret != 0) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[RegisterHfpHfCallbacks] ret = %d", ret); + } } -} -void PhoneServiceInit(void) -{ - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[PhoneServiceInit] start"); - g_scoFlag = HFP_SCO_STATE_DISCONNECTED; - AudioInit(); - InitMutex(); - CallLogCreatDir(); - if (GetCallLogFileSize() == OHOS_FAILURE) { // 如果不存在文件,创建新文件 - (void)ClearCallLogFile(); - } - (void)memset_s(g_bdAddr.addr, BD_ADDR_LEN, 0, BD_ADDR_LEN); - CallListInit(); - RegisterHfpHfCallbacks(); - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[PhoneServiceInit] end"); -} + void PhoneServiceInit(void) + { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[PhoneServiceInit] start"); + g_scoFlag = HFP_SCO_STATE_DISCONNECTED; + AudioInit(); + InitMutex(); + CallLogCreatDir(); + if (GetCallLogFileSize() == OHOS_FAILURE) + { // 如果不存在文件,创建新文件 + (void)ClearCallLogFile(); + } + (void)memset_s(g_bdAddr.addr, BD_ADDR_LEN, 0, BD_ADDR_LEN); + CallListInit(); + RegisterHfpHfCallbacks(); + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[PhoneServiceInit] end"); + } + + // 手表主动拨打电话 + int DialCall(unsigned char *number, unsigned char len) + { + int ret; + unsigned char *tel = NULL; + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[DialCall] start"); + if (g_btConnState != PROFILE_STATE_CONNECTED) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[DialCall] BT connStatus: 0x%X", g_btConnState); + return OHOS_FAILURE; + } -// 手表主动拨打电话 -int DialCall(unsigned char *number, unsigned char len) -{ - int ret; - unsigned char *tel = NULL; - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[DialCall] start"); - if (g_btConnState != PROFILE_STATE_CONNECTED) { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[DialCall] BT connStatus: 0x%X", g_btConnState); - return OHOS_FAILURE; - } - - // 有通话时,不允许拨出电话 - if (g_currCallNum > 0 || len > MAX_PHONE_NUM || number == NULL) { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[DialCall] g_currCallNum = %d", g_currCallNum); - return OHOS_FAILURE; - } - - tel = (unsigned char *)malloc(len + 1); - if (tel == NULL) { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[DialCall] malloc tel error"); - return OHOS_FAILURE; - } - (void)memcpy_s(tel, len, number, len); - *(tel + len) = '\0'; - ret = hfp_hf_start_dial(&g_bdAddr, tel, len); - if (ret != ERRCODE_BT_SUCCESS) { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[DialCall] hfp_hf_start_dial error ret %d", ret); + // 有通话时,不允许拨出电话 + if (g_currCallNum > 0 || len > MAX_PHONE_NUM || number == NULL) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[DialCall] g_currCallNum = %d", g_currCallNum); + return OHOS_FAILURE; + } + + tel = (unsigned char *)malloc(len + 1); + if (tel == NULL) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[DialCall] malloc tel error"); + return OHOS_FAILURE; + } + (void)memcpy_s(tel, len, number, len); + *(tel + len) = '\0'; + ret = hfp_hf_start_dial(&g_bdAddr, tel, len); + if (ret != ERRCODE_BT_SUCCESS) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[DialCall] hfp_hf_start_dial error ret %d", ret); + free(tel); + return OHOS_FAILURE; + } + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[DialCall] success!"); free(tel); - return OHOS_FAILURE; + return OHOS_SUCCESS; } - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[DialCall] success!"); - free(tel); - return OHOS_SUCCESS; -} -// 手表主动接听 -int AcceptIncomingCall(void) -{ - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[AcceptIncomingCall] start"); - int ret, i; - PhoneCallInfo *phoneCall = NULL; - PhoneCallInfo *tmp = g_callList; + // 手表主动接听 + int AcceptIncomingCall(void) + { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[AcceptIncomingCall] start"); + int ret, i; + PhoneCallInfo *phoneCall = NULL; + PhoneCallInfo *tmp = g_callList; - if (g_btConnState != PROFILE_STATE_CONNECTED) { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[AcceptIncomingCall] BT connStatus: 0x%X", g_btConnState); - return OHOS_FAILURE; - } + if (g_btConnState != PROFILE_STATE_CONNECTED) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[AcceptIncomingCall] BT connStatus: 0x%X", g_btConnState); + return OHOS_FAILURE; + } - for (i = 0; i < MULTI_CALL_MAX_NUME; i++) { - if (tmp->lastStatus == HFP_HF_CALL_STATE_INCOMING || tmp->lastStatus == HFP_HF_CALL_STATE_WAITING) { - phoneCall = tmp; - break; + for (i = 0; i < MULTI_CALL_MAX_NUME; i++) + { + if (tmp->lastStatus == HFP_HF_CALL_STATE_INCOMING || tmp->lastStatus == HFP_HF_CALL_STATE_WAITING) + { + phoneCall = tmp; + break; + } + tmp++; } - tmp++; - } - if (phoneCall == NULL) { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[AcceptIncomingCall] no incoming"); - return OHOS_FAILURE; - } + if (phoneCall == NULL) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[AcceptIncomingCall] no incoming"); + return OHOS_FAILURE; + } - phoneCall->operate = OPERATE_WATCH_ACTIVE; + phoneCall->operate = OPERATE_WATCH_ACTIVE; - if (g_currCallNum > 1) { - ret = hfp_hf_accept_incoming_call(&g_bdAddr, HFP_HF_ACCEPT_CALL_ACTION_HOLD); // 正在通话,有人呼入,接听呼入电话,挂起当前通话 - } else { - ret = hfp_hf_accept_incoming_call(&g_bdAddr, HFP_HF_ACCEPT_CALL_ACTION_NONE); // 无人通话,有人呼入,接听呼入电话 - } - if (ret != ERRCODE_BT_SUCCESS) { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[AcceptIncomingCall] hfp_hf_accept_incoming_call error ret = %d", ret); - phoneCall->operate = OPERATE_NO_OPE; - return OHOS_FAILURE; + if (g_currCallNum > 1) + { + ret = hfp_hf_accept_incoming_call(&g_bdAddr, HFP_HF_ACCEPT_CALL_ACTION_HOLD); // 正在通话,有人呼入,接听呼入电话,挂起当前通话 + } + else + { + ret = hfp_hf_accept_incoming_call(&g_bdAddr, HFP_HF_ACCEPT_CALL_ACTION_NONE); // 无人通话,有人呼入,接听呼入电话 + } + if (ret != ERRCODE_BT_SUCCESS) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[AcceptIncomingCall] hfp_hf_accept_incoming_call error ret = %d", ret); + phoneCall->operate = OPERATE_NO_OPE; + return OHOS_FAILURE; + } + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[AcceptIncomingCall] success!"); + return OHOS_SUCCESS; } - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[AcceptIncomingCall] success!"); - return OHOS_SUCCESS; -} -// 手表拒接呼入来电,成功:0,失败:错误码 -int RejectIncomingCall(void) -{ - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[RejectIncomingCall] start"); - int ret, i; - PhoneCallInfo *phoneCall = NULL; - PhoneCallInfo *tmp = g_callList; + // 手表拒接呼入来电,成功:0,失败:错误码 + int RejectIncomingCall(void) + { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[RejectIncomingCall] start"); + int ret, i; + PhoneCallInfo *phoneCall = NULL; + PhoneCallInfo *tmp = g_callList; - if (g_btConnState != PROFILE_STATE_CONNECTED) { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[RejectIncomingCall] BT connStatus: 0x%X", g_btConnState); - return OHOS_FAILURE; - } + if (g_btConnState != PROFILE_STATE_CONNECTED) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[RejectIncomingCall] BT connStatus: 0x%X", g_btConnState); + return OHOS_FAILURE; + } - for (i = 0; i < MULTI_CALL_MAX_NUME; i++) { - if (tmp->lastStatus == HFP_HF_CALL_STATE_INCOMING || tmp->lastStatus == HFP_HF_CALL_STATE_WAITING) { - phoneCall = tmp; + for (i = 0; i < MULTI_CALL_MAX_NUME; i++) + { + if (tmp->lastStatus == HFP_HF_CALL_STATE_INCOMING || tmp->lastStatus == HFP_HF_CALL_STATE_WAITING) + { + phoneCall = tmp; + } + tmp++; } - tmp++; - } - if (phoneCall == NULL) { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[AcceptIncomingCall] no incoming"); - return OHOS_SUCCESS; - } + if (phoneCall == NULL) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[AcceptIncomingCall] no incoming"); + return OHOS_SUCCESS; + } - ret = hfp_hf_reject_incoming_call(&g_bdAddr); - if (ret != ERRCODE_BT_SUCCESS) { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[RejectIncomingCall] hfp_hf_reject_incoming_call error ret = %d", ret); - return OHOS_FAILURE; + ret = hfp_hf_reject_incoming_call(&g_bdAddr); + if (ret != ERRCODE_BT_SUCCESS) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[RejectIncomingCall] hfp_hf_reject_incoming_call error ret = %d", ret); + return OHOS_FAILURE; + } + g_finishOperate = OPERATE_WATCH_REJECT; + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[RejectIncomingCall] success!"); + return OHOS_SUCCESS; } - g_finishOperate = OPERATE_WATCH_REJECT; - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[RejectIncomingCall] success!"); - return OHOS_SUCCESS; -} -// 手表结束通话 -int FinishCall(void) -{ - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[FinishCall] start"); + // 手表结束通话 + int FinishCall(void) + { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[FinishCall] start"); - if (g_btConnState != PROFILE_STATE_CONNECTED) { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[FinishCall] BT connStatus: 0x%X", g_btConnState); - return OHOS_FAILURE; - } - int ret = hfp_hf_finish_call(&g_bdAddr); - if (ret != ERRCODE_BT_SUCCESS) { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[FinishCall] hfp_hf_finish_call error ret = %d", ret); - return OHOS_FAILURE; + if (g_btConnState != PROFILE_STATE_CONNECTED) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[FinishCall] BT connStatus: 0x%X", g_btConnState); + return OHOS_FAILURE; + } + int ret = hfp_hf_finish_call(&g_bdAddr); + if (ret != ERRCODE_BT_SUCCESS) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[FinishCall] hfp_hf_finish_call error ret = %d", ret); + return OHOS_FAILURE; + } + g_finishOperate = OPERATE_WATCH_FINISH; + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[FinishCall] success!"); + return OHOS_SUCCESS; } - g_finishOperate = OPERATE_WATCH_FINISH; - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[FinishCall] success!"); - return OHOS_SUCCESS; -} -// 获取当前正在通话路数 -int GetCurrCallNum(void) -{ - return g_currCallNum; -} + // 获取当前正在通话路数 + int GetCurrCallNum(void) + { + return g_currCallNum; + } + + /** + * @brief 获取当前通话路数和对应的通话信息 + * + * @param callList 用来接收通话信息,需调用者分配空间,大小为MULTI_CALL_MAX_NUME * sizeof(PhoneCallInfo) + * @param listNum callList中PhoneCallInfo个数,大小为MULTI_CALL_MAX_NUME + * @param retNum 接收当前正在进行的通话路数 + * @return 返回值 成功返回0,失败返回错误码 + */ + int GetCallInfoInCallList(PhoneCallInfo callList[], int listNum, int *retNum) + { + int i, len; + PhoneCallInfo *tmp = g_callList; + PhoneCallInfo *tmp2 = callList; + + if (callList == NULL || listNum < MULTI_CALL_MAX_NUME) + { + *retNum = 0; + return OHOS_FAILURE; + } -/** - * @brief 获取当前通话路数和对应的通话信息 - * - * @param callList 用来接收通话信息,需调用者分配空间,大小为MULTI_CALL_MAX_NUME * sizeof(PhoneCallInfo) - * @param listNum callList中PhoneCallInfo个数,大小为MULTI_CALL_MAX_NUME - * @param retNum 接收当前正在进行的通话路数 - * @return 返回值 成功返回0,失败返回错误码 - */ -int GetCallInfoInCallList(PhoneCallInfo callList[], int listNum, int *retNum) -{ - int i, len; - PhoneCallInfo *tmp = g_callList; - PhoneCallInfo *tmp2 = callList; + if (g_currCallNum == 0) + { + *retNum = 0; + return OHOS_SUCCESS; + } - if (callList == NULL || listNum < MULTI_CALL_MAX_NUME) { - *retNum = 0; - return OHOS_FAILURE; - } + len = sizeof(PhoneCallInfo); + for (i = 0; i < MULTI_CALL_MAX_NUME; i++) + { + if (tmp->lastStatus == HFP_HF_CALL_STATE_FINISHED) + { + tmp++; + } + else + { + (void)memcpy_s(tmp2, len, tmp, len); + tmp++; + tmp2++; + } + } - if (g_currCallNum == 0) { - *retNum = 0; + *retNum = g_currCallNum; return OHOS_SUCCESS; } - len = sizeof(PhoneCallInfo); - for (i = 0; i < MULTI_CALL_MAX_NUME; i++) { - if (tmp->lastStatus == HFP_HF_CALL_STATE_FINISHED) { - tmp++; - } else { - (void)memcpy_s(tmp2, len, tmp, len); - tmp++; - tmp2++; + // 获取当前通话音量大小 (0 - 15) + // hfp音量范围 0-15, media 音量范围 0-100 + unsigned char GetCallCurrVolume(void) + { + int volume; + int minVolume; + int maxVolume; + unsigned char hfpVolume; + + volume = PhoneAudioGetVolume(); + minVolume = PhoneAudioGetMinVolume(); + maxVolume = PhoneAudioGetMaxVolume(); + hfpVolume = (unsigned char)((volume * CALL_VOLUME_MAX) / (maxVolume - minVolume)); // 转换 + + if (volume != 0 && hfpVolume == 0) + { + hfpVolume = 1; } + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[GetCallCurrVolume] volume = %d, minVolume = %d, maxVolume = %d, hfpVolume = %d", + volume, minVolume, maxVolume, hfpVolume); + return hfpVolume; } - *retNum = g_currCallNum; - return OHOS_SUCCESS; -} + void SetSpeakerVolume(unsigned char hfpVolume) + { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[SetSpeakerVolume] start, hfpVolume = %d", hfpVolume); + int ret, minVolume, maxVolume, volume; -// 获取当前通话音量大小 (0 - 15) -// hfp音量范围 0-15, media 音量范围 0-100 -unsigned char GetCallCurrVolume(void) -{ - int volume; - int minVolume; - int maxVolume; - unsigned char hfpVolume; - - volume = PhoneAudioGetVolume(); - minVolume = PhoneAudioGetMinVolume(); - maxVolume = PhoneAudioGetMaxVolume(); - hfpVolume = (unsigned char)((volume * CALL_VOLUME_MAX) / (maxVolume - minVolume)); // 转换 - - if (volume != 0 && hfpVolume == 0) { - hfpVolume = 1; - } - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[GetCallCurrVolume] volume = %d, minVolume = %d, maxVolume = %d, hfpVolume = %d", - volume, minVolume, maxVolume, hfpVolume); - return hfpVolume; -} + minVolume = PhoneAudioGetMinVolume(); + maxVolume = PhoneAudioGetMaxVolume(); + volume = hfpVolume * (maxVolume - minVolume) / CALL_VOLUME_MAX; // 转换 + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[SetSpeakerVolume] minVolume = %d, maxVolume = %d, volume = %d", + minVolume, maxVolume, volume); -void SetSpeakerVolume(unsigned char hfpVolume) -{ - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[SetSpeakerVolume] start, hfpVolume = %d", hfpVolume); - int ret, minVolume, maxVolume, volume; - - minVolume = PhoneAudioGetMinVolume(); - maxVolume = PhoneAudioGetMaxVolume(); - volume = hfpVolume * (maxVolume - minVolume) / CALL_VOLUME_MAX; // 转换 - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[SetSpeakerVolume] minVolume = %d, maxVolume = %d, volume = %d", - minVolume, maxVolume, volume); - - ret = PhoneAudioSetVolume(volume); - if (ret != true) { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[SetSpeakerVolume] PhoneAudioSetVolume ret = %d", ret); - return; - } + ret = PhoneAudioSetVolume(volume); + if (ret != true) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[SetSpeakerVolume] PhoneAudioSetVolume ret = %d", ret); + return; + } + + ret = hfp_hf_set_volume(&g_bdAddr, HFP_VOLUME_SPEAKER, hfpVolume); + if (ret != ERRCODE_BT_SUCCESS) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[SetSpeakerVolume] set_volume fail ret = %d, hfpVolume = %d", + ret, hfpVolume); + return; + } + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[SetSpeakerVolume] success!"); - ret = hfp_hf_set_volume(&g_bdAddr, HFP_VOLUME_SPEAKER, hfpVolume); - if (ret != ERRCODE_BT_SUCCESS) { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[SetSpeakerVolume] set_volume fail ret = %d, hfpVolume = %d", - ret, hfpVolume); return; } - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[SetSpeakerVolume] success!"); - - return; -} -// 设置通话speaker静音 -bool SetSpeakerMute(bool isMute) -{ - return PhoneAudioSetSpeakerMute(isMute); -} + // 设置通话speaker静音 + bool SetSpeakerMute(bool isMute) + { + return PhoneAudioSetSpeakerMute(isMute); + } -// 设置通话mic静音/取消静音 -bool SetMicMute(bool isMute) -{ - return PhoneAudioSetMicMute(isMute); -} + // 设置通话mic静音/取消静音 + bool SetMicMute(bool isMute) + { + return PhoneAudioSetMicMute(isMute); + } -// 获取SCO的连接状态 -int GetScoConnectState(void) -{ - return g_scoFlag; -} + // 获取SCO的连接状态 + int GetScoConnectState(void) + { + return g_scoFlag; + } -// 通话转移到手表 -int TransCallToWatch(void) -{ - int ret; - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[TransCallToWatch] start"); + // 通话转移到手表 + int TransCallToWatch(void) + { + int ret; + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[TransCallToWatch] start"); - if (g_btConnState != PROFILE_STATE_CONNECTED) { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[TransCallToWatch] BT connStatus: 0x%X", g_btConnState); - return OHOS_FAILURE; - } + if (g_btConnState != PROFILE_STATE_CONNECTED) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[TransCallToWatch] BT connStatus: 0x%X", g_btConnState); + return OHOS_FAILURE; + } - ret = GetScoConnectState(); - if (ret == HFP_SCO_STATE_CONNECTED || ret == HFP_SCO_STATE_CONNECTING) { - return OHOS_SUCCESS; - } else { - ret = hfp_hf_connect_sco(&g_bdAddr); - if (ret != 0) { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[TransCallToWatch] ret = %d", ret); + ret = GetScoConnectState(); + if (ret == HFP_SCO_STATE_CONNECTED || ret == HFP_SCO_STATE_CONNECTING) + { + return OHOS_SUCCESS; + } + else + { + ret = hfp_hf_connect_sco(&g_bdAddr); + if (ret != 0) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[TransCallToWatch] ret = %d", ret); + } + return ret; } - return ret; } -} -// 通话转移到手机 -int TransCallToMobilePhone(void) -{ - int ret; - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[TransCallToMobilePhone] start"); + // 通话转移到手机 + int TransCallToMobilePhone(void) + { + int ret; + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[TransCallToMobilePhone] start"); - if (g_btConnState != PROFILE_STATE_CONNECTED) { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[TransCallToMobilePhone] BT connStatus: 0x%X", g_btConnState); - return OHOS_FAILURE; - } + if (g_btConnState != PROFILE_STATE_CONNECTED) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[TransCallToMobilePhone] BT connStatus: 0x%X", g_btConnState); + return OHOS_FAILURE; + } - ret = GetScoConnectState(); - if (ret == HFP_SCO_STATE_DISCONNECTED || ret == HFP_SCO_STATE_DISCONNECTING) { - return OHOS_SUCCESS; - } else { - ret = hfp_hf_disconnect_sco(&g_bdAddr); - if (ret != 0) { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[TransCallToMobilePhone] ret = %d", ret); + ret = GetScoConnectState(); + if (ret == HFP_SCO_STATE_DISCONNECTED || ret == HFP_SCO_STATE_DISCONNECTING) + { + return OHOS_SUCCESS; + } + else + { + ret = hfp_hf_disconnect_sco(&g_bdAddr); + if (ret != 0) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[TransCallToMobilePhone] ret = %d", ret); + } + return ret; } - return ret; } -} #ifdef __cplusplus } diff --git a/code/sdk/application/wearable/service/msg_center/src/msg_center_customer.cpp b/code/sdk/application/wearable/service/msg_center/src/msg_center_customer.cpp index 5c6311f0f..e72074298 100755 --- a/code/sdk/application/wearable/service/msg_center/src/msg_center_customer.cpp +++ b/code/sdk/application/wearable/service/msg_center/src/msg_center_customer.cpp @@ -216,6 +216,7 @@ void MsgCenterNotifyAlarmProc(const Topic topic, Request* req) AlarmPopUpPresenter::GetInstance()->DelayAlarmRing(); } } +#ifdef FD230 #ifdef SUPPORT_CHARGER_PLUG_DETECTION_NOTIFICATION void MsgCenterNotifyChargePlugProc(const Topic topic, Request* req) { @@ -305,6 +306,7 @@ void MsgCenterNotifyLowPowerAlarmProc(const Topic topic, Request* req) // } } +#endif #endif void MsgCenterNotifyNextDayProc(const Topic topic, Request* req) { @@ -763,6 +765,7 @@ static msg_center_notify_table_t g_msg_center_notify_table[] = { {TOPIC_EVENT_HFP_WATCH_TO_PHONE, MsgCenterNotifyHfpPhoneProc}, {TOPIC_EVENT_HFP_WATCH_ACTIVE, MsgCenterNotifyHfpWatchProc}, {TOPIC_EVENT_HFP_PHONE_TO_WATCH, MsgCenterNotifyHfpWatchProc}, +#ifdef FD230 #ifdef SUPPORT_CHARGER_PLUG_DETECTION_NOTIFICATION {TOPIC_EVENT_CHARGE_PLUG, MsgCenterNotifyChargePlugProc}, {TOPIC_EVENT_CHARGE_UNPLUG, MsgCenterNotifyChargeUnPlugProc}, @@ -795,6 +798,7 @@ static msg_center_notify_table_t g_msg_center_notify_table[] = { #endif {TOPIC_EVENT_FIND_WATCH,MsgCenterNotifyFindWatchProc}, {TOPIC_EVENT_CANCEL_FIND_WATCH,MsgCenterNotifyCanCelFindWatchProc}, +#endif }; static msg_center_notify_table_t *MsgCenterGetNotifyTblCb(uint8_t idx) diff --git a/code/sdk/application/wearable/service/msg_center/src/notify/makephone_notification.cpp b/code/sdk/application/wearable/service/msg_center/src/notify/makephone_notification.cpp index 21ea0dd73..d51939af0 100755 --- a/code/sdk/application/wearable/service/msg_center/src/notify/makephone_notification.cpp +++ b/code/sdk/application/wearable/service/msg_center/src/notify/makephone_notification.cpp @@ -250,6 +250,7 @@ void DisableCallTimer(CallTimerType type) osStatus_t ret; switch (type) { case NOTIFY_PHONE_CALLING_DISPLAY: + #ifdef FD230 if (g_callDuration != NULL) { info.callDurTime=get_g_callTimes(); g_callTimesclean(); @@ -262,6 +263,7 @@ void DisableCallTimer(CallTimerType type) g_callDuration = NULL; } break; + #endif case NOTIFY_PHONE_CURTIME_DISPLAY: if (g_callCurrentTime != NULL) { ret = osTimerDelete(g_callCurrentTime); diff --git a/code/sdk/build/config/target_config/brandy/config.py b/code/sdk/build/config/target_config/brandy/config.py index c19324cc9..cbfc288f6 100755 --- a/code/sdk/build/config/target_config/brandy/config.py +++ b/code/sdk/build/config/target_config/brandy/config.py @@ -136,6 +136,7 @@ target = { 'SUPPORT_AT_CUSTOMUTILS', 'SUPPORT_ALIPAY_SEC', 'SUPPORT_BLE_SERVICE', + 'FD230', 'SUPPORT_HID_SERVICE' ], 'ram_component': ["algorithm", "dfx_port_brandy", "dfx_update", 'dfx_nv', "osal", "arch_port", "-:testsuite", @@ -176,7 +177,7 @@ target = { 'dsp_version': 'max', 'packet': True, 'image_analysis': False, - # 'fs_image_path':'evb4', + #'fs_image_path':'evb4', 'fs_image_path':'fd230', 'fs_image': True }, diff --git a/code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/APPLIST_ALARM.bin b/code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/APPLIST_ALARM.bin index 61b893e484699d7ee0c68570dea186f08d29805b..00a75bf0ceffb8e8ca9e0daa1d5c1393e2a5eb0a 100644 GIT binary patch literal 12824 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 D$-qF) literal 4504 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 b8}uIFmfWf?%&1DW#{? diff --git a/code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/APPLIST_SETTING.bin b/code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/APPLIST_SETTING.bin index bf4e8395ab11ee56a674d912c038c3becf587160..c96716ae4f9b0a74d39b21705d7e0ece879a8219 100644 GIT binary patch literal 12824 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 UYtS3Ii%3=kbj1GtU)PWS0)=@#M*si- literal 4504 zcmd5=eQXp(6n}erEpxS@AE4B)bZH@Jp~hYz3I^%!UBwni>~2NlAJCH!qcI^BrAL7D zmVVu~BD9T(1tTqA+9qO(F(9bvwMIdRHcgDFF{F!vB{3n;TA{SP@y#A{l}noTdWy^> zo12~Y@%znt^Jexy0Vu{!MN%xQ3xT(>acZ^Dn9`}niUb4o!Ed@&R=cqy5xbk6kr2{&ifJ*^)_IbI6wA!+==O1lo5M_7K zXlo?_QC=okDpTQ!bzX4{0(6PQa)xV!_&0f3d(r!3!pS|r?H5>WVtr;hR*U*Pej?k^ z-xgmmznuAl(_WCb0<_{w?$5#l6aJ<I~2P;)NVGxr-{-}!Xu8UHzv+n*`^ zX!Vh=SxW+(uMhL58IiRm!Vv&`%k52tvo^Y=3V568p# zhT?rfFjHZbP&^UudzBBz&+##Srq`?Q@Ir+bmU;O+=cgVYV*5Ex$NgOX!n5&wp6f?D zR)hiLckGsZ%m;Vl0%`RHUobm+;n6RDY@X|GejSGA9W2N=kk$(JM`F%@cU>(=zt)f( ztiMOzZEnJR4AnvgK*Df6>hA!vn&V@-W4V3Vn>%*8NVWoXS(rozEh=N8KLO_Ss=$lBKODnXzFUY`f7042Z@#6 z4h)SbLIK6FhFU+RYFCib!`7R(e7=02A{;bYv4;eRjoX_p9^@0~t~FQ;2QKBEmjwfC042JI))8!LsAMX?826k(GXj0`J_ly1;QQNoh=3C^Dq7Bb~(>6@$HcFEz z^-P?<9Ixis1vgp>XT#3r>4EfXf_iF$DZ#+{xI>v+R@}@B*LyA>iGQlGCN!2cUxAL>i%1;2tqR*$&kDOO?FW`NPmOAIL726iBPdq=}$4flHi}|Osu)f4M3dxG# zn#fN|eHzctr7K%{2EM)-Ykrmp8SMNAy{PGxUp6#tQk*~Q{mR|)!5Zr zs*`$hYZ!MRoVk|7;x`+hGXeAOCnU-BIp31@ROxuwE52Cu zwYslBuJ$9pwCcU)n>V>VwtDOWhJ2TXep^qwa%vYyFV_;|Y!!i?(Qz(6(|q}__1*1$ zkbh(G6V8GTP269I)5QMZW0tRLaR1nWRlULE$kkU z$DtzXcyWBw<*x~_DkRIEIiRVF1DUq0MHv7O1pI@SHFdp|F=zm(d$jZihEJ&5Y+%Q| yex02WsVR-RQCRa)w}|RT1@?b{iDgcIXml%^rb0;vNUmyjzXBj+ceMB-<^KjvZ!@g` diff --git a/code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/APPLIST_SPO2.bin b/code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/APPLIST_SPO2.bin index cc9c66482b54db187985d74022a05f2c55b56e5b..8177b458eaf5b81e65a9a7e1def41bfd3dbcf20d 100644 GIT binary patch literal 12824 zcmds-3pkYN`^TSoXD}0KP&(((&{S+Fo9$#~sC1qgM&}&TfwWtsb9tR=Naa+~i7gc( zI_R)gq?9D1maVqNNd1trB;+vv_Z=z!=izFv-(Gv|{{K@KiCKKF3rKbidj=_vechi7CtKLaMG?(Fqb}Nq|RpBmr`$^ssE+3Wd+O+9no@s5F1Sg zG1qmK`2#+|yjT!escsv9Z*qUwNxzFzV6GLCq6RYAOmANRVlt`7{Qv3w`?vRR%iM3c zB52J(z_tuirJ(wfF=nVv-oa{bXZprX+LbXFUVk2I-nP}@695q7VzISNGr}>|pe6%H zKEM^9u<4E0jCJG_);2cQHr6obCaP3*y6TPCss1U{Ewa1`=4LdR>~5)lBquM`Q<`uC z(H{@f3X__;2)lY0Bkc=l64}+PhzJ1cDYE0T<#78XKYNAbtU%TrkBrB9CG?{U^z}9MHDE3Tb#-sB0Dq!? zPW=2MxiA;dWOXkq{Rv(lDmx+fggGxK)RnF}ebY^?o%Wd^vmWMzz3k3Y{|G?Ci?41= z^X`qOWPD(k#P2vUK5~J)y|=>LHVd;8fxXdw)iXe)5-5Q=FKZZS3P4ELFPMKz zAAdLJCICWTn@6ao#2bnSK1cK=pw-FS)D`-mumYzc`!B%i>Z+6pF1C)fZE8$s1#NCB{$LB-LwEbVtMhCB|1FnYKB|V#m{nczTJ2M7 zDY`xa`V0^G4*m9zru17_%`QuLe58JwW)S+RExBErb~~*%uFw~8KlXOMg>hkHi;E0} zg*PeIxklRaV0$a9)w1nebjm?Hed{5!rwoI+E!Mi&au1USD183)iFGiRbB%6{y*n

8G5UFTY4AcTmdZiI&ZQ+m}%#jq$sq za0&-2d+t^A!$eJePyuruTfK_8CG7N&-41wtCb~b}`XXE-r8j+j z;aw9%&L`Jhxq8|hMn;5Txr1E(Ia%m22wSnpC}`Y|5t@`3`L#lfT{yIbJ)75e%dU-hORlGjWj^;b*iFAdROe#5|b zyW|;Gr{sky6XwMT;P$O5)J-nr4sw3FPCLvu_`^|{3&lf2JX4uf#hdTP+nF)$z`T3@ z<>exgPzckn=kwpn1>*2`^zUBAuZY`=uJH>zKZU-C_+4>7_7cDI z=z*?utqzZys(U!2Gwa)7dt0n+-HaV6(l_~yRX??7Ao*$f!6?@bl}?j+?$4;3w{5qF z?Z2+y|4n`U)$t3&S{|Lh{XDHqzRFE`q`_HueS~ysNaH=>n_siFTb(qxwxtEL3wjLszdDfz%&(EL+bFSrY)hBvQ0QBtrVn4?OYE&{e;^)?rlcBDRq8PA!HwO$55=CSwFt^Rpv|a!*J5`>ifn*i_ zPMGIkUeC~IFrT_llkAHKgj&<8Nm zY}DS%wS<)B29y2+w2!#+2hxf1+_0A0&pf3N|EU&u= z+uPEq?rS1bH10lrrPAJV7zrSy#yqdL1xtMA{d$iT_^1krpT5?w$mkBuKY6U>o?cnT zAcQ!3ON&HZGU+i0t%^h^`NZpPZL1F24mEE<>$gOHJbd!dA1I*sgshkPgn+Ff9HV5% zsf*Tj<1J}K>IX#s>r9UfrY@5@OJfo?mi6db@s^0+xfj~JaJS$%Jpb4*r?enR7q+_!< zIRLc%RIOetwiElKN)9Ud*+W*Guj^;eK=vH!?{YBr}xLkj}+6VmIPaAEBWNUfO)sR z@JO*}X)pIL$+r>u!^JqM&qCN9Q(lB!o83D6NYNl5N-fHQxuQO!-8_Us)W=wJG!cCX za(Eu{wzIR{8WuQPb7B_2_Qgt%8`e_z4Fn|i5V z|K@ERKG+K2F$oD#I}it@SE)Sy-3)2AkEstxP5dbX?w_3h)Kp_tG0mE0*I$Z^Phd0M zqjSO8X=MU~rxYVcZ`fXBzezWy z#nbj*vS0CQ7Jg1T9629?IQIJvbLzZRLc6S)ku{cZ`x7xq)1D=v3n@jn3zC)Ek@Le% zq<9^U^X}ySJc4gI*AC5(iTb!-P%NoGP&C;u4sM?(#x9O%FOlAzbHu)2vZ1>&D+b~a3Nq=+fX;>j( zeKbB@dF3F?WlB{ev-H)>!S}8&*UFH`C-Pz?i6s0=#8VE3mwRjLxkT80B1>`8-{d+3i8 zZlwQZTPCtTgn#>@FE7zZ|1uFac7(6tMM)^MB4|ZJ5JOYrsbQ|3q4& zRNq(=1fMC7a(?E8_%E43x!ugCN`S@<*_d{z>J!{QS$`z`ORa3sGAwC158=fA&z!EZ z!ai*LP3zE1Czwl=F8WzG>k1=s!Xr3`=z1_0vYPijIjL_5;`QTR#x!h%IX9SH)p3I| z`aQcc^vtIL1u(b5>e^qQT<9&;JhNdhu|zNzU^j|Hn21K1HlQ$|U7UeZCWpp13E&~|J*oc_XS(k9Ob*)r*Zl9luD>6hBahWNL2Fa*m~dMLua7Nw zC=G1!|45WJ7n#MfkoZTUboS`$-&Y?Z;3Au5b5OvG1`8#`W<-^?Yr6q|qT8O_f7E+@t^fDMtqNS{b7+RNS!<5~5Q(GpA)>xM;zLRCqh(8QoLJ+& z`Y$im&Sj+ra?A}ol!!`Wc&X&7y`&QUyOZ{^KKZ@{xW0J%o73Ko$VuSIN z2^JL1mrDa843PUxMvZS9y;jHZ^#f&G-=CQU+e?(Lo@dz8jQEo%JkgX(UNGmXopqh7 z=U=dk6$Z|N7$iPO4jp;n!L!GMa1ibmqCNfj(*ldoAfocr9AC9)K<(paJZvWXmApWU){rl1vH;-z*En$NW zH^zX|VmScG9|X+HZudiW;W6Naoj$;4!Too)-w|wmGw^U8t1g!;tv?hiTDb;^D@q;Ykx93;1B#S|CEe=zp;D&`qGbpD0%w%UQ@(p z9HJAX{X|WLxH{<N3D&+Z9cmIEvzP{ByFKbj+*NUI$ z^J7Avf&xGTCM?>zq1*G3`U>&Q{?7A|!toumv77vM)_5(_uY5oD|H0?Rgc-iu%F{y=6Fs1Cacq zr+&T}Uu9&d!tHmj|DV#Ab}#x;8?DgS`v+HWLOcWD_Id03H@I-KN_5!sLxJwwHkfz! z-?hmw{r3I&Z?_kW%cX&Ai)?*jf+lL$uE8_3%^6bd=7?*|ysxTZWW(2mx#IaFS^w0% zOngBzuowOHsE;}foC({L`BlI^MSg{QI}BEW`Iq_vQClEN42XXq^hMSuNdLmY0H>G! zd*p}mnB9QH-^BMTt&0fcIAm5` z{+7CQc>nW5o!$4xdF+pqG5u8@HNaRdsGymj!)dZRC5v|QMcPPx;ZhAPm=@}^9IVy> zMDb4oH{c*(7KW+a%n~17k literal 4504 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 o3ab{Fj|j>r8qMj@+B(iR literal 0 HcmV?d00001 diff --git a/code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/CARD_HEART.bin b/code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/CARD_HEART.bin new file mode 100644 index 0000000000000000000000000000000000000000..a19125d62ff976ecbcf06de401925d7f37a84d5a GIT binary patch literal 52664 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 literal 0 HcmV?d00001 diff --git a/code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/CARD_PLAYER.bin b/code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/CARD_PLAYER.bin new file mode 100644 index 0000000000000000000000000000000000000000..6b09852245621abae432222e5847ca931dc29b1d GIT binary patch literal 53416 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 I?;YR&0S|zYm;e9( literal 0 HcmV?d00001 diff --git a/code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/NEW_DEVICE.bin b/code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/NEW_DEVICE.bin index b3180e934e6935bbf43141047a1a5d17c0996f74..437402ac47794a39dfb1a277e91d56143d8693b4 100644 GIT binary patch literal 22488 zcmeHPeNa@_6+ds^0=o~86*Lgjjt^WSFiD1*8IulUvu_s(I8Ng3LX&Z!P1#$VR?y4fRYfftttgbfkspq{iy%sc zQ5XG;$|C2pTgiWqER=G#L;$-1n#d1|GW|jFzx|_w@^3i4u#5vJj|X598a#p#JV>v2 z#BpWL)P#nxF^bUQn)Q2r#vm=uHWONU>4ew!sQqXFpK_k-#c{_ZzO%SWdXeG z3h+ZmXUGGyXP0UmOIuZIX^;w4 zdw~qh{Ck#tQ;nyPv!VU*UWIo7;@7MLo=;9@59e}F%TRodvww3lP=u12PV}7=ci=_v zEcYotk9+ zF__!exB#FG_ORaGZ+e%`J6Li;zmcou$q7NDslkLmSt zp!C!uK3k;tQe*F01CCPw91P^EiX>~}d0igrZ<7#@&d#p^BA<-K*R`7PCEcN=kjI)( z2vvO*_@kRyOuk<c(o-87 zKHhAh_!(XMPWgLt{u2Ku6`@9^ma6{G9ZHgOSutsV%~Zd+b^d7zJ#62`iWbcMz=wBe zm=XY-_b1z4=b+Bz%&(~WY0Tq#|ERqknZ2d_x;Y+3n?G*Gg&!!;)w&Y@9{9^jjE^-z z_5N(zbTcGP0bXx^wD2W#ZbN^X%7Fn}m=7?k(@WyJrC!dO+AwW1qqk4-MDa8k$FuJA z1+u_S>rpzc#f7uL)Rw~JLOhrO$Cjk%`ma&9_IE;_A9(q%5$g4bDaZM3aw+FAs^h!q zi4;#m@l&N$dp7Q_B_-|)nHPm)X|Lp!3Nnz_2*l%PD8KGV0@3;A{ zTb;+}@5IU8L=z|>oZmB`zueS>RefI1@b?|{Z`8j{2LI*=Yz49D2q%5;&cGL^Pj|U} zv&8vqHBomXM2Ht|g_k=$?@B)k^0{--5Gmi^m-F5;`tvBhD842lzMMG!`E_2;@`wCNF{E=*R0ib-wN{ol7fPqgQ`12b`c8k0xhScm}e#Vvs`uk9Q8=1aMc78d0`v8JoPR!WdAR(UGSI@Hvv!2IH^IT%0m+SAZ z+UqfhM@+Q#95~W4xYTM3=I2oinqy$HyqEbYr?AHz7 z?+b(t^#1zds>)TBmAKyPSq(et(Ld4j`)=zmu4m4<&QDzE+LnRq&CeAr0ND)vkn($` z?p;sWuKIe+Sh148rrv*wzlniA#Lq+GAJ(3(94d~$PLPZ_YJ5DYadDR}PfZ7g?JK1T z2S%SC?L+&`U}GHgH3OM1H~~;qY*dtOICU?uFYE!Bd%&~z_}s1)dynh#qWBvd{MiF7 zQiwC)c;t=wWCI6xFcZHA7NWQ^kL|9yrl9?F5ltB?U+VJF=+W07+Mbr*@?H6j>+2*d zXKP;`#pCJ#ehK373xF6{wB1-xu(Y5+^?zl>jkx-b`oHh6e%fxXm%T?NoS!{)oJfl7 zuR&yG*^qd_oRH$j@m#wmJN4K|_4&^9d7|-ej`J`IUOF?&MCAWTiPPD^dpU_s!KAPw zixyP<$Q2MbJXglqqG}?-IMe51{pC_*~)t3J)FDT3kcnkKB!=Ty(Tn4q*1D>R%`@!Z1({X4P3k^`vi zm)^(y3B$c!+%4^m{vZa?$o@;RkFzi5nO9YR(nIzyl$OQfsW~4ney-X1XQRz*;Om^^ s;@%gk+?GNKGwZ_3Icr|6|HNP?b{x;>#WT_6Mf-nm`AaJA$t~~y1Ci18E&u=k literal 31224 zcmeHQe|S^X`G4OxamYuK=@8z2$uO{LIrda9F%_FlinZaus`8`iEuLR)zcb0gzs+LX0&|f4^yYKfV_qUtj=_FY14g>&1|501%^v+fzWw zsV^L3u%r8I(yw69oEq|ng>;0Q)@i;w{3Uqi0X1V zJ>TA_*LTTMzOcJP_n)1=nH=FKfDwJk&jdeBtucR?ed-6s1a|pu5T8y7${~Ku#^}{UQY7vM$Msks zIzRgNdp>(c;-*iz5etY;+|PtB6zqyf`4ii8><%FxG$J3U`aws&r?Ei8F4>pw*rDt5 zK`GzUrt2HaJ^4cGF-_l{jq=9b8a7oB`CA$mXPNSadfmRM0{N*<$9#p9=cuFf!;WI% zDdaE3KR5a>JoUPU`EsewL-c1yZU+*tp;f)H7yJzOS15eK!&F?x=da0*zNG(1;u9GMKcJ>Bo)xJ~?yfa_haJ(p` zkQcJJ3_^rX4ueYdV@dL1l287#eDa?j@0qDjL%ZcYezAFIV%6jRaMWBInO(VM!S?{q zOj6eNv21UQhWa z19+Pc;dm+Io4H8JU$PzjSFkhW_=WJ0j@`Mt4Y&o_c8Svlw6B2(aMI)Khl?^aJpvfCa$vW1OGF=Rdt3lkI)G z`R1#h-4C65x%jvoH zHod-B?kl!8Quc$cV*4}5k9FNbLF=fI+Id?Y4^AqcLeAT&zkM7H!ZscAvZujQcZ*LQ zFM#T3hDMJywQ75Bn@Cf#`T=Dy~tI>%h2=Lwbn%ZRk(3uJ4ztSzvx5cLL$ zT+iICRWDjK9WOY*@f1 zweJ29&o9<>(=!Xouc>Of;mz%b=f9-acRF%~M&uvOewHZgjZt_so^CM!#U-v=*^Ys{ysCbcp`8nhp1!pe8_>GeH z4Nk7J*XwdmQBJ7^xITXTqF7!cpQ+WaG$;5{ssDpnIm~=wc#rdk z{HgW_$9rPqTk3jvf8@FI=k9p$QOY0iXYIrJSM+lhW#un<&f`h}_l2I)zh3Bpzv6vy zFd6UtZ}HQYeIDWSaU`tYopBepmnWp=OF?pbA$Bk}=Mi_<`dlC6r>ksOfDd`_{D^#@ zV9&zm^AhL5F(a*55)W750PZ(MZj4~Qy#93!TSLfSs$@v_~r_PpS1CiMIrYV zCpUVe1q+!=fG;qfRO%Zd`KXk#X>9ktK0XEKZxV4 z`WwRgn0oX_k;}+m6As2Sdl86}=b5JOso0l?_rF^Iz-U;7{iFObaG`iW(>Kcd^X{#~ z`B2*Pgr$hkx?97hb;#$fw_!eaT(DvJyKmeub3vS2e-z(`5lGMReV9bTd>|L|#p{1v` z-SOZiiPP$b%*I2TbbSze^X-b9Jnt=j+)t{$XuOt~?7e6}b0 zqv-F(`&B#P0|g5q+>eC+6pZ(|xzf&CT-@jp7A)vra23Xzbbp|k?oZkNJWt(Wt-d>g zd|8kDb@hm=uwZ@s9KA%yzBbMZ^Z#I8jK7TW-&bG^(48LFdLO(we8m@<-S78B9(LT)A;QCkb!rdD@ zZEtB<*ogaS8}9c}!$)Gl#lc7YBi3qi7sd|{lKl9U!$)92vC%A$`%T4O&aB-Va6LM? zD~4xaNh~hIR*WZ9eazRG*5m%tu$<{$w3)(SsM>^lrpb-LNaQ3{Kh+z1ru8fV6r{Z6y*3FYM46Z^S${#>)72ZVZz z$MpKm;TDXiG+gPm<}%|~8K2jP{6D>K$!g?(ZXAgZ>H3+4fjEur&4JC7y;RKCE!F)g znw;y{LHlp040b(D*RPB(Yt#E5l!8NrT*_Y1ERgtE^S2q}bvz$mF*E}UgwvZ|!TSnb zE@p~}^FFn{93+3IuHTva@VtB*-M(dAyo>N%q4Pbiwx%}yhbIf|_J0-P$GUlsedojLL z?MGZue?48lyg3@Uuftl^Z7X;lS_eFYfAG}{ZakF)r-hazR9DpTMduf&N zrN=02k>dfvze<1Q^yrk~xc~L>uG}1;{Vfj`Z{Df42Z{GZ?y02o%fo@d{S;1X4v_l| z)t(si3y03@{;i5_j4g?3?c@Dy)Dfws>RXVH=Tg|v9FK3;>>2R>B%bnGE0*AT88{pZc*=eG_69spD4684 zF+b+xh73%{g6hp(PcAL>!4Pvg7E&MJC&-VQyrpI7(w$C@lFOYhQgU1C=DDSeTpoKZH!z#bCI%F9e8qisiyA<;rWofU!v9zW4@`?L+Q8tB~XI=p!gd` zE_nLv7mR)Jcn>u`9Pkw}s(yH0yi{+`74aZn(&N*zY!i_y_9L$NuI(iMq+)M;;R%A3 z@wZ_3V9MR3`HSP-FuT>m_``if`!gC6`88^M;rKo1>mvwqy<3yJDujl_`#h?C*jJ2i9BXoNA2Pd+ZI8F0|BAk8 zHNFo`;(5w{@eeB*3?lYNYu||Rr%9_%&aVP_zfZB}slfMbzV|vcKP{)?bLsV19hg^8 zisw^&HhYiUxpmLfTKAZ$UQE`m2x40Mi~nx_B<0^M{_CCJW3aa$#DDDFbfu3QoMy&? z6K)w$w+ZvR!_tOg0aJN;Xm-}E8aCqj$}eF2rRf`A2*>ffreTZ+0vHb{^*vw?O?g7n zFy_}oL!Uvu(e%TaElcq{s$r;Hd$NSW#`Rf^7$0eJduFr?*RO^RE#Hlwrm)4{7LM5bijO6eQpEhSAfzO^y1La$%h9E*~8O=}NY0`s;~SZ)r- zyLEkXd%Gm6<5j^mF{XZVOP~bfW6ho=9*_Ty!nVpl{HW%y5#twW9OG~F>Ns7$xw4`W z<0G}dnHat-xr??Jjs!|{xq$vWf#3H~=Er47k9x*EM(GDJ{-(#<5-;w$U$4JPzy_j} zKCEpC(BolPjPIXNa+_sB0MGwgf77DzlNjG=*f60b&`n``b$A}#zw*pL<6KIfR*n8? z{`2ML#nP}kyg$8YxM|fWFPwX&^X92DZs!c-Y~p@mO5pIez>x=ZK3fPMnetvw^3^ws zufFVj;rncfds6ZQ!;b;)n@DUnfcx3lGx1lp1$^8f(?BdlXtR}Va&iMqX;=t`0gv`{ zSSz}%1<&Dm?)drliUyve^((^_UAp|m^QTvjV&uWdTGn3Ko*u^j>{fi*xP;|IQ~lK-7{t|_1hmp|5W{Q3+9(n89Cg`w&%Lkp!Z|Aw(w`)m&-mxF7I~C32&F5fSZ@y5|HyXJ|;}SR6XvTuyf0>N;xpye*8Ph4UY46o92EOe6Na}yP_^-p- zak22GEy!2o!;{}PLHKSmH)ZhN@Lfly`ndjmO<3^XFug*~UjvM3SctBd--G7|6_fLB zZjO(_nPn}wewF(BywQbQ$@_0P(+v0U_+$`j zKVF=F6Y^>MB=LCa(CtpHztMz+cng-|Q&f9K$c*6o4r+ZdBpMHz7=8KPXK8(7bH%fa z-066Tk{e({G*0!uI^MJ#<40{g!i{Zh$Pbi1?f+o0dosowivHLoYwy}h&cl@cfzL61 z(d;$H=dIXE`EN8^bNf^BQ_*8fOPTuOnLP}K@(V0JbCJP+TFm+vlrPgi&f15ce5(0_ z?|Ekna*VO(D#!IOsP8~5@Pn`;-~I%i*VXaI=c8pAGk#s$=dt!>V;f`7xdHEkwehHq zKUsp~t=X#tLj=$BN_%*pyx1{p55;Hv-mLZ8lKk}T;-{~AJ}>7xN&WspzxKK9I|)C{ zn$DM$k@qhwW_+IeID`8AhG3wpWVw?|?Q6u6;2-Wj%&$=xiZ4<1fuBv{D@tAyT*hGI zr=K$zycn-h`kZ`;!Q#EA8I1Xy4r`x_{7q$}szyE6`TS4G_fZYK-~VEfsA^>8fB%HRWncWB!J@aG#XDGi*z|kde~gg(m@z(9 z=Qo4Izh&BZ?Z)q)O(Eak(&qa&#eo&~G4@mM+{s|r_`X(OD8l=Ky4|dN3cmlR%!eoJ zi1_O<{!`k=_t*GDyspe&!L+~j&L61j4F)W`eaBb5{*(6pxA^h$^DOT78~H(H*MR(U z`Q2YV@T8M7^m18((1N&sD4g;jp5G|ke(z2tKLW;Do3X~0vj+LJ8%nqIldwK{Uyad+ zvO^Nb_u3zu7vHt{aDbIhI<3|>LWt`?(`K`m$0_ObPGJn)3i6+XZ-oMqTXRSuA0sWDtO9_=@GGwn%p zkgurr7ZhOrfbY#!;C)83C-Q6EKECfWrp~C_2Scr!r^X`#&+EHhWbE}j@Mi||AMe!W z+cNjyU0V;~?@PcHSeW3n3^Av?D#<_pTm19io^NgawWr7r$rt)}Sj)OC1zVa@>d&>` zJJ7z;$>DF0R6oBwiTjtrA2(rsC80km>#1|%C#$EgM0?$ZC0ia%gDPA4EW&q`{;r>C z`nlp6%K@#L=8;!L-=S6Opv)%H^D%U?a-(Y?W^@+T(XDqGea zRpot#zuQjoN2)*9rIq1+z099Kcd7m~-Dk)Y#;u)ZQE{GXE!PLwO-F~&HK)MxC!_CE3-H9pT?!hD_bJiy$leQon^ zC@fbz8(+%kKi)&@SI6VUgipx$lkZQAt2JKM-ob;~_<($_{l?WzXI202ACBKod-d30 z#{O%iI~aV+{r_O_J8j69)EZk>?a-Wc_~`|clp?);#oD=Ss}$f(7CIk9}l86}@$aj&!G;1)+d zO6WJeJpEkfi9x3-6*&e^C|vJe=Tr9we%q)e9xr9~4~Utn{Xb41{Lyq)t?x!>hzS*A zFy^ea=13}@RTFk2Mm|d9BeA^%UdPxs%A9JyeFFM-_pep^hJ=5%96WFJ_LqF0;KYa1 zTbcSG4p-$jjGO%Go4+1)PQ?j-@&1JBUvo*<4@;Q(hE<}*N62SE-l2}SEp?48N3!Yu zXVn^>QNXa=qsyz!nII0!7fea?Lr_FEG zv1#W|+(VuDSYQ8R)533-!k%dCgA(?N`A*!<}Dj4 zV7x@t_iVnz;59FuWAO2f1q?3g{2hZYe9G2u+J}5a+5gjc*1tJ(k1+CGFJZh!>06Kg zlffSx$9$a<4`D=J~7+4HAqp6{=N_HXYl9e=TY@D2SnefX5^opzFVq} zMnCh2fx+AqBZJLb*my|JW80hmSQ(?gZ$8gp*z08RoeLS<=YyFHo^9O6U=X<^A0+wU ztK@@k`+8#c53u}#U-4(;{qeVy(|iLNuQ6DZWd_eQu4eG0EHi_L}I+ej!INxWmd3GNL7p1WMfh{cG4TIT? zJ`4}D_*ZQIz)<;ZUvJ6&CHeX5#Lw)01U9}AWp+P{lQLL+^C=duyG%ZdjgRDIEMJN1 zgKYf_wmmSWuyQL~ANqP&Ic#9CY}WFJ`1|F+l69w+?<4qM;z2OWOnvbFiNRt`oWbzu zW%|(0%Aq~E-;?|O>$KmK>oK_=lj~8x?@I26ScuSzSz*vr3QD~M(ai@*%W14E8|QDGlVg_`g`pPgvk&aE*8lOJwYJC? z!Xh#R^peHr%n-4Vb@)aPg-ckxo3b;#W-2VABH&^n0P+J}#pzAmjzL((D{I+?6<=s7 znt4YfQDl-o)IzPuIe$gG=dwLB1aG3KwLTIC;k-|}7S_-QSjM1A$>!3~sCR)UdgqNe z*`izrP7&kOxAVi)0W=h+_jfyd8vm6ik0UX>qx^yc|AW6U1e#Y>yK6$2ZT2KexXt|L zE|yPJS>!6yaAW)a-1F;2sI^780o17c?t4Hq>4E0|Ex)5j<4-I4<^NvJjqd*U{26ZJ z=M)ja;k<%yMO$kl%?&cY)XVY~UO)L$7CFzx_$PNVe`I?<@ICFR#=lHzIPTz%(=~_F zr~60d+zGqg9(RAVSv0;QAx~*ZxUNoRnu_H_ONQhj_BX-mI>vlCisGhnVD%XA0T=|{ z+50w|hPNiHbk+0u3Frf;tgL(?Ns?`<$V_~hG5s3PfNLzu-b@GklN{9a$MaS-sQxHQ zF)e2pL)ARn-l^>d@>kPR5;`=>w{Ji=LWunv5w;1W@rj>yOiGu4mx eJaxp8B?+6bd9n)jTn+Wm+H%A1E8hC?=Klcj_b)sE literal 360 zcmZQ@WMJT9kYf1H%)yrtpvnLPPRu?`7WNzspPLyh?lUx8{`2=g7)XM_|NrQGka`XV zhGqr^dkzMmrohZa3X9Wz$pg((U^~dsfUX{$57H0O39;4jWa4WT>yv()O053210~Sa zJMMg&@aunzm9p|<76v~?mY|oj6&^470kn@J{`~ciijJNv2>s3s3_$ap7#cn^Sl9!- z1hfLfJjo>rkDsJe{jvv|m$6mE@g*BVKLf)dboD`!8433tW)|}_NG7n&aNK|{kIn}G D4wR?r diff --git a/code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/SETTTING_DESKTOP.bin b/code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/SETTTING_DESKTOP.bin new file mode 100644 index 0000000000000000000000000000000000000000..332ebc05402cb49b73d7ed64ad7de6ac4a512101 GIT binary patch literal 3976 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 literal 0 HcmV?d00001 diff --git a/code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/SET_DESKTOP_HEXAGONS.bin b/code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/SET_DESKTOP_HEXAGONS.bin new file mode 100644 index 0000000000000000000000000000000000000000..6c9477666267308a42ad0d0f1c02d7661eb414cc GIT binary patch literal 14824 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 R&|1685Afhn>A&3b{||hE6{`RM literal 0 HcmV?d00001 diff --git a/code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/SET_DESKTOP_LIST.bin b/code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/SET_DESKTOP_LIST.bin new file mode 100644 index 0000000000000000000000000000000000000000..14547a23b4c3afa9db4606664b97e9f987fd4bc1 GIT binary patch literal 14824 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 NRH814c0bXM|1b57%y<9* literal 0 HcmV?d00001 diff --git a/code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/backGround.bin b/code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/backGround.bin new file mode 100644 index 0000000000000000000000000000000000000000..d17f2ab130db3d3de348dd9c94df387e0e18c96d GIT binary patch literal 1794008 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

!0rTu@f7}UjAG5>T5R8VYOXf?{&%2S4;0zZ_e+& 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%0D{A<3Tn9Mj!H8@1Y(@&8op#DIdeLwH|v7$*Tg| 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 literal 0 HcmV?d00001 diff --git a/code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/hexagons.bin b/code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/hexagons.bin new file mode 100644 index 0000000000000000000000000000000000000000..f3dc2e88bf4cbdce88c438be69cccb4ea80b89cc GIT binary patch literal 6168 zcmcgw4^Wfm8GqjIOF{xf5)u^u6^PLWXKO%IC_DJR;1t?<8hX~&wSu#r)?GL2yqz14 ze1I*9(-!y?@oYypU8~+~?cAw*X|~fsx2k3K#A}`9*3Q(wC<*VLFMmjk>>`5w zxZ`+u-}iZbzvtigd@t|-%khV@%HmcJU)}_-?~Ky0W<4QZwaS!Hqkmr|TGRA;JzyYl3p0<)hCo zG+wkh)#<66`HP?3Zr~qVs&B5yXdx&2Q~nD|7%AS7p6^(jfE27`!@^~m6ZQ0^z)ix7lGkp~fNk6>jqSjsoN@3|h!Ruxib^ll#JGISJ zdyWWs-ay1mA81X5%1LShTL3uC3%}dMYU~{gK{J~*{?uPN+I-{bE8p+bcH5mqVBBg@ zz^`;CR|N9$%f41lK){jn68iYEu2go{dA@hI6yKdS8x=xr=GL6239+W;vtQ2?`pF?V zfQ68owtlgnNXq42;LBu5LZ3?HE))*bW6j}y9{0ml)|ceOO%Xf~CqMX?UJc@HQ9!Mt zu03K;0vK(7XxXY7uRrf|F)eH+#|eTWaz2Q+gphyQu8B8-1?;Wl*>+ck&Dd0G@EDtJ zEP$YFYOiu2J$5{x}QCqe6V=- zVEv|?Befb}-7q8K?;!tN&nn&ILKO-c2ISHH85&P0pBdN+>sV~#VSQo#WZO8irsDb2 zb<}?;!#DcznKDI&zni#|QP=8=R21>55frezb$@Ywayy*J7Km4)wM=D#*&rJq6 zHjy;j9x=J|iKR@y{7@YswLr|kD&y%#J}XiSrUcx_F%22<`akxI>)0Q$e(+Iox$*Qr z?Df;HSQ8f2t0ug_0Iccvr{rdD(C<`baTqR07CXpcr>RgDSNY0EU)~}%K4uU6tBmAXsoUmcLn?5!}mwgw`|&^ zml$sE`{I2(x zVEvSb-^W~$py1fJ{W=z3gm3%A#f*u}3dVmWsvZL-aL4W+Z5jDU^J5C6g9hBHLHts2 zNKc3_++llCpa`56vWlLiUts;vYc_hTI43(*%3m^foh;GhcfB%Pd?CIoz?jgW7hVQF z=Q({d9p9XxY9WjUYKE&X-hPbd+Ui~6{y;qOS9o6hv0%y z5tIQctH7B0BSZFJ{4ro^C%GNZe(buXw@!NBwUAmj$OJEI^;q;@sX3TST^uN6_w;}4 zXS&9&f0sTPATa#?6wcoYUy664TmFCe!d~T6$2AA3*P%!8*{5|}qJ z{03Quvz>Zu!{B|zc66WB zuFz>7??0Y}zQclq9QKC9B?A~Bs|gi5|k~D53xSvH;JIZd5FEI9{BxZSg!w1o+|~d6!j;E_^_Z+ zml(%3+Dph!=x6j_G`qm~hrQdkH}T{Oy^Z7ocn2sA%?BXlbs9y?_u~-pFM7Bof^T%@ zW9$1m{W77ARd&Bl7$(sj(I4a+D_gQpA%E$<1FJ#phEFk(a6Z{Xr-DqtBa!_>+vdk2(l5qtN?H{Sk^&KU{a zN~b&>){Jqp$x-<YQ?2QiJc>1i38}!}w zHg)PUAnCw5yDVfufvQr-XCUxF5IO%~{H=~W{qw$Jri#@p_8=wczExNW0^WDhop;^0 zem{I8e1^8imz~qve*qfAx2FNW2ac~X=oZyy;$In87x-jc=>Geu&2Q;H&0dIn!uQ`F lum4-`SOQjSp?(=Sx9Pjpe12ayqx(8=e*q7ApBWGD{{a5$liC0P literal 0 HcmV?d00001 diff --git a/code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/kaleidoscope.bin b/code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/kaleidoscope.bin new file mode 100644 index 0000000000000000000000000000000000000000..eac0b906649d260e31c8704bb1184f29d092cbab GIT binary patch literal 27224 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 literal 0 HcmV?d00001 diff --git a/code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/planet.bin b/code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/planet.bin new file mode 100644 index 0000000000000000000000000000000000000000..9a6e5ba36e90906d63eea0e0a58b5aca84bd336a GIT binary patch literal 27224 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

+xcyk?@lOY$!gd1Vn&&(J8_V63)oM#?6gNh}(;h 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 EADQ_`-~a#s literal 0 HcmV?d00001 diff --git a/code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/rabbit454.bin b/code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/rabbit454.bin new file mode 100644 index 0000000000000000000000000000000000000000..f98a0c1bf1a85b31bdc0152425e71946cfbf8471 GIT binary patch literal 138648 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 literal 0 HcmV?d00001 diff --git a/code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/rainbow.bin b/code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/rainbow.bin new file mode 100644 index 0000000000000000000000000000000000000000..3419bad22aa17d9cfea78d07dca071109c142567 GIT binary patch literal 27224 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